oh-my-codex 0.7.2 → 0.7.3
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/README.md +10 -2
- package/dist/cli/__tests__/session-scoped-runtime.test.js +1 -9
- package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
- package/dist/cli/__tests__/uninstall.test.d.ts +2 -0
- package/dist/cli/__tests__/uninstall.test.d.ts.map +1 -0
- package/dist/cli/__tests__/uninstall.test.js +454 -0
- package/dist/cli/__tests__/uninstall.test.js.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +18 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +1 -1
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/uninstall.d.ts +13 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +317 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/config/__tests__/generator-idempotent.test.d.ts +2 -0
- package/dist/config/__tests__/generator-idempotent.test.d.ts.map +1 -0
- package/dist/config/__tests__/generator-idempotent.test.js +271 -0
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -0
- package/dist/config/generator.d.ts +14 -0
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +107 -2
- package/dist/config/generator.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +54 -0
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +78 -0
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +46 -4
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/task-size-detector.test.js +1 -7
- package/dist/hooks/__tests__/task-size-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/tmux-hook-engine.test.js +11 -0
- package/dist/hooks/__tests__/tmux-hook-engine.test.js.map +1 -1
- package/dist/hooks/keyword-detector.js +1 -1
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/keyword-registry.d.ts.map +1 -1
- package/dist/hooks/keyword-registry.js +0 -3
- package/dist/hooks/keyword-registry.js.map +1 -1
- package/dist/hooks/task-size-detector.d.ts.map +1 -1
- package/dist/hooks/task-size-detector.js +0 -2
- package/dist/hooks/task-size-detector.js.map +1 -1
- package/dist/hud/__tests__/index.test.js +0 -2
- package/dist/hud/__tests__/index.test.js.map +1 -1
- package/dist/hud/__tests__/render.test.js +5 -41
- package/dist/hud/__tests__/render.test.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +0 -15
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/state.d.ts +1 -3
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +2 -12
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/types.d.ts +0 -11
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js.map +1 -1
- package/dist/mcp/__tests__/state-server-schema.test.js +8 -14
- package/dist/mcp/__tests__/state-server-schema.test.js.map +1 -1
- package/dist/mcp/state-server.js +2 -2
- package/dist/mcp/state-server.js.map +1 -1
- package/dist/modes/base.d.ts +9 -2
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +17 -2
- package/dist/modes/base.js.map +1 -1
- package/dist/notifications/__tests__/template-engine.test.js +11 -0
- package/dist/notifications/__tests__/template-engine.test.js.map +1 -1
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +2 -0
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/template-engine.d.ts.map +1 -1
- package/dist/notifications/template-engine.js +3 -0
- package/dist/notifications/template-engine.js.map +1 -1
- package/dist/openclaw/__tests__/dispatcher.test.js +22 -0
- package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -1
- package/dist/openclaw/__tests__/index.test.js +127 -0
- package/dist/openclaw/__tests__/index.test.js.map +1 -1
- package/dist/openclaw/dispatcher.d.ts +3 -0
- package/dist/openclaw/dispatcher.d.ts.map +1 -1
- package/dist/openclaw/dispatcher.js +3 -0
- package/dist/openclaw/dispatcher.js.map +1 -1
- package/dist/openclaw/index.d.ts.map +1 -1
- package/dist/openclaw/index.js +36 -13
- package/dist/openclaw/index.js.map +1 -1
- package/dist/openclaw/types.d.ts +12 -0
- package/dist/openclaw/types.d.ts.map +1 -1
- package/dist/pipeline/__tests__/orchestrator.test.d.ts +2 -0
- package/dist/pipeline/__tests__/orchestrator.test.d.ts.map +1 -0
- package/dist/pipeline/__tests__/orchestrator.test.js +421 -0
- package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -0
- package/dist/pipeline/__tests__/stages.test.d.ts +2 -0
- package/dist/pipeline/__tests__/stages.test.d.ts.map +1 -0
- package/dist/pipeline/__tests__/stages.test.js +199 -0
- package/dist/pipeline/__tests__/stages.test.js.map +1 -0
- package/dist/pipeline/index.d.ts +16 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +13 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/orchestrator.d.ts +50 -0
- package/dist/pipeline/orchestrator.d.ts.map +1 -0
- package/dist/pipeline/orchestrator.js +245 -0
- package/dist/pipeline/orchestrator.js.map +1 -0
- package/dist/pipeline/stages/ralph-verify.d.ts +40 -0
- package/dist/pipeline/stages/ralph-verify.d.ts.map +1 -0
- package/dist/pipeline/stages/ralph-verify.js +62 -0
- package/dist/pipeline/stages/ralph-verify.js.map +1 -0
- package/dist/pipeline/stages/ralplan.d.ts +20 -0
- package/dist/pipeline/stages/ralplan.d.ts.map +1 -0
- package/dist/pipeline/stages/ralplan.js +79 -0
- package/dist/pipeline/stages/ralplan.js.map +1 -0
- package/dist/pipeline/stages/team-exec.d.ts +43 -0
- package/dist/pipeline/stages/team-exec.d.ts.map +1 -0
- package/dist/pipeline/stages/team-exec.js +70 -0
- package/dist/pipeline/stages/team-exec.js.map +1 -0
- package/dist/pipeline/types.d.ts +115 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +8 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/team/__tests__/state.test.js +47 -1
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +102 -11
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +64 -25
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +9 -1
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state.d.ts +1 -0
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +30 -7
- package/dist/team/state.js.map +1 -1
- package/dist/team/team-ops.d.ts +1 -0
- package/dist/team/team-ops.d.ts.map +1 -1
- package/dist/team/team-ops.js +2 -0
- package/dist/team/team-ops.js.map +1 -1
- package/dist/team/tmux-session.d.ts +7 -0
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +93 -8
- package/dist/team/tmux-session.js.map +1 -1
- package/package.json +1 -1
- package/scripts/notify-hook/team-dispatch.js +83 -2
- package/scripts/notify-hook/team-worker.js +78 -6
- package/scripts/tmux-hook-engine.js +12 -7
- package/skills/autopilot/SKILL.md +21 -0
- package/skills/pipeline/SKILL.md +86 -0
- package/skills/team/SKILL.md +22 -1
- package/templates/catalog-manifest.json +1 -1
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* omx uninstall - Remove oh-my-codex configuration and installed artifacts
|
|
3
|
+
*/
|
|
4
|
+
import { readFile, writeFile, readdir, rm } from 'fs/promises';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { join, basename } from 'path';
|
|
7
|
+
import { stripExistingOmxBlocks, stripOmxTopLevelKeys, stripOmxFeatureFlags, } from '../config/generator.js';
|
|
8
|
+
import { getPackageRoot } from '../utils/package.js';
|
|
9
|
+
import { AGENT_DEFINITIONS } from '../agents/definitions.js';
|
|
10
|
+
import { resolveScopeDirectories } from './setup.js';
|
|
11
|
+
import { readPersistedSetupScope } from './index.js';
|
|
12
|
+
const OMX_MCP_SERVERS = ['omx_state', 'omx_memory', 'omx_code_intel', 'omx_trace'];
|
|
13
|
+
function detectOmxConfigArtifacts(config) {
|
|
14
|
+
const hasMcpServers = OMX_MCP_SERVERS.filter((name) => new RegExp(`\\[mcp_servers\\.${name}\\]`).test(config));
|
|
15
|
+
const agentNames = Object.keys(AGENT_DEFINITIONS);
|
|
16
|
+
let hasAgentEntries = 0;
|
|
17
|
+
for (const name of agentNames) {
|
|
18
|
+
const tableKey = name.includes('-') ? `agents."${name}"` : `agents.${name}`;
|
|
19
|
+
if (config.includes(`[${tableKey}]`)) {
|
|
20
|
+
hasAgentEntries++;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const hasTuiSection = /^\[tui\]/m.test(config) &&
|
|
24
|
+
config.includes('oh-my-codex (OMX) Configuration');
|
|
25
|
+
const hasTopLevelKeys = /^\s*notify\s*=.*node/m.test(config) ||
|
|
26
|
+
/^\s*model_reasoning_effort\s*=/m.test(config) ||
|
|
27
|
+
/^\s*developer_instructions\s*=.*oh-my-codex/m.test(config);
|
|
28
|
+
const hasFeatureFlags = /^\s*multi_agent\s*=\s*true/m.test(config) ||
|
|
29
|
+
/^\s*child_agents_md\s*=\s*true/m.test(config);
|
|
30
|
+
return { hasMcpServers, hasAgentEntries, hasTuiSection, hasTopLevelKeys, hasFeatureFlags };
|
|
31
|
+
}
|
|
32
|
+
async function cleanConfig(configPath, options) {
|
|
33
|
+
const result = {
|
|
34
|
+
configCleaned: false,
|
|
35
|
+
mcpServersRemoved: [],
|
|
36
|
+
agentEntriesRemoved: 0,
|
|
37
|
+
tuiSectionRemoved: false,
|
|
38
|
+
topLevelKeysRemoved: false,
|
|
39
|
+
featureFlagsRemoved: false,
|
|
40
|
+
};
|
|
41
|
+
if (!existsSync(configPath)) {
|
|
42
|
+
if (options.verbose)
|
|
43
|
+
console.log(' config.toml not found, skipping.');
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
const original = await readFile(configPath, 'utf-8');
|
|
47
|
+
const detected = detectOmxConfigArtifacts(original);
|
|
48
|
+
result.mcpServersRemoved = detected.hasMcpServers;
|
|
49
|
+
result.agentEntriesRemoved = detected.hasAgentEntries;
|
|
50
|
+
result.tuiSectionRemoved = detected.hasTuiSection;
|
|
51
|
+
result.topLevelKeysRemoved = detected.hasTopLevelKeys;
|
|
52
|
+
result.featureFlagsRemoved = detected.hasFeatureFlags;
|
|
53
|
+
// Strip OMX tables block (MCP servers, agents, tui)
|
|
54
|
+
let config = original;
|
|
55
|
+
const { cleaned } = stripExistingOmxBlocks(config);
|
|
56
|
+
config = cleaned;
|
|
57
|
+
// Strip top-level keys
|
|
58
|
+
config = stripOmxTopLevelKeys(config);
|
|
59
|
+
// Strip feature flags
|
|
60
|
+
config = stripOmxFeatureFlags(config);
|
|
61
|
+
// Normalize trailing whitespace
|
|
62
|
+
config = config.trimEnd() + '\n';
|
|
63
|
+
if (config !== original) {
|
|
64
|
+
result.configCleaned = true;
|
|
65
|
+
if (!options.dryRun) {
|
|
66
|
+
await writeFile(configPath, config);
|
|
67
|
+
}
|
|
68
|
+
if (options.verbose) {
|
|
69
|
+
console.log(` ${options.dryRun ? 'Would clean' : 'Cleaned'} ${configPath}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
if (options.verbose)
|
|
74
|
+
console.log(' No OMX config entries found.');
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
async function removeInstalledPrompts(promptsDir, pkgRoot, options) {
|
|
79
|
+
const srcPromptsDir = join(pkgRoot, 'prompts');
|
|
80
|
+
if (!existsSync(srcPromptsDir) || !existsSync(promptsDir))
|
|
81
|
+
return 0;
|
|
82
|
+
let removed = 0;
|
|
83
|
+
const sourceFiles = await readdir(srcPromptsDir);
|
|
84
|
+
for (const file of sourceFiles) {
|
|
85
|
+
if (!file.endsWith('.md'))
|
|
86
|
+
continue;
|
|
87
|
+
const installed = join(promptsDir, file);
|
|
88
|
+
if (!existsSync(installed))
|
|
89
|
+
continue;
|
|
90
|
+
if (!options.dryRun) {
|
|
91
|
+
await rm(installed, { force: true });
|
|
92
|
+
}
|
|
93
|
+
if (options.verbose)
|
|
94
|
+
console.log(` ${options.dryRun ? 'Would remove' : 'Removed'} prompt: ${file}`);
|
|
95
|
+
removed++;
|
|
96
|
+
}
|
|
97
|
+
return removed;
|
|
98
|
+
}
|
|
99
|
+
async function removeInstalledSkills(skillsDir, pkgRoot, options) {
|
|
100
|
+
const srcSkillsDir = join(pkgRoot, 'skills');
|
|
101
|
+
if (!existsSync(srcSkillsDir) || !existsSync(skillsDir))
|
|
102
|
+
return 0;
|
|
103
|
+
let removed = 0;
|
|
104
|
+
const sourceEntries = await readdir(srcSkillsDir, { withFileTypes: true });
|
|
105
|
+
for (const entry of sourceEntries) {
|
|
106
|
+
if (!entry.isDirectory())
|
|
107
|
+
continue;
|
|
108
|
+
const installed = join(skillsDir, entry.name);
|
|
109
|
+
if (!existsSync(installed))
|
|
110
|
+
continue;
|
|
111
|
+
if (!options.dryRun) {
|
|
112
|
+
await rm(installed, { recursive: true, force: true });
|
|
113
|
+
}
|
|
114
|
+
if (options.verbose)
|
|
115
|
+
console.log(` ${options.dryRun ? 'Would remove' : 'Removed'} skill: ${entry.name}/`);
|
|
116
|
+
removed++;
|
|
117
|
+
}
|
|
118
|
+
return removed;
|
|
119
|
+
}
|
|
120
|
+
async function removeAgentConfigs(agentsDir, options) {
|
|
121
|
+
if (!existsSync(agentsDir))
|
|
122
|
+
return 0;
|
|
123
|
+
let removed = 0;
|
|
124
|
+
const agentNames = Object.keys(AGENT_DEFINITIONS);
|
|
125
|
+
for (const name of agentNames) {
|
|
126
|
+
const configFile = join(agentsDir, `${name}.toml`);
|
|
127
|
+
if (!existsSync(configFile))
|
|
128
|
+
continue;
|
|
129
|
+
if (!options.dryRun) {
|
|
130
|
+
await rm(configFile, { force: true });
|
|
131
|
+
}
|
|
132
|
+
if (options.verbose)
|
|
133
|
+
console.log(` ${options.dryRun ? 'Would remove' : 'Removed'} agent config: ${name}.toml`);
|
|
134
|
+
removed++;
|
|
135
|
+
}
|
|
136
|
+
// If the agents dir is now empty, remove it too
|
|
137
|
+
if (!options.dryRun && existsSync(agentsDir)) {
|
|
138
|
+
try {
|
|
139
|
+
const remaining = await readdir(agentsDir);
|
|
140
|
+
if (remaining.length === 0) {
|
|
141
|
+
await rm(agentsDir, { recursive: true, force: true });
|
|
142
|
+
if (options.verbose)
|
|
143
|
+
console.log(' Removed empty agents directory.');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Ignore errors when cleaning up empty dir
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return removed;
|
|
151
|
+
}
|
|
152
|
+
async function removeAgentsMd(projectRoot, options) {
|
|
153
|
+
const agentsMdPath = join(projectRoot, 'AGENTS.md');
|
|
154
|
+
if (!existsSync(agentsMdPath))
|
|
155
|
+
return false;
|
|
156
|
+
try {
|
|
157
|
+
const content = await readFile(agentsMdPath, 'utf-8');
|
|
158
|
+
// Only remove if it's the OMX-generated template (check for machine-parseable marker
|
|
159
|
+
// or the exact template title line to avoid false positives on user files)
|
|
160
|
+
const isOmxGenerated = content.includes('# oh-my-codex - Intelligent Multi-Agent Orchestration') ||
|
|
161
|
+
content.includes('<!-- omx:generated:agents-md -->');
|
|
162
|
+
if (!isOmxGenerated) {
|
|
163
|
+
if (options.verbose)
|
|
164
|
+
console.log(' AGENTS.md is not OMX-generated, skipping.');
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
if (!options.dryRun) {
|
|
172
|
+
await rm(agentsMdPath, { force: true });
|
|
173
|
+
}
|
|
174
|
+
if (options.verbose)
|
|
175
|
+
console.log(` ${options.dryRun ? 'Would remove' : 'Removed'} AGENTS.md`);
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
async function removeCacheDirectory(projectRoot, options) {
|
|
179
|
+
const omxDir = join(projectRoot, '.omx');
|
|
180
|
+
if (!existsSync(omxDir))
|
|
181
|
+
return false;
|
|
182
|
+
if (!options.dryRun) {
|
|
183
|
+
await rm(omxDir, { recursive: true, force: true });
|
|
184
|
+
}
|
|
185
|
+
if (options.verbose)
|
|
186
|
+
console.log(` ${options.dryRun ? 'Would remove' : 'Removed'} ${omxDir}`);
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
function printSummary(summary, dryRun) {
|
|
190
|
+
const prefix = dryRun ? '[dry-run] Would remove' : 'Removed';
|
|
191
|
+
console.log('\nUninstall summary:');
|
|
192
|
+
if (summary.configCleaned) {
|
|
193
|
+
console.log(` ${prefix} OMX configuration block from config.toml`);
|
|
194
|
+
if (summary.mcpServersRemoved.length > 0) {
|
|
195
|
+
console.log(` MCP servers: ${summary.mcpServersRemoved.join(', ')}`);
|
|
196
|
+
}
|
|
197
|
+
if (summary.agentEntriesRemoved > 0) {
|
|
198
|
+
console.log(` Agent entries: ${summary.agentEntriesRemoved}`);
|
|
199
|
+
}
|
|
200
|
+
if (summary.tuiSectionRemoved) {
|
|
201
|
+
console.log(' TUI status line section');
|
|
202
|
+
}
|
|
203
|
+
if (summary.topLevelKeysRemoved) {
|
|
204
|
+
console.log(' Top-level keys (notify, model_reasoning_effort, developer_instructions)');
|
|
205
|
+
}
|
|
206
|
+
if (summary.featureFlagsRemoved) {
|
|
207
|
+
console.log(' Feature flags (multi_agent, child_agents_md)');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else if (!summary.configCleaned && summary.mcpServersRemoved.length === 0) {
|
|
211
|
+
console.log(' config.toml: no OMX entries found (or --keep-config used)');
|
|
212
|
+
}
|
|
213
|
+
if (summary.promptsRemoved > 0) {
|
|
214
|
+
console.log(` ${prefix} ${summary.promptsRemoved} agent prompt(s)`);
|
|
215
|
+
}
|
|
216
|
+
if (summary.skillsRemoved > 0) {
|
|
217
|
+
console.log(` ${prefix} ${summary.skillsRemoved} skill(s)`);
|
|
218
|
+
}
|
|
219
|
+
if (summary.agentConfigsRemoved > 0) {
|
|
220
|
+
console.log(` ${prefix} ${summary.agentConfigsRemoved} native agent config(s)`);
|
|
221
|
+
}
|
|
222
|
+
if (summary.agentsMdRemoved) {
|
|
223
|
+
console.log(` ${prefix} AGENTS.md`);
|
|
224
|
+
}
|
|
225
|
+
if (summary.cacheDirectoryRemoved) {
|
|
226
|
+
console.log(` ${prefix} .omx/ cache directory`);
|
|
227
|
+
}
|
|
228
|
+
const totalActions = (summary.configCleaned ? 1 : 0) +
|
|
229
|
+
summary.promptsRemoved +
|
|
230
|
+
summary.skillsRemoved +
|
|
231
|
+
summary.agentConfigsRemoved +
|
|
232
|
+
(summary.agentsMdRemoved ? 1 : 0) +
|
|
233
|
+
(summary.cacheDirectoryRemoved ? 1 : 0);
|
|
234
|
+
if (totalActions === 0) {
|
|
235
|
+
console.log(' Nothing to remove. oh-my-codex does not appear to be installed.');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
export async function uninstall(options = {}) {
|
|
239
|
+
const { dryRun = false, keepConfig = false, verbose = false, purge = false, } = options;
|
|
240
|
+
const projectRoot = process.cwd();
|
|
241
|
+
const pkgRoot = getPackageRoot();
|
|
242
|
+
// Resolve scope (explicit --scope overrides persisted scope)
|
|
243
|
+
const scope = options.scope ?? readPersistedSetupScope(projectRoot) ?? 'user';
|
|
244
|
+
const scopeDirs = resolveScopeDirectories(scope, projectRoot);
|
|
245
|
+
console.log('oh-my-codex uninstall');
|
|
246
|
+
console.log('=====================\n');
|
|
247
|
+
if (dryRun) {
|
|
248
|
+
console.log('[dry-run mode] No files will be modified.\n');
|
|
249
|
+
}
|
|
250
|
+
console.log(`Resolved scope: ${scope}\n`);
|
|
251
|
+
const summary = {
|
|
252
|
+
configCleaned: false,
|
|
253
|
+
mcpServersRemoved: [],
|
|
254
|
+
agentEntriesRemoved: 0,
|
|
255
|
+
tuiSectionRemoved: false,
|
|
256
|
+
topLevelKeysRemoved: false,
|
|
257
|
+
featureFlagsRemoved: false,
|
|
258
|
+
promptsRemoved: 0,
|
|
259
|
+
skillsRemoved: 0,
|
|
260
|
+
agentConfigsRemoved: 0,
|
|
261
|
+
agentsMdRemoved: false,
|
|
262
|
+
cacheDirectoryRemoved: false,
|
|
263
|
+
};
|
|
264
|
+
// Step 1: Clean config.toml
|
|
265
|
+
if (keepConfig) {
|
|
266
|
+
console.log('[1/5] Skipping config.toml cleanup (--keep-config).');
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
console.log('[1/5] Cleaning config.toml...');
|
|
270
|
+
const configResult = await cleanConfig(scopeDirs.codexConfigFile, { dryRun, verbose });
|
|
271
|
+
Object.assign(summary, configResult);
|
|
272
|
+
}
|
|
273
|
+
console.log();
|
|
274
|
+
// Step 2: Remove installed prompts
|
|
275
|
+
console.log('[2/5] Removing agent prompts...');
|
|
276
|
+
summary.promptsRemoved = await removeInstalledPrompts(scopeDirs.promptsDir, pkgRoot, { dryRun, verbose });
|
|
277
|
+
console.log(` ${dryRun ? 'Would remove' : 'Removed'} ${summary.promptsRemoved} prompt(s).`);
|
|
278
|
+
console.log();
|
|
279
|
+
// Step 3: Remove native agent configs
|
|
280
|
+
console.log('[3/5] Removing native agent configs...');
|
|
281
|
+
summary.agentConfigsRemoved = await removeAgentConfigs(scopeDirs.nativeAgentsDir, { dryRun, verbose });
|
|
282
|
+
console.log(` ${dryRun ? 'Would remove' : 'Removed'} ${summary.agentConfigsRemoved} agent config(s).`);
|
|
283
|
+
console.log();
|
|
284
|
+
// Step 4: Remove installed skills
|
|
285
|
+
console.log('[4/5] Removing skills...');
|
|
286
|
+
summary.skillsRemoved = await removeInstalledSkills(scopeDirs.skillsDir, pkgRoot, { dryRun, verbose });
|
|
287
|
+
console.log(` ${dryRun ? 'Would remove' : 'Removed'} ${summary.skillsRemoved} skill(s).`);
|
|
288
|
+
console.log();
|
|
289
|
+
// Step 5: Remove AGENTS.md and optionally .omx/ cache directory
|
|
290
|
+
console.log('[5/5] Cleaning up...');
|
|
291
|
+
summary.agentsMdRemoved = await removeAgentsMd(projectRoot, { dryRun, verbose });
|
|
292
|
+
if (purge) {
|
|
293
|
+
summary.cacheDirectoryRemoved = await removeCacheDirectory(projectRoot, { dryRun, verbose });
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
// Always clean up setup-scope.json and hud-config.json
|
|
297
|
+
const scopeFile = join(projectRoot, '.omx', 'setup-scope.json');
|
|
298
|
+
const hudConfig = join(projectRoot, '.omx', 'hud-config.json');
|
|
299
|
+
for (const f of [scopeFile, hudConfig]) {
|
|
300
|
+
if (existsSync(f)) {
|
|
301
|
+
if (!dryRun)
|
|
302
|
+
await rm(f, { force: true });
|
|
303
|
+
if (verbose)
|
|
304
|
+
console.log(` ${dryRun ? 'Would remove' : 'Removed'} ${basename(f)}`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
console.log();
|
|
309
|
+
printSummary(summary, dryRun);
|
|
310
|
+
if (!dryRun) {
|
|
311
|
+
console.log('\noh-my-codex has been uninstalled. Run "omx setup" to reinstall.');
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
console.log('\nRun without --dry-run to apply changes.');
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/cli/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-idempotent.test.d.ts","sourceRoot":"","sources":["../../../src/config/__tests__/generator-idempotent.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotency tests for config.toml generator (issue #384)
|
|
3
|
+
* Verifies that repeated `omx setup` runs do not duplicate OMX sections.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
8
|
+
import { tmpdir } from 'node:os';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { mergeConfig } from '../generator.js';
|
|
11
|
+
/** Count occurrences of a pattern in text */
|
|
12
|
+
function count(text, pattern) {
|
|
13
|
+
return (text.match(pattern) ?? []).length;
|
|
14
|
+
}
|
|
15
|
+
/** Assert the OMX block appears exactly once */
|
|
16
|
+
function assertSingleOmxBlock(toml) {
|
|
17
|
+
assert.equal(count(toml, /# oh-my-codex \(OMX\) Configuration/g), 1, 'OMX marker should appear once');
|
|
18
|
+
assert.equal(count(toml, /# End oh-my-codex/g), 1, 'End marker should appear once');
|
|
19
|
+
assert.equal(count(toml, /^\[mcp_servers\.omx_state\]$/gm), 1, '[mcp_servers.omx_state] should appear once');
|
|
20
|
+
assert.equal(count(toml, /^\[mcp_servers\.omx_memory\]$/gm), 1, '[mcp_servers.omx_memory] should appear once');
|
|
21
|
+
assert.equal(count(toml, /^\[mcp_servers\.omx_code_intel\]$/gm), 1, '[mcp_servers.omx_code_intel] should appear once');
|
|
22
|
+
assert.equal(count(toml, /^\[mcp_servers\.omx_trace\]$/gm), 1, '[mcp_servers.omx_trace] should appear once');
|
|
23
|
+
assert.equal(count(toml, /^\[tui\]$/gm), 1, '[tui] should appear once');
|
|
24
|
+
assert.equal(count(toml, /^\[features\]$/gm), 1, '[features] should appear once');
|
|
25
|
+
assert.equal(count(toml, /^notify\s*=/gm), 1, 'notify key should appear once');
|
|
26
|
+
assert.equal(count(toml, /^model_reasoning_effort\s*=/gm), 1, 'model_reasoning_effort should appear once');
|
|
27
|
+
assert.equal(count(toml, /^developer_instructions\s*=/gm), 1, 'developer_instructions should appear once');
|
|
28
|
+
}
|
|
29
|
+
describe('config generator idempotency (#384)', () => {
|
|
30
|
+
it('first run creates config with all OMX sections', async () => {
|
|
31
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-idem-'));
|
|
32
|
+
try {
|
|
33
|
+
const configPath = join(wd, 'config.toml');
|
|
34
|
+
await mergeConfig(configPath, wd);
|
|
35
|
+
const toml = await readFile(configPath, 'utf-8');
|
|
36
|
+
assertSingleOmxBlock(toml);
|
|
37
|
+
assert.match(toml, /^multi_agent = true$/m);
|
|
38
|
+
assert.match(toml, /^child_agents_md = true$/m);
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await rm(wd, { recursive: true, force: true });
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
it('second run updates without duplicating any section', async () => {
|
|
45
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-idem-'));
|
|
46
|
+
try {
|
|
47
|
+
const configPath = join(wd, 'config.toml');
|
|
48
|
+
// First run
|
|
49
|
+
await mergeConfig(configPath, wd);
|
|
50
|
+
const first = await readFile(configPath, 'utf-8');
|
|
51
|
+
assertSingleOmxBlock(first);
|
|
52
|
+
// Second run
|
|
53
|
+
await mergeConfig(configPath, wd);
|
|
54
|
+
const second = await readFile(configPath, 'utf-8');
|
|
55
|
+
assertSingleOmxBlock(second);
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
await rm(wd, { recursive: true, force: true });
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
it('triple run stays clean', async () => {
|
|
62
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-idem-'));
|
|
63
|
+
try {
|
|
64
|
+
const configPath = join(wd, 'config.toml');
|
|
65
|
+
await mergeConfig(configPath, wd);
|
|
66
|
+
await mergeConfig(configPath, wd);
|
|
67
|
+
await mergeConfig(configPath, wd);
|
|
68
|
+
const toml = await readFile(configPath, 'utf-8');
|
|
69
|
+
assertSingleOmxBlock(toml);
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await rm(wd, { recursive: true, force: true });
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
it('cleans up legacy config without markers', async () => {
|
|
76
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-idem-'));
|
|
77
|
+
try {
|
|
78
|
+
const configPath = join(wd, 'config.toml');
|
|
79
|
+
// Simulate a legacy config written without OMX markers
|
|
80
|
+
// Note: [tui] is intentionally excluded — orphan-strip does not
|
|
81
|
+
// claim [tui] to avoid deleting user-owned TUI settings.
|
|
82
|
+
const legacy = [
|
|
83
|
+
'model = "o3"',
|
|
84
|
+
'',
|
|
85
|
+
'notify = ["node", "/old/path/notify-hook.js"]',
|
|
86
|
+
'model_reasoning_effort = "high"',
|
|
87
|
+
'developer_instructions = "old instructions"',
|
|
88
|
+
'',
|
|
89
|
+
'[features]',
|
|
90
|
+
'multi_agent = true',
|
|
91
|
+
'',
|
|
92
|
+
'[mcp_servers.omx_state]',
|
|
93
|
+
'command = "node"',
|
|
94
|
+
'args = ["/old/path/state-server.js"]',
|
|
95
|
+
'enabled = true',
|
|
96
|
+
'',
|
|
97
|
+
'[mcp_servers.omx_memory]',
|
|
98
|
+
'command = "node"',
|
|
99
|
+
'args = ["/old/path/memory-server.js"]',
|
|
100
|
+
'enabled = true',
|
|
101
|
+
'',
|
|
102
|
+
'[user.custom]',
|
|
103
|
+
'name = "kept"',
|
|
104
|
+
'',
|
|
105
|
+
].join('\n');
|
|
106
|
+
await writeFile(configPath, legacy);
|
|
107
|
+
await mergeConfig(configPath, wd);
|
|
108
|
+
const toml = await readFile(configPath, 'utf-8');
|
|
109
|
+
assertSingleOmxBlock(toml);
|
|
110
|
+
// User settings preserved
|
|
111
|
+
assert.match(toml, /^model = "o3"$/m, 'user model preserved');
|
|
112
|
+
assert.match(toml, /^\[user\.custom\]$/m, 'user section preserved');
|
|
113
|
+
assert.match(toml, /^name = "kept"$/m, 'user key preserved');
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
await rm(wd, { recursive: true, force: true });
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
it('cleans up orphaned OMX sections outside marker block', async () => {
|
|
120
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-idem-'));
|
|
121
|
+
try {
|
|
122
|
+
const configPath = join(wd, 'config.toml');
|
|
123
|
+
// Config with both orphaned sections AND a marker block
|
|
124
|
+
const mixed = [
|
|
125
|
+
'model = "o3"',
|
|
126
|
+
'',
|
|
127
|
+
'# OMX State Management MCP Server',
|
|
128
|
+
'[mcp_servers.omx_state]',
|
|
129
|
+
'command = "node"',
|
|
130
|
+
'args = ["/orphaned/state-server.js"]',
|
|
131
|
+
'enabled = true',
|
|
132
|
+
'',
|
|
133
|
+
'[user.settings]',
|
|
134
|
+
'name = "kept"',
|
|
135
|
+
'',
|
|
136
|
+
'# ============================================================',
|
|
137
|
+
'# oh-my-codex (OMX) Configuration',
|
|
138
|
+
'# Managed by omx setup',
|
|
139
|
+
'# ============================================================',
|
|
140
|
+
'',
|
|
141
|
+
'[mcp_servers.omx_state]',
|
|
142
|
+
'command = "node"',
|
|
143
|
+
'args = ["/marker-block/state-server.js"]',
|
|
144
|
+
'enabled = true',
|
|
145
|
+
'',
|
|
146
|
+
'# ============================================================',
|
|
147
|
+
'# End oh-my-codex',
|
|
148
|
+
'',
|
|
149
|
+
].join('\n');
|
|
150
|
+
await writeFile(configPath, mixed);
|
|
151
|
+
await mergeConfig(configPath, wd);
|
|
152
|
+
const toml = await readFile(configPath, 'utf-8');
|
|
153
|
+
assertSingleOmxBlock(toml);
|
|
154
|
+
assert.match(toml, /^model = "o3"$/m, 'user model preserved');
|
|
155
|
+
assert.match(toml, /^\[user\.settings\]$/m, 'user section preserved');
|
|
156
|
+
assert.match(toml, /^name = "kept"$/m, 'user key preserved');
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
await rm(wd, { recursive: true, force: true });
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
it('preserves user content between OMX re-runs', async () => {
|
|
163
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-idem-'));
|
|
164
|
+
try {
|
|
165
|
+
const configPath = join(wd, 'config.toml');
|
|
166
|
+
// First run
|
|
167
|
+
await mergeConfig(configPath, wd);
|
|
168
|
+
// User adds content
|
|
169
|
+
let toml = await readFile(configPath, 'utf-8');
|
|
170
|
+
toml += '\n[user.prefs]\ntheme = "dark"\n';
|
|
171
|
+
await writeFile(configPath, toml);
|
|
172
|
+
// Second run
|
|
173
|
+
await mergeConfig(configPath, wd);
|
|
174
|
+
const result = await readFile(configPath, 'utf-8');
|
|
175
|
+
assertSingleOmxBlock(result);
|
|
176
|
+
assert.match(result, /^\[user\.prefs\]$/m, 'user section preserved after re-run');
|
|
177
|
+
assert.match(result, /^theme = "dark"$/m, 'user key preserved after re-run');
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
await rm(wd, { recursive: true, force: true });
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
it('handles config with only orphaned agents sections', async () => {
|
|
184
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-idem-'));
|
|
185
|
+
try {
|
|
186
|
+
const configPath = join(wd, 'config.toml');
|
|
187
|
+
const orphanedAgents = [
|
|
188
|
+
'[features]',
|
|
189
|
+
'multi_agent = true',
|
|
190
|
+
'',
|
|
191
|
+
'# OMX Native Agent Roles (Codex multi-agent)',
|
|
192
|
+
'',
|
|
193
|
+
'[agents.executor]',
|
|
194
|
+
'description = "old executor"',
|
|
195
|
+
'config_file = "/old/path/executor.toml"',
|
|
196
|
+
'',
|
|
197
|
+
'[agents.explore]',
|
|
198
|
+
'description = "old explore"',
|
|
199
|
+
'config_file = "/old/path/explore.toml"',
|
|
200
|
+
'',
|
|
201
|
+
'[user.custom]',
|
|
202
|
+
'name = "kept"',
|
|
203
|
+
'',
|
|
204
|
+
].join('\n');
|
|
205
|
+
await writeFile(configPath, orphanedAgents);
|
|
206
|
+
await mergeConfig(configPath, wd);
|
|
207
|
+
const toml = await readFile(configPath, 'utf-8');
|
|
208
|
+
assertSingleOmxBlock(toml);
|
|
209
|
+
assert.match(toml, /^\[user\.custom\]$/m, 'user section preserved');
|
|
210
|
+
assert.match(toml, /^name = "kept"$/m, 'user key preserved');
|
|
211
|
+
// Verify agents appear only inside the OMX block
|
|
212
|
+
const omxBlockStart = toml.indexOf('# oh-my-codex (OMX) Configuration');
|
|
213
|
+
const agentIdx = toml.indexOf('[agents.executor]');
|
|
214
|
+
assert.ok(agentIdx > omxBlockStart, 'agents.executor should be inside OMX block');
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
await rm(wd, { recursive: true, force: true });
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
it('preserves non-OMX agent sections', async () => {
|
|
221
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-idem-'));
|
|
222
|
+
try {
|
|
223
|
+
const configPath = join(wd, 'config.toml');
|
|
224
|
+
const userAgents = [
|
|
225
|
+
'[agents."my-custom-bot"]',
|
|
226
|
+
'description = "My custom agent"',
|
|
227
|
+
'config_file = "/home/user/my-bot.toml"',
|
|
228
|
+
'',
|
|
229
|
+
'[agents.myreviewer]',
|
|
230
|
+
'description = "Company code reviewer"',
|
|
231
|
+
'config_file = "/home/user/reviewer.toml"',
|
|
232
|
+
'',
|
|
233
|
+
].join('\n');
|
|
234
|
+
await writeFile(configPath, userAgents);
|
|
235
|
+
await mergeConfig(configPath, wd);
|
|
236
|
+
const toml = await readFile(configPath, 'utf-8');
|
|
237
|
+
// User-defined agents must survive
|
|
238
|
+
assert.match(toml, /^\[agents\."my-custom-bot"\]$/m, 'user agent my-custom-bot preserved');
|
|
239
|
+
assert.match(toml, /^description = "My custom agent"$/m, 'user agent description preserved');
|
|
240
|
+
assert.match(toml, /^\[agents\.myreviewer\]$/m, 'user agent myreviewer preserved');
|
|
241
|
+
assert.match(toml, /^description = "Company code reviewer"$/m, 'user agent description preserved');
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
await rm(wd, { recursive: true, force: true });
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
it('preserves user [tui] section (not claimed by orphan-strip)', async () => {
|
|
248
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-idem-'));
|
|
249
|
+
try {
|
|
250
|
+
const configPath = join(wd, 'config.toml');
|
|
251
|
+
// User has their own [tui] settings before OMX was installed
|
|
252
|
+
const userTui = [
|
|
253
|
+
'[tui]',
|
|
254
|
+
'status_line = ["git-branch"]',
|
|
255
|
+
'',
|
|
256
|
+
].join('\n');
|
|
257
|
+
await writeFile(configPath, userTui);
|
|
258
|
+
await mergeConfig(configPath, wd);
|
|
259
|
+
const toml = await readFile(configPath, 'utf-8');
|
|
260
|
+
// User's [tui] is preserved (not stripped by orphan-strip).
|
|
261
|
+
// The OMX block also writes [tui], so there will be 2 — this is a
|
|
262
|
+
// known limitation for legacy markerless configs. Full convergence
|
|
263
|
+
// requires either renaming the OMX TUI key or a merge strategy.
|
|
264
|
+
assert.match(toml, /status_line = \["git-branch"\]/, 'user tui setting preserved');
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
await rm(wd, { recursive: true, force: true });
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
//# sourceMappingURL=generator-idempotent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-idempotent.test.js","sourceRoot":"","sources":["../../../src/config/__tests__/generator-idempotent.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,6CAA6C;AAC7C,SAAS,KAAK,CAAC,IAAY,EAAE,OAAe;IAC1C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AAED,gDAAgD;AAChD,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,sCAAsC,CAAC,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;IACtG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;IACpF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,gCAAgC,CAAC,EAAE,CAAC,EAAE,4CAA4C,CAAC,CAAC;IAC7G,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,iCAAiC,CAAC,EAAE,CAAC,EAAE,6CAA6C,CAAC,CAAC;IAC/G,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,qCAAqC,CAAC,EAAE,CAAC,EAAE,iDAAiD,CAAC,CAAC;IACvH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,gCAAgC,CAAC,EAAE,CAAC,EAAE,4CAA4C,CAAC,CAAC;IAC7G,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,0BAA0B,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;IAClF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;IAC/E,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,+BAA+B,CAAC,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC;IAC3G,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,+BAA+B,CAAC,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC;AAC7G,CAAC;AAED,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC3C,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEjD,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAE3C,YAAY;YACZ,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAClD,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAE5B,aAAa;YACb,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACnD,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAE3C,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAElC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACjD,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC3C,uDAAuD;YACvD,gEAAgE;YAChE,yDAAyD;YACzD,MAAM,MAAM,GAAG;gBACb,cAAc;gBACd,EAAE;gBACF,+CAA+C;gBAC/C,iCAAiC;gBACjC,6CAA6C;gBAC7C,EAAE;gBACF,YAAY;gBACZ,oBAAoB;gBACpB,EAAE;gBACF,yBAAyB;gBACzB,kBAAkB;gBAClB,sCAAsC;gBACtC,gBAAgB;gBAChB,EAAE;gBACF,0BAA0B;gBAC1B,kBAAkB;gBAClB,uCAAuC;gBACvC,gBAAgB;gBAChB,EAAE;gBACF,eAAe;gBACf,eAAe;gBACf,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAEpC,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEjD,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAE3B,0BAA0B;YAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,qBAAqB,EAAE,wBAAwB,CAAC,CAAC;YACpE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;QAC/D,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC3C,wDAAwD;YACxD,MAAM,KAAK,GAAG;gBACZ,cAAc;gBACd,EAAE;gBACF,mCAAmC;gBACnC,yBAAyB;gBACzB,kBAAkB;gBAClB,sCAAsC;gBACtC,gBAAgB;gBAChB,EAAE;gBACF,iBAAiB;gBACjB,eAAe;gBACf,EAAE;gBACF,gEAAgE;gBAChE,mCAAmC;gBACnC,wBAAwB;gBACxB,gEAAgE;gBAChE,EAAE;gBACF,yBAAyB;gBACzB,kBAAkB;gBAClB,0CAA0C;gBAC1C,gBAAgB;gBAChB,EAAE;gBACF,gEAAgE;gBAChE,mBAAmB;gBACnB,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAEnC,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEjD,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,uBAAuB,EAAE,wBAAwB,CAAC,CAAC;YACtE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;QAC/D,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAE3C,YAAY;YACZ,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAElC,oBAAoB;YACpB,IAAI,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,IAAI,kCAAkC,CAAC;YAC3C,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAElC,aAAa;YACb,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEnD,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,EAAE,qCAAqC,CAAC,CAAC;YAClF,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,mBAAmB,EAAE,iCAAiC,CAAC,CAAC;QAC/E,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC3C,MAAM,cAAc,GAAG;gBACrB,YAAY;gBACZ,oBAAoB;gBACpB,EAAE;gBACF,8CAA8C;gBAC9C,EAAE;gBACF,mBAAmB;gBACnB,8BAA8B;gBAC9B,yCAAyC;gBACzC,EAAE;gBACF,kBAAkB;gBAClB,6BAA6B;gBAC7B,wCAAwC;gBACxC,EAAE;gBACF,eAAe;gBACf,eAAe;gBACf,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,SAAS,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YAE5C,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEjD,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,qBAAqB,EAAE,wBAAwB,CAAC,CAAC;YACpE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;YAE7D,iDAAiD;YACjD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACnD,MAAM,CAAC,EAAE,CAAC,QAAQ,GAAG,aAAa,EAAE,4CAA4C,CAAC,CAAC;QACpF,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC3C,MAAM,UAAU,GAAG;gBACjB,0BAA0B;gBAC1B,iCAAiC;gBACjC,wCAAwC;gBACxC,EAAE;gBACF,qBAAqB;gBACrB,uCAAuC;gBACvC,0CAA0C;gBAC1C,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAExC,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEjD,mCAAmC;YACnC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,gCAAgC,EAAE,oCAAoC,CAAC,CAAC;YAC3F,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,oCAAoC,EAAE,kCAAkC,CAAC,CAAC;YAC7F,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,2BAA2B,EAAE,iCAAiC,CAAC,CAAC;YACnF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,0CAA0C,EAAE,kCAAkC,CAAC,CAAC;QACrG,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC3C,6DAA6D;YAC7D,MAAM,OAAO,GAAG;gBACd,OAAO;gBACP,8BAA8B;gBAC9B,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAErC,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEjD,4DAA4D;YAC5D,kEAAkE;YAClE,mEAAmE;YACnE,gEAAgE;YAChE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,gCAAgC,EAAE,4BAA4B,CAAC,CAAC;QACrF,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -13,6 +13,20 @@ interface MergeOptions {
|
|
|
13
13
|
agentsConfigDir?: string;
|
|
14
14
|
verbose?: boolean;
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Remove any existing OMX-owned top-level keys so we can re-insert them
|
|
18
|
+
* cleanly. Also removes the comment line that precedes them.
|
|
19
|
+
*/
|
|
20
|
+
export declare function stripOmxTopLevelKeys(config: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Remove OMX-owned feature flags from the [features] section.
|
|
23
|
+
* If the section becomes empty after removal, remove the section header too.
|
|
24
|
+
*/
|
|
25
|
+
export declare function stripOmxFeatureFlags(config: string): string;
|
|
26
|
+
export declare function stripExistingOmxBlocks(config: string): {
|
|
27
|
+
cleaned: string;
|
|
28
|
+
removed: number;
|
|
29
|
+
};
|
|
16
30
|
/**
|
|
17
31
|
* Merge OMX config into existing config.toml
|
|
18
32
|
* Preserves existing user settings, appends OMX block if not present.
|