oh-my-codex 0.7.6 → 0.8.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.de.md +315 -0
- package/README.es.md +296 -17
- package/README.fr.md +315 -0
- package/README.it.md +315 -0
- package/README.ja.md +297 -18
- package/README.ko.md +296 -17
- package/README.md +110 -13
- package/README.pt.md +296 -17
- package/README.ru.md +296 -17
- package/README.tr.md +315 -0
- package/README.vi.md +297 -18
- package/README.zh-TW.md +362 -0
- package/README.zh.md +293 -17
- package/dist/catalog/__tests__/generator.test.js +2 -0
- package/dist/catalog/__tests__/generator.test.js.map +1 -1
- package/dist/catalog/__tests__/schema.test.js +7 -0
- package/dist/catalog/__tests__/schema.test.js.map +1 -1
- package/dist/cli/__tests__/ask.test.d.ts +2 -0
- package/dist/cli/__tests__/ask.test.d.ts.map +1 -0
- package/dist/cli/__tests__/ask.test.js +236 -0
- package/dist/cli/__tests__/ask.test.js.map +1 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.d.ts +2 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.d.ts.map +1 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js +45 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -0
- package/dist/cli/__tests__/index.test.js +85 -2
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/ralph-prd-deep-interview.test.d.ts +2 -0
- package/dist/cli/__tests__/ralph-prd-deep-interview.test.d.ts.map +1 -0
- package/dist/cli/__tests__/ralph-prd-deep-interview.test.js +15 -0
- package/dist/cli/__tests__/ralph-prd-deep-interview.test.js.map +1 -0
- package/dist/cli/__tests__/ralph.test.js +19 -43
- package/dist/cli/__tests__/ralph.test.js.map +1 -1
- package/dist/cli/__tests__/setup-scope.test.js +2 -0
- package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +219 -1
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/__tests__/version.test.d.ts +2 -0
- package/dist/cli/__tests__/version.test.d.ts.map +1 -0
- package/dist/cli/__tests__/version.test.js +21 -0
- package/dist/cli/__tests__/version.test.js.map +1 -0
- package/dist/cli/ask.d.ts +13 -0
- package/dist/cli/ask.d.ts.map +1 -0
- package/dist/cli/ask.js +174 -0
- package/dist/cli/ask.js.map +1 -0
- package/dist/cli/constants.d.ts +10 -0
- package/dist/cli/constants.d.ts.map +1 -0
- package/dist/cli/constants.js +10 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/doctor.js +16 -5
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +8 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +150 -52
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ralph.d.ts +3 -11
- package/dist/cli/ralph.d.ts.map +1 -1
- package/dist/cli/ralph.js +64 -45
- package/dist/cli/ralph.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +17 -18
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +257 -0
- package/dist/cli/team.js.map +1 -1
- package/dist/hooks/__tests__/deep-interview-contract.test.d.ts +2 -0
- package/dist/hooks/__tests__/deep-interview-contract.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/deep-interview-contract.test.js +55 -0
- package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -0
- package/dist/hooks/__tests__/emulator.test.js +6 -0
- package/dist/hooks/__tests__/emulator.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +44 -22
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +23 -7
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js +59 -0
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +264 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +61 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +17 -7
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/openclaw-setup-contract.test.d.ts +2 -0
- package/dist/hooks/__tests__/openclaw-setup-contract.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/openclaw-setup-contract.test.js +61 -0
- package/dist/hooks/__tests__/openclaw-setup-contract.test.js.map +1 -0
- package/dist/hooks/__tests__/pre-context-gate-skills.test.d.ts +2 -0
- package/dist/hooks/__tests__/pre-context-gate-skills.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/pre-context-gate-skills.test.js +34 -0
- package/dist/hooks/__tests__/pre-context-gate-skills.test.js.map +1 -0
- package/dist/hooks/__tests__/visual-verdict-loop.test.d.ts +2 -0
- package/dist/hooks/__tests__/visual-verdict-loop.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/visual-verdict-loop.test.js +35 -0
- package/dist/hooks/__tests__/visual-verdict-loop.test.js.map +1 -0
- package/dist/hooks/agents-overlay.d.ts.map +1 -1
- package/dist/hooks/agents-overlay.js +18 -16
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/codebase-map.d.ts.map +1 -1
- package/dist/hooks/codebase-map.js +6 -2
- package/dist/hooks/codebase-map.js.map +1 -1
- package/dist/hooks/emulator.d.ts.map +1 -1
- package/dist/hooks/emulator.js +2 -0
- package/dist/hooks/emulator.js.map +1 -1
- package/dist/hooks/extensibility/sdk.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk.js +2 -1
- package/dist/hooks/extensibility/sdk.js.map +1 -1
- package/dist/hooks/keyword-registry.d.ts.map +1 -1
- package/dist/hooks/keyword-registry.js +6 -0
- package/dist/hooks/keyword-registry.js.map +1 -1
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +2 -24
- package/dist/hud/index.js.map +1 -1
- package/dist/mcp/__tests__/path-traversal.test.js +9 -227
- package/dist/mcp/__tests__/path-traversal.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server-schema.test.js +16 -20
- package/dist/mcp/__tests__/state-server-schema.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server-team-tools.test.js +30 -487
- package/dist/mcp/__tests__/state-server-team-tools.test.js.map +1 -1
- package/dist/mcp/code-intel-server.d.ts.map +1 -1
- package/dist/mcp/code-intel-server.js +18 -8
- package/dist/mcp/code-intel-server.js.map +1 -1
- package/dist/mcp/memory-server.js +72 -11
- package/dist/mcp/memory-server.js.map +1 -1
- package/dist/mcp/state-paths.d.ts.map +1 -1
- package/dist/mcp/state-paths.js +4 -1
- package/dist/mcp/state-paths.js.map +1 -1
- package/dist/mcp/state-server.d.ts +179 -0
- package/dist/mcp/state-server.d.ts.map +1 -1
- package/dist/mcp/state-server.js +221 -1111
- package/dist/mcp/state-server.js.map +1 -1
- package/dist/mcp/team-server.d.ts.map +1 -1
- package/dist/mcp/team-server.js +9 -3
- package/dist/mcp/team-server.js.map +1 -1
- package/dist/mcp/trace-server.d.ts.map +1 -1
- package/dist/mcp/trace-server.js +8 -3
- package/dist/mcp/trace-server.js.map +1 -1
- package/dist/notifications/__tests__/dispatch-cooldown.test.d.ts +5 -0
- package/dist/notifications/__tests__/dispatch-cooldown.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/dispatch-cooldown.test.js +100 -0
- package/dist/notifications/__tests__/dispatch-cooldown.test.js.map +1 -0
- package/dist/notifications/__tests__/temp-mode.test.d.ts +2 -0
- package/dist/notifications/__tests__/temp-mode.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/temp-mode.test.js +172 -0
- package/dist/notifications/__tests__/temp-mode.test.js.map +1 -0
- package/dist/notifications/config.d.ts.map +1 -1
- package/dist/notifications/config.js +67 -7
- package/dist/notifications/config.js.map +1 -1
- package/dist/notifications/dispatch-cooldown.d.ts +36 -0
- package/dist/notifications/dispatch-cooldown.d.ts.map +1 -0
- package/dist/notifications/dispatch-cooldown.js +109 -0
- package/dist/notifications/dispatch-cooldown.js.map +1 -0
- package/dist/notifications/dispatcher.d.ts.map +1 -1
- package/dist/notifications/dispatcher.js +4 -4
- package/dist/notifications/dispatcher.js.map +1 -1
- package/dist/notifications/index.d.ts +5 -0
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +39 -8
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/reply-listener.d.ts.map +1 -1
- package/dist/notifications/reply-listener.js +6 -2
- package/dist/notifications/reply-listener.js.map +1 -1
- package/dist/notifications/session-registry.d.ts.map +1 -1
- package/dist/notifications/session-registry.js +2 -2
- package/dist/notifications/session-registry.js.map +1 -1
- package/dist/notifications/temp-contract.d.ts +22 -0
- package/dist/notifications/temp-contract.d.ts.map +1 -0
- package/dist/notifications/temp-contract.js +147 -0
- package/dist/notifications/temp-contract.js.map +1 -0
- package/dist/notifications/tmux.js +2 -2
- package/dist/notifications/tmux.js.map +1 -1
- package/dist/notifications/types.d.ts +18 -0
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/openclaw/__tests__/config.test.js +81 -0
- package/dist/openclaw/__tests__/config.test.js.map +1 -1
- package/dist/openclaw/__tests__/dispatcher.test.js +40 -1
- package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -1
- package/dist/openclaw/config.d.ts +4 -0
- package/dist/openclaw/config.d.ts.map +1 -1
- package/dist/openclaw/config.js +110 -16
- package/dist/openclaw/config.js.map +1 -1
- package/dist/openclaw/dispatcher.d.ts +9 -3
- package/dist/openclaw/dispatcher.d.ts.map +1 -1
- package/dist/openclaw/dispatcher.js +42 -9
- package/dist/openclaw/dispatcher.js.map +1 -1
- package/dist/openclaw/types.d.ts +5 -1
- package/dist/openclaw/types.d.ts.map +1 -1
- package/dist/ralph/__tests__/persistence.test.js +28 -1
- package/dist/ralph/__tests__/persistence.test.js.map +1 -1
- package/dist/ralph/persistence.d.ts +21 -0
- package/dist/ralph/persistence.d.ts.map +1 -1
- package/dist/ralph/persistence.js +85 -2
- package/dist/ralph/persistence.js.map +1 -1
- package/dist/state/paths.d.ts +3 -0
- package/dist/state/paths.d.ts.map +1 -0
- package/dist/state/paths.js +2 -0
- package/dist/state/paths.js.map +1 -0
- package/dist/team/__tests__/api-interop.test.d.ts +2 -0
- package/dist/team/__tests__/api-interop.test.d.ts.map +1 -0
- package/dist/team/__tests__/api-interop.test.js +1052 -0
- package/dist/team/__tests__/api-interop.test.js.map +1 -0
- package/dist/team/__tests__/idle-nudge.test.d.ts +2 -0
- package/dist/team/__tests__/idle-nudge.test.d.ts.map +1 -0
- package/dist/team/__tests__/idle-nudge.test.js +225 -0
- package/dist/team/__tests__/idle-nudge.test.js.map +1 -0
- package/dist/team/__tests__/mcp-comm.test.js +30 -0
- package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +33 -26
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/state-root.test.d.ts +2 -0
- package/dist/team/__tests__/state-root.test.d.ts.map +1 -0
- package/dist/team/__tests__/state-root.test.js +9 -0
- package/dist/team/__tests__/state-root.test.js.map +1 -0
- package/dist/team/__tests__/state.test.js +52 -17
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/team-ops-contract.test.d.ts +2 -0
- package/dist/team/__tests__/team-ops-contract.test.d.ts.map +1 -0
- package/dist/team/__tests__/team-ops-contract.test.js +90 -0
- package/dist/team/__tests__/team-ops-contract.test.js.map +1 -0
- package/dist/team/__tests__/tmux-claude-workers-demo.test.d.ts +2 -0
- package/dist/team/__tests__/tmux-claude-workers-demo.test.d.ts.map +1 -0
- package/dist/team/__tests__/tmux-claude-workers-demo.test.js +176 -0
- package/dist/team/__tests__/tmux-claude-workers-demo.test.js.map +1 -0
- package/dist/team/__tests__/tmux-session.test.js +8 -0
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.js +29 -0
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/__tests__/worktree.test.js +54 -1
- package/dist/team/__tests__/worktree.test.js.map +1 -1
- package/dist/team/api-interop.d.ts +19 -0
- package/dist/team/api-interop.d.ts.map +1 -0
- package/dist/team/api-interop.js +578 -0
- package/dist/team/api-interop.js.map +1 -0
- package/dist/team/mcp-comm.d.ts.map +1 -1
- package/dist/team/mcp-comm.js +32 -2
- package/dist/team/mcp-comm.js.map +1 -1
- package/dist/team/orchestrator.d.ts +1 -10
- package/dist/team/orchestrator.d.ts.map +1 -1
- package/dist/team/orchestrator.js +8 -0
- package/dist/team/orchestrator.js.map +1 -1
- package/dist/team/runtime-cli.js +14 -8
- package/dist/team/runtime-cli.js.map +1 -1
- package/dist/team/runtime.d.ts +2 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +103 -30
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +33 -12
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state/approvals.d.ts +25 -0
- package/dist/team/state/approvals.d.ts.map +1 -0
- package/dist/team/state/approvals.js +31 -0
- package/dist/team/state/approvals.js.map +1 -0
- package/dist/team/state/config.d.ts +2 -0
- package/dist/team/state/config.d.ts.map +1 -0
- package/dist/team/state/config.js +2 -0
- package/dist/team/state/config.js.map +1 -0
- package/dist/team/state/dispatch-lock.d.ts +3 -0
- package/dist/team/state/dispatch-lock.d.ts.map +1 -0
- package/dist/team/state/dispatch-lock.js +81 -0
- package/dist/team/state/dispatch-lock.js.map +1 -0
- package/dist/team/state/dispatch.d.ts +61 -0
- package/dist/team/state/dispatch.d.ts.map +1 -0
- package/dist/team/state/dispatch.js +158 -0
- package/dist/team/state/dispatch.js.map +1 -0
- package/dist/team/state/events.d.ts +2 -0
- package/dist/team/state/events.d.ts.map +1 -0
- package/dist/team/state/events.js +2 -0
- package/dist/team/state/events.js.map +1 -0
- package/dist/team/state/index.d.ts +11 -0
- package/dist/team/state/index.d.ts.map +1 -0
- package/dist/team/state/index.js +11 -0
- package/dist/team/state/index.js.map +1 -0
- package/dist/team/state/io.d.ts +2 -0
- package/dist/team/state/io.d.ts.map +1 -0
- package/dist/team/state/io.js +2 -0
- package/dist/team/state/io.js.map +1 -0
- package/dist/team/state/locks.d.ts +16 -0
- package/dist/team/state/locks.d.ts.map +1 -0
- package/dist/team/state/locks.js +201 -0
- package/dist/team/state/locks.js.map +1 -0
- package/dist/team/state/mailbox.d.ts +39 -0
- package/dist/team/state/mailbox.d.ts.map +1 -0
- package/dist/team/state/mailbox.js +58 -0
- package/dist/team/state/mailbox.js.map +1 -0
- package/dist/team/state/monitor.d.ts +96 -0
- package/dist/team/state/monitor.d.ts.map +1 -0
- package/dist/team/state/monitor.js +163 -0
- package/dist/team/state/monitor.js.map +1 -0
- package/dist/team/state/shutdown.d.ts +2 -0
- package/dist/team/state/shutdown.d.ts.map +1 -0
- package/dist/team/state/shutdown.js +2 -0
- package/dist/team/state/shutdown.js.map +1 -0
- package/dist/team/state/summary.d.ts +2 -0
- package/dist/team/state/summary.d.ts.map +1 -0
- package/dist/team/state/summary.js +2 -0
- package/dist/team/state/summary.js.map +1 -0
- package/dist/team/state/tasks.d.ts +49 -0
- package/dist/team/state/tasks.d.ts.map +1 -0
- package/dist/team/state/tasks.js +182 -0
- package/dist/team/state/tasks.js.map +1 -0
- package/dist/team/state/types.d.ts +281 -0
- package/dist/team/state/types.d.ts.map +1 -0
- package/dist/team/state/types.js +3 -0
- package/dist/team/state/types.js.map +1 -0
- package/dist/team/state/workers.d.ts +2 -0
- package/dist/team/state/workers.d.ts.map +1 -0
- package/dist/team/state/workers.js +2 -0
- package/dist/team/state/workers.js.map +1 -0
- package/dist/team/state-root.d.ts +5 -0
- package/dist/team/state-root.d.ts.map +1 -0
- package/dist/team/state-root.js +8 -0
- package/dist/team/state-root.js.map +1 -0
- package/dist/team/state.d.ts +4 -1
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +200 -881
- package/dist/team/state.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +11 -10
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +58 -26
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/dist/team/worktree.d.ts.map +1 -1
- package/dist/team/worktree.js +43 -1
- package/dist/team/worktree.js.map +1 -1
- package/dist/utils/safe-json.d.ts +3 -0
- package/dist/utils/safe-json.d.ts.map +1 -0
- package/dist/utils/safe-json.js +19 -0
- package/dist/utils/safe-json.js.map +1 -0
- package/dist/utils/sleep.d.ts +3 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +15 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/visual/__tests__/verdict.test.d.ts +2 -0
- package/dist/visual/__tests__/verdict.test.d.ts.map +1 -0
- package/dist/visual/__tests__/verdict.test.js +81 -0
- package/dist/visual/__tests__/verdict.test.js.map +1 -0
- package/dist/visual/constants.d.ts +4 -0
- package/dist/visual/constants.d.ts.map +1 -0
- package/dist/visual/constants.js +3 -0
- package/dist/visual/constants.js.map +1 -0
- package/dist/visual/verdict.d.ts +17 -0
- package/dist/visual/verdict.d.ts.map +1 -0
- package/dist/visual/verdict.js +61 -0
- package/dist/visual/verdict.js.map +1 -0
- package/package.json +10 -3
- package/scripts/ask-claude.sh +17 -0
- package/scripts/ask-gemini.sh +14 -0
- package/scripts/demo-claude-workers.sh +241 -0
- package/scripts/demo-team-e2e.sh +179 -0
- package/scripts/fixtures/ask-advisor-stub.js +12 -0
- package/scripts/notify-hook/team-dispatch.js +234 -12
- package/scripts/notify-hook/team-leader-nudge.js +42 -2
- package/scripts/notify-hook/team-worker.js +63 -4
- package/scripts/notify-hook/visual-verdict.js +50 -1
- package/scripts/notify-hook.js +1 -0
- package/scripts/run-provider-advisor.js +179 -0
- package/skills/ask-claude/SKILL.md +61 -0
- package/skills/ask-gemini/SKILL.md +61 -0
- package/skills/autopilot/SKILL.md +32 -2
- package/skills/configure-notifications/SKILL.md +188 -186
- package/skills/deep-interview/SKILL.md +247 -0
- package/skills/omx-setup/SKILL.md +1 -1
- package/skills/ralph/SKILL.md +42 -11
- package/skills/ralplan/SKILL.md +17 -0
- package/skills/team/SKILL.md +64 -5
- package/skills/visual-verdict/SKILL.md +76 -0
- package/skills/web-clone/SKILL.md +366 -0
- package/skills/worker/SKILL.md +42 -11
- package/templates/AGENTS.md +9 -0
- package/templates/catalog-manifest.json +39 -18
- package/skills/configure-discord/SKILL.md +0 -256
- package/skills/configure-openclaw/SKILL.md +0 -267
- package/skills/configure-slack/SKILL.md +0 -226
- package/skills/configure-telegram/SKILL.md +0 -232
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oh-my-codex",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "Multi-agent orchestration layer for OpenAI Codex CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -11,9 +11,14 @@
|
|
|
11
11
|
"build": "tsc",
|
|
12
12
|
"check:no-unused": "tsc -p tsconfig.no-unused.json",
|
|
13
13
|
"dev": "tsc --watch",
|
|
14
|
+
"lint": "biome lint .",
|
|
14
15
|
"setup": "node bin/omx.js setup",
|
|
15
16
|
"doctor": "node bin/omx.js doctor",
|
|
16
|
-
"
|
|
17
|
+
"ask:claude": "./scripts/ask-claude.sh",
|
|
18
|
+
"ask:gemini": "./scripts/ask-gemini.sh",
|
|
19
|
+
"test:node": "node --test $(find dist -name '*.test.js')",
|
|
20
|
+
"test": "npm run build && npm run test:node && node scripts/generate-catalog-docs.js --check",
|
|
21
|
+
"coverage:team-critical": "npm run build && c8 --all --src dist/team --src dist/state --include 'dist/team/**/*.js' --include 'dist/state/**/*.js' --exclude '**/__tests__/**' --reporter=text-summary --reporter=lcov --reporter=json-summary --report-dir coverage/team --check-coverage --lines=78 --functions=90 --branches=70 --statements=78 node --test $(find dist/team/__tests__ dist/state/__tests__ -name '*.test.js')"
|
|
17
22
|
},
|
|
18
23
|
"engines": {
|
|
19
24
|
"node": ">=20"
|
|
@@ -46,10 +51,12 @@
|
|
|
46
51
|
},
|
|
47
52
|
"license": "MIT",
|
|
48
53
|
"dependencies": {
|
|
49
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
54
|
+
"@modelcontextprotocol/sdk": "^1.26.0"
|
|
50
55
|
},
|
|
51
56
|
"devDependencies": {
|
|
57
|
+
"@biomejs/biome": "^2.4.4",
|
|
52
58
|
"@types/node": "^22.19.11",
|
|
59
|
+
"c8": "^10.1.3",
|
|
53
60
|
"typescript": "^5.7.0"
|
|
54
61
|
},
|
|
55
62
|
"overrides": {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
set -eu
|
|
3
|
+
|
|
4
|
+
if [ "$#" -eq 0 ]; then
|
|
5
|
+
echo "Usage: scripts/ask-claude.sh <question or task>" >&2
|
|
6
|
+
exit 1
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
|
|
10
|
+
echo "[omx] wrapper deprecation: prefer 'omx ask claude \"...\"'." >&2
|
|
11
|
+
if [ -x "$SCRIPT_DIR/../bin/omx.js" ]; then
|
|
12
|
+
if node "$SCRIPT_DIR/../bin/omx.js" ask claude "$@"; then
|
|
13
|
+
exit 0
|
|
14
|
+
fi
|
|
15
|
+
echo "[omx] wrapper fallback: bin/omx ask failed, using legacy advisor script." >&2
|
|
16
|
+
fi
|
|
17
|
+
exec node "$SCRIPT_DIR/run-provider-advisor.js" claude "$@"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
set -eu
|
|
3
|
+
|
|
4
|
+
if [ "$#" -eq 0 ]; then
|
|
5
|
+
echo "Usage: scripts/ask-gemini.sh <question or task>" >&2
|
|
6
|
+
exit 1
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
|
|
10
|
+
echo "[omx] wrapper deprecation: prefer 'omx ask gemini \"...\"'." >&2
|
|
11
|
+
if [ -x "$SCRIPT_DIR/../bin/omx.js" ]; then
|
|
12
|
+
exec node "$SCRIPT_DIR/../bin/omx.js" ask gemini "$@"
|
|
13
|
+
fi
|
|
14
|
+
exec node "$SCRIPT_DIR/run-provider-advisor.js" gemini "$@"
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# OMX Tmux Claude Workers Demo Script
|
|
4
|
+
#
|
|
5
|
+
# This script demonstrates the tmux-based multi-agent orchestration system
|
|
6
|
+
# with Claude Code CLI workers. It showcases:
|
|
7
|
+
# - Multi-worker coordination in tmux panes
|
|
8
|
+
# - Task lifecycle management (create, claim, complete)
|
|
9
|
+
# - Mailbox-based communication between workers
|
|
10
|
+
# - Mixed workload distribution across Claude workers
|
|
11
|
+
#
|
|
12
|
+
# Usage:
|
|
13
|
+
# ./scripts/demo-claude-workers.sh
|
|
14
|
+
#
|
|
15
|
+
# Environment Variables:
|
|
16
|
+
# WORKER_COUNT Number of workers (default: 3, minimum: 2)
|
|
17
|
+
# TEAM_TASK Task description (default: "tmux claude workers demo")
|
|
18
|
+
# TEAM_NAME Team identifier (default: slugified TEAM_TASK)
|
|
19
|
+
# OMX_TEAM_WORKER_LAUNCH_MODE Worker launch mode (default: interactive)
|
|
20
|
+
# OMX_TEAM_WORKER_LAUNCH_ARGS Arguments passed to Claude CLI
|
|
21
|
+
#
|
|
22
|
+
# Example:
|
|
23
|
+
# WORKER_COUNT=5 ./scripts/demo-claude-workers.sh
|
|
24
|
+
#
|
|
25
|
+
# shellcheck disable=SC2317 # Functions are called via trap
|
|
26
|
+
|
|
27
|
+
set -euo pipefail
|
|
28
|
+
|
|
29
|
+
readonly SCRIPT_VERSION="1.0.0"
|
|
30
|
+
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
31
|
+
|
|
32
|
+
require_bin() {
|
|
33
|
+
if ! command -v "$1" >/dev/null 2>&1; then
|
|
34
|
+
echo "error: required command not found: $1" >&2
|
|
35
|
+
exit 1
|
|
36
|
+
fi
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
slugify() {
|
|
40
|
+
echo "$1" \
|
|
41
|
+
| tr '[:upper:]' '[:lower:]' \
|
|
42
|
+
| sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//; s/-+/-/g' \
|
|
43
|
+
| cut -c1-30
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
require_bin omx
|
|
47
|
+
require_bin jq
|
|
48
|
+
require_bin tmux
|
|
49
|
+
|
|
50
|
+
WORKER_COUNT="${WORKER_COUNT:-3}"
|
|
51
|
+
if ! [[ "$WORKER_COUNT" =~ ^[0-9]+$ ]]; then
|
|
52
|
+
echo "error: WORKER_COUNT must be a positive integer (got: $WORKER_COUNT)" >&2
|
|
53
|
+
exit 1
|
|
54
|
+
fi
|
|
55
|
+
if ((WORKER_COUNT < 2)); then
|
|
56
|
+
echo "error: WORKER_COUNT must be >= 2 for this demo (got: $WORKER_COUNT)" >&2
|
|
57
|
+
exit 1
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
TEAM_TASK="${TEAM_TASK:-tmux claude workers demo}"
|
|
61
|
+
TEAM_NAME="${TEAM_NAME:-$(slugify "$TEAM_TASK")}"
|
|
62
|
+
OMX_TEAM_WORKER_LAUNCH_MODE="${OMX_TEAM_WORKER_LAUNCH_MODE:-interactive}"
|
|
63
|
+
|
|
64
|
+
# All workers use Claude CLI for this demo
|
|
65
|
+
build_claude_cli_map() {
|
|
66
|
+
local count="$1"
|
|
67
|
+
local entries=()
|
|
68
|
+
local i
|
|
69
|
+
for ((i = 1; i <= count; i++)); do
|
|
70
|
+
entries+=("claude")
|
|
71
|
+
done
|
|
72
|
+
(IFS=,; echo "${entries[*]}")
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
OMX_TEAM_WORKER_CLI="${OMX_TEAM_WORKER_CLI:-auto}"
|
|
76
|
+
OMX_TEAM_WORKER_CLI_MAP="${OMX_TEAM_WORKER_CLI_MAP:-$(build_claude_cli_map "$WORKER_COUNT")}"
|
|
77
|
+
|
|
78
|
+
TEAM_STARTED=0
|
|
79
|
+
cleanup() {
|
|
80
|
+
if ((TEAM_STARTED == 1)); then
|
|
81
|
+
echo "[cleanup] shutting down team: $TEAM_NAME"
|
|
82
|
+
omx team shutdown "$TEAM_NAME" >/dev/null 2>&1 || true
|
|
83
|
+
echo "[cleanup] cleaning state for team: $TEAM_NAME"
|
|
84
|
+
omx team api cleanup --input "{\"team_name\":\"$TEAM_NAME\"}" --json >/dev/null 2>&1 || true
|
|
85
|
+
fi
|
|
86
|
+
}
|
|
87
|
+
trap cleanup EXIT
|
|
88
|
+
|
|
89
|
+
echo "== OMX Tmux Claude Workers Demo v${SCRIPT_VERSION} =="
|
|
90
|
+
echo "TEAM_TASK=$TEAM_TASK"
|
|
91
|
+
echo "TEAM_NAME=$TEAM_NAME"
|
|
92
|
+
echo "WORKER_COUNT=$WORKER_COUNT"
|
|
93
|
+
echo "OMX_TEAM_WORKER_CLI=$OMX_TEAM_WORKER_CLI"
|
|
94
|
+
echo "OMX_TEAM_WORKER_CLI_MAP=$OMX_TEAM_WORKER_CLI_MAP"
|
|
95
|
+
echo ""
|
|
96
|
+
echo "This demo showcases Claude Code CLI workers in tmux panes"
|
|
97
|
+
echo "coordinated through the OMX team orchestration system."
|
|
98
|
+
echo ""
|
|
99
|
+
|
|
100
|
+
echo "[1/10] Starting team with ${WORKER_COUNT} Claude workers..."
|
|
101
|
+
omx team "${WORKER_COUNT}:executor" "$TEAM_TASK"
|
|
102
|
+
TEAM_STARTED=1
|
|
103
|
+
echo ""
|
|
104
|
+
|
|
105
|
+
echo "[2/10] Checking team status..."
|
|
106
|
+
omx team status "$TEAM_NAME"
|
|
107
|
+
echo ""
|
|
108
|
+
|
|
109
|
+
echo "[3/10] Creating distributed tasks for workers..."
|
|
110
|
+
for i in $(seq 1 "$WORKER_COUNT"); do
|
|
111
|
+
TASK_SUBJECT="Demo task $i"
|
|
112
|
+
TASK_DESC="Demonstration task for Claude worker-$i showcasing tmux-based multi-agent orchestration"
|
|
113
|
+
CREATE_INPUT="$(jq -nc \
|
|
114
|
+
--arg team "$TEAM_NAME" \
|
|
115
|
+
--arg subject "$TASK_SUBJECT" \
|
|
116
|
+
--arg description "$TASK_DESC" \
|
|
117
|
+
--arg owner "worker-$i" \
|
|
118
|
+
'{team_name:$team,subject:$subject,description:$description,owner:$owner}')"
|
|
119
|
+
CREATE_JSON="$(omx team api create-task --input "$CREATE_INPUT" --json)"
|
|
120
|
+
TASK_ID="$(echo "$CREATE_JSON" | jq -r '.data.task.id // empty')"
|
|
121
|
+
if [[ -n "$TASK_ID" ]]; then
|
|
122
|
+
echo " Created task $TASK_ID for worker-$i"
|
|
123
|
+
fi
|
|
124
|
+
done
|
|
125
|
+
echo ""
|
|
126
|
+
|
|
127
|
+
echo "[4/10] Listing all tasks..."
|
|
128
|
+
LIST_INPUT="$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team}')"
|
|
129
|
+
omx team api list-tasks --input "$LIST_INPUT" --json | jq -r '.data.tasks[] | " Task \(.id): \(.subject) [\(.status)]"'
|
|
130
|
+
echo ""
|
|
131
|
+
|
|
132
|
+
echo "[5/10] Workers claiming their assigned tasks..."
|
|
133
|
+
for i in $(seq 1 "$WORKER_COUNT"); do
|
|
134
|
+
WORKER_NAME="worker-$i"
|
|
135
|
+
# Find task assigned to this worker
|
|
136
|
+
TASK_ID="$(omx team api list-tasks --input "$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team}')" --json | \
|
|
137
|
+
jq -r --arg owner "$WORKER_NAME" '.data.tasks[] | select(.owner == $owner) | .id' | head -1)"
|
|
138
|
+
|
|
139
|
+
if [[ -n "$TASK_ID" ]]; then
|
|
140
|
+
CLAIM_INPUT="$(jq -nc \
|
|
141
|
+
--arg team "$TEAM_NAME" \
|
|
142
|
+
--arg task "$TASK_ID" \
|
|
143
|
+
--arg worker "$WORKER_NAME" \
|
|
144
|
+
'{team_name:$team,task_id:$task,worker:$worker,expected_version:1}')"
|
|
145
|
+
CLAIM_JSON="$(omx team api claim-task --input "$CLAIM_INPUT" --json)"
|
|
146
|
+
if echo "$CLAIM_JSON" | jq -e '.ok' >/dev/null; then
|
|
147
|
+
echo " $WORKER_NAME claimed task $TASK_ID"
|
|
148
|
+
fi
|
|
149
|
+
fi
|
|
150
|
+
done
|
|
151
|
+
echo ""
|
|
152
|
+
|
|
153
|
+
echo "[6/10] Simulating work completion - transitioning tasks to completed..."
|
|
154
|
+
for i in $(seq 1 "$WORKER_COUNT"); do
|
|
155
|
+
WORKER_NAME="worker-$i"
|
|
156
|
+
# Get the claimed task for this worker
|
|
157
|
+
TASK_INFO="$(omx team api list-tasks --input "$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team}')" --json | \
|
|
158
|
+
jq -r --arg owner "$WORKER_NAME" '.data.tasks[] | select(.owner == $owner and .status == "in_progress") | [.id, .claim.token] | @tsv' | head -1)"
|
|
159
|
+
|
|
160
|
+
if [[ -n "$TASK_INFO" ]]; then
|
|
161
|
+
TASK_ID="$(echo "$TASK_INFO" | cut -f1)"
|
|
162
|
+
CLAIM_TOKEN="$(echo "$TASK_INFO" | cut -f2)"
|
|
163
|
+
|
|
164
|
+
TRANSITION_INPUT="$(jq -nc \
|
|
165
|
+
--arg team "$TEAM_NAME" \
|
|
166
|
+
--arg task "$TASK_ID" \
|
|
167
|
+
--arg token "$CLAIM_TOKEN" \
|
|
168
|
+
'{team_name:$team,task_id:$task,from:"in_progress",to:"completed",claim_token:$token}')"
|
|
169
|
+
omx team api transition-task-status --input "$TRANSITION_INPUT" --json >/dev/null
|
|
170
|
+
echo " $WORKER_NAME completed task $TASK_ID"
|
|
171
|
+
fi
|
|
172
|
+
done
|
|
173
|
+
echo ""
|
|
174
|
+
|
|
175
|
+
echo "[7/10] Testing mailbox communication..."
|
|
176
|
+
# Leader sends messages to workers
|
|
177
|
+
for i in $(seq 1 "$WORKER_COUNT"); do
|
|
178
|
+
SEND_INPUT="$(jq -nc \
|
|
179
|
+
--arg team "$TEAM_NAME" \
|
|
180
|
+
--arg to "worker-$i" \
|
|
181
|
+
--arg body "Hello from leader! Great work on the demo task." \
|
|
182
|
+
'{team_name:$team,from_worker:"leader-fixed",to_worker:$to,body:$body}')"
|
|
183
|
+
omx team api send-message --input "$SEND_INPUT" --json >/dev/null
|
|
184
|
+
echo " Sent message to worker-$i"
|
|
185
|
+
done
|
|
186
|
+
|
|
187
|
+
# Workers acknowledge
|
|
188
|
+
for i in $(seq 1 "$WORKER_COUNT"); do
|
|
189
|
+
WORKER_NAME="worker-$i"
|
|
190
|
+
MAILBOX_INPUT="$(jq -nc --arg team "$TEAM_NAME" --arg worker "$WORKER_NAME" '{team_name:$team,worker:$worker}')"
|
|
191
|
+
MAILBOX_JSON="$(omx team api mailbox-list --input "$MAILBOX_INPUT" --json)"
|
|
192
|
+
MESSAGE_COUNT="$(echo "$MAILBOX_JSON" | jq -r '.data.messages | length')"
|
|
193
|
+
echo " $WORKER_NAME has $MESSAGE_COUNT messages in mailbox"
|
|
194
|
+
done
|
|
195
|
+
echo ""
|
|
196
|
+
|
|
197
|
+
echo "[8/10] Broadcasting sync message to all workers..."
|
|
198
|
+
BROADCAST_INPUT="$(jq -nc \
|
|
199
|
+
--arg team "$TEAM_NAME" \
|
|
200
|
+
--arg body "Sync checkpoint: All workers verify tmux coordination complete" \
|
|
201
|
+
'{team_name:$team,from_worker:"leader-fixed",body:$body}')"
|
|
202
|
+
BROADCAST_RESULT="$(omx team api broadcast --input "$BROADCAST_INPUT" --json)"
|
|
203
|
+
BROADCAST_COUNT="$(echo "$BROADCAST_RESULT" | jq -r '.data.count')"
|
|
204
|
+
echo " Broadcasted to $BROADCAST_COUNT workers"
|
|
205
|
+
echo ""
|
|
206
|
+
|
|
207
|
+
echo "[9/10] Verifying team summary..."
|
|
208
|
+
SUMMARY_INPUT="$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team}')"
|
|
209
|
+
SUMMARY_JSON="$(omx team api get-summary --input "$SUMMARY_INPUT" --json)"
|
|
210
|
+
echo "$SUMMARY_JSON" | jq -e '.schema_version == "1.0" and .operation == "get-summary" and .ok == true' >/dev/null
|
|
211
|
+
|
|
212
|
+
# Extract and display summary stats
|
|
213
|
+
TOTAL_TASKS="$(echo "$SUMMARY_JSON" | jq -r '.data.summary.taskStatusById | length')"
|
|
214
|
+
COMPLETED_TASKS="$(echo "$SUMMARY_JSON" | jq -r '[.data.summary.taskStatusById[] | select(. == "completed")] | length')"
|
|
215
|
+
ALIVE_WORKERS="$(echo "$SUMMARY_JSON" | jq -r '[.data.summary.workerAliveByName[] | select(. == true)] | length')"
|
|
216
|
+
echo " Total tasks: $TOTAL_TASKS"
|
|
217
|
+
echo " Completed tasks: $COMPLETED_TASKS"
|
|
218
|
+
echo " Alive workers: $ALIVE_WORKERS"
|
|
219
|
+
echo ""
|
|
220
|
+
|
|
221
|
+
echo "[10/10] Shutting down team and cleaning up..."
|
|
222
|
+
omx team shutdown "$TEAM_NAME"
|
|
223
|
+
omx team api cleanup --input "{\"team_name\":\"$TEAM_NAME\"}" --json >/dev/null
|
|
224
|
+
TEAM_STARTED=0
|
|
225
|
+
echo ""
|
|
226
|
+
|
|
227
|
+
echo "=========================================="
|
|
228
|
+
echo "Tmux Claude Workers Demo Complete!"
|
|
229
|
+
echo ""
|
|
230
|
+
echo "Summary:"
|
|
231
|
+
echo " - Spawned $WORKER_COUNT Claude workers in tmux panes"
|
|
232
|
+
echo " - Created and distributed $WORKER_COUNT tasks"
|
|
233
|
+
echo " - Demonstrated claim-safe task lifecycle"
|
|
234
|
+
echo " - Verified mailbox-based communication"
|
|
235
|
+
echo " - Tested broadcast messaging"
|
|
236
|
+
echo " - Clean shutdown and state cleanup"
|
|
237
|
+
echo ""
|
|
238
|
+
echo "The Claude workers were coordinated through the OMX"
|
|
239
|
+
echo "team orchestration system using tmux for process isolation"
|
|
240
|
+
echo "and the CLI interop API for state management."
|
|
241
|
+
echo "=========================================="
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# OMX Team E2E Demo Script
|
|
4
|
+
#
|
|
5
|
+
# This script demonstrates the tmux-based multi-agent orchestration system
|
|
6
|
+
# with mixed Codex/Claude workers. It performs a complete end-to-end test
|
|
7
|
+
# of team lifecycle, task management, and mailbox communication.
|
|
8
|
+
#
|
|
9
|
+
# Usage:
|
|
10
|
+
# ./scripts/demo-team-e2e.sh
|
|
11
|
+
#
|
|
12
|
+
# Environment Variables:
|
|
13
|
+
# WORKER_COUNT Number of workers (default: 6, minimum: 5)
|
|
14
|
+
# TEAM_TASK Task description (default: "e2e team demo <timestamp>")
|
|
15
|
+
# TEAM_NAME Team identifier (default: slugified TEAM_TASK)
|
|
16
|
+
# OMX_TEAM_WORKER_CLI Worker CLI mode (default: auto)
|
|
17
|
+
# OMX_TEAM_WORKER_CLI_MAP Comma-separated CLI assignments per worker
|
|
18
|
+
# OMX_TEAM_WORKER_LAUNCH_ARGS Arguments passed to worker CLIs
|
|
19
|
+
#
|
|
20
|
+
# Example:
|
|
21
|
+
# WORKER_COUNT=8 ./scripts/demo-team-e2e.sh
|
|
22
|
+
#
|
|
23
|
+
# shellcheck disable=SC2317 # Functions are called via trap
|
|
24
|
+
|
|
25
|
+
set -euo pipefail
|
|
26
|
+
|
|
27
|
+
readonly SCRIPT_VERSION="1.0.0"
|
|
28
|
+
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
29
|
+
|
|
30
|
+
require_bin() {
|
|
31
|
+
if ! command -v "$1" >/dev/null 2>&1; then
|
|
32
|
+
echo "error: required command not found: $1" >&2
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
slugify() {
|
|
38
|
+
echo "$1" \
|
|
39
|
+
| tr '[:upper:]' '[:lower:]' \
|
|
40
|
+
| sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//; s/-+/-/g' \
|
|
41
|
+
| cut -c1-30
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
build_default_cli_map() {
|
|
45
|
+
local count="$1"
|
|
46
|
+
# More claude than codex for mixed demos (emphasizes claude workers)
|
|
47
|
+
# For 6 workers: 2 codex, 4 claude
|
|
48
|
+
local pivot=$(((count - 1) / 2))
|
|
49
|
+
local entries=()
|
|
50
|
+
local i
|
|
51
|
+
for ((i = 1; i <= count; i++)); do
|
|
52
|
+
if ((i <= pivot)); then
|
|
53
|
+
entries+=("codex")
|
|
54
|
+
else
|
|
55
|
+
entries+=("claude")
|
|
56
|
+
fi
|
|
57
|
+
done
|
|
58
|
+
(IFS=,; echo "${entries[*]}")
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
require_bin omx
|
|
62
|
+
require_bin jq
|
|
63
|
+
|
|
64
|
+
WORKER_COUNT="${WORKER_COUNT:-6}"
|
|
65
|
+
if ! [[ "$WORKER_COUNT" =~ ^[0-9]+$ ]]; then
|
|
66
|
+
echo "error: WORKER_COUNT must be a positive integer (got: $WORKER_COUNT)" >&2
|
|
67
|
+
exit 1
|
|
68
|
+
fi
|
|
69
|
+
if ((WORKER_COUNT < 5)); then
|
|
70
|
+
echo "error: WORKER_COUNT must be >= 5 for this demo (got: $WORKER_COUNT)" >&2
|
|
71
|
+
exit 1
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# Validate CLI map length matches worker count when explicitly provided
|
|
75
|
+
if [[ -n "${OMX_TEAM_WORKER_CLI_MAP:-}" ]]; then
|
|
76
|
+
IFS=',' read -ra CLI_MAP_ENTRIES <<< "$OMX_TEAM_WORKER_CLI_MAP"
|
|
77
|
+
if (("${#CLI_MAP_ENTRIES[@]}" != WORKER_COUNT)); then
|
|
78
|
+
echo "error: OMX_TEAM_WORKER_CLI_MAP has ${#CLI_MAP_ENTRIES[@]} entries but WORKER_COUNT is $WORKER_COUNT" >&2
|
|
79
|
+
exit 1
|
|
80
|
+
fi
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
TEAM_TASK="${TEAM_TASK:-e2e team demo $(date -u +%Y%m%d%H%M%S)}"
|
|
84
|
+
TEAM_NAME="${TEAM_NAME:-$(slugify "$TEAM_TASK")}"
|
|
85
|
+
OMX_TEAM_WORKER_CLI="${OMX_TEAM_WORKER_CLI:-auto}"
|
|
86
|
+
OMX_TEAM_WORKER_CLI_MAP="${OMX_TEAM_WORKER_CLI_MAP:-$(build_default_cli_map "$WORKER_COUNT")}"
|
|
87
|
+
OMX_TEAM_WORKER_LAUNCH_ARGS="${OMX_TEAM_WORKER_LAUNCH_ARGS:---model gpt-5.3-codex-spark -c model_reasoning_effort=\"low\"}"
|
|
88
|
+
|
|
89
|
+
TEAM_STARTED=0
|
|
90
|
+
cleanup() {
|
|
91
|
+
if ((TEAM_STARTED == 1)); then
|
|
92
|
+
echo "[cleanup] shutting down team: $TEAM_NAME"
|
|
93
|
+
omx team shutdown "$TEAM_NAME" >/dev/null 2>&1 || true
|
|
94
|
+
echo "[cleanup] cleaning state for team: $TEAM_NAME"
|
|
95
|
+
omx team api cleanup --input "{\"team_name\":\"$TEAM_NAME\"}" --json >/dev/null 2>&1 || true
|
|
96
|
+
fi
|
|
97
|
+
}
|
|
98
|
+
trap cleanup EXIT
|
|
99
|
+
|
|
100
|
+
echo "== OMX Team E2E demo =="
|
|
101
|
+
echo "TEAM_TASK=$TEAM_TASK"
|
|
102
|
+
echo "TEAM_NAME=$TEAM_NAME"
|
|
103
|
+
echo "WORKER_COUNT=$WORKER_COUNT"
|
|
104
|
+
echo "OMX_TEAM_WORKER_CLI=$OMX_TEAM_WORKER_CLI"
|
|
105
|
+
echo "OMX_TEAM_WORKER_CLI_MAP=$OMX_TEAM_WORKER_CLI_MAP"
|
|
106
|
+
echo "OMX_TEAM_WORKER_LAUNCH_ARGS=$OMX_TEAM_WORKER_LAUNCH_ARGS"
|
|
107
|
+
|
|
108
|
+
echo "[1/8] start team (${WORKER_COUNT} mixed workers)"
|
|
109
|
+
omx team "${WORKER_COUNT}:executor" "$TEAM_TASK"
|
|
110
|
+
TEAM_STARTED=1
|
|
111
|
+
|
|
112
|
+
echo "[2/8] status"
|
|
113
|
+
omx team status "$TEAM_NAME"
|
|
114
|
+
|
|
115
|
+
echo "[3/8] create task"
|
|
116
|
+
CREATE_INPUT="$(jq -nc \
|
|
117
|
+
--arg team "$TEAM_NAME" \
|
|
118
|
+
--arg subject "one-shot lifecycle" \
|
|
119
|
+
--arg description "demo task" \
|
|
120
|
+
--arg owner "worker-1" \
|
|
121
|
+
'{team_name:$team,subject:$subject,description:$description,owner:$owner}')"
|
|
122
|
+
CREATE_JSON="$(omx team api create-task --input "$CREATE_INPUT" --json)"
|
|
123
|
+
TASK_ID="$(echo "$CREATE_JSON" | jq -r '.data.task.id // empty')"
|
|
124
|
+
if [[ -z "$TASK_ID" ]]; then
|
|
125
|
+
echo "error: failed to parse task id from create-task response" >&2
|
|
126
|
+
exit 1
|
|
127
|
+
fi
|
|
128
|
+
echo "task_id=$TASK_ID"
|
|
129
|
+
|
|
130
|
+
echo "[4/8] claim task"
|
|
131
|
+
CLAIM_INPUT="$(jq -nc \
|
|
132
|
+
--arg team "$TEAM_NAME" \
|
|
133
|
+
--arg task "$TASK_ID" \
|
|
134
|
+
--arg worker "worker-1" \
|
|
135
|
+
'{team_name:$team,task_id:$task,worker:$worker,expected_version:1}')"
|
|
136
|
+
CLAIM_JSON="$(omx team api claim-task --input "$CLAIM_INPUT" --json)"
|
|
137
|
+
CLAIM_TOKEN="$(echo "$CLAIM_JSON" | jq -r '.data.claimToken // empty')"
|
|
138
|
+
if [[ -z "$CLAIM_TOKEN" ]]; then
|
|
139
|
+
echo "error: failed to parse claimToken from claim-task response" >&2
|
|
140
|
+
exit 1
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
echo "[5/8] transition task -> completed"
|
|
144
|
+
TRANSITION_INPUT="$(jq -nc \
|
|
145
|
+
--arg team "$TEAM_NAME" \
|
|
146
|
+
--arg task "$TASK_ID" \
|
|
147
|
+
--arg token "$CLAIM_TOKEN" \
|
|
148
|
+
'{team_name:$team,task_id:$task,from:"in_progress",to:"completed",claim_token:$token}')"
|
|
149
|
+
omx team api transition-task-status --input "$TRANSITION_INPUT" --json >/dev/null
|
|
150
|
+
|
|
151
|
+
echo "[6/8] mailbox flow"
|
|
152
|
+
SEND_INPUT="$(jq -nc \
|
|
153
|
+
--arg team "$TEAM_NAME" \
|
|
154
|
+
--arg body "ACK one-shot" \
|
|
155
|
+
'{team_name:$team,from_worker:"leader-fixed",to_worker:"worker-1",body:$body}')"
|
|
156
|
+
omx team api send-message --input "$SEND_INPUT" --json >/dev/null
|
|
157
|
+
MAILBOX_INPUT="$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team,worker:"worker-1"}')"
|
|
158
|
+
MAILBOX_JSON="$(omx team api mailbox-list --input "$MAILBOX_INPUT" --json)"
|
|
159
|
+
MESSAGE_ID="$(echo "$MAILBOX_JSON" | jq -r '.data.messages[0].id // empty')"
|
|
160
|
+
if [[ -n "$MESSAGE_ID" ]]; then
|
|
161
|
+
MARK_INPUT="$(jq -nc \
|
|
162
|
+
--arg team "$TEAM_NAME" \
|
|
163
|
+
--arg id "$MESSAGE_ID" \
|
|
164
|
+
'{team_name:$team,worker:"worker-1",message_id:$id}')"
|
|
165
|
+
omx team api mailbox-mark-notified --input "$MARK_INPUT" --json >/dev/null
|
|
166
|
+
omx team api mailbox-mark-delivered --input "$MARK_INPUT" --json >/dev/null
|
|
167
|
+
fi
|
|
168
|
+
|
|
169
|
+
echo "[7/8] summary envelope check"
|
|
170
|
+
SUMMARY_INPUT="$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team}')"
|
|
171
|
+
SUMMARY_JSON="$(omx team api get-summary --input "$SUMMARY_INPUT" --json)"
|
|
172
|
+
echo "$SUMMARY_JSON" | jq -e '.schema_version == "1.0" and .operation == "get-summary" and .ok == true' >/dev/null
|
|
173
|
+
|
|
174
|
+
echo "[8/8] shutdown + cleanup"
|
|
175
|
+
omx team shutdown "$TEAM_NAME"
|
|
176
|
+
omx team api cleanup --input "{\"team_name\":\"$TEAM_NAME\"}" --json >/dev/null
|
|
177
|
+
TEAM_STARTED=0
|
|
178
|
+
|
|
179
|
+
echo "E2E demo complete."
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const [provider = '', ...rest] = process.argv.slice(2);
|
|
4
|
+
const prompt = rest.join(' ');
|
|
5
|
+
|
|
6
|
+
const stdout = process.env.OMX_ASK_STUB_STDOUT ?? `OUT:${provider}:${prompt}\n`;
|
|
7
|
+
const stderr = process.env.OMX_ASK_STUB_STDERR ?? '';
|
|
8
|
+
const exitCode = Number.parseInt(process.env.OMX_ASK_STUB_EXIT_CODE ?? '0', 10);
|
|
9
|
+
|
|
10
|
+
if (stdout.length > 0) process.stdout.write(stdout);
|
|
11
|
+
if (stderr.length > 0) process.stderr.write(stderr);
|
|
12
|
+
process.exit(Number.isFinite(exitCode) ? exitCode : 0);
|