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.
Files changed (150) hide show
  1. package/README.md +10 -2
  2. package/dist/cli/__tests__/session-scoped-runtime.test.js +1 -9
  3. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  4. package/dist/cli/__tests__/uninstall.test.d.ts +2 -0
  5. package/dist/cli/__tests__/uninstall.test.d.ts.map +1 -0
  6. package/dist/cli/__tests__/uninstall.test.js +454 -0
  7. package/dist/cli/__tests__/uninstall.test.js.map +1 -0
  8. package/dist/cli/index.d.ts +1 -1
  9. package/dist/cli/index.d.ts.map +1 -1
  10. package/dist/cli/index.js +18 -6
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cli/setup.d.ts +8 -0
  13. package/dist/cli/setup.d.ts.map +1 -1
  14. package/dist/cli/setup.js +1 -1
  15. package/dist/cli/setup.js.map +1 -1
  16. package/dist/cli/uninstall.d.ts +13 -0
  17. package/dist/cli/uninstall.d.ts.map +1 -0
  18. package/dist/cli/uninstall.js +317 -0
  19. package/dist/cli/uninstall.js.map +1 -0
  20. package/dist/config/__tests__/generator-idempotent.test.d.ts +2 -0
  21. package/dist/config/__tests__/generator-idempotent.test.d.ts.map +1 -0
  22. package/dist/config/__tests__/generator-idempotent.test.js +271 -0
  23. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -0
  24. package/dist/config/generator.d.ts +14 -0
  25. package/dist/config/generator.d.ts.map +1 -1
  26. package/dist/config/generator.js +107 -2
  27. package/dist/config/generator.js.map +1 -1
  28. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +54 -0
  29. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
  30. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +78 -0
  31. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  32. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +46 -4
  33. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  34. package/dist/hooks/__tests__/task-size-detector.test.js +1 -7
  35. package/dist/hooks/__tests__/task-size-detector.test.js.map +1 -1
  36. package/dist/hooks/__tests__/tmux-hook-engine.test.js +11 -0
  37. package/dist/hooks/__tests__/tmux-hook-engine.test.js.map +1 -1
  38. package/dist/hooks/keyword-detector.js +1 -1
  39. package/dist/hooks/keyword-detector.js.map +1 -1
  40. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  41. package/dist/hooks/keyword-registry.js +0 -3
  42. package/dist/hooks/keyword-registry.js.map +1 -1
  43. package/dist/hooks/task-size-detector.d.ts.map +1 -1
  44. package/dist/hooks/task-size-detector.js +0 -2
  45. package/dist/hooks/task-size-detector.js.map +1 -1
  46. package/dist/hud/__tests__/index.test.js +0 -2
  47. package/dist/hud/__tests__/index.test.js.map +1 -1
  48. package/dist/hud/__tests__/render.test.js +5 -41
  49. package/dist/hud/__tests__/render.test.js.map +1 -1
  50. package/dist/hud/render.d.ts.map +1 -1
  51. package/dist/hud/render.js +0 -15
  52. package/dist/hud/render.js.map +1 -1
  53. package/dist/hud/state.d.ts +1 -3
  54. package/dist/hud/state.d.ts.map +1 -1
  55. package/dist/hud/state.js +2 -12
  56. package/dist/hud/state.js.map +1 -1
  57. package/dist/hud/types.d.ts +0 -11
  58. package/dist/hud/types.d.ts.map +1 -1
  59. package/dist/hud/types.js.map +1 -1
  60. package/dist/mcp/__tests__/state-server-schema.test.js +8 -14
  61. package/dist/mcp/__tests__/state-server-schema.test.js.map +1 -1
  62. package/dist/mcp/state-server.js +2 -2
  63. package/dist/mcp/state-server.js.map +1 -1
  64. package/dist/modes/base.d.ts +9 -2
  65. package/dist/modes/base.d.ts.map +1 -1
  66. package/dist/modes/base.js +17 -2
  67. package/dist/modes/base.js.map +1 -1
  68. package/dist/notifications/__tests__/template-engine.test.js +11 -0
  69. package/dist/notifications/__tests__/template-engine.test.js.map +1 -1
  70. package/dist/notifications/index.d.ts.map +1 -1
  71. package/dist/notifications/index.js +2 -0
  72. package/dist/notifications/index.js.map +1 -1
  73. package/dist/notifications/template-engine.d.ts.map +1 -1
  74. package/dist/notifications/template-engine.js +3 -0
  75. package/dist/notifications/template-engine.js.map +1 -1
  76. package/dist/openclaw/__tests__/dispatcher.test.js +22 -0
  77. package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -1
  78. package/dist/openclaw/__tests__/index.test.js +127 -0
  79. package/dist/openclaw/__tests__/index.test.js.map +1 -1
  80. package/dist/openclaw/dispatcher.d.ts +3 -0
  81. package/dist/openclaw/dispatcher.d.ts.map +1 -1
  82. package/dist/openclaw/dispatcher.js +3 -0
  83. package/dist/openclaw/dispatcher.js.map +1 -1
  84. package/dist/openclaw/index.d.ts.map +1 -1
  85. package/dist/openclaw/index.js +36 -13
  86. package/dist/openclaw/index.js.map +1 -1
  87. package/dist/openclaw/types.d.ts +12 -0
  88. package/dist/openclaw/types.d.ts.map +1 -1
  89. package/dist/pipeline/__tests__/orchestrator.test.d.ts +2 -0
  90. package/dist/pipeline/__tests__/orchestrator.test.d.ts.map +1 -0
  91. package/dist/pipeline/__tests__/orchestrator.test.js +421 -0
  92. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -0
  93. package/dist/pipeline/__tests__/stages.test.d.ts +2 -0
  94. package/dist/pipeline/__tests__/stages.test.d.ts.map +1 -0
  95. package/dist/pipeline/__tests__/stages.test.js +199 -0
  96. package/dist/pipeline/__tests__/stages.test.js.map +1 -0
  97. package/dist/pipeline/index.d.ts +16 -0
  98. package/dist/pipeline/index.d.ts.map +1 -0
  99. package/dist/pipeline/index.js +13 -0
  100. package/dist/pipeline/index.js.map +1 -0
  101. package/dist/pipeline/orchestrator.d.ts +50 -0
  102. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  103. package/dist/pipeline/orchestrator.js +245 -0
  104. package/dist/pipeline/orchestrator.js.map +1 -0
  105. package/dist/pipeline/stages/ralph-verify.d.ts +40 -0
  106. package/dist/pipeline/stages/ralph-verify.d.ts.map +1 -0
  107. package/dist/pipeline/stages/ralph-verify.js +62 -0
  108. package/dist/pipeline/stages/ralph-verify.js.map +1 -0
  109. package/dist/pipeline/stages/ralplan.d.ts +20 -0
  110. package/dist/pipeline/stages/ralplan.d.ts.map +1 -0
  111. package/dist/pipeline/stages/ralplan.js +79 -0
  112. package/dist/pipeline/stages/ralplan.js.map +1 -0
  113. package/dist/pipeline/stages/team-exec.d.ts +43 -0
  114. package/dist/pipeline/stages/team-exec.d.ts.map +1 -0
  115. package/dist/pipeline/stages/team-exec.js +70 -0
  116. package/dist/pipeline/stages/team-exec.js.map +1 -0
  117. package/dist/pipeline/types.d.ts +115 -0
  118. package/dist/pipeline/types.d.ts.map +1 -0
  119. package/dist/pipeline/types.js +8 -0
  120. package/dist/pipeline/types.js.map +1 -0
  121. package/dist/team/__tests__/state.test.js +47 -1
  122. package/dist/team/__tests__/state.test.js.map +1 -1
  123. package/dist/team/__tests__/tmux-session.test.js +102 -11
  124. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  125. package/dist/team/runtime.d.ts.map +1 -1
  126. package/dist/team/runtime.js +64 -25
  127. package/dist/team/runtime.js.map +1 -1
  128. package/dist/team/scaling.d.ts.map +1 -1
  129. package/dist/team/scaling.js +9 -1
  130. package/dist/team/scaling.js.map +1 -1
  131. package/dist/team/state.d.ts +1 -0
  132. package/dist/team/state.d.ts.map +1 -1
  133. package/dist/team/state.js +30 -7
  134. package/dist/team/state.js.map +1 -1
  135. package/dist/team/team-ops.d.ts +1 -0
  136. package/dist/team/team-ops.d.ts.map +1 -1
  137. package/dist/team/team-ops.js +2 -0
  138. package/dist/team/team-ops.js.map +1 -1
  139. package/dist/team/tmux-session.d.ts +7 -0
  140. package/dist/team/tmux-session.d.ts.map +1 -1
  141. package/dist/team/tmux-session.js +93 -8
  142. package/dist/team/tmux-session.js.map +1 -1
  143. package/package.json +1 -1
  144. package/scripts/notify-hook/team-dispatch.js +83 -2
  145. package/scripts/notify-hook/team-worker.js +78 -6
  146. package/scripts/tmux-hook-engine.js +12 -7
  147. package/skills/autopilot/SKILL.md +21 -0
  148. package/skills/pipeline/SKILL.md +86 -0
  149. package/skills/team/SKILL.md +22 -1
  150. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generator-idempotent.test.d.ts.map
@@ -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":"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"}
@@ -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.