oh-my-codex 0.1.1

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 (182) hide show
  1. package/README.md +269 -0
  2. package/bin/omx.js +25 -0
  3. package/dist/agents/definitions.d.ts +22 -0
  4. package/dist/agents/definitions.d.ts.map +1 -0
  5. package/dist/agents/definitions.js +235 -0
  6. package/dist/agents/definitions.js.map +1 -0
  7. package/dist/cli/doctor.d.ts +11 -0
  8. package/dist/cli/doctor.d.ts.map +1 -0
  9. package/dist/cli/doctor.js +157 -0
  10. package/dist/cli/doctor.js.map +1 -0
  11. package/dist/cli/index.d.ts +6 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +266 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/setup.d.ts +12 -0
  16. package/dist/cli/setup.d.ts.map +1 -0
  17. package/dist/cli/setup.js +175 -0
  18. package/dist/cli/setup.js.map +1 -0
  19. package/dist/cli/version.d.ts +2 -0
  20. package/dist/cli/version.d.ts.map +1 -0
  21. package/dist/cli/version.js +17 -0
  22. package/dist/cli/version.js.map +1 -0
  23. package/dist/config/generator.d.ts +14 -0
  24. package/dist/config/generator.d.ts.map +1 -0
  25. package/dist/config/generator.js +106 -0
  26. package/dist/config/generator.js.map +1 -0
  27. package/dist/hooks/__tests__/agents-overlay.test.d.ts +8 -0
  28. package/dist/hooks/__tests__/agents-overlay.test.d.ts.map +1 -0
  29. package/dist/hooks/__tests__/agents-overlay.test.js +148 -0
  30. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -0
  31. package/dist/hooks/agents-overlay.d.ts +34 -0
  32. package/dist/hooks/agents-overlay.d.ts.map +1 -0
  33. package/dist/hooks/agents-overlay.js +265 -0
  34. package/dist/hooks/agents-overlay.js.map +1 -0
  35. package/dist/hooks/emulator.d.ts +44 -0
  36. package/dist/hooks/emulator.d.ts.map +1 -0
  37. package/dist/hooks/emulator.js +108 -0
  38. package/dist/hooks/emulator.js.map +1 -0
  39. package/dist/hooks/keyword-detector.d.ts +27 -0
  40. package/dist/hooks/keyword-detector.d.ts.map +1 -0
  41. package/dist/hooks/keyword-detector.js +63 -0
  42. package/dist/hooks/keyword-detector.js.map +1 -0
  43. package/dist/hooks/session.d.ts +38 -0
  44. package/dist/hooks/session.d.ts.map +1 -0
  45. package/dist/hooks/session.js +135 -0
  46. package/dist/hooks/session.js.map +1 -0
  47. package/dist/hud/colors.d.ts +26 -0
  48. package/dist/hud/colors.d.ts.map +1 -0
  49. package/dist/hud/colors.js +71 -0
  50. package/dist/hud/colors.js.map +1 -0
  51. package/dist/hud/index.d.ts +12 -0
  52. package/dist/hud/index.d.ts.map +1 -0
  53. package/dist/hud/index.js +107 -0
  54. package/dist/hud/index.js.map +1 -0
  55. package/dist/hud/render.d.ts +9 -0
  56. package/dist/hud/render.d.ts.map +1 -0
  57. package/dist/hud/render.js +192 -0
  58. package/dist/hud/render.js.map +1 -0
  59. package/dist/hud/state.d.ts +21 -0
  60. package/dist/hud/state.d.ts.map +1 -0
  61. package/dist/hud/state.js +101 -0
  62. package/dist/hud/state.js.map +1 -0
  63. package/dist/hud/types.d.ts +87 -0
  64. package/dist/hud/types.d.ts.map +1 -0
  65. package/dist/hud/types.js +8 -0
  66. package/dist/hud/types.js.map +1 -0
  67. package/dist/index.d.ts +18 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +18 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/mcp/code-intel-server.d.ts +7 -0
  72. package/dist/mcp/code-intel-server.d.ts.map +1 -0
  73. package/dist/mcp/code-intel-server.js +567 -0
  74. package/dist/mcp/code-intel-server.js.map +1 -0
  75. package/dist/mcp/memory-server.d.ts +7 -0
  76. package/dist/mcp/memory-server.d.ts.map +1 -0
  77. package/dist/mcp/memory-server.js +359 -0
  78. package/dist/mcp/memory-server.js.map +1 -0
  79. package/dist/mcp/state-server.d.ts +7 -0
  80. package/dist/mcp/state-server.d.ts.map +1 -0
  81. package/dist/mcp/state-server.js +181 -0
  82. package/dist/mcp/state-server.js.map +1 -0
  83. package/dist/mcp/trace-server.d.ts +7 -0
  84. package/dist/mcp/trace-server.d.ts.map +1 -0
  85. package/dist/mcp/trace-server.js +205 -0
  86. package/dist/mcp/trace-server.js.map +1 -0
  87. package/dist/modes/base.d.ts +50 -0
  88. package/dist/modes/base.d.ts.map +1 -0
  89. package/dist/modes/base.js +140 -0
  90. package/dist/modes/base.js.map +1 -0
  91. package/dist/notifications/notifier.d.ts +30 -0
  92. package/dist/notifications/notifier.d.ts.map +1 -0
  93. package/dist/notifications/notifier.js +124 -0
  94. package/dist/notifications/notifier.js.map +1 -0
  95. package/dist/team/orchestrator.d.ts +54 -0
  96. package/dist/team/orchestrator.d.ts.map +1 -0
  97. package/dist/team/orchestrator.js +106 -0
  98. package/dist/team/orchestrator.js.map +1 -0
  99. package/dist/utils/package.d.ts +9 -0
  100. package/dist/utils/package.d.ts.map +1 -0
  101. package/dist/utils/package.js +31 -0
  102. package/dist/utils/package.js.map +1 -0
  103. package/dist/utils/paths.d.ts +27 -0
  104. package/dist/utils/paths.d.ts.map +1 -0
  105. package/dist/utils/paths.js +60 -0
  106. package/dist/utils/paths.js.map +1 -0
  107. package/dist/verification/verifier.d.ts +32 -0
  108. package/dist/verification/verifier.d.ts.map +1 -0
  109. package/dist/verification/verifier.js +81 -0
  110. package/dist/verification/verifier.js.map +1 -0
  111. package/package.json +54 -0
  112. package/prompts/analyst.md +110 -0
  113. package/prompts/api-reviewer.md +98 -0
  114. package/prompts/architect.md +109 -0
  115. package/prompts/build-fixer.md +89 -0
  116. package/prompts/code-reviewer.md +105 -0
  117. package/prompts/critic.md +87 -0
  118. package/prompts/debugger.md +93 -0
  119. package/prompts/deep-executor.md +112 -0
  120. package/prompts/dependency-expert.md +99 -0
  121. package/prompts/designer.md +103 -0
  122. package/prompts/executor.md +99 -0
  123. package/prompts/explore.md +112 -0
  124. package/prompts/git-master.md +92 -0
  125. package/prompts/information-architect.md +267 -0
  126. package/prompts/performance-reviewer.md +94 -0
  127. package/prompts/planner.md +116 -0
  128. package/prompts/product-analyst.md +299 -0
  129. package/prompts/product-manager.md +255 -0
  130. package/prompts/qa-tester.md +98 -0
  131. package/prompts/quality-reviewer.md +105 -0
  132. package/prompts/quality-strategist.md +227 -0
  133. package/prompts/researcher.md +96 -0
  134. package/prompts/scientist.md +92 -0
  135. package/prompts/security-reviewer.md +125 -0
  136. package/prompts/style-reviewer.md +87 -0
  137. package/prompts/test-engineer.md +103 -0
  138. package/prompts/ux-researcher.md +282 -0
  139. package/prompts/verifier.md +95 -0
  140. package/prompts/vision.md +75 -0
  141. package/prompts/writer.md +86 -0
  142. package/scripts/notify-hook.js +237 -0
  143. package/skills/analyze/SKILL.md +93 -0
  144. package/skills/autopilot/SKILL.md +175 -0
  145. package/skills/build-fix/SKILL.md +123 -0
  146. package/skills/cancel/SKILL.md +387 -0
  147. package/skills/code-review/SKILL.md +208 -0
  148. package/skills/configure-discord/SKILL.md +256 -0
  149. package/skills/configure-telegram/SKILL.md +232 -0
  150. package/skills/deepinit/SKILL.md +320 -0
  151. package/skills/deepsearch/SKILL.md +38 -0
  152. package/skills/doctor/SKILL.md +193 -0
  153. package/skills/ecomode/SKILL.md +114 -0
  154. package/skills/frontend-ui-ux/SKILL.md +34 -0
  155. package/skills/git-master/SKILL.md +29 -0
  156. package/skills/help/SKILL.md +192 -0
  157. package/skills/hud/SKILL.md +97 -0
  158. package/skills/learn-about-omx/SKILL.md +37 -0
  159. package/skills/learner/SKILL.md +135 -0
  160. package/skills/note/SKILL.md +62 -0
  161. package/skills/omx-setup/SKILL.md +1147 -0
  162. package/skills/pipeline/SKILL.md +407 -0
  163. package/skills/plan/SKILL.md +223 -0
  164. package/skills/project-session-manager/SKILL.md +560 -0
  165. package/skills/psm/SKILL.md +20 -0
  166. package/skills/ralph/SKILL.md +197 -0
  167. package/skills/ralph-init/SKILL.md +38 -0
  168. package/skills/ralplan/SKILL.md +34 -0
  169. package/skills/release/SKILL.md +83 -0
  170. package/skills/research/SKILL.md +510 -0
  171. package/skills/review/SKILL.md +30 -0
  172. package/skills/security-review/SKILL.md +284 -0
  173. package/skills/skill/SKILL.md +837 -0
  174. package/skills/swarm/SKILL.md +25 -0
  175. package/skills/tdd/SKILL.md +106 -0
  176. package/skills/team/SKILL.md +860 -0
  177. package/skills/trace/SKILL.md +33 -0
  178. package/skills/ultrapilot/SKILL.md +632 -0
  179. package/skills/ultraqa/SKILL.md +130 -0
  180. package/skills/ultrawork/SKILL.md +143 -0
  181. package/skills/writer-memory/SKILL.md +443 -0
  182. package/templates/AGENTS.md +326 -0
