oh-my-codex 0.8.10 → 0.8.12
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 +86 -6
- package/dist/agents/__tests__/definitions.test.js +1 -0
- package/dist/agents/__tests__/definitions.test.js.map +1 -1
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +11 -0
- package/dist/agents/definitions.js.map +1 -1
- package/dist/cli/__tests__/agents-init.test.d.ts +2 -0
- package/dist/cli/__tests__/agents-init.test.d.ts.map +1 -0
- package/dist/cli/__tests__/agents-init.test.js +182 -0
- package/dist/cli/__tests__/agents-init.test.js.map +1 -0
- package/dist/cli/__tests__/error-handling-warnings.test.js +2 -0
- package/dist/cli/__tests__/error-handling-warnings.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +35 -3
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.d.ts +2 -0
- package/dist/cli/__tests__/launch-fallback.test.d.ts.map +1 -0
- package/dist/cli/__tests__/launch-fallback.test.js +60 -0
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -0
- package/dist/cli/__tests__/session-search-help.test.d.ts +2 -0
- package/dist/cli/__tests__/session-search-help.test.d.ts.map +1 -0
- package/dist/cli/__tests__/session-search-help.test.js +35 -0
- package/dist/cli/__tests__/session-search-help.test.js.map +1 -0
- package/dist/cli/__tests__/session-search.test.d.ts +2 -0
- package/dist/cli/__tests__/session-search.test.d.ts.map +1 -0
- package/dist/cli/__tests__/session-search.test.js +77 -0
- package/dist/cli/__tests__/session-search.test.js.map +1 -0
- package/dist/cli/__tests__/setup-agents-overwrite.test.js +24 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-prompts-overwrite.test.d.ts +2 -0
- package/dist/cli/__tests__/setup-prompts-overwrite.test.d.ts.map +1 -0
- package/dist/cli/__tests__/setup-prompts-overwrite.test.js +100 -0
- package/dist/cli/__tests__/setup-prompts-overwrite.test.js.map +1 -0
- package/dist/cli/__tests__/setup-scope.test.js +28 -0
- package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
- package/dist/cli/__tests__/team-decompose.test.js +34 -4
- package/dist/cli/__tests__/team-decompose.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +283 -3
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/agents-init.d.ts +14 -0
- package/dist/cli/agents-init.d.ts.map +1 -0
- package/dist/cli/agents-init.js +270 -0
- package/dist/cli/agents-init.js.map +1 -0
- package/dist/cli/catalog-contract.d.ts.map +1 -1
- package/dist/cli/catalog-contract.js +16 -12
- package/dist/cli/catalog-contract.js.map +1 -1
- package/dist/cli/doctor.js +39 -10
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +4 -3
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +245 -70
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ralph.d.ts.map +1 -1
- package/dist/cli/ralph.js +8 -0
- package/dist/cli/ralph.js.map +1 -1
- package/dist/cli/session-search.d.ts +8 -0
- package/dist/cli/session-search.d.ts.map +1 -0
- package/dist/cli/session-search.js +133 -0
- package/dist/cli/session-search.js.map +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +126 -36
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/team.d.ts +13 -12
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +200 -44
- package/dist/cli/team.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +16 -0
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/__tests__/models.test.js +47 -2
- package/dist/config/__tests__/models.test.js.map +1 -1
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +12 -1
- package/dist/config/generator.js.map +1 -1
- package/dist/config/models.d.ts +17 -3
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +53 -24
- package/dist/config/models.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +33 -1
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/clawhip-event-contract.test.d.ts +2 -0
- package/dist/hooks/__tests__/clawhip-event-contract.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/clawhip-event-contract.test.js +30 -0
- package/dist/hooks/__tests__/clawhip-event-contract.test.js.map +1 -0
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js +25 -0
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +2 -1
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +277 -0
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +80 -0
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +50 -5
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-modules.test.js +78 -0
- package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +1 -0
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +812 -0
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +77 -0
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
- package/dist/hooks/agents-overlay.d.ts +6 -1
- package/dist/hooks/agents-overlay.d.ts.map +1 -1
- package/dist/hooks/agents-overlay.js +45 -4
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/events.test.js +2 -0
- package/dist/hooks/extensibility/__tests__/events.test.js.map +1 -1
- package/dist/hooks/extensibility/types.d.ts +1 -1
- package/dist/hooks/extensibility/types.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +1 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +1 -1
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/mcp/__tests__/team-server-runtime-deps.test.d.ts +2 -0
- package/dist/mcp/__tests__/team-server-runtime-deps.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/team-server-runtime-deps.test.js +13 -0
- package/dist/mcp/__tests__/team-server-runtime-deps.test.js.map +1 -0
- package/dist/notifications/tmux-detector.d.ts.map +1 -1
- package/dist/notifications/tmux-detector.js +3 -8
- package/dist/notifications/tmux-detector.js.map +1 -1
- package/dist/pipeline/__tests__/stages.test.js +36 -7
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/stages/ralph-verify.d.ts +3 -0
- package/dist/pipeline/stages/ralph-verify.d.ts.map +1 -1
- package/dist/pipeline/stages/ralph-verify.js +10 -1
- package/dist/pipeline/stages/ralph-verify.js.map +1 -1
- package/dist/pipeline/stages/team-exec.d.ts +3 -0
- package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
- package/dist/pipeline/stages/team-exec.js +12 -4
- package/dist/pipeline/stages/team-exec.js.map +1 -1
- package/dist/rtk/__tests__/index.test.d.ts +2 -0
- package/dist/rtk/__tests__/index.test.d.ts.map +1 -0
- package/dist/rtk/__tests__/index.test.js +104 -0
- package/dist/rtk/__tests__/index.test.js.map +1 -0
- package/dist/rtk/index.d.ts +130 -0
- package/dist/rtk/index.d.ts.map +1 -0
- package/dist/rtk/index.js +257 -0
- package/dist/rtk/index.js.map +1 -0
- package/dist/session-history/__tests__/search.test.d.ts +2 -0
- package/dist/session-history/__tests__/search.test.d.ts.map +1 -0
- package/dist/session-history/__tests__/search.test.js +150 -0
- package/dist/session-history/__tests__/search.test.js.map +1 -0
- package/dist/session-history/search.d.ts +31 -0
- package/dist/session-history/search.d.ts.map +1 -0
- package/dist/session-history/search.js +326 -0
- package/dist/session-history/search.js.map +1 -0
- package/dist/team/__tests__/api-interop.test.js +283 -8
- package/dist/team/__tests__/api-interop.test.js.map +1 -1
- package/dist/team/__tests__/events.test.d.ts +2 -0
- package/dist/team/__tests__/events.test.d.ts.map +1 -0
- package/dist/team/__tests__/events.test.js +81 -0
- package/dist/team/__tests__/events.test.js.map +1 -0
- package/dist/team/__tests__/followup-planner.test.d.ts +2 -0
- package/dist/team/__tests__/followup-planner.test.d.ts.map +1 -0
- package/dist/team/__tests__/followup-planner.test.js +59 -0
- package/dist/team/__tests__/followup-planner.test.js.map +1 -0
- package/dist/team/__tests__/runtime.test.js +340 -3
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +31 -1
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.js +21 -0
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/api-interop.d.ts +1 -1
- package/dist/team/api-interop.d.ts.map +1 -1
- package/dist/team/api-interop.js +281 -2
- package/dist/team/api-interop.js.map +1 -1
- package/dist/team/followup-planner.d.ts +37 -0
- package/dist/team/followup-planner.d.ts.map +1 -0
- package/dist/team/followup-planner.js +148 -0
- package/dist/team/followup-planner.js.map +1 -0
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +3 -2
- package/dist/team/model-contract.js.map +1 -1
- package/dist/team/runtime.d.ts +16 -0
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +206 -46
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +5 -1
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state/events.d.ts +9 -2
- package/dist/team/state/events.d.ts.map +1 -1
- package/dist/team/state/events.js +25 -1
- package/dist/team/state/events.js.map +1 -1
- package/dist/team/state/types.d.ts +2 -0
- package/dist/team/state/types.d.ts.map +1 -1
- package/dist/team/state/types.js.map +1 -1
- package/dist/team/state.d.ts +2 -0
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +10 -13
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts +2 -2
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +15 -4
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/dist/utils/__tests__/platform-command.test.d.ts +2 -0
- package/dist/utils/__tests__/platform-command.test.d.ts.map +1 -0
- package/dist/utils/__tests__/platform-command.test.js +124 -0
- package/dist/utils/__tests__/platform-command.test.js.map +1 -0
- package/dist/utils/platform-command.d.ts +19 -0
- package/dist/utils/platform-command.d.ts.map +1 -0
- package/dist/utils/platform-command.js +123 -0
- package/dist/utils/platform-command.js.map +1 -0
- package/package.json +3 -2
- package/prompts/planner.md +1 -0
- package/prompts/team-executor.md +57 -0
- package/prompts/team-orchestrator.md +8 -0
- package/scripts/hook-derived-watcher.js +177 -0
- package/scripts/notify-fallback-watcher.js +335 -32
- package/scripts/notify-hook/auto-nudge.js +8 -1
- package/scripts/notify-hook/operational-events.js +255 -0
- package/scripts/notify-hook/team-dispatch.js +48 -0
- package/scripts/notify-hook/team-leader-nudge.js +405 -31
- package/scripts/notify-hook/team-tmux-guard.js +31 -0
- package/scripts/notify-hook/team-worker.js +132 -1
- package/scripts/notify-hook.js +53 -8
- package/skills/help/SKILL.md +8 -0
- package/skills/omx-setup/SKILL.md +2 -0
- package/skills/plan/SKILL.md +6 -2
- package/skills/ralph/SKILL.md +1 -0
- package/skills/ralplan/SKILL.md +2 -2
- package/skills/team/SKILL.md +42 -1
- package/templates/AGENTS.md +1 -1
- package/templates/catalog-manifest.json +5 -0
package/README.md
CHANGED
|
@@ -58,9 +58,14 @@ OMX is best used as an **outer CLI orchestration layer**:
|
|
|
58
58
|
- **Capability/state plane (MCP):** task state, mailbox, memory, diagnostics tools
|
|
59
59
|
|
|
60
60
|
Practical mode split:
|
|
61
|
-
- **`$team` / `omx team`**: durable, inspectable, resumable multi-worker execution
|
|
61
|
+
- **`$team` / `omx team`**: durable, inspectable, resumable multi-worker execution with live lanes, shared blockers, and visible handoff / rebalancing when one worker gets stuck
|
|
62
62
|
- **`$ultrawork`**: lightweight parallel fanout for independent tasks (component mode)
|
|
63
63
|
|
|
64
|
+
Why team mode exists even when ultrawork already exists:
|
|
65
|
+
- Use **ultrawork** when tasks are mostly independent and the leader can merge results afterward.
|
|
66
|
+
- Use **team mode** when the work benefits from shared situational awareness: workers can discover blockers early, hand work across lanes, and keep execution visible through tmux panes plus durable state.
|
|
67
|
+
- Team mode is the better fit for orchestration-heavy or edge-case-heavy work where runtime control, recovery, and inspectability matter as much as raw fanout.
|
|
68
|
+
|
|
64
69
|
Low-token team profile example:
|
|
65
70
|
|
|
66
71
|
```bash
|
|
@@ -138,7 +143,7 @@ OMX installs and wires these layers:
|
|
|
138
143
|
User
|
|
139
144
|
-> Codex CLI
|
|
140
145
|
-> AGENTS.md (orchestration brain)
|
|
141
|
-
-> ~/.codex/prompts/*.md (agent prompt catalog)
|
|
146
|
+
-> ~/.codex/prompts/*.md (installable active/internal agent prompt catalog)
|
|
142
147
|
-> ~/.agents/skills/*/SKILL.md (skill catalog)
|
|
143
148
|
-> ~/.codex/config.toml (features, notify, MCP)
|
|
144
149
|
-> .omx/ (runtime state, memory, plans, logs)
|
|
@@ -196,7 +201,8 @@ This experiment currently changes native prompt generation and metadata, not the
|
|
|
196
201
|
|
|
197
202
|
```bash
|
|
198
203
|
omx # Launch Codex (+ HUD in tmux when available)
|
|
199
|
-
omx setup # Install prompts/skills/config by scope + project AGENTS.md
|
|
204
|
+
omx setup # Install prompts/skills/config by scope + project .omx (AGENTS.md only for project scope)
|
|
205
|
+
omx agents-init . # Bootstrap lightweight AGENTS.md files for a repo/subtree
|
|
200
206
|
omx doctor # Installation/runtime diagnostics
|
|
201
207
|
omx doctor --team # Team/swarm diagnostics
|
|
202
208
|
omx ask ... # Ask local provider advisor (claude|gemini), writes .omx/artifacts/*
|
|
@@ -314,6 +320,56 @@ omx team shutdown <team-name>
|
|
|
314
320
|
|
|
315
321
|
Important rule: do not shutdown while tasks are still `in_progress` unless aborting.
|
|
316
322
|
|
|
323
|
+
### Recommended high-control workflow: `ralplan -> team -> ralph`
|
|
324
|
+
|
|
325
|
+
For contributors who want tighter control than `autopilot` but more coordination than `$ultrawork`, the strongest workflow is:
|
|
326
|
+
|
|
327
|
+
```text
|
|
328
|
+
ralplan -> team -> ralph
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
Why this combination works well:
|
|
332
|
+
- **`ralplan`** turns a rough request into a spec, acceptance checks, and a lane-ready breakdown before workers start.
|
|
333
|
+
- **`$team`** executes that plan with durable worker coordination, visible runtime state, and better handling of blockers than simple fanout.
|
|
334
|
+
- **`$ralph`** keeps the loop alive until verification is real, evidence is fresh, and cleanup is explicit.
|
|
335
|
+
|
|
336
|
+
In practice, this is the right workflow when you want to stay in control of planning and orchestration while still getting parallel execution. `autopilot` can chain these modes for you, but advanced users will often prefer running the sequence directly so they can tune worker roles, follow-up stages, and verification thresholds themselves.
|
|
337
|
+
|
|
338
|
+
Example:
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
omx ask --agent-prompt planner "ralplan: break this feature into worker lanes and acceptance checks"
|
|
342
|
+
omx team 3:executor "execute the approved ralplan with shared runtime coordination"
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
Planned documentation/product direction: make `ralplan` produce stronger team follow-up guidance by default, including worker placement hints and an explicit follow-up path such as `--followup team`.
|
|
346
|
+
|
|
347
|
+
### Why `omx team ralph` is a distinct launch mode
|
|
348
|
+
|
|
349
|
+
Use `omx team ralph ...` when the team run and Ralph follow-up should behave as
|
|
350
|
+
one linked lifecycle, not as two unrelated commands.
|
|
351
|
+
|
|
352
|
+
- **Linked lifecycle/state:** team starts with `linked_ralph=true`, Ralph tracks
|
|
353
|
+
`linked_team=true`, and terminal team phases propagate into Ralph state. That
|
|
354
|
+
gives one operator-visible chain for resume/cancel/final verification instead
|
|
355
|
+
of a manual handoff after the fact.
|
|
356
|
+
- **Cleanup/shutdown:** linked shutdown uses the Ralph-aware cleanup policy.
|
|
357
|
+
Team cleanup happens first, Ralph is terminalized from the linked team result,
|
|
358
|
+
branch rollback preserves worktree branches, and the run records linked
|
|
359
|
+
terminal metadata plus Ralph cleanup events.
|
|
360
|
+
- **Why not just `team` then later `ralph`:** if you start plain `team` and only
|
|
361
|
+
launch Ralph afterward, OMX treats them as separate runs. You do not get
|
|
362
|
+
linked terminal propagation, linked cancel ordering, or automatic Ralph-aware
|
|
363
|
+
shutdown semantics for that original team run.
|
|
364
|
+
|
|
365
|
+
Use this quick rule:
|
|
366
|
+
|
|
367
|
+
| Path | Use when |
|
|
368
|
+
|---|---|
|
|
369
|
+
| `omx team ...` | You want parallel worker coordination only; you will inspect/close the run yourself. |
|
|
370
|
+
| `omx team ralph ...` | You already know the team run should roll straight into persistent Ralph verification and linked cleanup. |
|
|
371
|
+
| `omx team ...` then later `omx ask ... ralph` | You intentionally want a separate, manual second pass after reviewing team output or changing scope. |
|
|
372
|
+
|
|
317
373
|
### Ralph Cleanup Policy
|
|
318
374
|
|
|
319
375
|
When a team runs in ralph mode (`omx team ralph ...`), the shutdown cleanup
|
|
@@ -340,6 +396,7 @@ OMX_TEAM_AUTO_INTERRUPT_RETRY=0 # optional: disable adaptive queue->resend fall
|
|
|
340
396
|
|
|
341
397
|
Notes:
|
|
342
398
|
- Worker launch args are still shared via `OMX_TEAM_WORKER_LAUNCH_ARGS` for model/config inheritance.
|
|
399
|
+
- When no explicit worker model is provided, low-complexity worker fallback follows `OMX_SPARK_MODEL` (currently `gpt-5.3-codex-spark`).
|
|
343
400
|
- `OMX_TEAM_WORKER_CLI_MAP` overrides `OMX_TEAM_WORKER_CLI` for per-worker selection.
|
|
344
401
|
- Team mode now allocates `model_reasoning_effort` per teammate from the resolved worker role (`low` / `medium` / `high`) unless an explicit reasoning override already exists in `OMX_TEAM_WORKER_LAUNCH_ARGS`.
|
|
345
402
|
- When a worker resolves to a concrete task role, OMX composes a per-worker startup instructions file that layers the corresponding role prompt on top of the shared team worker protocol; explicit `model_instructions_file` launch overrides still win.
|
|
@@ -353,25 +410,44 @@ Notes:
|
|
|
353
410
|
- `user`: `~/.codex/prompts/`, `~/.agents/skills/`, `~/.codex/config.toml`, `~/.omx/agents/`
|
|
354
411
|
- `project`: `./.codex/prompts/`, `./.agents/skills/`, `./.codex/config.toml`, `./.omx/agents/`
|
|
355
412
|
- Launch behavior: if persisted scope is `project`, `omx` launch auto-uses `CODEX_HOME=./.codex` (unless `CODEX_HOME` is already set).
|
|
356
|
-
- Managed OMX artifacts refresh by default in both interactive and non-interactive runs: prompts, skills, native agent configs,
|
|
413
|
+
- Managed OMX artifacts refresh by default in both interactive and non-interactive runs: prompts, skills, native agent configs, and the managed OMX portion of `config.toml`
|
|
414
|
+
- Project `AGENTS.md` is only generated/refreshed for `project` scope; `user` scope leaves any existing project `AGENTS.md` unchanged
|
|
357
415
|
- If a managed file differs and will be overwritten, setup creates a backup first under `.omx/backups/setup/<timestamp>/...` (project scope) or `~/.omx/backups/setup/<timestamp>/...` (user scope)
|
|
358
416
|
- Active-session safety still blocks `AGENTS.md` overwrite while an OMX session is running
|
|
359
417
|
- `config.toml` updates (for both scopes):
|
|
360
418
|
- `notify = ["node", "..."]`
|
|
361
419
|
- `model_reasoning_effort = "high"`
|
|
362
420
|
- `developer_instructions = "..."`
|
|
363
|
-
- `model = "gpt-5.4"` when root `model` is absent
|
|
421
|
+
- `model = "gpt-5.4"` when root `model` is absent (matching the current `OMX_MAIN_MODEL` default)
|
|
364
422
|
- if the existing root model is `gpt-5.3-codex`, interactive `omx setup` asks whether to upgrade it to `gpt-5.4`; non-interactive runs preserve the existing model
|
|
365
423
|
- `model_context_window = 1000000` and `model_auto_compact_token_limit = 900000` only when the effective root model is `gpt-5.4` and both context keys are absent
|
|
366
424
|
- `[features] multi_agent = true, child_agents_md = true`
|
|
367
425
|
- MCP server entries (`omx_state`, `omx_memory`, `omx_code_intel`, `omx_trace`)
|
|
368
426
|
- `[tui] status_line`
|
|
369
|
-
- Project `AGENTS.md`
|
|
427
|
+
- Project `AGENTS.md` (project scope only)
|
|
370
428
|
- `.omx/` runtime directories and HUD config
|
|
371
429
|
- Default setup output includes a compact per-category refresh summary; `--verbose` adds changed-file detail
|
|
372
430
|
- `--force` is reserved for stronger maintenance behavior such as stale/deprecated skill cleanup; it is no longer required for ordinary refresh
|
|
373
431
|
- The 1M GPT-5.4 context settings are experimental and can increase usage because requests beyond the standard context budget may count more heavily
|
|
374
432
|
|
|
433
|
+
## Lightweight AGENTS bootstrap
|
|
434
|
+
|
|
435
|
+
Use `omx agents-init [path]` when you only want a narrow AGENTS.md bootstrap helper instead of full OMX setup.
|
|
436
|
+
|
|
437
|
+
- creates or refreshes `AGENTS.md` in the target directory plus its immediate child directories
|
|
438
|
+
- skips generated/vendor/tooling directories such as `.git`, `.omx`, `.codex`, `.agents`, `node_modules`, `dist`, and `build`
|
|
439
|
+
- preserves the `<!-- OMX:AGENTS-MANUAL:* -->` section on refresh
|
|
440
|
+
- skips unmanaged existing `AGENTS.md` files unless you pass `--force`
|
|
441
|
+
- does **not** install prompts, skills, config, or replace planning/execution workflows such as `team`, `ralph`, or `ralplan`
|
|
442
|
+
|
|
443
|
+
Examples:
|
|
444
|
+
|
|
445
|
+
```bash
|
|
446
|
+
omx agents-init .
|
|
447
|
+
omx agents-init ./src --dry-run
|
|
448
|
+
omx agents-init . --force
|
|
449
|
+
```
|
|
450
|
+
|
|
375
451
|
## Agents and Skills
|
|
376
452
|
|
|
377
453
|
- Prompts: `prompts/*.md` (installed to `~/.codex/prompts/` for `user`, `./.codex/prompts/` for `project`)
|
|
@@ -484,6 +560,10 @@ npm test
|
|
|
484
560
|
|
|
485
561
|
Inspired by [oh-my-claudecode](https://github.com/Yeachan-Heo/oh-my-claudecode), adapted for Codex CLI.
|
|
486
562
|
|
|
563
|
+
## Star History
|
|
564
|
+
|
|
565
|
+
[](https://www.star-history.com/#Yeachan-Heo/oh-my-codex&Date)
|
|
566
|
+
|
|
487
567
|
## License
|
|
488
568
|
|
|
489
569
|
MIT
|
|
@@ -23,6 +23,7 @@ describe('agents/definitions', () => {
|
|
|
23
23
|
const buildAgents = getAgentsByCategory('build');
|
|
24
24
|
assert.ok(buildAgents.length > 0);
|
|
25
25
|
assert.ok(buildAgents.some((agent) => agent.name === 'executor'));
|
|
26
|
+
assert.ok(buildAgents.some((agent) => agent.name === 'team-executor'));
|
|
26
27
|
const allowed = [
|
|
27
28
|
'build',
|
|
28
29
|
'review',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.test.js","sourceRoot":"","sources":["../../../src/agents/__tests__/definitions.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,aAAa,EACb,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,oCAAoC,CAAC,CAAC;QAEnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"definitions.test.js","sourceRoot":"","sources":["../../../src/agents/__tests__/definitions.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,aAAa,EACb,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,oCAAoC,CAAC,CAAC;QAEnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC;QAEvE,MAAM,OAAO,GAAkC;YAC7C,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,SAAS;YACT,cAAc;SACf,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,OAAO,EAAE,uBAAuB,GAAG,aAAa,GAAG,WAAW,CAAC;IAC/D,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC7C,WAAW,EAAE,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;IAClD,0BAA0B;IAC1B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;IACvD,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;CACtE;
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,OAAO,EAAE,uBAAuB,GAAG,aAAa,GAAG,WAAW,CAAC;IAC/D,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC7C,WAAW,EAAE,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;IAClD,0BAA0B;IAC1B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;IACvD,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;CACtE;AAwBD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAoS7D,CAAC;AAEF,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAElE;AAED,mCAAmC;AACnC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,GAAG,eAAe,EAAE,CAE5F;AAED,0BAA0B;AAC1B,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC"}
|
|
@@ -13,6 +13,16 @@ const EXECUTOR_AGENT = {
|
|
|
13
13
|
tools: 'execution',
|
|
14
14
|
category: 'build',
|
|
15
15
|
};
|
|
16
|
+
const TEAM_EXECUTOR_AGENT = {
|
|
17
|
+
name: 'team-executor',
|
|
18
|
+
description: 'Supervised team execution for conservative delivery lanes',
|
|
19
|
+
reasoningEffort: 'medium',
|
|
20
|
+
posture: 'deep-worker',
|
|
21
|
+
modelClass: 'standard',
|
|
22
|
+
routingRole: 'executor',
|
|
23
|
+
tools: 'execution',
|
|
24
|
+
category: 'build',
|
|
25
|
+
};
|
|
16
26
|
export const AGENT_DEFINITIONS = {
|
|
17
27
|
// Build/Analysis Lane
|
|
18
28
|
'explore': {
|
|
@@ -66,6 +76,7 @@ export const AGENT_DEFINITIONS = {
|
|
|
66
76
|
category: 'build',
|
|
67
77
|
},
|
|
68
78
|
'executor': EXECUTOR_AGENT,
|
|
79
|
+
'team-executor': TEAM_EXECUTOR_AGENT,
|
|
69
80
|
'verifier': {
|
|
70
81
|
name: 'verifier',
|
|
71
82
|
description: 'Completion evidence, claim validation, test adequacy',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-init.test.d.ts","sourceRoot":"","sources":["../../../src/cli/__tests__/agents-init.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { mkdir, mkdtemp, readFile, readdir, rm, writeFile } from 'node:fs/promises';
|
|
5
|
+
import { dirname, join } from 'node:path';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { spawnSync } from 'node:child_process';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
import { agentsInit } from '../agents-init.js';
|
|
10
|
+
function runOmx(cwd, argv) {
|
|
11
|
+
const testDir = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const repoRoot = join(testDir, '..', '..', '..');
|
|
13
|
+
const omxBin = join(repoRoot, 'bin', 'omx.js');
|
|
14
|
+
const result = spawnSync(process.execPath, [omxBin, ...argv], {
|
|
15
|
+
cwd,
|
|
16
|
+
encoding: 'utf-8',
|
|
17
|
+
env: { ...process.env },
|
|
18
|
+
});
|
|
19
|
+
return {
|
|
20
|
+
status: result.status,
|
|
21
|
+
stdout: result.stdout || '',
|
|
22
|
+
stderr: result.stderr || '',
|
|
23
|
+
error: result.error?.message,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function shouldSkipForSpawnPermissions(err) {
|
|
27
|
+
return typeof err === 'string' && /(EPERM|EACCES)/i.test(err);
|
|
28
|
+
}
|
|
29
|
+
async function withCwd(cwd, fn) {
|
|
30
|
+
const previous = process.cwd();
|
|
31
|
+
process.chdir(cwd);
|
|
32
|
+
try {
|
|
33
|
+
return await fn();
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
process.chdir(previous);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function readCurrentLinuxStartTicks() {
|
|
40
|
+
if (process.platform !== 'linux')
|
|
41
|
+
return undefined;
|
|
42
|
+
try {
|
|
43
|
+
const stat = await readFile('/proc/self/stat', 'utf-8');
|
|
44
|
+
const commandEnd = stat.lastIndexOf(')');
|
|
45
|
+
if (commandEnd === -1)
|
|
46
|
+
return undefined;
|
|
47
|
+
const fields = stat.slice(commandEnd + 1).trim().split(/\s+/);
|
|
48
|
+
const ticks = Number(fields[19]);
|
|
49
|
+
return Number.isFinite(ticks) ? ticks : undefined;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
describe('omx agents-init', () => {
|
|
56
|
+
it('creates a managed root AGENTS.md plus direct-child AGENTS.md files while skipping ignored directories', async () => {
|
|
57
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-agents-init-'));
|
|
58
|
+
try {
|
|
59
|
+
await mkdir(join(wd, 'src'), { recursive: true });
|
|
60
|
+
await mkdir(join(wd, 'docs'), { recursive: true });
|
|
61
|
+
await mkdir(join(wd, 'node_modules', 'dep'), { recursive: true });
|
|
62
|
+
await mkdir(join(wd, 'dist'), { recursive: true });
|
|
63
|
+
await writeFile(join(wd, 'src', 'index.ts'), 'export const value = 1;\n');
|
|
64
|
+
await writeFile(join(wd, 'docs', 'guide.md'), '# guide\n');
|
|
65
|
+
await writeFile(join(wd, 'package.json'), '{"name":"fixture"}\n');
|
|
66
|
+
await withCwd(wd, async () => {
|
|
67
|
+
await agentsInit();
|
|
68
|
+
});
|
|
69
|
+
const rootAgents = await readFile(join(wd, 'AGENTS.md'), 'utf-8');
|
|
70
|
+
const srcAgents = await readFile(join(wd, 'src', 'AGENTS.md'), 'utf-8');
|
|
71
|
+
const docsAgents = await readFile(join(wd, 'docs', 'AGENTS.md'), 'utf-8');
|
|
72
|
+
assert.match(rootAgents, /OMX:AGENTS-INIT:MANAGED/);
|
|
73
|
+
assert.match(rootAgents, /# oh-my-codex - Intelligent Multi-Agent Orchestration/);
|
|
74
|
+
assert.match(rootAgents, /\.\/\.codex/);
|
|
75
|
+
assert.match(srcAgents, /<!-- Parent: ..\/AGENTS\.md -->/);
|
|
76
|
+
assert.match(srcAgents, /`index\.ts`/);
|
|
77
|
+
assert.match(docsAgents, /`guide\.md`/);
|
|
78
|
+
assert.equal(existsSync(join(wd, 'node_modules', 'AGENTS.md')), false);
|
|
79
|
+
assert.equal(existsSync(join(wd, 'dist', 'AGENTS.md')), false);
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
await rm(wd, { recursive: true, force: true });
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
it('refreshes managed subtree files while preserving the manual notes block', async () => {
|
|
86
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-agents-init-'));
|
|
87
|
+
try {
|
|
88
|
+
await mkdir(join(wd, 'src', 'lib'), { recursive: true });
|
|
89
|
+
await writeFile(join(wd, 'src', 'index.ts'), 'export const index = true;\n');
|
|
90
|
+
await withCwd(wd, async () => {
|
|
91
|
+
await agentsInit({ targetPath: 'src' });
|
|
92
|
+
});
|
|
93
|
+
const agentsPath = join(wd, 'src', 'AGENTS.md');
|
|
94
|
+
const initial = await readFile(agentsPath, 'utf-8');
|
|
95
|
+
const customized = initial.replace('- Add subtree-specific constraints, ownership notes, and test commands here.', '- Preserve this custom manual note.');
|
|
96
|
+
await writeFile(agentsPath, customized);
|
|
97
|
+
await writeFile(join(wd, 'src', 'new-file.ts'), 'export const newer = true;\n');
|
|
98
|
+
await withCwd(wd, async () => {
|
|
99
|
+
await agentsInit({ targetPath: 'src' });
|
|
100
|
+
});
|
|
101
|
+
const refreshed = await readFile(agentsPath, 'utf-8');
|
|
102
|
+
assert.match(refreshed, /Preserve this custom manual note\./);
|
|
103
|
+
assert.match(refreshed, /`new-file\.ts`/);
|
|
104
|
+
assert.equal(existsSync(join(wd, 'src', 'lib', 'AGENTS.md')), true);
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
await rm(wd, { recursive: true, force: true });
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
it('skips unmanaged AGENTS.md files by default but can adopt them with --force and a backup', async () => {
|
|
111
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-agents-init-'));
|
|
112
|
+
const original = '# custom root guidance\n';
|
|
113
|
+
try {
|
|
114
|
+
await mkdir(join(wd, 'src'), { recursive: true });
|
|
115
|
+
await writeFile(join(wd, 'AGENTS.md'), original);
|
|
116
|
+
await writeFile(join(wd, 'src', 'index.ts'), 'export const x = 1;\n');
|
|
117
|
+
await withCwd(wd, async () => {
|
|
118
|
+
await agentsInit();
|
|
119
|
+
});
|
|
120
|
+
assert.equal(await readFile(join(wd, 'AGENTS.md'), 'utf-8'), original);
|
|
121
|
+
assert.equal(existsSync(join(wd, 'src', 'AGENTS.md')), true);
|
|
122
|
+
await withCwd(wd, async () => {
|
|
123
|
+
await agentsInit({ force: true });
|
|
124
|
+
});
|
|
125
|
+
const adopted = await readFile(join(wd, 'AGENTS.md'), 'utf-8');
|
|
126
|
+
assert.match(adopted, /OMX:AGENTS-INIT:MANAGED/);
|
|
127
|
+
const backupRoot = join(wd, '.omx', 'backups', 'agents-init');
|
|
128
|
+
assert.equal(existsSync(backupRoot), true);
|
|
129
|
+
const timestamps = await readdir(backupRoot);
|
|
130
|
+
assert.equal(timestamps.length > 0, true);
|
|
131
|
+
const backupContent = await readFile(join(backupRoot, timestamps[0], 'AGENTS.md'), 'utf-8');
|
|
132
|
+
assert.equal(backupContent, original);
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
await rm(wd, { recursive: true, force: true });
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
it('protects project-root AGENTS.md during an active OMX session', async () => {
|
|
139
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-agents-init-'));
|
|
140
|
+
try {
|
|
141
|
+
const pidStartTicks = await readCurrentLinuxStartTicks();
|
|
142
|
+
await mkdir(join(wd, '.omx', 'state'), { recursive: true });
|
|
143
|
+
await mkdir(join(wd, 'src'), { recursive: true });
|
|
144
|
+
await writeFile(join(wd, 'AGENTS.md'), '# unmanaged\n');
|
|
145
|
+
await writeFile(join(wd, 'src', 'index.ts'), 'export const x = 1;\n');
|
|
146
|
+
await writeFile(join(wd, '.omx', 'state', 'session.json'), JSON.stringify({
|
|
147
|
+
session_id: 'session-1',
|
|
148
|
+
started_at: new Date().toISOString(),
|
|
149
|
+
cwd: wd,
|
|
150
|
+
pid: process.pid,
|
|
151
|
+
pid_start_ticks: pidStartTicks,
|
|
152
|
+
}, null, 2));
|
|
153
|
+
await withCwd(wd, async () => {
|
|
154
|
+
await agentsInit({ force: true });
|
|
155
|
+
});
|
|
156
|
+
assert.equal(await readFile(join(wd, 'AGENTS.md'), 'utf-8'), '# unmanaged\n');
|
|
157
|
+
assert.equal(existsSync(join(wd, 'src', 'AGENTS.md')), true);
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
await rm(wd, { recursive: true, force: true });
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
it('exposes help for agents-init and the deepinit alias', async () => {
|
|
164
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-agents-init-'));
|
|
165
|
+
try {
|
|
166
|
+
const helpRes = runOmx(wd, ['agents-init', '--help']);
|
|
167
|
+
if (shouldSkipForSpawnPermissions(helpRes.error))
|
|
168
|
+
return;
|
|
169
|
+
assert.equal(helpRes.status, 0, helpRes.stderr || helpRes.stdout);
|
|
170
|
+
assert.match(helpRes.stdout, /Usage: omx agents-init/);
|
|
171
|
+
const aliasRes = runOmx(wd, ['deepinit', '--help']);
|
|
172
|
+
if (shouldSkipForSpawnPermissions(aliasRes.error))
|
|
173
|
+
return;
|
|
174
|
+
assert.equal(aliasRes.status, 0, aliasRes.stderr || aliasRes.stdout);
|
|
175
|
+
assert.match(aliasRes.stdout, /Usage: omx agents-init/);
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
await rm(wd, { recursive: true, force: true });
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=agents-init.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-init.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/agents-init.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,8 @@ describe('error-handling warning guards', () => {
|
|
|
15
15
|
const source = await readSource('src/cli/index.ts');
|
|
16
16
|
assert.ok(!source.includes("await mkdir(join(cwd, '.omx', 'state'), { recursive: true }).catch(() => {});"));
|
|
17
17
|
assert.ok(!source.includes('await unlink(pidPath).catch(() => {});'));
|
|
18
|
+
const esrchGuardCount = source.match(/if \(!hasErrnoCode\(error, 'ESRCH'\)\)/g)?.length ?? 0;
|
|
19
|
+
assert.equal(esrchGuardCount, 2);
|
|
18
20
|
assert.match(source, /failed to write notify fallback watcher pid file/);
|
|
19
21
|
assert.match(source, /failed to write hook-derived watcher pid file/);
|
|
20
22
|
assert.match(source, /failed to remove notify fallback watcher pid file/);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handling-warnings.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/error-handling-warnings.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,KAAK,UAAU,UAAU,CAAC,YAAoB;IAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,4CAA4C,CAAC,CAAC;QACnE,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,kEAAkE,CAAC,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAEpD,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,+EAA+E,CAAC,CAAC,CAAC;QAC7G,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAEtE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,kDAAkD,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,+CAA+C,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,mDAAmD,CAAC,CAAC;QAC1E,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,gDAAgD,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,oCAAoC,CAAC,CAAC;QAC7E,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,uCAAuC,CAAC,CAAC;QACjF,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QAExE,MAAM,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAExD,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,wCAAwC,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,0CAA0C,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,4CAA4C,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"error-handling-warnings.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/error-handling-warnings.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,KAAK,UAAU,UAAU,CAAC,YAAoB;IAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,4CAA4C,CAAC,CAAC;QACnE,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,kEAAkE,CAAC,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAEpD,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,+EAA+E,CAAC,CAAC,CAAC;QAC7G,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAEtE,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;QAC7F,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,kDAAkD,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,+CAA+C,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,mDAAmD,CAAC,CAAC;QAC1E,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,gDAAgD,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,oCAAoC,CAAC,CAAC;QAC7E,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,uCAAuC,CAAC,CAAC;QACjF,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QAExE,MAAM,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAExD,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,wCAAwC,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,0CAA0C,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,4CAA4C,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -3,7 +3,7 @@ import assert from 'node:assert/strict';
|
|
|
3
3
|
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { tmpdir } from 'node:os';
|
|
6
|
-
import { normalizeCodexLaunchArgs, buildTmuxShellCommand, buildTmuxPaneCommand, buildTmuxSessionName, resolveCliInvocation, resolveCodexLaunchPolicy, classifyCodexExecFailure, resolveSignalExitCode, parseTmuxPaneSnapshot, findHudWatchPaneIds, buildHudPaneCleanupTargets, readTopLevelTomlString, upsertTopLevelTomlString, collectInheritableTeamWorkerArgs, resolveTeamWorkerLaunchArgsEnv, injectModelInstructionsBypassArgs, resolveWorkerSparkModel, resolveSetupScopeArg, readPersistedSetupScope, resolveCodexHomeForLaunch, buildDetachedSessionBootstrapSteps, buildDetachedSessionFinalizeSteps, buildDetachedSessionRollbackSteps, resolveNotifyTempContract, buildNotifyTempStartupMessages, } from '../index.js';
|
|
6
|
+
import { normalizeCodexLaunchArgs, buildTmuxShellCommand, buildTmuxPaneCommand, buildWindowsPromptCommand, buildTmuxSessionName, resolveCliInvocation, resolveCodexLaunchPolicy, classifyCodexExecFailure, resolveSignalExitCode, parseTmuxPaneSnapshot, findHudWatchPaneIds, buildHudPaneCleanupTargets, readTopLevelTomlString, upsertTopLevelTomlString, collectInheritableTeamWorkerArgs, resolveTeamWorkerLaunchArgsEnv, injectModelInstructionsBypassArgs, resolveWorkerSparkModel, resolveSetupScopeArg, readPersistedSetupScope, resolveCodexHomeForLaunch, buildDetachedSessionBootstrapSteps, buildDetachedSessionFinalizeSteps, buildDetachedSessionRollbackSteps, resolveNotifyTempContract, buildNotifyTempStartupMessages, } from '../index.js';
|
|
7
7
|
import { HUD_TMUX_HEIGHT_LINES } from '../../hud/constants.js';
|
|
8
8
|
import { DEFAULT_FRONTIER_MODEL, getTeamLowComplexityModel } from '../../config/models.js';
|
|
9
9
|
function expectedLowComplexityModel(codexHomeOverride) {
|
|
@@ -167,12 +167,30 @@ describe('resolveCliInvocation', () => {
|
|
|
167
167
|
launchArgs: [],
|
|
168
168
|
});
|
|
169
169
|
});
|
|
170
|
+
it('resolves session to session command', () => {
|
|
171
|
+
assert.deepEqual(resolveCliInvocation(['session', 'search', 'startup evidence']), {
|
|
172
|
+
command: 'session',
|
|
173
|
+
launchArgs: [],
|
|
174
|
+
});
|
|
175
|
+
});
|
|
170
176
|
it('resolves hooks to hooks command', () => {
|
|
171
177
|
assert.deepEqual(resolveCliInvocation(['hooks']), {
|
|
172
178
|
command: 'hooks',
|
|
173
179
|
launchArgs: [],
|
|
174
180
|
});
|
|
175
181
|
});
|
|
182
|
+
it('resolves agents-init to agents-init command', () => {
|
|
183
|
+
assert.deepEqual(resolveCliInvocation(['agents-init', '.']), {
|
|
184
|
+
command: 'agents-init',
|
|
185
|
+
launchArgs: [],
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
it('resolves deepinit to deepinit alias command', () => {
|
|
189
|
+
assert.deepEqual(resolveCliInvocation(['deepinit', 'src']), {
|
|
190
|
+
command: 'deepinit',
|
|
191
|
+
launchArgs: [],
|
|
192
|
+
});
|
|
193
|
+
});
|
|
176
194
|
it('resolves --help to the help command instead of launch', () => {
|
|
177
195
|
assert.deepEqual(resolveCliInvocation(['--help']), {
|
|
178
196
|
command: 'help',
|
|
@@ -355,6 +373,11 @@ describe('detached tmux new-session sequencing', () => {
|
|
|
355
373
|
assert.equal(newSession.args.includes('-e')
|
|
356
374
|
&& newSession.args.some((arg) => arg.startsWith('OMX_NOTIFY_TEMP_CONTRACT=')), true);
|
|
357
375
|
});
|
|
376
|
+
it('buildDetachedSessionBootstrapSteps starts native Windows detached sessions with powershell', () => {
|
|
377
|
+
const steps = buildDetachedSessionBootstrapSteps('omx-demo', 'C:/project', "'codex' '--dangerously-bypass-approvals-and-sandbox'", "'node' 'omx.js' 'hud' '--watch'", '--model gpt-5', 'C:/codex-home', null, true);
|
|
378
|
+
assert.equal(steps[0]?.name, 'new-session');
|
|
379
|
+
assert.equal(steps[0]?.args.at(-1), 'powershell.exe');
|
|
380
|
+
});
|
|
358
381
|
it('buildDetachedSessionFinalizeSteps keeps schedule after split-capture and before attach', () => {
|
|
359
382
|
const steps = buildDetachedSessionFinalizeSteps('omx-demo', '%12', '3', true, false);
|
|
360
383
|
const names = steps.map((step) => step.name);
|
|
@@ -380,6 +403,10 @@ describe('detached tmux new-session sequencing', () => {
|
|
|
380
403
|
assert.match((reconcile?.args ?? []).join(' '), />\/dev\/null 2>&1 \|\| true/);
|
|
381
404
|
assert.match((reconcile?.args ?? []).join(' '), new RegExp(`-y ${HUD_TMUX_HEIGHT_LINES}\\b`));
|
|
382
405
|
});
|
|
406
|
+
it('buildDetachedSessionFinalizeSteps skips detached resize hooks on native Windows', () => {
|
|
407
|
+
const steps = buildDetachedSessionFinalizeSteps('omx-demo', '%12', '3', true, false, true);
|
|
408
|
+
assert.deepEqual(steps.map((step) => step.name), ['set-mouse', 'attach-session']);
|
|
409
|
+
});
|
|
383
410
|
it('buildDetachedSessionRollbackSteps unregisters hooks before killing session', () => {
|
|
384
411
|
const steps = buildDetachedSessionRollbackSteps('omx-demo', 'omx-demo:0', 'omx_resize_launch_demo_0_12', 'omx_attached_launch_demo_0_12');
|
|
385
412
|
assert.deepEqual(steps.map((step) => step.name), ['unregister-client-attached-reconcile', 'unregister-resize-hook', 'kill-session']);
|
|
@@ -425,10 +452,15 @@ describe('buildTmuxPaneCommand', () => {
|
|
|
425
452
|
assert.ok(result.startsWith("'/bin/sh' -lc "), 'should fall back to /bin/sh');
|
|
426
453
|
});
|
|
427
454
|
});
|
|
455
|
+
describe('buildWindowsPromptCommand', () => {
|
|
456
|
+
it('quotes detached Windows codex commands for PowerShell prompt injection', () => {
|
|
457
|
+
assert.equal(buildWindowsPromptCommand('codex', ['--dangerously-bypass-approvals-and-sandbox', '-c', 'model_reasoning_effort="high"', "it's"]), "& 'codex' '--dangerously-bypass-approvals-and-sandbox' '-c' 'model_reasoning_effort=\"high\"' 'it''s'");
|
|
458
|
+
});
|
|
459
|
+
});
|
|
428
460
|
describe('buildTmuxSessionName', () => {
|
|
429
|
-
it('uses
|
|
461
|
+
it('uses detached fallback quietly outside git repos', () => {
|
|
430
462
|
const name = buildTmuxSessionName('/tmp/My Repo', 'omx-1770992424158-abc123');
|
|
431
|
-
assert.
|
|
463
|
+
assert.equal(name, 'omx-my-repo-detached-1770992424158-abc123');
|
|
432
464
|
});
|
|
433
465
|
it('sanitizes invalid characters', () => {
|
|
434
466
|
const name = buildTmuxSessionName('/tmp/@#$', 'omx-+++');
|