oh-my-copilot 4.13.1 → 4.13.21
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +3 -3
- package/bridge/cli.cjs +4709 -1961
- package/bridge/mcp-server.cjs +112 -11
- package/bridge/runtime-cli.cjs +4917 -2645
- package/bridge/team-bridge.cjs +6 -4
- package/bridge/team-mcp.cjs +19607 -0
- package/bridge/team.js +4895 -2215
- package/dist/__tests__/auto-slash-aliases.test.js +91 -0
- package/dist/__tests__/auto-slash-aliases.test.js.map +1 -1
- package/dist/__tests__/hooks/learner/bridge.test.js +25 -0
- package/dist/__tests__/hooks/learner/bridge.test.js.map +1 -1
- package/dist/__tests__/hooks/learner/parser.test.js +30 -0
- package/dist/__tests__/hooks/learner/parser.test.js.map +1 -1
- package/dist/__tests__/hud/extra-usage.test.js +42 -0
- package/dist/__tests__/hud/extra-usage.test.js.map +1 -1
- package/dist/__tests__/hud/labels.test.d.ts +2 -0
- package/dist/__tests__/hud/labels.test.d.ts.map +1 -0
- package/dist/__tests__/hud/labels.test.js +158 -0
- package/dist/__tests__/hud/labels.test.js.map +1 -0
- package/dist/__tests__/hud/render-enterprise.test.d.ts +5 -0
- package/dist/__tests__/hud/render-enterprise.test.d.ts.map +1 -0
- package/dist/__tests__/hud/render-enterprise.test.js +232 -0
- package/dist/__tests__/hud/render-enterprise.test.js.map +1 -0
- package/dist/__tests__/hud/render-rate-limits-priority.test.js +185 -0
- package/dist/__tests__/hud/render-rate-limits-priority.test.js.map +1 -1
- package/dist/__tests__/hud/stdin-session-scope.test.d.ts +2 -0
- package/dist/__tests__/hud/stdin-session-scope.test.d.ts.map +1 -0
- package/dist/__tests__/hud/stdin-session-scope.test.js +169 -0
- package/dist/__tests__/hud/stdin-session-scope.test.js.map +1 -0
- package/dist/__tests__/hud/usage-api.test.js +111 -1
- package/dist/__tests__/hud/usage-api.test.js.map +1 -1
- package/dist/__tests__/hud-marketplace-resolution.test.js +34 -0
- package/dist/__tests__/hud-marketplace-resolution.test.js.map +1 -1
- package/dist/__tests__/installer-hud-skip.test.js +6 -0
- package/dist/__tests__/installer-hud-skip.test.js.map +1 -1
- package/dist/__tests__/installer-omc-reference.test.js +1 -1
- package/dist/__tests__/installer-omc-reference.test.js.map +1 -1
- package/dist/__tests__/keyword-detector-echo-guard.test.d.ts +2 -0
- package/dist/__tests__/keyword-detector-echo-guard.test.d.ts.map +1 -0
- package/dist/__tests__/keyword-detector-echo-guard.test.js +218 -0
- package/dist/__tests__/keyword-detector-echo-guard.test.js.map +1 -0
- package/dist/__tests__/mnemosyne/detector.test.js +2 -0
- package/dist/__tests__/mnemosyne/detector.test.js.map +1 -1
- package/dist/__tests__/notepad.test.js +2 -2
- package/dist/__tests__/notepad.test.js.map +1 -1
- package/dist/__tests__/pre-tool-enforcer.test.js +84 -1
- package/dist/__tests__/pre-tool-enforcer.test.js.map +1 -1
- package/dist/__tests__/preemptive-compaction-hook.test.js +63 -0
- package/dist/__tests__/preemptive-compaction-hook.test.js.map +1 -1
- package/dist/__tests__/ralph-prd-mandatory.test.js +11 -1
- package/dist/__tests__/ralph-prd-mandatory.test.js.map +1 -1
- package/dist/__tests__/ralph-prd.test.js +40 -2
- package/dist/__tests__/ralph-prd.test.js.map +1 -1
- package/dist/__tests__/skills.test.js +363 -4
- package/dist/__tests__/skills.test.js.map +1 -1
- package/dist/__tests__/state-root-resolution.test.js +120 -6
- package/dist/__tests__/state-root-resolution.test.js.map +1 -1
- package/dist/autoresearch/__tests__/runtime.test.js +225 -28
- package/dist/autoresearch/__tests__/runtime.test.js.map +1 -1
- package/dist/autoresearch/runtime.d.ts.map +1 -1
- package/dist/autoresearch/runtime.js +9 -5
- package/dist/autoresearch/runtime.js.map +1 -1
- package/dist/cli/__tests__/team-status-worktree.test.d.ts +2 -0
- package/dist/cli/__tests__/team-status-worktree.test.d.ts.map +1 -0
- package/dist/cli/__tests__/team-status-worktree.test.js +96 -0
- package/dist/cli/__tests__/team-status-worktree.test.js.map +1 -0
- package/dist/cli/__tests__/team.test.js +164 -0
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/autoresearch.d.ts +1 -1
- package/dist/cli/autoresearch.d.ts.map +1 -1
- package/dist/cli/autoresearch.js +4 -4
- package/dist/cli/commands/team.d.ts +1 -0
- package/dist/cli/commands/team.d.ts.map +1 -1
- package/dist/cli/commands/team.js +15 -3
- package/dist/cli/commands/team.js.map +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/team.d.ts +6 -0
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +126 -5
- package/dist/cli/team.js.map +1 -1
- package/dist/cli/utils/formatting.d.ts +0 -10
- package/dist/cli/utils/formatting.d.ts.map +1 -1
- package/dist/cli/utils/formatting.js +0 -52
- package/dist/cli/utils/formatting.js.map +1 -1
- package/dist/config/__tests__/loader.test.js.map +1 -1
- package/dist/features/boulder-state/constants.d.ts +1 -1
- package/dist/features/boulder-state/constants.d.ts.map +1 -1
- package/dist/features/builtin-skills/skills.d.ts.map +1 -1
- package/dist/features/builtin-skills/skills.js +11 -3
- package/dist/features/builtin-skills/skills.js.map +1 -1
- package/dist/features/builtin-skills/types.d.ts +7 -0
- package/dist/features/builtin-skills/types.d.ts.map +1 -1
- package/dist/features/delegation-enforcer.d.ts +2 -0
- package/dist/features/delegation-enforcer.d.ts.map +1 -1
- package/dist/features/delegation-enforcer.js +10 -0
- package/dist/features/delegation-enforcer.js.map +1 -1
- package/dist/features/magic-keywords.d.ts.map +1 -1
- package/dist/features/magic-keywords.js +30 -1
- package/dist/features/magic-keywords.js.map +1 -1
- package/dist/features/rate-limit-wait/tmux-detector.d.ts +4 -4
- package/dist/features/rate-limit-wait/tmux-detector.js +9 -9
- package/dist/features/rate-limit-wait/tmux-detector.js.map +1 -1
- package/dist/hooks/__tests__/bridge-routing.test.js +156 -0
- package/dist/hooks/__tests__/bridge-routing.test.js.map +1 -1
- package/dist/hooks/auto-slash-command/constants.d.ts.map +1 -1
- package/dist/hooks/auto-slash-command/constants.js +1 -0
- package/dist/hooks/auto-slash-command/constants.js.map +1 -1
- package/dist/hooks/auto-slash-command/executor.d.ts.map +1 -1
- package/dist/hooks/auto-slash-command/executor.js +29 -0
- package/dist/hooks/auto-slash-command/executor.js.map +1 -1
- package/dist/hooks/bridge.d.ts.map +1 -1
- package/dist/hooks/bridge.js +184 -1
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/learner/bridge.d.ts.map +1 -1
- package/dist/hooks/learner/bridge.js +4 -109
- package/dist/hooks/learner/bridge.js.map +1 -1
- package/dist/hooks/learner/detector.js +1 -1
- package/dist/hooks/learner/parser.d.ts +9 -0
- package/dist/hooks/learner/parser.d.ts.map +1 -1
- package/dist/hooks/learner/parser.js +18 -5
- package/dist/hooks/learner/parser.js.map +1 -1
- package/dist/hooks/learner/types.d.ts +6 -0
- package/dist/hooks/learner/types.d.ts.map +1 -1
- package/dist/hooks/mode-registry/__tests__/session-isolation.test.js +16 -0
- package/dist/hooks/mode-registry/__tests__/session-isolation.test.js.map +1 -1
- package/dist/hooks/notepad/index.d.ts +4 -1
- package/dist/hooks/notepad/index.d.ts.map +1 -1
- package/dist/hooks/notepad/index.js +7 -4
- package/dist/hooks/notepad/index.js.map +1 -1
- package/dist/hooks/persistent-mode/__tests__/ralph-verification-flow.test.js +70 -3
- package/dist/hooks/persistent-mode/__tests__/ralph-verification-flow.test.js.map +1 -1
- package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
- package/dist/hooks/persistent-mode/index.js +17 -13
- package/dist/hooks/persistent-mode/index.js.map +1 -1
- package/dist/hooks/persistent-mode/stop-hook-blocking.test.js +175 -3
- package/dist/hooks/persistent-mode/stop-hook-blocking.test.js.map +1 -1
- package/dist/hooks/project-memory/__tests__/integration.test.js +117 -3
- package/dist/hooks/project-memory/__tests__/integration.test.js.map +1 -1
- package/dist/hooks/project-memory/__tests__/storage.test.js +11 -11
- package/dist/hooks/project-memory/__tests__/storage.test.js.map +1 -1
- package/dist/hooks/project-memory/index.d.ts.map +1 -1
- package/dist/hooks/project-memory/index.js +24 -12
- package/dist/hooks/project-memory/index.js.map +1 -1
- package/dist/hooks/ralph/index.d.ts +1 -1
- package/dist/hooks/ralph/index.d.ts.map +1 -1
- package/dist/hooks/ralph/index.js +1 -1
- package/dist/hooks/ralph/index.js.map +1 -1
- package/dist/hooks/ralph/loop.d.ts +6 -6
- package/dist/hooks/ralph/loop.d.ts.map +1 -1
- package/dist/hooks/ralph/loop.js +18 -18
- package/dist/hooks/ralph/loop.js.map +1 -1
- package/dist/hooks/ralph/prd.d.ts +23 -12
- package/dist/hooks/ralph/prd.d.ts.map +1 -1
- package/dist/hooks/ralph/prd.js +88 -42
- package/dist/hooks/ralph/prd.js.map +1 -1
- package/dist/hooks/session-end/__tests__/mode-state-cleanup.test.js +20 -0
- package/dist/hooks/session-end/__tests__/mode-state-cleanup.test.js.map +1 -1
- package/dist/hooks/session-end/index.d.ts +9 -0
- package/dist/hooks/session-end/index.d.ts.map +1 -1
- package/dist/hooks/session-end/index.js +110 -0
- package/dist/hooks/session-end/index.js.map +1 -1
- package/dist/hooks/skill-bridge.cjs +114 -92
- package/dist/hooks/skill-state/index.d.ts.map +1 -1
- package/dist/hooks/skill-state/index.js +1 -0
- package/dist/hooks/skill-state/index.js.map +1 -1
- package/dist/hud/__tests__/enterprise-cost.test.d.ts +5 -0
- package/dist/hud/__tests__/enterprise-cost.test.d.ts.map +1 -0
- package/dist/hud/__tests__/enterprise-cost.test.js +151 -0
- package/dist/hud/__tests__/enterprise-cost.test.js.map +1 -0
- package/dist/hud/__tests__/git-status.test.js +18 -0
- package/dist/hud/__tests__/git-status.test.js.map +1 -1
- package/dist/hud/__tests__/usage-api-enterprise.test.d.ts +5 -0
- package/dist/hud/__tests__/usage-api-enterprise.test.d.ts.map +1 -0
- package/dist/hud/__tests__/usage-api-enterprise.test.js +249 -0
- package/dist/hud/__tests__/usage-api-enterprise.test.js.map +1 -0
- package/dist/hud/elements/background.d.ts +3 -3
- package/dist/hud/elements/background.d.ts.map +1 -1
- package/dist/hud/elements/background.js +5 -4
- package/dist/hud/elements/background.js.map +1 -1
- package/dist/hud/elements/call-counts.d.ts +2 -2
- package/dist/hud/elements/call-counts.d.ts.map +1 -1
- package/dist/hud/elements/call-counts.js +7 -6
- package/dist/hud/elements/call-counts.js.map +1 -1
- package/dist/hud/elements/context.d.ts +3 -3
- package/dist/hud/elements/context.d.ts.map +1 -1
- package/dist/hud/elements/context.js +5 -4
- package/dist/hud/elements/context.js.map +1 -1
- package/dist/hud/elements/enterprise-cost.d.ts +16 -0
- package/dist/hud/elements/enterprise-cost.d.ts.map +1 -0
- package/dist/hud/elements/enterprise-cost.js +63 -0
- package/dist/hud/elements/enterprise-cost.js.map +1 -0
- package/dist/hud/elements/git.d.ts +2 -1
- package/dist/hud/elements/git.d.ts.map +1 -1
- package/dist/hud/elements/git.js +7 -6
- package/dist/hud/elements/git.js.map +1 -1
- package/dist/hud/elements/permission.d.ts.map +1 -1
- package/dist/hud/elements/permission.js +2 -5
- package/dist/hud/elements/permission.js.map +1 -1
- package/dist/hud/elements/ralph.d.ts +2 -2
- package/dist/hud/elements/ralph.d.ts.map +1 -1
- package/dist/hud/elements/ralph.js +3 -2
- package/dist/hud/elements/ralph.js.map +1 -1
- package/dist/hud/elements/session.d.ts.map +1 -1
- package/dist/hud/elements/session.js +5 -9
- package/dist/hud/elements/session.js.map +1 -1
- package/dist/hud/elements/thinking.d.ts +2 -2
- package/dist/hud/elements/thinking.d.ts.map +1 -1
- package/dist/hud/elements/thinking.js +3 -2
- package/dist/hud/elements/thinking.js.map +1 -1
- package/dist/hud/elements/token-usage.d.ts +2 -2
- package/dist/hud/elements/token-usage.d.ts.map +1 -1
- package/dist/hud/elements/token-usage.js +3 -2
- package/dist/hud/elements/token-usage.js.map +1 -1
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +5 -1
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +43 -10
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +18 -1
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/stdin.d.ts.map +1 -1
- package/dist/hud/stdin.js +49 -5
- package/dist/hud/stdin.js.map +1 -1
- package/dist/hud/types.d.ts +42 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js +59 -1
- package/dist/hud/types.js.map +1 -1
- package/dist/hud/usage-api.d.ts +19 -1
- package/dist/hud/usage-api.d.ts.map +1 -1
- package/dist/hud/usage-api.js +101 -18
- package/dist/hud/usage-api.js.map +1 -1
- package/dist/installer/__tests__/hud-cache-wrapper.test.d.ts +2 -0
- package/dist/installer/__tests__/hud-cache-wrapper.test.d.ts.map +1 -0
- package/dist/installer/__tests__/hud-cache-wrapper.test.js +235 -0
- package/dist/installer/__tests__/hud-cache-wrapper.test.js.map +1 -0
- package/dist/installer/__tests__/standalone-hook-reconcile.test.js +2 -0
- package/dist/installer/__tests__/standalone-hook-reconcile.test.js.map +1 -1
- package/dist/installer/index.d.ts +1 -0
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +83 -31
- package/dist/installer/index.js.map +1 -1
- package/dist/lib/__tests__/worktree-paths.test.js +162 -39
- package/dist/lib/__tests__/worktree-paths.test.js.map +1 -1
- package/dist/lib/worktree-paths.d.ts +87 -9
- package/dist/lib/worktree-paths.d.ts.map +1 -1
- package/dist/lib/worktree-paths.js +209 -27
- package/dist/lib/worktree-paths.js.map +1 -1
- package/dist/mcp/__tests__/team-server-artifact-convergence.test.js +156 -4
- package/dist/mcp/__tests__/team-server-artifact-convergence.test.js.map +1 -1
- package/dist/mcp/omc-tools-server.d.ts +11 -17
- package/dist/mcp/omc-tools-server.d.ts.map +1 -1
- package/dist/mcp/omc-tools-server.js +22 -32
- package/dist/mcp/omc-tools-server.js.map +1 -1
- package/dist/mcp/team-job-convergence.d.ts +9 -2
- package/dist/mcp/team-job-convergence.d.ts.map +1 -1
- package/dist/mcp/team-job-convergence.js +35 -14
- package/dist/mcp/team-job-convergence.js.map +1 -1
- package/dist/mcp/team-server.d.ts.map +1 -1
- package/dist/mcp/team-server.js +93 -13
- package/dist/mcp/team-server.js.map +1 -1
- package/dist/ralphthon/prd.d.ts.map +1 -1
- package/dist/ralphthon/prd.js +13 -17
- package/dist/ralphthon/prd.js.map +1 -1
- package/dist/shared/types.d.ts +2 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/team/__tests__/api-interop.cleanup.test.d.ts +2 -0
- package/dist/team/__tests__/api-interop.cleanup.test.d.ts.map +1 -0
- package/dist/team/__tests__/api-interop.cleanup.test.js +234 -0
- package/dist/team/__tests__/api-interop.cleanup.test.js.map +1 -0
- package/dist/team/__tests__/api-interop.dispatch.test.js +2 -1
- package/dist/team/__tests__/api-interop.dispatch.test.js.map +1 -1
- package/dist/team/__tests__/auto-merge-restart.test.d.ts +2 -0
- package/dist/team/__tests__/auto-merge-restart.test.d.ts.map +1 -0
- package/dist/team/__tests__/auto-merge-restart.test.js +128 -0
- package/dist/team/__tests__/auto-merge-restart.test.js.map +1 -0
- package/dist/team/__tests__/auto-merge.perf.test.d.ts +2 -0
- package/dist/team/__tests__/auto-merge.perf.test.d.ts.map +1 -0
- package/dist/team/__tests__/auto-merge.perf.test.js +85 -0
- package/dist/team/__tests__/auto-merge.perf.test.js.map +1 -0
- package/dist/team/__tests__/conflict-mailbox.test.d.ts +2 -0
- package/dist/team/__tests__/conflict-mailbox.test.d.ts.map +1 -0
- package/dist/team/__tests__/conflict-mailbox.test.js +238 -0
- package/dist/team/__tests__/conflict-mailbox.test.js.map +1 -0
- package/dist/team/__tests__/git-worktree.test.js +164 -3
- package/dist/team/__tests__/git-worktree.test.js.map +1 -1
- package/dist/team/__tests__/helpers/git-fixture.d.ts +72 -0
- package/dist/team/__tests__/helpers/git-fixture.d.ts.map +1 -0
- package/dist/team/__tests__/helpers/git-fixture.js +252 -0
- package/dist/team/__tests__/helpers/git-fixture.js.map +1 -0
- package/dist/team/__tests__/leader-inbox.test.d.ts +2 -0
- package/dist/team/__tests__/leader-inbox.test.d.ts.map +1 -0
- package/dist/team/__tests__/leader-inbox.test.js +152 -0
- package/dist/team/__tests__/leader-inbox.test.js.map +1 -0
- package/dist/team/__tests__/merge-orchestrator.test.d.ts +2 -0
- package/dist/team/__tests__/merge-orchestrator.test.d.ts.map +1 -0
- package/dist/team/__tests__/merge-orchestrator.test.js +779 -0
- package/dist/team/__tests__/merge-orchestrator.test.js.map +1 -0
- package/dist/team/__tests__/model-contract.test.js +35 -21
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/rebase-smoke.test.d.ts +2 -0
- package/dist/team/__tests__/rebase-smoke.test.d.ts.map +1 -0
- package/dist/team/__tests__/rebase-smoke.test.js +272 -0
- package/dist/team/__tests__/rebase-smoke.test.js.map +1 -0
- package/dist/team/__tests__/runtime-cli.test.js +11 -3
- package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
- package/dist/team/__tests__/runtime-prompt-mode.test.js +14 -16
- package/dist/team/__tests__/runtime-prompt-mode.test.js.map +1 -1
- package/dist/team/__tests__/runtime-v2-role-routing.test.js +7 -1
- package/dist/team/__tests__/runtime-v2-role-routing.test.js.map +1 -1
- package/dist/team/__tests__/runtime-v2.dispatch.test.js +293 -15
- package/dist/team/__tests__/runtime-v2.dispatch.test.js.map +1 -1
- package/dist/team/__tests__/runtime-v2.monitor.test.d.ts +2 -0
- package/dist/team/__tests__/runtime-v2.monitor.test.d.ts.map +1 -0
- package/dist/team/__tests__/runtime-v2.monitor.test.js +219 -0
- package/dist/team/__tests__/runtime-v2.monitor.test.js.map +1 -0
- package/dist/team/__tests__/runtime-v2.shutdown.test.d.ts +2 -0
- package/dist/team/__tests__/runtime-v2.shutdown.test.d.ts.map +1 -0
- package/dist/team/__tests__/runtime-v2.shutdown.test.js +292 -0
- package/dist/team/__tests__/runtime-v2.shutdown.test.js.map +1 -0
- package/dist/team/__tests__/scaling-launch-config.test.js +203 -3
- package/dist/team/__tests__/scaling-launch-config.test.js.map +1 -1
- package/dist/team/__tests__/team-summary-worktree.test.d.ts +2 -0
- package/dist/team/__tests__/team-summary-worktree.test.d.ts.map +1 -0
- package/dist/team/__tests__/team-summary-worktree.test.js +85 -0
- package/dist/team/__tests__/team-summary-worktree.test.js.map +1 -0
- package/dist/team/__tests__/teardown-invariant.test.d.ts +2 -0
- package/dist/team/__tests__/teardown-invariant.test.d.ts.map +1 -0
- package/dist/team/__tests__/teardown-invariant.test.js +176 -0
- package/dist/team/__tests__/teardown-invariant.test.js.map +1 -0
- package/dist/team/__tests__/tmux-session-liveness.test.d.ts +2 -0
- package/dist/team/__tests__/tmux-session-liveness.test.d.ts.map +1 -0
- package/dist/team/__tests__/tmux-session-liveness.test.js +37 -0
- package/dist/team/__tests__/tmux-session-liveness.test.js.map +1 -0
- package/dist/team/__tests__/worker-bootstrap.test.js +47 -1
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/__tests__/worker-commit-cadence.test.d.ts +2 -0
- package/dist/team/__tests__/worker-commit-cadence.test.d.ts.map +1 -0
- package/dist/team/__tests__/worker-commit-cadence.test.js +315 -0
- package/dist/team/__tests__/worker-commit-cadence.test.js.map +1 -0
- package/dist/team/__tests__/worktree-contract-fields.test.d.ts +2 -0
- package/dist/team/__tests__/worktree-contract-fields.test.d.ts.map +1 -0
- package/dist/team/__tests__/worktree-contract-fields.test.js +157 -0
- package/dist/team/__tests__/worktree-contract-fields.test.js.map +1 -0
- package/dist/team/__tests__/worktree-runtime-e2e.test.d.ts +2 -0
- package/dist/team/__tests__/worktree-runtime-e2e.test.d.ts.map +1 -0
- package/dist/team/__tests__/worktree-runtime-e2e.test.js +182 -0
- package/dist/team/__tests__/worktree-runtime-e2e.test.js.map +1 -0
- package/dist/team/api-interop.d.ts +2 -1
- package/dist/team/api-interop.d.ts.map +1 -1
- package/dist/team/api-interop.js +121 -14
- package/dist/team/api-interop.js.map +1 -1
- package/dist/team/capabilities.d.ts.map +1 -1
- package/dist/team/capabilities.js +2 -0
- package/dist/team/capabilities.js.map +1 -1
- package/dist/team/cli-worker-contract.d.ts +7 -6
- package/dist/team/cli-worker-contract.d.ts.map +1 -1
- package/dist/team/cli-worker-contract.js +7 -6
- package/dist/team/cli-worker-contract.js.map +1 -1
- package/dist/team/conflict-mailbox.d.ts +49 -0
- package/dist/team/conflict-mailbox.d.ts.map +1 -0
- package/dist/team/conflict-mailbox.js +98 -0
- package/dist/team/conflict-mailbox.js.map +1 -0
- package/dist/team/events.d.ts +3 -0
- package/dist/team/events.d.ts.map +1 -1
- package/dist/team/events.js +2 -1
- package/dist/team/events.js.map +1 -1
- package/dist/team/git-worktree.d.ts +78 -10
- package/dist/team/git-worktree.d.ts.map +1 -1
- package/dist/team/git-worktree.js +453 -97
- package/dist/team/git-worktree.js.map +1 -1
- package/dist/team/governance.d.ts +3 -2
- package/dist/team/governance.d.ts.map +1 -1
- package/dist/team/governance.js.map +1 -1
- package/dist/team/leader-inbox.d.ts +28 -0
- package/dist/team/leader-inbox.d.ts.map +1 -0
- package/dist/team/leader-inbox.js +68 -0
- package/dist/team/leader-inbox.js.map +1 -0
- package/dist/team/merge-coordinator.d.ts +6 -0
- package/dist/team/merge-coordinator.d.ts.map +1 -1
- package/dist/team/merge-coordinator.js +6 -2
- package/dist/team/merge-coordinator.js.map +1 -1
- package/dist/team/merge-orchestrator.d.ts +41 -0
- package/dist/team/merge-orchestrator.d.ts.map +1 -0
- package/dist/team/merge-orchestrator.js +736 -0
- package/dist/team/merge-orchestrator.js.map +1 -0
- package/dist/team/model-contract.d.ts +18 -2
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +55 -28
- package/dist/team/model-contract.js.map +1 -1
- package/dist/team/monitor.d.ts.map +1 -1
- package/dist/team/monitor.js +47 -3
- package/dist/team/monitor.js.map +1 -1
- package/dist/team/runtime-cli.d.ts +1 -0
- package/dist/team/runtime-cli.d.ts.map +1 -1
- package/dist/team/runtime-cli.js +15 -2
- package/dist/team/runtime-cli.js.map +1 -1
- package/dist/team/runtime-flags.d.ts +5 -0
- package/dist/team/runtime-flags.d.ts.map +1 -0
- package/dist/team/runtime-flags.js +12 -0
- package/dist/team/runtime-flags.js.map +1 -0
- package/dist/team/runtime-v2.d.ts +16 -1
- package/dist/team/runtime-v2.d.ts.map +1 -1
- package/dist/team/runtime-v2.js +531 -127
- package/dist/team/runtime-v2.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +4 -1
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +110 -13
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state/tasks.d.ts.map +1 -1
- package/dist/team/state/tasks.js +1 -0
- package/dist/team/state/tasks.js.map +1 -1
- package/dist/team/team-ops.d.ts.map +1 -1
- package/dist/team/team-ops.js +112 -16
- package/dist/team/team-ops.js.map +1 -1
- package/dist/team/tmux-session.d.ts +17 -29
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +117 -108
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/types.d.ts +31 -17
- package/dist/team/types.d.ts.map +1 -1
- package/dist/team/types.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts +11 -0
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +37 -14
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/dist/team/worker-canonicalization.d.ts.map +1 -1
- package/dist/team/worker-canonicalization.js +2 -0
- package/dist/team/worker-canonicalization.js.map +1 -1
- package/dist/team/worker-commit-cadence.d.ts +70 -0
- package/dist/team/worker-commit-cadence.d.ts.map +1 -0
- package/dist/team/worker-commit-cadence.js +271 -0
- package/dist/team/worker-commit-cadence.js.map +1 -0
- package/dist/tools/__tests__/memory-tools.test.js +4 -4
- package/dist/tools/__tests__/memory-tools.test.js.map +1 -1
- package/dist/tools/__tests__/state-tools.test.js +13 -1
- package/dist/tools/__tests__/state-tools.test.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +1 -16
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/resolve-node.d.ts.map +1 -1
- package/dist/utils/resolve-node.js +22 -28
- package/dist/utils/resolve-node.js.map +1 -1
- package/docs/GETTING-STARTED.md +415 -0
- package/docs/MIGRATION.md +1003 -0
- package/docs/REFERENCE.md +21 -4
- package/docs/TEAM-WORKTREE-MODE.md +86 -0
- package/docs/company-context-interface.md +5 -16
- package/docs/copilot-instructions.md +1 -1
- package/package.json +1 -1
- package/scripts/keyword-detector.mjs +168 -20
- package/scripts/lib/hud-cache-wrapper.sh +122 -0
- package/scripts/persistent-mode.cjs +28 -2
- package/scripts/persistent-mode.mjs +28 -2
- package/scripts/plugin-setup.mjs +10 -1
- package/scripts/post-tool-verifier.mjs +153 -3
- package/scripts/pre-tool-enforcer.mjs +54 -6
- package/scripts/session-start.mjs +194 -2
- package/skills/AGENTS.md +22 -91
- package/skills/ai-slop-cleaner/SKILL.md +118 -120
- package/skills/ask/SKILL.md +6 -8
- package/skills/autopilot/SKILL.md +1 -28
- package/skills/autoresearch/SKILL.md +5 -5
- package/skills/cancel/SKILL.md +13 -13
- package/skills/cccg/SKILL.md +1 -0
- package/skills/configure-notifications/SKILL.md +80 -215
- package/skills/debug/SKILL.md +3 -2
- package/skills/deep-dive/SKILL.md +20 -9
- package/skills/deep-interview/SKILL.md +32 -4
- package/skills/deepinit/SKILL.md +1 -0
- package/skills/external-context/SKILL.md +2 -1
- package/skills/hud/SKILL.md +22 -52
- package/skills/learner/SKILL.md +90 -57
- package/skills/mcp-setup/SKILL.md +45 -60
- package/skills/omc-doctor/SKILL.md +1 -1
- package/skills/omc-reference/SKILL.md +6 -6
- package/skills/omc-setup/SKILL.md +30 -74
- package/skills/omc-setup/phases/01-install-claude-md.md +97 -0
- package/skills/omc-setup/phases/02-configure.md +25 -40
- package/skills/omc-setup/phases/03-integrations.md +100 -69
- package/skills/omc-setup/phases/04-welcome.md +102 -44
- package/skills/omc-teams/SKILL.md +63 -26
- package/skills/plan/SKILL.md +11 -9
- package/skills/ralph/SKILL.md +42 -41
- package/skills/ralplan/SKILL.md +3 -10
- package/skills/release/SKILL.md +168 -57
- package/skills/remember/SKILL.md +2 -1
- package/skills/sciomc/SKILL.md +12 -11
- package/skills/self-improve/SKILL.md +4 -4
- package/skills/setup/SKILL.md +1 -0
- package/skills/skill/SKILL.md +21 -20
- package/skills/skillify/SKILL.md +34 -3
- package/skills/team/SKILL.md +62 -44
- package/skills/ultraqa/SKILL.md +1 -2
- package/skills/ultrawork/SKILL.md +28 -21
- package/skills/verify/SKILL.md +2 -1
- package/skills/writer-memory/SKILL.md +2 -1
- package/templates/hooks/keyword-detector.mjs +129 -11
- package/templates/hooks/persistent-mode.mjs +28 -2
- package/templates/hooks/pre-tool-use.mjs +144 -45
- package/templates/hooks/session-start.mjs +25 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// src/team/__tests__/worktree-runtime-e2e.test.ts
|
|
2
|
+
//
|
|
3
|
+
// Acceptance #1: 3 workers × 10 commits → 30 merge_succeeded events.
|
|
4
|
+
// Uses real git via git-fixture helper.
|
|
5
|
+
import { afterEach, beforeAll, beforeEach, describe, expect, it } from 'vitest';
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { createGitFixture, orchestratorEventLogPath, readEventLog, waitForEventInLog, } from './helpers/git-fixture.js';
|
|
9
|
+
import { startMergeOrchestrator, } from '../merge-orchestrator.js';
|
|
10
|
+
beforeAll(() => {
|
|
11
|
+
process.env.OMC_RUNTIME_V2 = '1';
|
|
12
|
+
});
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
process.env.OMC_RUNTIME_V2 = '1';
|
|
15
|
+
});
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Acceptance #1: 3 workers × 10 commits — all 30 merges succeed
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Windows: real-git fixture is too slow under Defender ASR — heavy 30-commit
|
|
20
|
+
// volume test gates on event-log polling that exceeds reasonable timeouts.
|
|
21
|
+
// Other tests in this describe block + smaller integration tests
|
|
22
|
+
// (rebase-smoke, teardown-invariant) validate the same code paths.
|
|
23
|
+
const describeIfNotWin = process.platform === 'win32' ? describe.skip : describe;
|
|
24
|
+
describeIfNotWin('worktree runtime e2e: 3 workers × 10 commits', () => {
|
|
25
|
+
let fixture;
|
|
26
|
+
let handle;
|
|
27
|
+
beforeEach(async () => {
|
|
28
|
+
fixture = await createGitFixture({
|
|
29
|
+
workerCount: 3,
|
|
30
|
+
leaderBranchName: 'omc-team-test-leader',
|
|
31
|
+
teamName: 'e2e-team',
|
|
32
|
+
});
|
|
33
|
+
process.env.OMC_RUNTIME_V2 = '1';
|
|
34
|
+
const config = {
|
|
35
|
+
teamName: fixture.teamName,
|
|
36
|
+
repoRoot: fixture.repoRoot,
|
|
37
|
+
leaderBranch: fixture.leaderBranch,
|
|
38
|
+
cwd: fixture.repoRoot,
|
|
39
|
+
pollIntervalMs: 100,
|
|
40
|
+
drainTimeoutMs: 20000,
|
|
41
|
+
};
|
|
42
|
+
handle = await startMergeOrchestrator(config);
|
|
43
|
+
await handle.registerWorker('worker-1');
|
|
44
|
+
await handle.registerWorker('worker-2');
|
|
45
|
+
await handle.registerWorker('worker-3');
|
|
46
|
+
});
|
|
47
|
+
afterEach(async () => {
|
|
48
|
+
try {
|
|
49
|
+
await handle.drainAndStop();
|
|
50
|
+
}
|
|
51
|
+
catch { /* ignore */ }
|
|
52
|
+
await fixture.cleanup();
|
|
53
|
+
});
|
|
54
|
+
it('all 30 commits across 3 workers produce merge_succeeded events', async () => {
|
|
55
|
+
// Each worker commits 10 files to disjoint paths (worker-N/file-X.ts)
|
|
56
|
+
// so there are NO conflicts. All merges should succeed.
|
|
57
|
+
//
|
|
58
|
+
// Use serialized commit→wait-for-merge loops to prevent burst-commit
|
|
59
|
+
// coalescing (the orchestrator merges latest HEAD per poll window, so
|
|
60
|
+
// 10 rapid commits → 1 merge event). By waiting for each merge before
|
|
61
|
+
// the next commit we guarantee at least 1 merge per commit.
|
|
62
|
+
//
|
|
63
|
+
// NOTE: rebase fan-out after each merge advances other workers' branch
|
|
64
|
+
// SHAs, which the orchestrator treats as new commits and also merges.
|
|
65
|
+
// So the total merge count may exceed 30 (each of the 30 user commits
|
|
66
|
+
// produces ≥1 merge, plus rebase-induced merges). We assert ≥30 total
|
|
67
|
+
// and ≥10 per worker.
|
|
68
|
+
const COMMITS_PER_WORKER = 10;
|
|
69
|
+
const eventLog = orchestratorEventLogPath(fixture.repoRoot, fixture.teamName);
|
|
70
|
+
const workers = ['worker-1', 'worker-2', 'worker-3'];
|
|
71
|
+
// Track total merges seen so far per worker (rebase-induced merges count too)
|
|
72
|
+
const mergeCountPerWorker = { 'worker-1': 0, 'worker-2': 0, 'worker-3': 0 };
|
|
73
|
+
for (const worker of workers) {
|
|
74
|
+
for (let i = 1; i <= COMMITS_PER_WORKER; i++) {
|
|
75
|
+
await fixture.commitFile(worker, `${worker}/file-${i}.ts`, `// ${worker} file ${i}\nexport const f${i} = ${i};\n`);
|
|
76
|
+
mergeCountPerWorker[worker] += 1;
|
|
77
|
+
// Wait for at least mergeCountPerWorker[worker] merges from this worker
|
|
78
|
+
// before issuing the next commit (prevents coalescing).
|
|
79
|
+
await waitForEventInLog({
|
|
80
|
+
eventLogPath: eventLog,
|
|
81
|
+
eventType: 'merge_succeeded',
|
|
82
|
+
worker,
|
|
83
|
+
count: mergeCountPerWorker[worker],
|
|
84
|
+
timeoutMs: process.platform === 'win32' ? 15000 : 5000,
|
|
85
|
+
});
|
|
86
|
+
// Re-read current count in case rebase-induced merges arrived
|
|
87
|
+
const currentEvents = readEventLog(eventLog);
|
|
88
|
+
mergeCountPerWorker[worker] = currentEvents.filter((e) => e.type === 'merge_succeeded' && e.worker === worker).length;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const events = readEventLog(eventLog);
|
|
92
|
+
const mergeSucceeded = events.filter((e) => e.type === 'merge_succeeded');
|
|
93
|
+
// At least 30 merges: one per user commit. May be more due to rebase fan-out.
|
|
94
|
+
expect(mergeSucceeded.length).toBeGreaterThanOrEqual(30);
|
|
95
|
+
// All three workers should have contributed at least COMMITS_PER_WORKER merges
|
|
96
|
+
for (const worker of workers) {
|
|
97
|
+
const wMerges = mergeSucceeded.filter((e) => e.worker === worker);
|
|
98
|
+
expect(wMerges.length).toBeGreaterThanOrEqual(COMMITS_PER_WORKER);
|
|
99
|
+
}
|
|
100
|
+
}, 120000);
|
|
101
|
+
it('leader branch has merge commits after all workers finish', async () => {
|
|
102
|
+
const COMMITS_PER_WORKER = 3; // smaller count for speed
|
|
103
|
+
const eventLog = orchestratorEventLogPath(fixture.repoRoot, fixture.teamName);
|
|
104
|
+
const workers = ['worker-1', 'worker-2', 'worker-3'];
|
|
105
|
+
const mergeCountPerWorker = { 'worker-1': 0, 'worker-2': 0, 'worker-3': 0 };
|
|
106
|
+
// Serialized commit→wait-for-merge per worker to prevent coalescing
|
|
107
|
+
for (const worker of workers) {
|
|
108
|
+
for (let i = 1; i <= COMMITS_PER_WORKER; i++) {
|
|
109
|
+
await fixture.commitFile(worker, `${worker}/f${i}.ts`, `// ${worker} f${i}\n`);
|
|
110
|
+
mergeCountPerWorker[worker] += 1;
|
|
111
|
+
await waitForEventInLog({
|
|
112
|
+
eventLogPath: eventLog,
|
|
113
|
+
eventType: 'merge_succeeded',
|
|
114
|
+
worker,
|
|
115
|
+
count: mergeCountPerWorker[worker],
|
|
116
|
+
timeoutMs: process.platform === 'win32' ? 15000 : 5000,
|
|
117
|
+
});
|
|
118
|
+
// Update count to include any rebase-induced merges
|
|
119
|
+
const currentEvents = readEventLog(eventLog);
|
|
120
|
+
mergeCountPerWorker[worker] = currentEvents.filter((e) => e.type === 'merge_succeeded' && e.worker === worker).length;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Drain to ensure all merges are flushed
|
|
124
|
+
await handle.drainAndStop();
|
|
125
|
+
// Verify leader branch has merge commits via git log.
|
|
126
|
+
// Each worker's user commits produce ≥1 merge commit each.
|
|
127
|
+
// Rebase-induced merges may add more. Assert at least one worker's
|
|
128
|
+
// commits made it in as merge commits.
|
|
129
|
+
const { execFileSync } = await import('node:child_process');
|
|
130
|
+
const logOutput = execFileSync('git', ['log', '--merges', '--oneline', fixture.leaderBranch], {
|
|
131
|
+
cwd: fixture.repoRoot,
|
|
132
|
+
encoding: 'utf-8',
|
|
133
|
+
stdio: 'pipe',
|
|
134
|
+
}).trim();
|
|
135
|
+
const mergeCommitLines = logOutput.split('\n').filter((l) => l.trim().length > 0);
|
|
136
|
+
// At least one merge per worker (3 workers × 1 = 3 minimum)
|
|
137
|
+
expect(mergeCommitLines.length).toBeGreaterThanOrEqual(workers.length);
|
|
138
|
+
}, 60000);
|
|
139
|
+
it('leader inbox has merge notifications', async () => {
|
|
140
|
+
await fixture.commitFile('worker-1', 'worker-1/notify.ts', '// notify test\n');
|
|
141
|
+
const eventLog = orchestratorEventLogPath(fixture.repoRoot, fixture.teamName);
|
|
142
|
+
await waitForEventInLog({ eventLogPath: eventLog, eventType: 'merge_succeeded', worker: 'worker-1', timeoutMs: 8000 });
|
|
143
|
+
// Leader inbox should have been created and seeded by orchestrator startup
|
|
144
|
+
const leaderInboxPath = join(fixture.repoRoot, '.omcp', 'state', 'team', fixture.teamName, 'leader', 'inbox.md');
|
|
145
|
+
expect(existsSync(leaderInboxPath)).toBe(true);
|
|
146
|
+
});
|
|
147
|
+
it('orchestrator state is consistent across registerWorker calls', async () => {
|
|
148
|
+
const state = handle.getState();
|
|
149
|
+
expect(state.workers).toContain('worker-1');
|
|
150
|
+
expect(state.workers).toContain('worker-2');
|
|
151
|
+
expect(state.workers).toContain('worker-3');
|
|
152
|
+
expect(state.workers.length).toBe(3);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
// Leader branch name guard — never main/master (M3 compliance check)
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
describe('M3 compliance: fixture never uses main/master', () => {
|
|
159
|
+
it('fixture rejects main as leader branch', async () => {
|
|
160
|
+
await expect(createGitFixture({ workerCount: 1, leaderBranchName: 'main' })).rejects.toThrow(/main\/master/);
|
|
161
|
+
});
|
|
162
|
+
it('fixture rejects master as leader branch', async () => {
|
|
163
|
+
await expect(createGitFixture({ workerCount: 1, leaderBranchName: 'master' })).rejects.toThrow(/main\/master/);
|
|
164
|
+
});
|
|
165
|
+
it('orchestrator rejects main leader branch', async () => {
|
|
166
|
+
const fixture = await createGitFixture({ workerCount: 1 });
|
|
167
|
+
try {
|
|
168
|
+
process.env.OMC_RUNTIME_V2 = '1';
|
|
169
|
+
const config = {
|
|
170
|
+
teamName: fixture.teamName,
|
|
171
|
+
repoRoot: fixture.repoRoot,
|
|
172
|
+
leaderBranch: 'main', // should be rejected
|
|
173
|
+
cwd: fixture.repoRoot,
|
|
174
|
+
};
|
|
175
|
+
await expect(startMergeOrchestrator(config)).rejects.toThrow(/main\/master/);
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
await fixture.cleanup();
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=worktree-runtime-e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-runtime-e2e.test.js","sourceRoot":"","sources":["../../../src/team/__tests__/worktree-runtime-e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export declare const LEGACY_TEAM_MCP_TOOLS: readonly ["team_send_message", "team_broadcast", "team_mailbox_list", "team_mailbox_mark_delivered", "team_mailbox_mark_notified", "team_create_task", "team_read_task", "team_list_tasks", "team_update_task", "team_claim_task", "team_transition_task_status", "team_release_task_claim", "team_read_config", "team_read_manifest", "team_read_worker_status", "team_read_worker_heartbeat", "team_update_worker_heartbeat", "team_write_worker_inbox", "team_write_worker_identity", "team_append_event", "team_get_summary", "team_cleanup", "team_write_shutdown_request", "team_read_shutdown_ack", "team_read_monitor_snapshot", "team_write_monitor_snapshot", "team_read_task_approval", "team_write_task_approval"];
|
|
1
2
|
export declare const TEAM_API_OPERATIONS: readonly ["send-message", "broadcast", "mailbox-list", "mailbox-mark-delivered", "mailbox-mark-notified", "create-task", "read-task", "list-tasks", "update-task", "claim-task", "transition-task-status", "release-task-claim", "read-config", "read-manifest", "read-worker-status", "read-worker-heartbeat", "update-worker-heartbeat", "write-worker-inbox", "write-worker-identity", "append-event", "get-summary", "cleanup", "write-shutdown-request", "read-shutdown-ack", "read-monitor-snapshot", "write-monitor-snapshot", "read-task-approval", "write-task-approval", "orphan-cleanup"];
|
|
2
3
|
export type TeamApiOperation = typeof TEAM_API_OPERATIONS[number];
|
|
3
4
|
export type TeamApiEnvelope = {
|
|
@@ -12,7 +13,7 @@ export type TeamApiEnvelope = {
|
|
|
12
13
|
message: string;
|
|
13
14
|
};
|
|
14
15
|
};
|
|
15
|
-
export declare function resolveTeamApiCliCommand(
|
|
16
|
+
export declare function resolveTeamApiCliCommand(env?: NodeJS.ProcessEnv): 'omcp team api' | 'omx team api';
|
|
16
17
|
export declare function resolveTeamApiOperation(name: string): TeamApiOperation | null;
|
|
17
18
|
export declare function buildLegacyTeamDeprecationHint(legacyName: string, originalArgs?: Record<string, unknown>, env?: NodeJS.ProcessEnv): string;
|
|
18
19
|
export declare function executeTeamApiOperation(operation: TeamApiOperation, args: Record<string, unknown>, fallbackCwd: string): Promise<TeamApiEnvelope>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-interop.d.ts","sourceRoot":"","sources":["../../src/team/api-interop.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-interop.d.ts","sourceRoot":"","sources":["../../src/team/api-interop.ts"],"names":[],"mappings":"AAwDA,eAAO,MAAM,qBAAqB,gsBA6BxB,CAAC;AAEX,eAAO,MAAM,mBAAmB,skBA8BtB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACxE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAkDrG,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,eAAe,GAAG,cAAc,CAc/G;AA4JD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAG7E;AAED,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAQR;AAwJD,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,gBAAgB,EAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC,CA2c1B"}
|
package/dist/team/api-interop.js
CHANGED
|
@@ -6,9 +6,42 @@ import { queueBroadcastMailboxMessage, queueDirectMailboxMessage } from './mcp-c
|
|
|
6
6
|
import { injectToLeaderPane, sendToWorker } from './tmux-session.js';
|
|
7
7
|
import { listDispatchRequests, markDispatchRequestDelivered, markDispatchRequestNotified } from './dispatch-queue.js';
|
|
8
8
|
import { generateMailboxTriggerMessage } from './worker-bootstrap.js';
|
|
9
|
+
import { shutdownTeam } from './runtime.js';
|
|
9
10
|
import { shutdownTeamV2 } from './runtime-v2.js';
|
|
11
|
+
import { inspectTeamWorktreeCleanupSafety } from './git-worktree.js';
|
|
12
|
+
import { createSwallowedErrorLogger } from '../lib/swallowed-error.js';
|
|
10
13
|
const TEAM_UPDATE_TASK_MUTABLE_FIELDS = new Set(['subject', 'description', 'blocked_by', 'requires_code_change']);
|
|
11
14
|
const TEAM_UPDATE_TASK_REQUEST_FIELDS = new Set(['team_name', 'task_id', 'workingDirectory', ...TEAM_UPDATE_TASK_MUTABLE_FIELDS]);
|
|
15
|
+
export const LEGACY_TEAM_MCP_TOOLS = [
|
|
16
|
+
'team_send_message',
|
|
17
|
+
'team_broadcast',
|
|
18
|
+
'team_mailbox_list',
|
|
19
|
+
'team_mailbox_mark_delivered',
|
|
20
|
+
'team_mailbox_mark_notified',
|
|
21
|
+
'team_create_task',
|
|
22
|
+
'team_read_task',
|
|
23
|
+
'team_list_tasks',
|
|
24
|
+
'team_update_task',
|
|
25
|
+
'team_claim_task',
|
|
26
|
+
'team_transition_task_status',
|
|
27
|
+
'team_release_task_claim',
|
|
28
|
+
'team_read_config',
|
|
29
|
+
'team_read_manifest',
|
|
30
|
+
'team_read_worker_status',
|
|
31
|
+
'team_read_worker_heartbeat',
|
|
32
|
+
'team_update_worker_heartbeat',
|
|
33
|
+
'team_write_worker_inbox',
|
|
34
|
+
'team_write_worker_identity',
|
|
35
|
+
'team_append_event',
|
|
36
|
+
'team_get_summary',
|
|
37
|
+
'team_cleanup',
|
|
38
|
+
'team_write_shutdown_request',
|
|
39
|
+
'team_read_shutdown_ack',
|
|
40
|
+
'team_read_monitor_snapshot',
|
|
41
|
+
'team_write_monitor_snapshot',
|
|
42
|
+
'team_read_task_approval',
|
|
43
|
+
'team_write_task_approval',
|
|
44
|
+
];
|
|
12
45
|
export const TEAM_API_OPERATIONS = [
|
|
13
46
|
'send-message',
|
|
14
47
|
'broadcast',
|
|
@@ -75,23 +108,53 @@ function parseTeamWorkerEnv(raw) {
|
|
|
75
108
|
return { teamName: match[1], workerName: match[2] };
|
|
76
109
|
}
|
|
77
110
|
function parseTeamWorkerContextFromEnv(env = process.env) {
|
|
78
|
-
return parseTeamWorkerEnv(env.OMC_TEAM_WORKER);
|
|
111
|
+
return parseTeamWorkerEnv(env.OMC_TEAM_WORKER) ?? parseTeamWorkerEnv(env.OMX_TEAM_WORKER);
|
|
79
112
|
}
|
|
80
113
|
function readTeamStateRootFromEnv(env = process.env) {
|
|
81
114
|
const candidate = typeof env.OMC_TEAM_STATE_ROOT === 'string' && env.OMC_TEAM_STATE_ROOT.trim() !== ''
|
|
82
115
|
? env.OMC_TEAM_STATE_ROOT.trim()
|
|
83
|
-
: ''
|
|
116
|
+
: (typeof env.OMX_TEAM_STATE_ROOT === 'string' && env.OMX_TEAM_STATE_ROOT.trim() !== ''
|
|
117
|
+
? env.OMX_TEAM_STATE_ROOT.trim()
|
|
118
|
+
: '');
|
|
84
119
|
return candidate || null;
|
|
85
120
|
}
|
|
86
|
-
export function resolveTeamApiCliCommand(
|
|
121
|
+
export function resolveTeamApiCliCommand(env = process.env) {
|
|
122
|
+
const hasOmcContext = ((typeof env.OMC_TEAM_WORKER === 'string' && env.OMC_TEAM_WORKER.trim() !== '')
|
|
123
|
+
|| (typeof env.OMC_TEAM_STATE_ROOT === 'string' && env.OMC_TEAM_STATE_ROOT.trim() !== ''));
|
|
124
|
+
if (hasOmcContext)
|
|
125
|
+
return 'omcp team api';
|
|
126
|
+
const hasOmxContext = ((typeof env.OMX_TEAM_WORKER === 'string' && env.OMX_TEAM_WORKER.trim() !== '')
|
|
127
|
+
|| (typeof env.OMX_TEAM_STATE_ROOT === 'string' && env.OMX_TEAM_STATE_ROOT.trim() !== ''));
|
|
128
|
+
if (hasOmxContext)
|
|
129
|
+
return 'omx team api';
|
|
87
130
|
return 'omcp team api';
|
|
88
131
|
}
|
|
89
132
|
function isRuntimeV2Config(config) {
|
|
90
133
|
return !!config && typeof config === 'object' && Array.isArray(config.workers);
|
|
91
134
|
}
|
|
135
|
+
function isLegacyRuntimeConfig(config) {
|
|
136
|
+
return !!config && typeof config === 'object' && Array.isArray(config.agentTypes);
|
|
137
|
+
}
|
|
138
|
+
function assertNoNativeWorktreeCleanupEvidence(teamName, cwd) {
|
|
139
|
+
const safety = inspectTeamWorktreeCleanupSafety(teamName, cwd);
|
|
140
|
+
if (!safety.hasEvidence)
|
|
141
|
+
return;
|
|
142
|
+
const evidence = safety.blockers.length > 0
|
|
143
|
+
? safety.blockers
|
|
144
|
+
: safety.entries.map((entry) => ({
|
|
145
|
+
workerName: entry.workerName,
|
|
146
|
+
path: entry.path,
|
|
147
|
+
reason: 'worktree_cleanup_evidence_present',
|
|
148
|
+
}));
|
|
149
|
+
const details = evidence
|
|
150
|
+
.map((item) => `${item.workerName}:${item.reason}:${item.path}`)
|
|
151
|
+
.join(';');
|
|
152
|
+
throw new Error(`cleanup_blocked:worktree_cleanup_evidence_present:${details}`);
|
|
153
|
+
}
|
|
92
154
|
async function executeTeamCleanupViaRuntime(teamName, cwd) {
|
|
93
155
|
const config = await teamReadConfig(teamName, cwd);
|
|
94
156
|
if (!config) {
|
|
157
|
+
assertNoNativeWorktreeCleanupEvidence(teamName, cwd);
|
|
95
158
|
await teamCleanup(teamName, cwd);
|
|
96
159
|
return;
|
|
97
160
|
}
|
|
@@ -99,6 +162,18 @@ async function executeTeamCleanupViaRuntime(teamName, cwd) {
|
|
|
99
162
|
await shutdownTeamV2(teamName, cwd);
|
|
100
163
|
return;
|
|
101
164
|
}
|
|
165
|
+
if (isLegacyRuntimeConfig(config)) {
|
|
166
|
+
const legacyConfig = config;
|
|
167
|
+
const sessionName = typeof legacyConfig.tmuxSession === 'string' && legacyConfig.tmuxSession.trim() !== ''
|
|
168
|
+
? legacyConfig.tmuxSession.trim()
|
|
169
|
+
: `omc-team-${teamName}`;
|
|
170
|
+
const leaderPaneId = typeof legacyConfig.leaderPaneId === 'string' && legacyConfig.leaderPaneId.trim() !== ''
|
|
171
|
+
? legacyConfig.leaderPaneId.trim()
|
|
172
|
+
: undefined;
|
|
173
|
+
await shutdownTeam(teamName, sessionName, cwd, 30_000, undefined, leaderPaneId, legacyConfig.tmuxOwnsWindow === true);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
assertNoNativeWorktreeCleanupEvidence(teamName, cwd);
|
|
102
177
|
await teamCleanup(teamName, cwd);
|
|
103
178
|
}
|
|
104
179
|
function readTeamStateRootFromFile(path) {
|
|
@@ -149,9 +224,11 @@ function resolveTeamWorkingDirectoryFromMetadata(teamName, candidateCwd, workerC
|
|
|
149
224
|
const fromConfig = readTeamStateRootFromFile(join(teamRoot, 'config.json'));
|
|
150
225
|
if (fromConfig)
|
|
151
226
|
return stateRootToWorkingDirectory(fromConfig);
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
227
|
+
for (const manifestName of ['manifest.json', 'manifest.v2.json']) {
|
|
228
|
+
const fromManifest = readTeamStateRootFromFile(join(teamRoot, manifestName));
|
|
229
|
+
if (fromManifest)
|
|
230
|
+
return stateRootToWorkingDirectory(fromManifest);
|
|
231
|
+
}
|
|
155
232
|
return null;
|
|
156
233
|
}
|
|
157
234
|
function resolveTeamWorkingDirectory(teamName, preferredCwd) {
|
|
@@ -160,7 +237,10 @@ function resolveTeamWorkingDirectory(teamName, preferredCwd) {
|
|
|
160
237
|
return preferredCwd;
|
|
161
238
|
const envTeamStateRoot = readTeamStateRootFromEnv();
|
|
162
239
|
if (typeof envTeamStateRoot === 'string' && envTeamStateRoot.trim() !== '') {
|
|
163
|
-
|
|
240
|
+
const envWorkingDirectory = stateRootToWorkingDirectory(envTeamStateRoot.trim());
|
|
241
|
+
if (teamStateExists(normalizedTeamName, envWorkingDirectory)) {
|
|
242
|
+
return envWorkingDirectory;
|
|
243
|
+
}
|
|
164
244
|
}
|
|
165
245
|
const seeds = [];
|
|
166
246
|
for (const seed of [preferredCwd, process.cwd()]) {
|
|
@@ -204,6 +284,10 @@ export function buildLegacyTeamDeprecationHint(legacyName, originalArgs, env = p
|
|
|
204
284
|
}
|
|
205
285
|
const QUEUED_FOR_HOOK_DISPATCH_REASON = 'queued_for_hook_dispatch';
|
|
206
286
|
const LEADER_PANE_MISSING_MAILBOX_PERSISTED_REASON = 'leader_pane_missing_mailbox_persisted';
|
|
287
|
+
const WORKTREE_TRIGGER_STATE_ROOT = '$OMC_TEAM_STATE_ROOT';
|
|
288
|
+
function resolveInstructionStateRoot(worktreePath) {
|
|
289
|
+
return worktreePath ? WORKTREE_TRIGGER_STATE_ROOT : undefined;
|
|
290
|
+
}
|
|
207
291
|
function queuedForHookDispatch() {
|
|
208
292
|
return {
|
|
209
293
|
ok: true,
|
|
@@ -246,6 +330,7 @@ function findWorkerDispatchTarget(teamName, toWorker, cwd) {
|
|
|
246
330
|
return {
|
|
247
331
|
paneId: recipient?.pane_id,
|
|
248
332
|
workerIndex: recipient?.index,
|
|
333
|
+
instructionStateRoot: resolveInstructionStateRoot(recipient?.worktree_path),
|
|
249
334
|
};
|
|
250
335
|
});
|
|
251
336
|
}
|
|
@@ -257,17 +342,19 @@ async function findMailboxDispatchRequestId(teamName, workerName, messageId, cwd
|
|
|
257
342
|
return matching[0]?.request_id ?? null;
|
|
258
343
|
}
|
|
259
344
|
async function syncMailboxDispatchNotified(teamName, workerName, messageId, cwd) {
|
|
345
|
+
const logDispatchSyncFailure = createSwallowedErrorLogger('team.api-interop syncMailboxDispatchNotified dispatch state sync failed');
|
|
260
346
|
const requestId = await findMailboxDispatchRequestId(teamName, workerName, messageId, cwd);
|
|
261
347
|
if (!requestId)
|
|
262
348
|
return;
|
|
263
|
-
await markDispatchRequestNotified(teamName, requestId, { message_id: messageId, last_reason: 'mailbox_mark_notified' }, cwd).catch(
|
|
349
|
+
await markDispatchRequestNotified(teamName, requestId, { message_id: messageId, last_reason: 'mailbox_mark_notified' }, cwd).catch(logDispatchSyncFailure);
|
|
264
350
|
}
|
|
265
351
|
async function syncMailboxDispatchDelivered(teamName, workerName, messageId, cwd) {
|
|
352
|
+
const logDispatchSyncFailure = createSwallowedErrorLogger('team.api-interop syncMailboxDispatchDelivered dispatch state sync failed');
|
|
266
353
|
const requestId = await findMailboxDispatchRequestId(teamName, workerName, messageId, cwd);
|
|
267
354
|
if (!requestId)
|
|
268
355
|
return;
|
|
269
|
-
await markDispatchRequestNotified(teamName, requestId, { message_id: messageId, last_reason: 'mailbox_mark_delivered' }, cwd).catch(
|
|
270
|
-
await markDispatchRequestDelivered(teamName, requestId, { message_id: messageId, last_reason: 'mailbox_mark_delivered' }, cwd).catch(
|
|
356
|
+
await markDispatchRequestNotified(teamName, requestId, { message_id: messageId, last_reason: 'mailbox_mark_delivered' }, cwd).catch(logDispatchSyncFailure);
|
|
357
|
+
await markDispatchRequestDelivered(teamName, requestId, { message_id: messageId, last_reason: 'mailbox_mark_delivered' }, cwd).catch(logDispatchSyncFailure);
|
|
271
358
|
}
|
|
272
359
|
function validateCommonFields(args) {
|
|
273
360
|
const teamName = String(args.team_name || '').trim();
|
|
@@ -311,7 +398,7 @@ export async function executeTeamApiOperation(operation, args, fallbackCwd) {
|
|
|
311
398
|
toWorkerIndex: target.workerIndex,
|
|
312
399
|
toPaneId: target.paneId,
|
|
313
400
|
body,
|
|
314
|
-
triggerMessage: generateMailboxTriggerMessage(teamName, toWorker),
|
|
401
|
+
triggerMessage: generateMailboxTriggerMessage(teamName, toWorker, 1, target.instructionStateRoot),
|
|
315
402
|
cwd,
|
|
316
403
|
notify: ({ workerName }, triggerMessage) => notifyMailboxTarget(teamName, workerName, triggerMessage, cwd),
|
|
317
404
|
deps: {
|
|
@@ -338,14 +425,19 @@ export async function executeTeamApiOperation(operation, args, fallbackCwd) {
|
|
|
338
425
|
const config = await teamReadConfig(teamName, cwd);
|
|
339
426
|
const recipients = (config?.workers ?? [])
|
|
340
427
|
.filter((worker) => worker.name !== fromWorker)
|
|
341
|
-
.map((worker) => ({
|
|
428
|
+
.map((worker) => ({
|
|
429
|
+
workerName: worker.name,
|
|
430
|
+
workerIndex: worker.index,
|
|
431
|
+
paneId: worker.pane_id,
|
|
432
|
+
instructionStateRoot: resolveInstructionStateRoot(worker.worktree_path),
|
|
433
|
+
}));
|
|
342
434
|
await queueBroadcastMailboxMessage({
|
|
343
435
|
teamName,
|
|
344
436
|
fromWorker,
|
|
345
437
|
recipients,
|
|
346
438
|
body,
|
|
347
439
|
cwd,
|
|
348
|
-
triggerFor: (workerName) => generateMailboxTriggerMessage(teamName, workerName),
|
|
440
|
+
triggerFor: (workerName) => generateMailboxTriggerMessage(teamName, workerName, 1, recipients.find((recipient) => recipient.workerName === workerName)?.instructionStateRoot),
|
|
349
441
|
notify: ({ workerName }, triggerMessage) => notifyMailboxTarget(teamName, workerName, triggerMessage, cwd),
|
|
350
442
|
deps: {
|
|
351
443
|
sendDirectMessage,
|
|
@@ -591,9 +683,11 @@ export async function executeTeamApiOperation(operation, args, fallbackCwd) {
|
|
|
591
683
|
pid: args.pid,
|
|
592
684
|
pane_id: args.pane_id,
|
|
593
685
|
working_dir: args.working_dir,
|
|
686
|
+
worktree_repo_root: args.worktree_repo_root,
|
|
594
687
|
worktree_path: args.worktree_path,
|
|
595
688
|
worktree_branch: args.worktree_branch,
|
|
596
689
|
worktree_detached: args.worktree_detached,
|
|
690
|
+
worktree_created: args.worktree_created,
|
|
597
691
|
team_state_root: args.team_state_root,
|
|
598
692
|
}, cwd);
|
|
599
693
|
return { ok: true, operation, data: { worker } };
|
|
@@ -634,10 +728,23 @@ export async function executeTeamApiOperation(operation, args, fallbackCwd) {
|
|
|
634
728
|
return { ok: true, operation, data: { team_name: teamName } };
|
|
635
729
|
}
|
|
636
730
|
case 'orphan-cleanup': {
|
|
637
|
-
// Destructive escape hatch:
|
|
731
|
+
// Destructive escape hatch: calls teamCleanup directly, bypassing shutdown orchestration.
|
|
732
|
+
// Native worktree recovery metadata/root AGENTS backups are protected unless callers
|
|
733
|
+
// explicitly acknowledge that this force path may delete those recovery records.
|
|
638
734
|
const teamName = String(args.team_name || '').trim();
|
|
639
735
|
if (!teamName)
|
|
640
736
|
return { ok: false, operation, error: { code: 'invalid_input', message: 'team_name is required' } };
|
|
737
|
+
const safety = inspectTeamWorktreeCleanupSafety(teamName, cwd);
|
|
738
|
+
if (safety.hasEvidence && args.acknowledge_lost_worktree_recovery !== true) {
|
|
739
|
+
return {
|
|
740
|
+
ok: false,
|
|
741
|
+
operation,
|
|
742
|
+
error: {
|
|
743
|
+
code: 'invalid_input',
|
|
744
|
+
message: 'orphan_cleanup_blocked:worktree_recovery_evidence_present; pass acknowledge_lost_worktree_recovery=true only after manually preserving or intentionally discarding worker worktrees and root AGENTS backups',
|
|
745
|
+
},
|
|
746
|
+
};
|
|
747
|
+
}
|
|
641
748
|
await teamCleanup(teamName, cwd);
|
|
642
749
|
return { ok: true, operation, data: { team_name: teamName } };
|
|
643
750
|
}
|