@@ -0,0 +1,157 @@
1
+ /**
2
+ * omx doctor - Validate oh-my-codex installation
3
+ */
4
+ import { existsSync } from 'fs';
5
+ import { readdir, readFile } from 'fs/promises';
6
+ import { join } from 'path';
7
+ import { execSync } from 'child_process';
8
+ import { codexHome, codexConfigPath, codexPromptsDir, userSkillsDir, omxStateDir, } from '../utils/paths.js';
9
+ export async function doctor(options = {}) {
10
+ console.log('oh-my-codex doctor');
11
+ console.log('==================\n');
12
+ const checks = [];
13
+ // Check 1: Codex CLI installed
14
+ checks.push(checkCodexCli());
15
+ // Check 2: Node.js version
16
+ checks.push(checkNodeVersion());
17
+ // Check 3: Codex home directory
18
+ checks.push(checkDirectory('Codex home', codexHome()));
19
+ // Check 4: Config file
20
+ checks.push(await checkConfig());
21
+ // Check 5: Prompts installed
22
+ checks.push(await checkPrompts());
23
+ // Check 6: Skills installed
24
+ checks.push(await checkSkills());
25
+ // Check 7: AGENTS.md in project
26
+ checks.push(checkAgentsMd());
27
+ // Check 8: State directory
28
+ checks.push(checkDirectory('State dir', omxStateDir()));
29
+ // Check 9: MCP servers configured
30
+ checks.push(await checkMcpServers());
31
+ // Print results
32
+ let passCount = 0;
33
+ let warnCount = 0;
34
+ let failCount = 0;
35
+ for (const check of checks) {
36
+ const icon = check.status === 'pass' ? '[OK]' : check.status === 'warn' ? '[!!]' : '[XX]';
37
+ console.log(` ${icon} ${check.name}: ${check.message}`);
38
+ if (check.status === 'pass')
39
+ passCount++;
40
+ else if (check.status === 'warn')
41
+ warnCount++;
42
+ else
43
+ failCount++;
44
+ }
45
+ console.log(`\nResults: ${passCount} passed, ${warnCount} warnings, ${failCount} failed`);
46
+ if (failCount > 0) {
47
+ console.log('\nRun "omx setup" to fix installation issues.');
48
+ }
49
+ else if (warnCount > 0) {
50
+ console.log('\nRun "omx setup --force" to refresh all components.');
51
+ }
52
+ else {
53
+ console.log('\nAll checks passed! oh-my-codex is ready.');
54
+ }
55
+ }
56
+ function checkCodexCli() {
57
+ try {
58
+ const version = execSync('codex --version 2>/dev/null', { encoding: 'utf-8' }).trim();
59
+ return { name: 'Codex CLI', status: 'pass', message: `installed (${version})` };
60
+ }
61
+ catch {
62
+ return { name: 'Codex CLI', status: 'fail', message: 'not found - install from https://github.com/openai/codex' };
63
+ }
64
+ }
65
+ function checkNodeVersion() {
66
+ const major = parseInt(process.versions.node.split('.')[0], 10);
67
+ if (major >= 20) {
68
+ return { name: 'Node.js', status: 'pass', message: `v${process.versions.node}` };
69
+ }
70
+ return { name: 'Node.js', status: 'fail', message: `v${process.versions.node} (need >= 20)` };
71
+ }
72
+ function checkDirectory(name, path) {
73
+ if (existsSync(path)) {
74
+ return { name, status: 'pass', message: path };
75
+ }
76
+ return { name, status: 'warn', message: `${path} (not created yet)` };
77
+ }
78
+ async function checkConfig() {
79
+ const configPath = codexConfigPath();
80
+ if (!existsSync(configPath)) {
81
+ return { name: 'Config', status: 'warn', message: 'config.toml not found' };
82
+ }
83
+ try {
84
+ const content = await readFile(configPath, 'utf-8');
85
+ const hasOmx = content.includes('omx_') || content.includes('oh-my-codex');
86
+ if (hasOmx) {
87
+ return { name: 'Config', status: 'pass', message: 'config.toml has OMX entries' };
88
+ }
89
+ return { name: 'Config', status: 'warn', message: 'config.toml exists but no OMX entries' };
90
+ }
91
+ catch {
92
+ return { name: 'Config', status: 'fail', message: 'cannot read config.toml' };
93
+ }
94
+ }
95
+ async function checkPrompts() {
96
+ const dir = codexPromptsDir();
97
+ if (!existsSync(dir)) {
98
+ return { name: 'Prompts', status: 'warn', message: 'prompts directory not found' };
99
+ }
100
+ try {
101
+ const files = await readdir(dir);
102
+ const mdFiles = files.filter(f => f.endsWith('.md'));
103
+ if (mdFiles.length >= 25) {
104
+ return { name: 'Prompts', status: 'pass', message: `${mdFiles.length} agent prompts installed` };
105
+ }
106
+ return { name: 'Prompts', status: 'warn', message: `${mdFiles.length} prompts (expected 30+)` };
107
+ }
108
+ catch {
109
+ return { name: 'Prompts', status: 'fail', message: 'cannot read prompts directory' };
110
+ }
111
+ }
112
+ async function checkSkills() {
113
+ const dir = userSkillsDir();
114
+ if (!existsSync(dir)) {
115
+ return { name: 'Skills', status: 'warn', message: 'skills directory not found' };
116
+ }
117
+ try {
118
+ const entries = await readdir(dir, { withFileTypes: true });
119
+ const skillDirs = entries.filter(e => e.isDirectory());
120
+ if (skillDirs.length >= 20) {
121
+ return { name: 'Skills', status: 'pass', message: `${skillDirs.length} skills installed` };
122
+ }
123
+ return { name: 'Skills', status: 'warn', message: `${skillDirs.length} skills (expected 30+)` };
124
+ }
125
+ catch {
126
+ return { name: 'Skills', status: 'fail', message: 'cannot read skills directory' };
127
+ }
128
+ }
129
+ function checkAgentsMd() {
130
+ const agentsMd = join(process.cwd(), 'AGENTS.md');
131
+ if (existsSync(agentsMd)) {
132
+ return { name: 'AGENTS.md', status: 'pass', message: 'found in project root' };
133
+ }
134
+ return { name: 'AGENTS.md', status: 'warn', message: 'not found in project root (run omx setup)' };
135
+ }
136
+ async function checkMcpServers() {
137
+ const configPath = codexConfigPath();
138
+ if (!existsSync(configPath)) {
139
+ return { name: 'MCP Servers', status: 'warn', message: 'config.toml not found' };
140
+ }
141
+ try {
142
+ const content = await readFile(configPath, 'utf-8');
143
+ const mcpCount = (content.match(/\[mcp_servers\./g) || []).length;
144
+ if (mcpCount > 0) {
145
+ const hasOmx = content.includes('omx_state') || content.includes('omx_memory');
146
+ if (hasOmx) {
147
+ return { name: 'MCP Servers', status: 'pass', message: `${mcpCount} servers configured (OMX present)` };
148
+ }
149
+ return { name: 'MCP Servers', status: 'warn', message: `${mcpCount} servers but no OMX servers` };
150
+ }
151
+ return { name: 'MCP Servers', status: 'warn', message: 'no MCP servers configured' };
152
+ }
153
+ catch {
154
+ return { name: 'MCP Servers', status: 'fail', message: 'cannot read config.toml' };
155
+ }
156
+ }
157
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * oh-my-codex CLI
3
+ * Multi-agent orchestration for OpenAI Codex CLI
4
+ */
5
+ export declare function main(args: string[]): Promise<void>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgCH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CxD"}
@@ -0,0 +1,266 @@
1
+ /**
2
+ * oh-my-codex CLI
3
+ * Multi-agent orchestration for OpenAI Codex CLI
4
+ */
5
+ import { execSync, execFileSync } from 'child_process';
6
+ import { join } from 'path';
7
+ import { setup } from './setup.js';
8
+ import { doctor } from './doctor.js';
9
+ import { version } from './version.js';
10
+ import { hudCommand } from '../hud/index.js';
11
+ import { generateOverlay, applyOverlay, stripOverlay } from '../hooks/agents-overlay.js';
12
+ import { readSessionState, isSessionStale, writeSessionStart, writeSessionEnd, resetSessionMetrics, } from '../hooks/session.js';
13
+ const HELP = `
14
+ oh-my-codex (omx) - Multi-agent orchestration for Codex CLI
15
+
16
+ Usage:
17
+ omx Launch Codex CLI + HUD in tmux (or just Codex if no tmux)
18
+ omx setup Install skills, prompts, MCP servers, and AGENTS.md
19
+ omx doctor Check installation health
20
+ omx version Show version information
21
+ omx hud Show HUD statusline (--watch, --json, --preset=NAME)
22
+ omx help Show this help message
23
+ omx status Show active modes and state
24
+ omx cancel Cancel active execution modes
25
+
26
+ Options:
27
+ --force Force reinstall (overwrite existing files)
28
+ --dry-run Show what would be done without doing it
29
+ --verbose Show detailed output
30
+ `;
31
+ export async function main(args) {
32
+ const command = args[0] || 'launch';
33
+ const flags = new Set(args.filter(a => a.startsWith('--')));
34
+ const options = {
35
+ force: flags.has('--force'),
36
+ dryRun: flags.has('--dry-run'),
37
+ verbose: flags.has('--verbose'),
38
+ };
39
+ try {
40
+ switch (command) {
41
+ case 'launch':
42
+ await launchWithHud(args.slice(1));
43
+ break;
44
+ case 'setup':
45
+ await setup(options);
46
+ break;
47
+ case 'doctor':
48
+ await doctor(options);
49
+ break;
50
+ case 'version':
51
+ version();
52
+ break;
53
+ case 'hud':
54
+ await hudCommand(args.slice(1));
55
+ break;
56
+ case 'status':
57
+ await showStatus();
58
+ break;
59
+ case 'cancel':
60
+ await cancelModes();
61
+ break;
62
+ case 'help':
63
+ case '--help':
64
+ case '-h':
65
+ console.log(HELP);
66
+ break;
67
+ default:
68
+ console.error(`Unknown command: ${command}`);
69
+ console.log(HELP);
70
+ process.exit(1);
71
+ }
72
+ }
73
+ catch (err) {
74
+ console.error(`Error: ${err instanceof Error ? err.message : err}`);
75
+ process.exit(1);
76
+ }
77
+ }
78
+ async function showStatus() {
79
+ const { readdir, readFile } = await import('fs/promises');
80
+ const { join } = await import('path');
81
+ const stateDir = join(process.cwd(), '.omx', 'state');
82
+ try {
83
+ const files = await readdir(stateDir);
84
+ const states = files.filter(f => f.endsWith('-state.json'));
85
+ if (states.length === 0) {
86
+ console.log('No active modes.');
87
+ return;
88
+ }
89
+ for (const file of states) {
90
+ const content = await readFile(join(stateDir, file), 'utf-8');
91
+ const state = JSON.parse(content);
92
+ const mode = file.replace('-state.json', '');
93
+ console.log(`${mode}: ${state.active ? 'ACTIVE' : 'inactive'} (phase: ${state.current_phase || 'n/a'})`);
94
+ }
95
+ }
96
+ catch {
97
+ console.log('No active modes.');
98
+ }
99
+ }
100
+ async function launchWithHud(args) {
101
+ const cwd = process.cwd();
102
+ const sessionId = `omx-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
103
+ // ── Phase 1: preLaunch ──────────────────────────────────────────────────
104
+ try {
105
+ await preLaunch(cwd, sessionId);
106
+ }
107
+ catch (err) {
108
+ // preLaunch errors must NOT prevent Codex from starting
109
+ console.error(`[omx] preLaunch warning: ${err instanceof Error ? err.message : err}`);
110
+ }
111
+ // ── Phase 2: run ────────────────────────────────────────────────────────
112
+ try {
113
+ runCodex(cwd, args);
114
+ }
115
+ finally {
116
+ // ── Phase 3: postLaunch ─────────────────────────────────────────────
117
+ await postLaunch(cwd, sessionId);
118
+ }
119
+ }
120
+ /**
121
+ * preLaunch: Prepare environment before Codex starts.
122
+ * 1. Orphan cleanup (stale session from a crashed launch)
123
+ * 2. Generate + apply AGENTS.md overlay
124
+ * 3. Write session.json
125
+ */
126
+ async function preLaunch(cwd, sessionId) {
127
+ // 1. Orphan cleanup
128
+ const existingSession = await readSessionState(cwd);
129
+ if (existingSession && isSessionStale(existingSession)) {
130
+ const agentsMdPath = join(cwd, 'AGENTS.md');
131
+ try {
132
+ await stripOverlay(agentsMdPath, cwd);
133
+ }
134
+ catch { /* best effort */ }
135
+ const { unlink } = await import('fs/promises');
136
+ try {
137
+ await unlink(join(cwd, '.omx', 'state', 'session.json'));
138
+ }
139
+ catch { /* best effort */ }
140
+ }
141
+ // 2. Generate + apply AGENTS.md overlay
142
+ const agentsMdPath = join(cwd, 'AGENTS.md');
143
+ const overlay = await generateOverlay(cwd, sessionId);
144
+ await applyOverlay(agentsMdPath, overlay, cwd);
145
+ // 3. Write session state
146
+ await resetSessionMetrics(cwd);
147
+ await writeSessionStart(cwd, sessionId);
148
+ }
149
+ /**
150
+ * runCodex: Launch Codex CLI (blocks until exit).
151
+ * All 3 paths (new tmux, existing tmux, no tmux) block via execSync/execFileSync.
152
+ */
153
+ function runCodex(cwd, args) {
154
+ const omxBin = process.argv[1];
155
+ const codexArgs = args.length > 0 ? ' ' + args.join(' ') : '';
156
+ if (process.env.TMUX) {
157
+ // Already in tmux: launch codex in current pane, HUD in bottom split
158
+ const hudCmd = `node ${omxBin} hud --watch`;
159
+ try {
160
+ execSync(`tmux split-window -v -l 4 -d -c "${cwd}" '${hudCmd}'`, { stdio: 'inherit' });
161
+ }
162
+ catch {
163
+ // HUD split failed, continue without it
164
+ }
165
+ // execFileSync imported at top level
166
+ try {
167
+ execFileSync('codex', args, { cwd, stdio: 'inherit' });
168
+ }
169
+ catch {
170
+ // Codex exited
171
+ }
172
+ }
173
+ else {
174
+ // Not in tmux: create a new tmux session with codex + HUD pane
175
+ const sessionName = `omx-${Date.now()}`;
176
+ const hudCmd = `node ${omxBin} hud --watch`;
177
+ try {
178
+ execSync(`tmux new-session -d -s "${sessionName}" -c "${cwd}" "codex${codexArgs}" \\; ` +
179
+ `split-window -v -l 4 -d -c "${cwd}" '${hudCmd}' \\; ` +
180
+ `select-pane -t 0 \\; ` +
181
+ `attach-session -t "${sessionName}"`, { stdio: 'inherit' });
182
+ }
183
+ catch {
184
+ // tmux not available, just run codex directly
185
+ console.log('tmux not available, launching codex without HUD...');
186
+ // execFileSync imported at top level
187
+ try {
188
+ execFileSync('codex', args, { cwd, stdio: 'inherit' });
189
+ }
190
+ catch {
191
+ // Codex exited
192
+ }
193
+ }
194
+ }
195
+ }
196
+ /**
197
+ * postLaunch: Clean up after Codex exits.
198
+ * Each step is independently fault-tolerant (try/catch per step).
199
+ */
200
+ async function postLaunch(cwd, sessionId) {
201
+ // 1. Strip AGENTS.md overlay
202
+ try {
203
+ await stripOverlay(join(cwd, 'AGENTS.md'), cwd);
204
+ }
205
+ catch (err) {
206
+ console.error(`[omx] postLaunch: overlay strip failed: ${err instanceof Error ? err.message : err}`);
207
+ }
208
+ // 2. Archive session (write history, delete session.json)
209
+ try {
210
+ await writeSessionEnd(cwd, sessionId);
211
+ }
212
+ catch (err) {
213
+ console.error(`[omx] postLaunch: session archive failed: ${err instanceof Error ? err.message : err}`);
214
+ }
215
+ // 3. Cancel any still-active modes
216
+ try {
217
+ const { readdir, writeFile, readFile } = await import('fs/promises');
218
+ const stateDir = join(cwd, '.omx', 'state');
219
+ const files = await readdir(stateDir).catch(() => []);
220
+ for (const file of files) {
221
+ if (!file.endsWith('-state.json') || file === 'session.json')
222
+ continue;
223
+ const path = join(stateDir, file);
224
+ const content = await readFile(path, 'utf-8');
225
+ const state = JSON.parse(content);
226
+ if (state.active) {
227
+ state.active = false;
228
+ state.completed_at = new Date().toISOString();
229
+ await writeFile(path, JSON.stringify(state, null, 2));
230
+ }
231
+ }
232
+ }
233
+ catch (err) {
234
+ console.error(`[omx] postLaunch: mode cleanup failed: ${err instanceof Error ? err.message : err}`);
235
+ }
236
+ }
237
+ async function cancelModes() {
238
+ const { readdir, writeFile, readFile } = await import('fs/promises');
239
+ const { join } = await import('path');
240
+ const stateDir = join(process.cwd(), '.omx', 'state');
241
+ try {
242
+ const files = await readdir(stateDir);
243
+ const states = files.filter(f => f.endsWith('-state.json'));
244
+ let cancelled = 0;
245
+ for (const file of states) {
246
+ const path = join(stateDir, file);
247
+ const content = await readFile(path, 'utf-8');
248
+ const state = JSON.parse(content);
249
+ if (state.active) {
250
+ state.active = false;
251
+ state.current_phase = 'cancelled';
252
+ state.completed_at = new Date().toISOString();
253
+ await writeFile(path, JSON.stringify(state, null, 2));
254
+ cancelled++;
255
+ console.log(`Cancelled: ${file.replace('-state.json', '')}`);
256
+ }
257
+ }
258
+ if (cancelled === 0) {
259
+ console.log('No active modes to cancel.');
260
+ }
261
+ }
262
+ catch {
263
+ console.log('No active modes to cancel.');
264
+ }
265
+ }
266
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EACL,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,GAC1F,MAAM,qBAAqB,CAAC;AAE7B,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;CAiBZ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG;QACd,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;QAC3B,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;QAC9B,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;KAChC,CAAC;IAEF,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,QAAQ;gBACX,MAAM,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrB,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,EAAE,CAAC;gBACV,MAAM;YACR,KAAK,KAAK;gBACR,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,UAAU,EAAE,CAAC;gBACnB,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,WAAW,EAAE,CAAC;gBACpB,MAAM;YACR,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClB,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,YAAY,KAAK,CAAC,aAAa,IAAI,KAAK,GAAG,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAc;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAEhF,2EAA2E;IAC3E,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,wDAAwD;QACxD,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,2EAA2E;IAC3E,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,uEAAuE;QACvE,MAAM,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,SAAiB;IACrD,oBAAoB;IACpB,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,eAAe,IAAI,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC;QACvD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC5C,IAAI,CAAC;YAAC,MAAM,YAAY,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC1E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC/F,CAAC;IAED,wCAAwC;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,YAAY,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAE/C,yBAAyB;IACzB,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,GAAW,EAAE,IAAc;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9D,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACrB,qEAAqE;QACrE,MAAM,MAAM,GAAG,QAAQ,MAAM,cAAc,CAAC;QAC5C,IAAI,CAAC;YACH,QAAQ,CAAC,oCAAoC,GAAG,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACzF,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;QACD,qCAAqC;QACrC,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,+DAA+D;QAC/D,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ,MAAM,cAAc,CAAC;QAC5C,IAAI,CAAC;YACH,QAAQ,CACN,2BAA2B,WAAW,SAAS,GAAG,WAAW,SAAS,QAAQ;gBAC9E,+BAA+B,GAAG,MAAM,MAAM,QAAQ;gBACtD,uBAAuB;gBACvB,sBAAsB,WAAW,GAAG,EACpC,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;YAC9C,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAClE,qCAAqC;YACrC,IAAI,CAAC;gBACH,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,SAAiB;IACtD,6BAA6B;IAC7B,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACvG,CAAC;IAED,0DAA0D;IAC1D,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACzG,CAAC;IAED,mCAAmC;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CAAC;QAClE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,cAAc;gBAAE,SAAS;YACvE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;gBACrB,KAAK,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC9C,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,0CAA0C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACrE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5D,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;gBACrB,KAAK,CAAC,aAAa,GAAG,WAAW,CAAC;gBAClC,KAAK,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC9C,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACtD,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * omx setup - Automated installation of oh-my-codex
3
+ * Installs skills, prompts, MCP servers config, and AGENTS.md
4
+ */
5
+ interface SetupOptions {
6
+ force?: boolean;
7
+ dryRun?: boolean;
8
+ verbose?: boolean;
9
+ }
10
+ export declare function setup(options?: SetupOptions): Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGrE"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * omx setup - Automated installation of oh-my-codex
3
+ * Installs skills, prompts, MCP servers config, and AGENTS.md
4
+ */
5
+ import { mkdir, copyFile, readdir, readFile, writeFile, stat } from 'fs/promises';
6
+ import { join } from 'path';
7
+ import { existsSync } from 'fs';
8
+ import { codexHome, codexConfigPath, codexPromptsDir, userSkillsDir, omxStateDir, omxPlansDir, omxLogsDir, } from '../utils/paths.js';
9
+ import { mergeConfig } from '../config/generator.js';
10
+ import { getPackageRoot } from '../utils/package.js';
11
+ import { readSessionState, isSessionStale } from '../hooks/session.js';
12
+ export async function setup(options = {}) {
13
+ const { force = false, dryRun = false, verbose = false } = options;
14
+ const pkgRoot = getPackageRoot();
15
+ console.log('oh-my-codex setup');
16
+ console.log('=================\n');
17
+ // Step 1: Ensure directories exist
18
+ console.log('[1/7] Creating directories...');
19
+ const dirs = [
20
+ codexHome(),
21
+ codexPromptsDir(),
22
+ userSkillsDir(),
23
+ omxStateDir(),
24
+ omxPlansDir(),
25
+ omxLogsDir(),
26
+ ];
27
+ for (const dir of dirs) {
28
+ if (!dryRun) {
29
+ await mkdir(dir, { recursive: true });
30
+ }
31
+ if (verbose)
32
+ console.log(` mkdir ${dir}`);
33
+ }
34
+ console.log(' Done.\n');
35
+ // Step 2: Install agent prompts
36
+ console.log('[2/7] Installing agent prompts...');
37
+ const promptsSrc = join(pkgRoot, 'prompts');
38
+ const promptsDst = codexPromptsDir();
39
+ const promptCount = await installDirectory(promptsSrc, promptsDst, '.md', { force, dryRun, verbose });
40
+ console.log(` Installed ${promptCount} agent prompts.\n`);
41
+ // Step 3: Install skills
42
+ console.log('[3/7] Installing skills...');
43
+ const skillsSrc = join(pkgRoot, 'skills');
44
+ const skillsDst = userSkillsDir();
45
+ const skillCount = await installSkills(skillsSrc, skillsDst, { force, dryRun, verbose });
46
+ console.log(` Installed ${skillCount} skills.\n`);
47
+ // Step 4: Update config.toml
48
+ console.log('[4/7] Updating config.toml...');
49
+ if (!dryRun) {
50
+ await mergeConfig(codexConfigPath(), pkgRoot, { verbose });
51
+ }
52
+ console.log(' Done.\n');
53
+ // Step 5: Generate AGENTS.md
54
+ console.log('[5/7] Generating AGENTS.md...');
55
+ const agentsMdSrc = join(pkgRoot, 'templates', 'AGENTS.md');
56
+ const agentsMdDst = join(process.cwd(), 'AGENTS.md');
57
+ // Guard: refuse to overwrite AGENTS.md during active session
58
+ const activeSession = await readSessionState(process.cwd());
59
+ const sessionIsActive = activeSession && !isSessionStale(activeSession);
60
+ if (existsSync(agentsMdSrc)) {
61
+ if (sessionIsActive && force) {
62
+ console.log(' WARNING: Active omx session detected (pid ' + activeSession.pid + ').');
63
+ console.log(' Skipping AGENTS.md overwrite to avoid corrupting runtime overlay.');
64
+ console.log(' Stop the active session first, then re-run setup --force.');
65
+ }
66
+ else if (force || !existsSync(agentsMdDst)) {
67
+ if (!dryRun) {
68
+ const content = await readFile(agentsMdSrc, 'utf-8');
69
+ await writeFile(agentsMdDst, content);
70
+ }
71
+ console.log(' Generated AGENTS.md in project root.');
72
+ }
73
+ else {
74
+ console.log(' AGENTS.md already exists (use --force to overwrite).');
75
+ }
76
+ }
77
+ else {
78
+ console.log(' AGENTS.md template not found, skipping.');
79
+ }
80
+ console.log();
81
+ // Step 6: Set up notify hook
82
+ console.log('[6/7] Configuring notification hook...');
83
+ await setupNotifyHook(pkgRoot, { dryRun, verbose });
84
+ console.log(' Done.\n');
85
+ // Step 7: Configure HUD
86
+ console.log('[7/7] Configuring HUD...');
87
+ const hudConfigPath = join(process.cwd(), '.omx', 'hud-config.json');
88
+ if (force || !existsSync(hudConfigPath)) {
89
+ if (!dryRun) {
90
+ const defaultHudConfig = { preset: 'focused' };
91
+ await writeFile(hudConfigPath, JSON.stringify(defaultHudConfig, null, 2));
92
+ }
93
+ if (verbose)
94
+ console.log(' Wrote .omx/hud-config.json');
95
+ console.log(' HUD config created (preset: focused).');
96
+ }
97
+ else {
98
+ console.log(' HUD config already exists (use --force to overwrite).');
99
+ }
100
+ console.log(' StatusLine configured in config.toml via [tui] section.');
101
+ console.log();
102
+ console.log('Setup complete! Run "omx doctor" to verify installation.');
103
+ console.log('\nNext steps:');
104
+ console.log(' 1. Start Codex CLI in your project directory');
105
+ console.log(' 2. Use /prompts:architect, /prompts:executor, /prompts:planner as slash commands');
106
+ console.log(' 3. Skills are available via /skills or implicit matching');
107
+ console.log(' 4. The AGENTS.md orchestration brain is loaded automatically');
108
+ }
109
+ async function installDirectory(srcDir, dstDir, ext, options) {
110
+ if (!existsSync(srcDir))
111
+ return 0;
112
+ const files = await readdir(srcDir);
113
+ let count = 0;
114
+ for (const file of files) {
115
+ if (!file.endsWith(ext))
116
+ continue;
117
+ const src = join(srcDir, file);
118
+ const dst = join(dstDir, file);
119
+ const srcStat = await stat(src);
120
+ if (!srcStat.isFile())
121
+ continue;
122
+ if (options.force || !existsSync(dst)) {
123
+ if (!options.dryRun) {
124
+ await copyFile(src, dst);
125
+ }
126
+ if (options.verbose)
127
+ console.log(` ${file}`);
128
+ count++;
129
+ }
130
+ }
131
+ return count;
132
+ }
133
+ async function installSkills(srcDir, dstDir, options) {
134
+ if (!existsSync(srcDir))
135
+ return 0;
136
+ const entries = await readdir(srcDir, { withFileTypes: true });
137
+ let count = 0;
138
+ for (const entry of entries) {
139
+ if (!entry.isDirectory())
140
+ continue;
141
+ const skillSrc = join(srcDir, entry.name);
142
+ const skillDst = join(dstDir, entry.name);
143
+ const skillMd = join(skillSrc, 'SKILL.md');
144
+ if (!existsSync(skillMd))
145
+ continue;
146
+ if (!options.dryRun) {
147
+ await mkdir(skillDst, { recursive: true });
148
+ // Copy all files in the skill directory
149
+ const skillFiles = await readdir(skillSrc);
150
+ for (const sf of skillFiles) {
151
+ const sfPath = join(skillSrc, sf);
152
+ const sfStat = await stat(sfPath);
153
+ if (sfStat.isFile()) {
154
+ await copyFile(sfPath, join(skillDst, sf));
155
+ }
156
+ }
157
+ }
158
+ if (options.verbose)
159
+ console.log(` ${entry.name}/`);
160
+ count++;
161
+ }
162
+ return count;
163
+ }
164
+ async function setupNotifyHook(pkgRoot, options) {
165
+ const hookScript = join(pkgRoot, 'scripts', 'notify-hook.js');
166
+ if (!existsSync(hookScript)) {
167
+ if (options.verbose)
168
+ console.log(' Notify hook script not found, skipping.');
169
+ return;
170
+ }
171
+ // The notify hook is configured in config.toml via mergeConfig
172
+ if (options.verbose)
173
+ console.log(` Notify hook: ${hookScript}`);
174
+ }
175
+ //# sourceMappingURL=setup.js.map