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.
- package/README.md +269 -0
- package/bin/omx.js +25 -0
- package/dist/agents/definitions.d.ts +22 -0
- package/dist/agents/definitions.d.ts.map +1 -0
- package/dist/agents/definitions.js +235 -0
- package/dist/agents/definitions.js.map +1 -0
- package/dist/cli/doctor.d.ts +11 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +157 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +266 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/setup.d.ts +12 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +175 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +17 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/config/generator.d.ts +14 -0
- package/dist/config/generator.d.ts.map +1 -0
- package/dist/config/generator.js +106 -0
- package/dist/config/generator.js.map +1 -0
- package/dist/hooks/__tests__/agents-overlay.test.d.ts +8 -0
- package/dist/hooks/__tests__/agents-overlay.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/agents-overlay.test.js +148 -0
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -0
- package/dist/hooks/agents-overlay.d.ts +34 -0
- package/dist/hooks/agents-overlay.d.ts.map +1 -0
- package/dist/hooks/agents-overlay.js +265 -0
- package/dist/hooks/agents-overlay.js.map +1 -0
- package/dist/hooks/emulator.d.ts +44 -0
- package/dist/hooks/emulator.d.ts.map +1 -0
- package/dist/hooks/emulator.js +108 -0
- package/dist/hooks/emulator.js.map +1 -0
- package/dist/hooks/keyword-detector.d.ts +27 -0
- package/dist/hooks/keyword-detector.d.ts.map +1 -0
- package/dist/hooks/keyword-detector.js +63 -0
- package/dist/hooks/keyword-detector.js.map +1 -0
- package/dist/hooks/session.d.ts +38 -0
- package/dist/hooks/session.d.ts.map +1 -0
- package/dist/hooks/session.js +135 -0
- package/dist/hooks/session.js.map +1 -0
- package/dist/hud/colors.d.ts +26 -0
- package/dist/hud/colors.d.ts.map +1 -0
- package/dist/hud/colors.js +71 -0
- package/dist/hud/colors.js.map +1 -0
- package/dist/hud/index.d.ts +12 -0
- package/dist/hud/index.d.ts.map +1 -0
- package/dist/hud/index.js +107 -0
- package/dist/hud/index.js.map +1 -0
- package/dist/hud/render.d.ts +9 -0
- package/dist/hud/render.d.ts.map +1 -0
- package/dist/hud/render.js +192 -0
- package/dist/hud/render.js.map +1 -0
- package/dist/hud/state.d.ts +21 -0
- package/dist/hud/state.d.ts.map +1 -0
- package/dist/hud/state.js +101 -0
- package/dist/hud/state.js.map +1 -0
- package/dist/hud/types.d.ts +87 -0
- package/dist/hud/types.d.ts.map +1 -0
- package/dist/hud/types.js +8 -0
- package/dist/hud/types.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/code-intel-server.d.ts +7 -0
- package/dist/mcp/code-intel-server.d.ts.map +1 -0
- package/dist/mcp/code-intel-server.js +567 -0
- package/dist/mcp/code-intel-server.js.map +1 -0
- package/dist/mcp/memory-server.d.ts +7 -0
- package/dist/mcp/memory-server.d.ts.map +1 -0
- package/dist/mcp/memory-server.js +359 -0
- package/dist/mcp/memory-server.js.map +1 -0
- package/dist/mcp/state-server.d.ts +7 -0
- package/dist/mcp/state-server.d.ts.map +1 -0
- package/dist/mcp/state-server.js +181 -0
- package/dist/mcp/state-server.js.map +1 -0
- package/dist/mcp/trace-server.d.ts +7 -0
- package/dist/mcp/trace-server.d.ts.map +1 -0
- package/dist/mcp/trace-server.js +205 -0
- package/dist/mcp/trace-server.js.map +1 -0
- package/dist/modes/base.d.ts +50 -0
- package/dist/modes/base.d.ts.map +1 -0
- package/dist/modes/base.js +140 -0
- package/dist/modes/base.js.map +1 -0
- package/dist/notifications/notifier.d.ts +30 -0
- package/dist/notifications/notifier.d.ts.map +1 -0
- package/dist/notifications/notifier.js +124 -0
- package/dist/notifications/notifier.js.map +1 -0
- package/dist/team/orchestrator.d.ts +54 -0
- package/dist/team/orchestrator.d.ts.map +1 -0
- package/dist/team/orchestrator.js +106 -0
- package/dist/team/orchestrator.js.map +1 -0
- package/dist/utils/package.d.ts +9 -0
- package/dist/utils/package.d.ts.map +1 -0
- package/dist/utils/package.js +31 -0
- package/dist/utils/package.js.map +1 -0
- package/dist/utils/paths.d.ts +27 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +60 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/verification/verifier.d.ts +32 -0
- package/dist/verification/verifier.d.ts.map +1 -0
- package/dist/verification/verifier.js +81 -0
- package/dist/verification/verifier.js.map +1 -0
- package/package.json +54 -0
- package/prompts/analyst.md +110 -0
- package/prompts/api-reviewer.md +98 -0
- package/prompts/architect.md +109 -0
- package/prompts/build-fixer.md +89 -0
- package/prompts/code-reviewer.md +105 -0
- package/prompts/critic.md +87 -0
- package/prompts/debugger.md +93 -0
- package/prompts/deep-executor.md +112 -0
- package/prompts/dependency-expert.md +99 -0
- package/prompts/designer.md +103 -0
- package/prompts/executor.md +99 -0
- package/prompts/explore.md +112 -0
- package/prompts/git-master.md +92 -0
- package/prompts/information-architect.md +267 -0
- package/prompts/performance-reviewer.md +94 -0
- package/prompts/planner.md +116 -0
- package/prompts/product-analyst.md +299 -0
- package/prompts/product-manager.md +255 -0
- package/prompts/qa-tester.md +98 -0
- package/prompts/quality-reviewer.md +105 -0
- package/prompts/quality-strategist.md +227 -0
- package/prompts/researcher.md +96 -0
- package/prompts/scientist.md +92 -0
- package/prompts/security-reviewer.md +125 -0
- package/prompts/style-reviewer.md +87 -0
- package/prompts/test-engineer.md +103 -0
- package/prompts/ux-researcher.md +282 -0
- package/prompts/verifier.md +95 -0
- package/prompts/vision.md +75 -0
- package/prompts/writer.md +86 -0
- package/scripts/notify-hook.js +237 -0
- package/skills/analyze/SKILL.md +93 -0
- package/skills/autopilot/SKILL.md +175 -0
- package/skills/build-fix/SKILL.md +123 -0
- package/skills/cancel/SKILL.md +387 -0
- package/skills/code-review/SKILL.md +208 -0
- package/skills/configure-discord/SKILL.md +256 -0
- package/skills/configure-telegram/SKILL.md +232 -0
- package/skills/deepinit/SKILL.md +320 -0
- package/skills/deepsearch/SKILL.md +38 -0
- package/skills/doctor/SKILL.md +193 -0
- package/skills/ecomode/SKILL.md +114 -0
- package/skills/frontend-ui-ux/SKILL.md +34 -0
- package/skills/git-master/SKILL.md +29 -0
- package/skills/help/SKILL.md +192 -0
- package/skills/hud/SKILL.md +97 -0
- package/skills/learn-about-omx/SKILL.md +37 -0
- package/skills/learner/SKILL.md +135 -0
- package/skills/note/SKILL.md +62 -0
- package/skills/omx-setup/SKILL.md +1147 -0
- package/skills/pipeline/SKILL.md +407 -0
- package/skills/plan/SKILL.md +223 -0
- package/skills/project-session-manager/SKILL.md +560 -0
- package/skills/psm/SKILL.md +20 -0
- package/skills/ralph/SKILL.md +197 -0
- package/skills/ralph-init/SKILL.md +38 -0
- package/skills/ralplan/SKILL.md +34 -0
- package/skills/release/SKILL.md +83 -0
- package/skills/research/SKILL.md +510 -0
- package/skills/review/SKILL.md +30 -0
- package/skills/security-review/SKILL.md +284 -0
- package/skills/skill/SKILL.md +837 -0
- package/skills/swarm/SKILL.md +25 -0
- package/skills/tdd/SKILL.md +106 -0
- package/skills/team/SKILL.md +860 -0
- package/skills/trace/SKILL.md +33 -0
- package/skills/ultrapilot/SKILL.md +632 -0
- package/skills/ultraqa/SKILL.md +130 -0
- package/skills/ultrawork/SKILL.md +143 -0
- package/skills/writer-memory/SKILL.md +443 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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
|