oh-my-codex 0.18.12 → 0.18.13
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/README.md +7 -0
- package/dist/autopilot/__tests__/ralplan-gate.test.js +621 -0
- package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
- package/dist/autopilot/ralplan-gate.d.ts.map +1 -1
- package/dist/autopilot/ralplan-gate.js +32 -18
- package/dist/autopilot/ralplan-gate.js.map +1 -1
- package/dist/cli/__tests__/doctor-invalid-config.test.js +35 -0
- package/dist/cli/__tests__/doctor-invalid-config.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +54 -1
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/resume.test.js +217 -1
- package/dist/cli/__tests__/resume.test.js.map +1 -1
- package/dist/cli/__tests__/session-search-help.test.js +3 -2
- package/dist/cli/__tests__/session-search-help.test.js.map +1 -1
- package/dist/cli/__tests__/session-search.test.js +64 -2
- package/dist/cli/__tests__/session-search.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +6 -5
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/setup-prompts-overwrite.test.js +74 -0
- package/dist/cli/__tests__/setup-prompts-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-scope.test.js +45 -0
- package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
- package/dist/cli/__tests__/update.test.js +5 -2
- package/dist/cli/__tests__/update.test.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +9 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +9 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +209 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/project-runtime-codex-homes.d.ts +6 -0
- package/dist/cli/project-runtime-codex-homes.d.ts.map +1 -0
- package/dist/cli/project-runtime-codex-homes.js +27 -0
- package/dist/cli/project-runtime-codex-homes.js.map +1 -0
- package/dist/cli/session-search.d.ts.map +1 -1
- package/dist/cli/session-search.js +8 -1
- package/dist/cli/session-search.js.map +1 -1
- package/dist/cli/setup.d.ts +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +168 -4
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +2 -0
- package/dist/cli/update.js.map +1 -1
- package/dist/config/__tests__/codex-hooks.test.js +38 -24
- package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
- package/dist/config/codex-hooks.d.ts +6 -0
- package/dist/config/codex-hooks.d.ts.map +1 -1
- package/dist/config/codex-hooks.js +34 -49
- package/dist/config/codex-hooks.js.map +1 -1
- package/dist/pipeline/__tests__/orchestrator.test.js +125 -0
- package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
- package/dist/pipeline/__tests__/stages.test.js +109 -0
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/pipeline/orchestrator.js +7 -0
- package/dist/pipeline/orchestrator.js.map +1 -1
- package/dist/ralplan/__tests__/consensus-gate.test.js +440 -1
- package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
- package/dist/ralplan/consensus-gate.d.ts +2 -0
- package/dist/ralplan/consensus-gate.d.ts.map +1 -1
- package/dist/ralplan/consensus-gate.js +173 -71
- package/dist/ralplan/consensus-gate.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +273 -0
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +56 -12
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/codex-native-pre-post.d.ts +1 -0
- package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
- package/dist/scripts/codex-native-pre-post.js +130 -0
- package/dist/scripts/codex-native-pre-post.js.map +1 -1
- package/dist/session-history/__tests__/search.test.js +166 -0
- package/dist/session-history/__tests__/search.test.js.map +1 -1
- package/dist/session-history/search.d.ts +7 -0
- package/dist/session-history/search.d.ts.map +1 -1
- package/dist/session-history/search.js +83 -24
- package/dist/session-history/search.js.map +1 -1
- package/dist/sidecar/__tests__/collector.test.js +60 -0
- package/dist/sidecar/__tests__/collector.test.js.map +1 -1
- package/dist/sidecar/collector.d.ts.map +1 -1
- package/dist/sidecar/collector.js +3 -6
- package/dist/sidecar/collector.js.map +1 -1
- package/dist/verification/__tests__/ci-rust-gates.test.js +4 -2
- package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +71 -3
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -1
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/src/scripts/__tests__/codex-native-hook.test.ts +363 -0
- package/src/scripts/codex-native-hook.ts +68 -18
- package/src/scripts/codex-native-pre-post.ts +137 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-runtime-codex-homes.d.ts","sourceRoot":"","sources":["../../src/cli/project-runtime-codex-homes.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,gCAAgC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAiBtG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readdir } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { omxRoot } from '../utils/paths.js';
|
|
5
|
+
export async function discoverProjectRuntimeCodexHomes(cwd) {
|
|
6
|
+
const root = join(omxRoot(cwd), 'runtime', 'codex-home');
|
|
7
|
+
if (!existsSync(root))
|
|
8
|
+
return [];
|
|
9
|
+
const entries = await readdir(root, { withFileTypes: true }).catch(() => []);
|
|
10
|
+
const homes = [];
|
|
11
|
+
for (const entry of entries) {
|
|
12
|
+
if (!entry.isDirectory() || !entry.name.startsWith('omx-'))
|
|
13
|
+
continue;
|
|
14
|
+
const home = join(root, entry.name);
|
|
15
|
+
const sessions = join(home, 'sessions');
|
|
16
|
+
if (!existsSync(sessions))
|
|
17
|
+
continue;
|
|
18
|
+
const sessionCountHint = await countImmediateSessionEntries(sessions);
|
|
19
|
+
homes.push({ path: home, sessionCountHint });
|
|
20
|
+
}
|
|
21
|
+
return homes.sort((a, b) => b.path.localeCompare(a.path));
|
|
22
|
+
}
|
|
23
|
+
async function countImmediateSessionEntries(sessionsDir) {
|
|
24
|
+
const years = await readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
|
|
25
|
+
return years.filter((entry) => entry.isDirectory()).length;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=project-runtime-codex-homes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-runtime-codex-homes.js","sourceRoot":"","sources":["../../src/cli/project-runtime-codex-homes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAO5C,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,GAAW;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7E,MAAM,KAAK,GAA8B,EAAE,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QACpC,MAAM,gBAAgB,GAAG,MAAM,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,WAAmB;IAC7D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;AAC7D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-search.d.ts","sourceRoot":"","sources":["../../src/cli/session-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkD,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"session-search.d.ts","sourceRoot":"","sources":["../../src/cli/session-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkD,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AA0BzH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;CACf;AAUD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,uBAAuB,CAmE9E;AAuBD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlE"}
|
|
@@ -9,6 +9,7 @@ Options:
|
|
|
9
9
|
--session <id> Restrict to a specific session id or id fragment
|
|
10
10
|
--since <spec> Restrict by recency (examples: 7d, 24h, 2026-03-10)
|
|
11
11
|
--project <scope> Filter by project context: current | all | <cwd-fragment>
|
|
12
|
+
--codex-home <path> Search only the supplied Codex home (escape hatch)
|
|
12
13
|
--context <n> Snippet context characters (default: 80)
|
|
13
14
|
--case-sensitive Match query using exact case
|
|
14
15
|
--json Emit structured JSON
|
|
@@ -43,7 +44,7 @@ export function parseSessionSearchArgs(args) {
|
|
|
43
44
|
options.caseSensitive = true;
|
|
44
45
|
continue;
|
|
45
46
|
}
|
|
46
|
-
if (token === '--limit' || token === '--session' || token === '--since' || token === '--project' || token === '--context') {
|
|
47
|
+
if (token === '--limit' || token === '--session' || token === '--since' || token === '--project' || token === '--context' || token === '--codex-home') {
|
|
47
48
|
const next = args[index + 1];
|
|
48
49
|
if (!next || next.startsWith('-')) {
|
|
49
50
|
throw new Error(`Missing value after ${token}.`);
|
|
@@ -58,6 +59,8 @@ export function parseSessionSearchArgs(args) {
|
|
|
58
59
|
options.project = next;
|
|
59
60
|
if (token === '--context')
|
|
60
61
|
options.context = parsePositiveInteger(next, token);
|
|
62
|
+
if (token === '--codex-home')
|
|
63
|
+
options.codexHomeDir = next;
|
|
61
64
|
index += 1;
|
|
62
65
|
continue;
|
|
63
66
|
}
|
|
@@ -81,6 +84,10 @@ export function parseSessionSearchArgs(args) {
|
|
|
81
84
|
options.context = parsePositiveInteger(token.slice('--context='.length), '--context');
|
|
82
85
|
continue;
|
|
83
86
|
}
|
|
87
|
+
if (token.startsWith('--codex-home=')) {
|
|
88
|
+
options.codexHomeDir = token.slice('--codex-home='.length);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
84
91
|
if (token.startsWith('-')) {
|
|
85
92
|
throw new Error(`Unknown option: ${token}`);
|
|
86
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-search.js","sourceRoot":"","sources":["../../src/cli/session-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAuD,MAAM,8BAA8B,CAAC;AAEzH,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"session-search.js","sourceRoot":"","sources":["../../src/cli/session-search.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/setup.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ interface SetupOptions {
|
|
|
16
16
|
scope?: SetupScope;
|
|
17
17
|
verbose?: boolean;
|
|
18
18
|
agentsOverwritePrompt?: (destinationPath: string) => Promise<boolean>;
|
|
19
|
+
skipNativeAgentRefresh?: boolean;
|
|
19
20
|
setupScopePrompt?: (defaultScope: SetupScope) => Promise<SetupScope>;
|
|
20
21
|
persistedSetupReviewPrompt?: (preferences: Partial<PersistedSetupScope>) => Promise<PersistedSetupReviewDecision>;
|
|
21
22
|
installModePrompt?: (defaultMode: SetupInstallMode) => Promise<SetupInstallMode>;
|
package/dist/cli/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/setup.js
CHANGED
|
@@ -9,9 +9,10 @@ import { spawnSync } from "child_process";
|
|
|
9
9
|
import { createInterface } from "readline/promises";
|
|
10
10
|
import { homedir } from "os";
|
|
11
11
|
import TOML from "@iarna/toml";
|
|
12
|
+
import { createHash } from "crypto";
|
|
12
13
|
import { codexHome, codexConfigPath, codexPromptsDir, codexAgentsDir, userSkillsDir, omxStateDir, detectLegacySkillRootOverlap, omxPlansDir, omxLogsDir, } from "../utils/paths.js";
|
|
13
14
|
import { buildMergedConfig, getRootModelName, getRootTomlArray, hasLegacyOmxTeamRunTable, isOmxManagedNotifyCommand, sanitizePreviousNotifyCommand, stripExistingOmxBlocks, stripExistingSharedMcpRegistryBlock, mergeSharedMcpRegistryBlock, stripOmxEnvSettings, stripOmxFeatureFlags, stripOmxSeededBehavioralDefaults, upsertPluginModeRuntimeFeatureFlags, upsertManagedCodexHookTrustState, stripManagedCodexHookTrustState, OMX_DEVELOPER_INSTRUCTIONS, OMX_PLUGIN_DEVELOPER_INSTRUCTIONS, hasFirstPartyOmxMcpRegistrations, extractFirstPartyOmxMcpSections, stripFirstPartyOmxMcpSections, } from "../config/generator.js";
|
|
14
|
-
import { buildManagedCodexHookTrustState, buildManagedCodexNativeHookWindowsShimContent, buildManagedCodexNativeHookWindowsShimPath, mergeManagedCodexHooksConfig, removeManagedCodexHooks, } from "../config/codex-hooks.js";
|
|
15
|
+
import { buildManagedCodexHookTrustState, buildManagedCodexNativeHookWindowsShimContent, buildManagedCodexNativeHookWindowsShimPath, mergeManagedCodexHooksConfig, extractCodexHooksJsonTrustState, removeManagedCodexHooks, } from "../config/codex-hooks.js";
|
|
15
16
|
import { getLegacyUnifiedMcpRegistryCandidate, getUnifiedMcpRegistryCandidates, loadUnifiedMcpRegistry, planClaudeCodeMcpSettingsSync, } from "../config/mcp-registry.js";
|
|
16
17
|
import { generateAgentToml } from "../agents/native-config.js";
|
|
17
18
|
import { AGENT_DEFINITIONS } from "../agents/definitions.js";
|
|
@@ -63,6 +64,7 @@ const PROJECT_GITIGNORE_ENTRIES = [
|
|
|
63
64
|
const LEGACY_PROJECT_GITIGNORE_ENTRIES = [".codex/"];
|
|
64
65
|
const SETUP_ONLY_INSTALLABLE_SKILLS = new Set(["wiki"]);
|
|
65
66
|
const DEFAULT_SETUP_MCP_MODE = "none";
|
|
67
|
+
const SKIP_NATIVE_AGENT_REFRESH_ENV = "OMX_SKIP_NATIVE_AGENT_REFRESH";
|
|
66
68
|
const HARD_DEPRECATED_SKILL_NAMES = new Set(["web-clone"]);
|
|
67
69
|
const TEAM_MODE_SKILL_NAMES = new Set(["team", "worker"]);
|
|
68
70
|
const TEAM_MODE_PROMPT_NAMES = new Set(["team-executor"]);
|
|
@@ -193,6 +195,68 @@ function getBackupContext(scope, projectRoot) {
|
|
|
193
195
|
baseRoot: homedir(),
|
|
194
196
|
};
|
|
195
197
|
}
|
|
198
|
+
function escapeTomlBasicString(value) {
|
|
199
|
+
return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
200
|
+
}
|
|
201
|
+
function renderHooksJsonTrustStateToml(content) {
|
|
202
|
+
const trustState = extractCodexHooksJsonTrustState(content);
|
|
203
|
+
return Object.entries(trustState)
|
|
204
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
205
|
+
.flatMap(([key, state]) => [
|
|
206
|
+
`[hooks.state."${escapeTomlBasicString(key)}"]`,
|
|
207
|
+
`trusted_hash = "${escapeTomlBasicString(state.trusted_hash)}"`,
|
|
208
|
+
...(typeof state.enabled === "boolean" ? [`enabled = ${state.enabled}`] : []),
|
|
209
|
+
"",
|
|
210
|
+
])
|
|
211
|
+
.join("\n")
|
|
212
|
+
.trimEnd();
|
|
213
|
+
}
|
|
214
|
+
function existingHooksStateKeys(config) {
|
|
215
|
+
try {
|
|
216
|
+
const parsed = TOML.parse(config);
|
|
217
|
+
return new Set(Object.keys(parsed.hooks?.state ?? {}));
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return new Set();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function appendHooksJsonTrustStateToConfig(config, hooksContent) {
|
|
224
|
+
const existingKeys = existingHooksStateKeys(config);
|
|
225
|
+
const trustState = extractCodexHooksJsonTrustState(hooksContent);
|
|
226
|
+
const migratableContent = JSON.stringify({
|
|
227
|
+
state: Object.fromEntries(Object.entries(trustState).filter(([key]) => !existingKeys.has(key))),
|
|
228
|
+
});
|
|
229
|
+
const trustToml = renderHooksJsonTrustStateToml(migratableContent);
|
|
230
|
+
if (!trustToml)
|
|
231
|
+
return config;
|
|
232
|
+
const base = config.trimEnd();
|
|
233
|
+
return [
|
|
234
|
+
base,
|
|
235
|
+
base ? "" : null,
|
|
236
|
+
"# Migrated from legacy hooks.json state; kept in Codex config.toml because Codex 0.140 rejects top-level hooks.json state.",
|
|
237
|
+
trustToml,
|
|
238
|
+
"",
|
|
239
|
+
].filter((line) => line !== null).join("\n");
|
|
240
|
+
}
|
|
241
|
+
async function migrateLegacyHooksJsonTrustStateToConfig(configPath, hooksContent, backupContext, summary, options) {
|
|
242
|
+
const existingConfig = existsSync(configPath)
|
|
243
|
+
? await readFile(configPath, "utf-8")
|
|
244
|
+
: "";
|
|
245
|
+
const nextConfig = appendHooksJsonTrustStateToConfig(existingConfig, hooksContent);
|
|
246
|
+
if (nextConfig === existingConfig)
|
|
247
|
+
return;
|
|
248
|
+
if (await ensureBackup(configPath, existsSync(configPath), backupContext, options)) {
|
|
249
|
+
summary.backedUp += 1;
|
|
250
|
+
}
|
|
251
|
+
if (!options.dryRun) {
|
|
252
|
+
await mkdir(dirname(configPath), { recursive: true });
|
|
253
|
+
await writeFile(configPath, nextConfig);
|
|
254
|
+
}
|
|
255
|
+
summary.updated += 1;
|
|
256
|
+
if (options.verbose) {
|
|
257
|
+
console.log(` ${options.dryRun ? "would migrate" : "migrated"} legacy hooks.json trust state to ${configPath}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
196
260
|
async function ensureBackup(destinationPath, contentChanged, backupContext, options) {
|
|
197
261
|
if (!contentChanged || !existsSync(destinationPath))
|
|
198
262
|
return false;
|
|
@@ -1193,6 +1257,7 @@ async function applyPluginModeHooksConfig(configPath, hooksPath, pkgRoot, codexH
|
|
|
1193
1257
|
const existingHooksContent = existsSync(hooksPath)
|
|
1194
1258
|
? await readFile(hooksPath, "utf-8")
|
|
1195
1259
|
: null;
|
|
1260
|
+
await migrateLegacyHooksJsonTrustStateToConfig(configPath, existingHooksContent, backupContext, summary, options);
|
|
1196
1261
|
if (options.pluginScopedHooks) {
|
|
1197
1262
|
await cleanupPluginModeManagedHooksJson(existingHooksContent, hooksPath, backupContext, summary, options);
|
|
1198
1263
|
}
|
|
@@ -1285,7 +1350,7 @@ async function cleanupPluginModeLegacyConfig(configPath, backupContext, options)
|
|
|
1285
1350
|
return true;
|
|
1286
1351
|
}
|
|
1287
1352
|
export async function setup(options = {}) {
|
|
1288
|
-
const { force = false, dryRun = false, installMode: requestedInstallMode, mcpMode: requestedMcpMode, teamMode: requestedTeamMode, scope: requestedScope, verbose = false, setupScopePrompt, persistedSetupReviewPrompt, installModePrompt, modelUpgradePrompt, pluginAgentsMdPrompt, pluginDeveloperInstructionsPrompt, firstPartyMcpRemovalPrompt, } = options;
|
|
1353
|
+
const { force = false, dryRun = false, installMode: requestedInstallMode, mcpMode: requestedMcpMode, teamMode: requestedTeamMode, scope: requestedScope, verbose = false, skipNativeAgentRefresh: requestedSkipNativeAgentRefresh = false, setupScopePrompt, persistedSetupReviewPrompt, installModePrompt, modelUpgradePrompt, pluginAgentsMdPrompt, pluginDeveloperInstructionsPrompt, firstPartyMcpRemovalPrompt, } = options;
|
|
1289
1354
|
const pkgRoot = getPackageRoot();
|
|
1290
1355
|
const projectRoot = process.cwd();
|
|
1291
1356
|
const persistedPreferences = await readPersistedSetupPreferences(projectRoot, { warnOnLegacyScope: true });
|
|
@@ -1324,6 +1389,8 @@ export async function setup(options = {}) {
|
|
|
1324
1389
|
: undefined)
|
|
1325
1390
|
?? "enabled";
|
|
1326
1391
|
const isTeamModeEnabled = teamModeEnabled(resolvedTeamMode);
|
|
1392
|
+
const skipNativeAgentRefresh = requestedSkipNativeAgentRefresh ||
|
|
1393
|
+
process.env[SKIP_NATIVE_AGENT_REFRESH_ENV] === "1";
|
|
1327
1394
|
const scopeDirs = resolveScopeDirectories(resolvedScope.scope, projectRoot);
|
|
1328
1395
|
const existingConfigForMcpMigration = existsSync(scopeDirs.codexConfigFile)
|
|
1329
1396
|
? await readFile(scopeDirs.codexConfigFile, "utf-8")
|
|
@@ -1529,7 +1596,11 @@ export async function setup(options = {}) {
|
|
|
1529
1596
|
}
|
|
1530
1597
|
// Step 4: Install native agent configs
|
|
1531
1598
|
console.log("[4/8] Installing native agent configs...");
|
|
1532
|
-
if (
|
|
1599
|
+
if (skipNativeAgentRefresh) {
|
|
1600
|
+
summary.nativeAgents = createEmptyCategorySummary();
|
|
1601
|
+
console.log(" Native agent refresh skipped for background update-check setup refresh.\n");
|
|
1602
|
+
}
|
|
1603
|
+
else if (isPluginInstallMode) {
|
|
1533
1604
|
summary.nativeAgents = await refreshNativeAgentConfigs(pkgRoot, scopeDirs.nativeAgentsDir, backupContext, {
|
|
1534
1605
|
force,
|
|
1535
1606
|
dryRun,
|
|
@@ -1685,6 +1756,7 @@ export async function setup(options = {}) {
|
|
|
1685
1756
|
const existingHooksContent = existsSync(scopeDirs.codexHooksFile)
|
|
1686
1757
|
? await readFile(scopeDirs.codexHooksFile, "utf-8")
|
|
1687
1758
|
: null;
|
|
1759
|
+
await migrateLegacyHooksJsonTrustStateToConfig(scopeDirs.codexConfigFile, existingHooksContent, backupContext, summary.config, { dryRun, verbose });
|
|
1688
1760
|
const hooksConfig = mergeManagedCodexHooksConfig(existingHooksContent, pkgRoot, scopeDirs.codexHooksFile, { platform: process.platform, codexHomeDir: scopeDirs.codexHomeDir });
|
|
1689
1761
|
await syncManagedContent(hooksConfig, scopeDirs.codexHooksFile, summary.config, backupContext, { dryRun, verbose }, `native hooks ${scopeDirs.codexHooksFile}`);
|
|
1690
1762
|
await syncManagedWindowsNativeHookShim(scopeDirs.codexHomeDir, pkgRoot, summary.config, backupContext, { dryRun, verbose });
|
|
@@ -2067,6 +2139,93 @@ async function syncManagedContent(content, dstPath, summary, backupContext, opti
|
|
|
2067
2139
|
console.log(` ${options.dryRun ? "would update" : "updated"} ${verboseLabel}`);
|
|
2068
2140
|
}
|
|
2069
2141
|
}
|
|
2142
|
+
function hashContent(content) {
|
|
2143
|
+
return createHash("sha256").update(content).digest("hex");
|
|
2144
|
+
}
|
|
2145
|
+
function nativeAgentInstallManifestPath(agentsDir) {
|
|
2146
|
+
return join(agentsDir, "..", ".omx", "native-agents.json");
|
|
2147
|
+
}
|
|
2148
|
+
async function readNativeAgentInstallManifest(agentsDir) {
|
|
2149
|
+
const manifestPath = nativeAgentInstallManifestPath(agentsDir);
|
|
2150
|
+
if (!existsSync(manifestPath))
|
|
2151
|
+
return { version: 1, files: {} };
|
|
2152
|
+
try {
|
|
2153
|
+
const parsed = JSON.parse(await readFile(manifestPath, "utf-8"));
|
|
2154
|
+
if (parsed.version !== 1 ||
|
|
2155
|
+
!parsed.files ||
|
|
2156
|
+
typeof parsed.files !== "object") {
|
|
2157
|
+
return { version: 1, files: {} };
|
|
2158
|
+
}
|
|
2159
|
+
const files = {};
|
|
2160
|
+
for (const [fileName, entry] of Object.entries(parsed.files)) {
|
|
2161
|
+
if (!fileName.endsWith(".toml"))
|
|
2162
|
+
continue;
|
|
2163
|
+
if (!entry || typeof entry !== "object")
|
|
2164
|
+
continue;
|
|
2165
|
+
const sha256 = entry.sha256;
|
|
2166
|
+
if (typeof sha256 === "string" && /^[0-9a-f]{64}$/i.test(sha256)) {
|
|
2167
|
+
files[fileName] = { sha256: sha256.toLowerCase() };
|
|
2168
|
+
}
|
|
2169
|
+
}
|
|
2170
|
+
return { version: 1, files };
|
|
2171
|
+
}
|
|
2172
|
+
catch {
|
|
2173
|
+
return { version: 1, files: {} };
|
|
2174
|
+
}
|
|
2175
|
+
}
|
|
2176
|
+
async function writeNativeAgentInstallManifest(agentsDir, manifest) {
|
|
2177
|
+
const manifestPath = nativeAgentInstallManifestPath(agentsDir);
|
|
2178
|
+
await mkdir(dirname(manifestPath), { recursive: true });
|
|
2179
|
+
const sortedFiles = Object.fromEntries(Object.entries(manifest.files).sort(([left], [right]) => left.localeCompare(right)));
|
|
2180
|
+
await writeFile(manifestPath, JSON.stringify({ version: 1, files: sortedFiles }, null, 2) + "\n");
|
|
2181
|
+
}
|
|
2182
|
+
async function syncNativeAgentToml(content, dstPath, summary, backupContext, options, verboseLabel, manifest) {
|
|
2183
|
+
const fileName = basename(dstPath);
|
|
2184
|
+
const nextHash = hashContent(content);
|
|
2185
|
+
const destinationExists = existsSync(dstPath);
|
|
2186
|
+
if (!destinationExists) {
|
|
2187
|
+
if (!options.dryRun) {
|
|
2188
|
+
await mkdir(dirname(dstPath), { recursive: true });
|
|
2189
|
+
await writeFile(dstPath, content);
|
|
2190
|
+
manifest.files[fileName] = { sha256: nextHash };
|
|
2191
|
+
}
|
|
2192
|
+
summary.updated += 1;
|
|
2193
|
+
if (options.verbose) {
|
|
2194
|
+
console.log(` ${options.dryRun ? "would update" : "updated"} ${verboseLabel}`);
|
|
2195
|
+
}
|
|
2196
|
+
return;
|
|
2197
|
+
}
|
|
2198
|
+
const existing = await readFile(dstPath, "utf-8");
|
|
2199
|
+
const existingHash = hashContent(existing);
|
|
2200
|
+
if (existing === content) {
|
|
2201
|
+
if (!options.dryRun) {
|
|
2202
|
+
manifest.files[fileName] = { sha256: nextHash };
|
|
2203
|
+
}
|
|
2204
|
+
summary.unchanged += 1;
|
|
2205
|
+
return;
|
|
2206
|
+
}
|
|
2207
|
+
const priorHash = manifest.files[fileName]?.sha256;
|
|
2208
|
+
const safeToOverwrite = options.force || priorHash === existingHash;
|
|
2209
|
+
if (!safeToOverwrite) {
|
|
2210
|
+
summary.skipped += 1;
|
|
2211
|
+
if (options.verbose) {
|
|
2212
|
+
console.log(` skipped ${verboseLabel} (local modifications preserved; use --force to overwrite)`);
|
|
2213
|
+
}
|
|
2214
|
+
return;
|
|
2215
|
+
}
|
|
2216
|
+
if (await ensureBackup(dstPath, true, backupContext, options)) {
|
|
2217
|
+
summary.backedUp += 1;
|
|
2218
|
+
}
|
|
2219
|
+
if (!options.dryRun) {
|
|
2220
|
+
await mkdir(dirname(dstPath), { recursive: true });
|
|
2221
|
+
await writeFile(dstPath, content);
|
|
2222
|
+
manifest.files[fileName] = { sha256: nextHash };
|
|
2223
|
+
}
|
|
2224
|
+
summary.updated += 1;
|
|
2225
|
+
if (options.verbose) {
|
|
2226
|
+
console.log(` ${options.dryRun ? "would update" : "updated"} ${verboseLabel}`);
|
|
2227
|
+
}
|
|
2228
|
+
}
|
|
2070
2229
|
async function syncManagedWindowsNativeHookShim(codexHomeDir, pkgRoot, summary, backupContext, options) {
|
|
2071
2230
|
if (process.platform !== "win32")
|
|
2072
2231
|
return;
|
|
@@ -2251,6 +2410,7 @@ async function refreshNativeAgentConfigs(pkgRoot, agentsDir, backupContext, opti
|
|
|
2251
2410
|
if (!options.dryRun) {
|
|
2252
2411
|
await mkdir(agentsDir, { recursive: true });
|
|
2253
2412
|
}
|
|
2413
|
+
const nativeAgentManifest = await readNativeAgentInstallManifest(agentsDir);
|
|
2254
2414
|
const manifest = tryReadCatalogManifest();
|
|
2255
2415
|
const agentStatusByName = manifest
|
|
2256
2416
|
? getCatalogAgentStatusByName(manifest)
|
|
@@ -2285,7 +2445,7 @@ async function refreshNativeAgentConfigs(pkgRoot, agentsDir, backupContext, opti
|
|
|
2285
2445
|
codexHomeOverride: join(agentsDir, ".."),
|
|
2286
2446
|
});
|
|
2287
2447
|
const dst = join(agentsDir, `${name}.toml`);
|
|
2288
|
-
await
|
|
2448
|
+
await syncNativeAgentToml(toml, dst, summary, backupContext, options, `native agent ${name}.toml`, nativeAgentManifest);
|
|
2289
2449
|
}
|
|
2290
2450
|
summary.removed += await cleanupObsoleteNativeAgents(agentsDir, backupContext, options);
|
|
2291
2451
|
if (manifest) {
|
|
@@ -2316,6 +2476,7 @@ async function refreshNativeAgentConfigs(pkgRoot, agentsDir, backupContext, opti
|
|
|
2316
2476
|
}
|
|
2317
2477
|
if (!options.dryRun) {
|
|
2318
2478
|
await rm(staleAgentPath, { force: true });
|
|
2479
|
+
delete nativeAgentManifest.files[file];
|
|
2319
2480
|
}
|
|
2320
2481
|
summary.removed += 1;
|
|
2321
2482
|
if (options.verbose) {
|
|
@@ -2328,6 +2489,9 @@ async function refreshNativeAgentConfigs(pkgRoot, agentsDir, backupContext, opti
|
|
|
2328
2489
|
}
|
|
2329
2490
|
}
|
|
2330
2491
|
}
|
|
2492
|
+
if (!options.dryRun) {
|
|
2493
|
+
await writeNativeAgentInstallManifest(agentsDir, nativeAgentManifest);
|
|
2494
|
+
}
|
|
2331
2495
|
return summary;
|
|
2332
2496
|
}
|
|
2333
2497
|
async function cleanupObsoleteNativeAgents(agentsDir, backupContext, options) {
|