oh-my-copilot 4.13.2 → 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 +1 -1
- package/bridge/cli.cjs +2522 -949
- package/bridge/mcp-server.cjs +97 -9
- package/bridge/runtime-cli.cjs +1256 -133
- package/bridge/team.js +1241 -65
- package/dist/__tests__/auto-slash-aliases.test.js +91 -0
- package/dist/__tests__/auto-slash-aliases.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-rate-limits-priority.test.js +26 -0
- package/dist/__tests__/hud/render-rate-limits-priority.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__/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__/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 +56 -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/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 +14 -2
- 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 +23 -1
- package/dist/cli/team.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/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/detector.js +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 +10 -9
- package/dist/hooks/persistent-mode/index.js.map +1 -1
- package/dist/hooks/persistent-mode/stop-hook-blocking.test.js +64 -9
- 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 +67 -0
- package/dist/hooks/session-end/index.js.map +1 -1
- package/dist/hooks/skill-bridge.cjs +6 -5
- 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__/git-status.test.js +18 -0
- package/dist/hud/__tests__/git-status.test.js.map +1 -1
- 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/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/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/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/render.d.ts.map +1 -1
- package/dist/hud/render.js +11 -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/types.d.ts +26 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js +58 -0
- package/dist/hud/types.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.map +1 -1
- package/dist/installer/index.js +19 -7
- 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/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__/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__/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 +9 -1
- package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
- package/dist/team/__tests__/runtime-v2.dispatch.test.js +150 -1
- package/dist/team/__tests__/runtime-v2.dispatch.test.js.map +1 -1
- 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__/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-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/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/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/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 +7 -1
- package/dist/team/runtime-v2.d.ts.map +1 -1
- package/dist/team/runtime-v2.js +185 -8
- package/dist/team/runtime-v2.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts +4 -0
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +10 -1
- package/dist/team/worker-bootstrap.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/docs/GETTING-STARTED.md +415 -0
- package/docs/MIGRATION.md +66 -66
- package/docs/REFERENCE.md +21 -4
- package/docs/company-context-interface.md +5 -16
- package/docs/copilot-instructions.md +1 -1
- package/package.json +1 -1
- package/scripts/lib/hud-cache-wrapper.sh +122 -0
- package/scripts/plugin-setup.mjs +10 -1
- package/scripts/post-tool-verifier.mjs +118 -5
- package/scripts/pre-tool-enforcer.mjs +54 -6
- package/scripts/session-start.mjs +171 -3
- 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/pre-tool-use.mjs +144 -45
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { mkdtempSync, rmSync, existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
5
|
+
import { installPostToolUseHook, pauseHookViaSentinel, resumeHookViaSentinel, isHookPaused, startFallbackPoller, } from '../worker-commit-cadence.js';
|
|
6
|
+
vi.mock('child_process', () => ({
|
|
7
|
+
exec: vi.fn((_cmd, _opts, cb) => {
|
|
8
|
+
if (typeof cb === 'function')
|
|
9
|
+
cb(null);
|
|
10
|
+
}),
|
|
11
|
+
execFile: vi.fn(),
|
|
12
|
+
execSync: vi.fn(),
|
|
13
|
+
execFileSync: vi.fn(),
|
|
14
|
+
}));
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Helpers
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
function mkWorktree() {
|
|
19
|
+
const dir = mkdtempSync(join(tmpdir(), 'omc-cadence-test-'));
|
|
20
|
+
// Minimal git init so hooks can reference .git internals
|
|
21
|
+
mkdirSync(join(dir, '.git'), { recursive: true });
|
|
22
|
+
return dir;
|
|
23
|
+
}
|
|
24
|
+
function readSettings(worktreePath) {
|
|
25
|
+
const p = join(worktreePath, '.claude', 'settings.json');
|
|
26
|
+
return JSON.parse(readFileSync(p, 'utf-8'));
|
|
27
|
+
}
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// 1. settings.json shape — must match Claude Code hook schema
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
describe('installPostToolUseHook – settings.json shape', () => {
|
|
32
|
+
let worktreePath;
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
worktreePath = mkWorktree();
|
|
35
|
+
});
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
rmSync(worktreePath, { recursive: true, force: true });
|
|
38
|
+
});
|
|
39
|
+
it('creates .claude/settings.json with correct Claude Code hook schema', async () => {
|
|
40
|
+
await installPostToolUseHook(worktreePath, 'writer');
|
|
41
|
+
const settings = readSettings(worktreePath);
|
|
42
|
+
// Top-level "hooks" key
|
|
43
|
+
expect(settings).toHaveProperty('hooks');
|
|
44
|
+
const hooks = settings.hooks;
|
|
45
|
+
// "PostToolUse" array
|
|
46
|
+
expect(hooks).toHaveProperty('PostToolUse');
|
|
47
|
+
const postToolUse = hooks['PostToolUse'];
|
|
48
|
+
expect(Array.isArray(postToolUse)).toBe(true);
|
|
49
|
+
expect(postToolUse.length).toBeGreaterThanOrEqual(1);
|
|
50
|
+
// Entry shape: { matcher: string, hooks: [{ type: 'command', command: string }] }
|
|
51
|
+
const entry = postToolUse[0];
|
|
52
|
+
expect(entry).toHaveProperty('matcher', 'Write|Edit|MultiEdit');
|
|
53
|
+
expect(entry).toHaveProperty('hooks');
|
|
54
|
+
const innerHooks = entry['hooks'];
|
|
55
|
+
expect(Array.isArray(innerHooks)).toBe(true);
|
|
56
|
+
expect(innerHooks.length).toBe(1);
|
|
57
|
+
expect(innerHooks[0]).toMatchObject({ type: 'command' });
|
|
58
|
+
expect(typeof innerHooks[0]['command']).toBe('string');
|
|
59
|
+
});
|
|
60
|
+
it('hook command embeds the worker name', async () => {
|
|
61
|
+
await installPostToolUseHook(worktreePath, 'my-worker');
|
|
62
|
+
const settings = readSettings(worktreePath);
|
|
63
|
+
const hooks = settings.hooks;
|
|
64
|
+
const postToolUse = hooks['PostToolUse'];
|
|
65
|
+
const innerHooks = postToolUse[0]['hooks'];
|
|
66
|
+
const command = innerHooks[0]['command'];
|
|
67
|
+
expect(command).toContain('my-worker');
|
|
68
|
+
});
|
|
69
|
+
it('hook command checks gitdir-aware rebase and merge guards', async () => {
|
|
70
|
+
await installPostToolUseHook(worktreePath, 'writer');
|
|
71
|
+
const settings = readSettings(worktreePath);
|
|
72
|
+
const hooks = settings.hooks;
|
|
73
|
+
const postToolUse = hooks['PostToolUse'];
|
|
74
|
+
const innerHooks = postToolUse[0]['hooks'];
|
|
75
|
+
const command = innerHooks[0]['command'];
|
|
76
|
+
// Must resolve rebase-merge and MERGE_HEAD through git so real worktrees
|
|
77
|
+
// with a .git file are guarded correctly.
|
|
78
|
+
expect(command).toContain('git rev-parse --git-path rebase-merge');
|
|
79
|
+
expect(command).toContain('git rev-parse --git-path MERGE_HEAD');
|
|
80
|
+
expect(command).toContain('-d "$rebase_dir"');
|
|
81
|
+
expect(command).toContain('-f "$merge_head"');
|
|
82
|
+
// Must check for sentinel
|
|
83
|
+
expect(command).toContain('.hook-paused');
|
|
84
|
+
});
|
|
85
|
+
it('hook command uses git diff --cached --quiet to skip empty diffs', async () => {
|
|
86
|
+
await installPostToolUseHook(worktreePath, 'writer');
|
|
87
|
+
const settings = readSettings(worktreePath);
|
|
88
|
+
const hooks = settings.hooks;
|
|
89
|
+
const postToolUse = hooks['PostToolUse'];
|
|
90
|
+
const innerHooks = postToolUse[0]['hooks'];
|
|
91
|
+
const command = innerHooks[0]['command'];
|
|
92
|
+
expect(command).toContain('git diff --cached --quiet');
|
|
93
|
+
});
|
|
94
|
+
it('does not install hook when sentinel is present', async () => {
|
|
95
|
+
// Touch the sentinel first
|
|
96
|
+
await pauseHookViaSentinel(worktreePath);
|
|
97
|
+
await installPostToolUseHook(worktreePath, 'writer');
|
|
98
|
+
// settings.json should not have been created
|
|
99
|
+
expect(existsSync(join(worktreePath, '.claude', 'settings.json'))).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
it('merges into existing settings.json without clobbering other keys', async () => {
|
|
102
|
+
// Pre-create a settings.json with an existing key
|
|
103
|
+
const claudeDir = join(worktreePath, '.claude');
|
|
104
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
105
|
+
writeFileSync(join(claudeDir, 'settings.json'), JSON.stringify({ theme: 'dark', hooks: { PreToolUse: [] } }, null, 2), 'utf-8');
|
|
106
|
+
await installPostToolUseHook(worktreePath, 'writer');
|
|
107
|
+
const settings = readSettings(worktreePath);
|
|
108
|
+
expect(settings).toHaveProperty('theme', 'dark');
|
|
109
|
+
const hooks = settings.hooks;
|
|
110
|
+
expect(hooks).toHaveProperty('PreToolUse');
|
|
111
|
+
expect(hooks).toHaveProperty('PostToolUse');
|
|
112
|
+
});
|
|
113
|
+
it('replaces existing auto-commit entry on re-install (no duplicate matcher)', async () => {
|
|
114
|
+
await installPostToolUseHook(worktreePath, 'writer');
|
|
115
|
+
await installPostToolUseHook(worktreePath, 'writer');
|
|
116
|
+
const settings = readSettings(worktreePath);
|
|
117
|
+
const postToolUse = settings.hooks['PostToolUse'];
|
|
118
|
+
const matching = postToolUse.filter((h) => h['matcher'] === 'Write|Edit|MultiEdit');
|
|
119
|
+
expect(matching).toHaveLength(1);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
// 2. Sentinel pause / resume — idempotency
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
describe('pauseHookViaSentinel / resumeHookViaSentinel', () => {
|
|
126
|
+
let worktreePath;
|
|
127
|
+
beforeEach(() => {
|
|
128
|
+
worktreePath = mkWorktree();
|
|
129
|
+
});
|
|
130
|
+
afterEach(() => {
|
|
131
|
+
rmSync(worktreePath, { recursive: true, force: true });
|
|
132
|
+
});
|
|
133
|
+
it('pause creates sentinel; isHookPaused returns true', async () => {
|
|
134
|
+
expect(isHookPaused(worktreePath)).toBe(false);
|
|
135
|
+
await pauseHookViaSentinel(worktreePath);
|
|
136
|
+
expect(existsSync(join(worktreePath, '.hook-paused'))).toBe(true);
|
|
137
|
+
expect(isHookPaused(worktreePath)).toBe(true);
|
|
138
|
+
});
|
|
139
|
+
it('resume removes sentinel; isHookPaused returns false', async () => {
|
|
140
|
+
await pauseHookViaSentinel(worktreePath);
|
|
141
|
+
expect(isHookPaused(worktreePath)).toBe(true);
|
|
142
|
+
await resumeHookViaSentinel(worktreePath);
|
|
143
|
+
expect(existsSync(join(worktreePath, '.hook-paused'))).toBe(false);
|
|
144
|
+
expect(isHookPaused(worktreePath)).toBe(false);
|
|
145
|
+
});
|
|
146
|
+
it('pause is idempotent — calling twice does not throw', async () => {
|
|
147
|
+
await pauseHookViaSentinel(worktreePath);
|
|
148
|
+
await expect(pauseHookViaSentinel(worktreePath)).resolves.toBeUndefined();
|
|
149
|
+
expect(isHookPaused(worktreePath)).toBe(true);
|
|
150
|
+
});
|
|
151
|
+
it('resume is idempotent — calling when not paused does not throw', async () => {
|
|
152
|
+
expect(isHookPaused(worktreePath)).toBe(false);
|
|
153
|
+
await expect(resumeHookViaSentinel(worktreePath)).resolves.toBeUndefined();
|
|
154
|
+
expect(isHookPaused(worktreePath)).toBe(false);
|
|
155
|
+
});
|
|
156
|
+
it('pause then resume then pause works correctly', async () => {
|
|
157
|
+
await pauseHookViaSentinel(worktreePath);
|
|
158
|
+
await resumeHookViaSentinel(worktreePath);
|
|
159
|
+
await pauseHookViaSentinel(worktreePath);
|
|
160
|
+
expect(isHookPaused(worktreePath)).toBe(true);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
// ---------------------------------------------------------------------------
|
|
164
|
+
// 3. Fallback poller — debounce with fake timers
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
describe('startFallbackPoller – debounce', () => {
|
|
167
|
+
let worktreePath;
|
|
168
|
+
beforeEach(() => {
|
|
169
|
+
vi.useFakeTimers();
|
|
170
|
+
worktreePath = mkWorktree();
|
|
171
|
+
});
|
|
172
|
+
afterEach(() => {
|
|
173
|
+
vi.useRealTimers();
|
|
174
|
+
rmSync(worktreePath, { recursive: true, force: true });
|
|
175
|
+
});
|
|
176
|
+
it('returns a stop handle', () => {
|
|
177
|
+
const handle = startFallbackPoller(worktreePath, 'writer', { intervalMs: 3000 });
|
|
178
|
+
expect(handle).toHaveProperty('stop');
|
|
179
|
+
expect(typeof handle.stop).toBe('function');
|
|
180
|
+
handle.stop();
|
|
181
|
+
});
|
|
182
|
+
it('does not commit immediately on fs event — waits for debounce', async () => {
|
|
183
|
+
const { exec } = await import('child_process');
|
|
184
|
+
const execMock = vi.mocked(exec);
|
|
185
|
+
execMock.mockClear();
|
|
186
|
+
const handle = startFallbackPoller(worktreePath, 'writer', { intervalMs: 3000 });
|
|
187
|
+
// Write a file to trigger the watcher — but debounce has not fired yet
|
|
188
|
+
writeFileSync(join(worktreePath, 'test.txt'), 'hello');
|
|
189
|
+
// Advance time by less than debounce — exec should not have been called yet
|
|
190
|
+
vi.advanceTimersByTime(1000);
|
|
191
|
+
expect(execMock).not.toHaveBeenCalled();
|
|
192
|
+
// Advance past debounce
|
|
193
|
+
vi.advanceTimersByTime(3000);
|
|
194
|
+
// exec may or may not have been called depending on whether the fs event fired
|
|
195
|
+
// (fs.watch fires asynchronously; in fake timer environment the watcher may not
|
|
196
|
+
// deliver the event). The important invariant is that stop() does not throw.
|
|
197
|
+
handle.stop();
|
|
198
|
+
});
|
|
199
|
+
it('stop() cancels pending debounce timer', () => {
|
|
200
|
+
const handle = startFallbackPoller(worktreePath, 'writer', { intervalMs: 3000 });
|
|
201
|
+
// Simulate a debounce being scheduled by writing a file
|
|
202
|
+
writeFileSync(join(worktreePath, 'a.txt'), 'data');
|
|
203
|
+
// Stop before debounce fires — should not throw
|
|
204
|
+
expect(() => handle.stop()).not.toThrow();
|
|
205
|
+
// Advance time well past debounce — nothing should execute
|
|
206
|
+
vi.advanceTimersByTime(10000);
|
|
207
|
+
// No errors means stop() correctly cancelled the timer
|
|
208
|
+
});
|
|
209
|
+
it('respects .hook-paused sentinel — does not run commit when paused', async () => {
|
|
210
|
+
// Place sentinel before poller starts
|
|
211
|
+
await pauseHookViaSentinel(worktreePath);
|
|
212
|
+
const { exec } = await import('child_process');
|
|
213
|
+
const execMock = vi.mocked(exec);
|
|
214
|
+
execMock.mockClear();
|
|
215
|
+
const handle = startFallbackPoller(worktreePath, 'writer', { intervalMs: 500 });
|
|
216
|
+
// Trigger debounce cycle
|
|
217
|
+
vi.advanceTimersByTime(2000);
|
|
218
|
+
// exec should not have been called since sentinel is set
|
|
219
|
+
expect(execMock).not.toHaveBeenCalled();
|
|
220
|
+
handle.stop();
|
|
221
|
+
});
|
|
222
|
+
it('uses default interval of 3000ms when no opts provided', () => {
|
|
223
|
+
// Just verify it does not throw with default opts
|
|
224
|
+
const handle = startFallbackPoller(worktreePath, 'writer');
|
|
225
|
+
handle.stop();
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
// 4. Empty-diff branch — hook command structure
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
describe('empty-diff branch — hook command', () => {
|
|
232
|
+
let worktreePath;
|
|
233
|
+
beforeEach(() => {
|
|
234
|
+
worktreePath = mkWorktree();
|
|
235
|
+
});
|
|
236
|
+
afterEach(() => {
|
|
237
|
+
rmSync(worktreePath, { recursive: true, force: true });
|
|
238
|
+
});
|
|
239
|
+
it('hook command uses || operator so empty diff skips commit', async () => {
|
|
240
|
+
await installPostToolUseHook(worktreePath, 'writer');
|
|
241
|
+
const settings = readSettings(worktreePath);
|
|
242
|
+
const hooks = settings.hooks;
|
|
243
|
+
const postToolUse = hooks['PostToolUse'];
|
|
244
|
+
const innerHooks = postToolUse[0]['hooks'];
|
|
245
|
+
const command = innerHooks[0]['command'];
|
|
246
|
+
// The pattern "git diff --cached --quiet || git commit" means: if diff is
|
|
247
|
+
// non-empty (non-zero exit) then commit; if empty (zero exit) skip commit.
|
|
248
|
+
expect(command).toMatch(/git diff --cached --quiet.*\|\|.*git commit/);
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
// ---------------------------------------------------------------------------
|
|
252
|
+
// 5. Sentinel filename correctness — exactly one '.hook-paused' (no double-dot)
|
|
253
|
+
// ---------------------------------------------------------------------------
|
|
254
|
+
describe('hook command sentinel filename', () => {
|
|
255
|
+
let worktreePath;
|
|
256
|
+
beforeEach(() => {
|
|
257
|
+
worktreePath = mkWorktree();
|
|
258
|
+
});
|
|
259
|
+
afterEach(() => {
|
|
260
|
+
rmSync(worktreePath, { recursive: true, force: true });
|
|
261
|
+
});
|
|
262
|
+
it('uses exactly one ".hook-paused" (no double-dot bug)', async () => {
|
|
263
|
+
await installPostToolUseHook(worktreePath, 'writer');
|
|
264
|
+
const settings = readSettings(worktreePath);
|
|
265
|
+
const hooks = settings.hooks;
|
|
266
|
+
const postToolUse = hooks['PostToolUse'];
|
|
267
|
+
const innerHooks = postToolUse[0]['hooks'];
|
|
268
|
+
const command = innerHooks[0]['command'];
|
|
269
|
+
// Bug guard: previously the preamble interpolated `.${SENTINEL_FILENAME}`
|
|
270
|
+
// which produced `..hook-paused` (two dots) and never matched the sentinel.
|
|
271
|
+
expect(command).not.toContain('..hook-paused');
|
|
272
|
+
expect(command).toContain('[ -e .hook-paused ]');
|
|
273
|
+
});
|
|
274
|
+
it('contains a single occurrence of ".hook-paused" in the hook command', async () => {
|
|
275
|
+
await installPostToolUseHook(worktreePath, 'writer');
|
|
276
|
+
const settings = readSettings(worktreePath);
|
|
277
|
+
const hooks = settings.hooks;
|
|
278
|
+
const postToolUse = hooks['PostToolUse'];
|
|
279
|
+
const innerHooks = postToolUse[0]['hooks'];
|
|
280
|
+
const command = innerHooks[0]['command'];
|
|
281
|
+
const matches = command.match(/\.hook-paused/g) ?? [];
|
|
282
|
+
expect(matches).toHaveLength(1);
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
// ---------------------------------------------------------------------------
|
|
286
|
+
// 6. Worker-name validation — shell-injection guard
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
describe('worker name validation (shell injection guard)', () => {
|
|
289
|
+
let worktreePath;
|
|
290
|
+
beforeEach(() => {
|
|
291
|
+
worktreePath = mkWorktree();
|
|
292
|
+
});
|
|
293
|
+
afterEach(() => {
|
|
294
|
+
rmSync(worktreePath, { recursive: true, force: true });
|
|
295
|
+
});
|
|
296
|
+
it('installPostToolUseHook throws on a name containing a single quote', async () => {
|
|
297
|
+
await expect(installPostToolUseHook(worktreePath, "alice'; rm -rf /; #")).rejects.toThrow(/Invalid worker name/);
|
|
298
|
+
});
|
|
299
|
+
it('installPostToolUseHook throws on a name containing whitespace', async () => {
|
|
300
|
+
await expect(installPostToolUseHook(worktreePath, 'alice bob')).rejects.toThrow(/Invalid worker name/);
|
|
301
|
+
});
|
|
302
|
+
it('installPostToolUseHook throws on a name containing $', async () => {
|
|
303
|
+
await expect(installPostToolUseHook(worktreePath, 'alice$(id)')).rejects.toThrow(/Invalid worker name/);
|
|
304
|
+
});
|
|
305
|
+
it('installPostToolUseHook throws on an empty name', async () => {
|
|
306
|
+
await expect(installPostToolUseHook(worktreePath, '')).rejects.toThrow(/Invalid worker name/);
|
|
307
|
+
});
|
|
308
|
+
it('startFallbackPoller throws on injectable name (synchronous)', () => {
|
|
309
|
+
expect(() => startFallbackPoller(worktreePath, "alice'; touch /tmp/pwn; #")).toThrow(/Invalid worker name/);
|
|
310
|
+
});
|
|
311
|
+
it('accepts safe alphanumeric/dash/underscore names', async () => {
|
|
312
|
+
await expect(installPostToolUseHook(worktreePath, 'alice-1_writer')).resolves.toBeUndefined();
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
//# sourceMappingURL=worker-commit-cadence.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-commit-cadence.test.js","sourceRoot":"","sources":["../../../src/team/__tests__/worker-commit-cadence.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-runtime-e2e.test.d.ts","sourceRoot":"","sources":["../../../src/team/__tests__/worktree-runtime-e2e.test.ts"],"names":[],"mappings":""}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface MergeConflictArgs {
|
|
2
|
+
workerName: string;
|
|
3
|
+
workerBranch: string;
|
|
4
|
+
leaderBranch: string;
|
|
5
|
+
conflictingFiles: string[];
|
|
6
|
+
mergeBaseSha: string;
|
|
7
|
+
observedAt: number;
|
|
8
|
+
}
|
|
9
|
+
export interface RebaseConflictArgs {
|
|
10
|
+
workerName: string;
|
|
11
|
+
workerBranch: string;
|
|
12
|
+
leaderBranch: string;
|
|
13
|
+
conflictingFiles: string[];
|
|
14
|
+
baseSha: string;
|
|
15
|
+
worktreePath: string;
|
|
16
|
+
observedAt: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Format a merge conflict notification destined for the leader inbox.
|
|
20
|
+
* Pure: same input → same output.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatMergeConflictForLeader(args: MergeConflictArgs): string;
|
|
23
|
+
/**
|
|
24
|
+
* Format a rebase conflict notification destined for a worker inbox.
|
|
25
|
+
* Pure: same input → same output.
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatRebaseConflictForWorker(args: RebaseConflictArgs): string;
|
|
28
|
+
export interface DeliverMergeConflictArgs {
|
|
29
|
+
teamName: string;
|
|
30
|
+
cwd: string;
|
|
31
|
+
message: string;
|
|
32
|
+
}
|
|
33
|
+
export interface DeliverRebaseConflictArgs {
|
|
34
|
+
teamName: string;
|
|
35
|
+
workerName: string;
|
|
36
|
+
cwd: string;
|
|
37
|
+
message: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Deliver a merge conflict message to the leader inbox.
|
|
41
|
+
* Delegates to leader-inbox.appendToLeaderInbox.
|
|
42
|
+
*/
|
|
43
|
+
export declare function deliverMergeConflictToLeader(args: DeliverMergeConflictArgs): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Deliver a rebase conflict message to a worker inbox.
|
|
46
|
+
* Delegates to worker-bootstrap.appendToInbox.
|
|
47
|
+
*/
|
|
48
|
+
export declare function deliverRebaseConflictToWorker(args: DeliverRebaseConflictArgs): Promise<void>;
|
|
49
|
+
//# sourceMappingURL=conflict-mailbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-mailbox.d.ts","sourceRoot":"","sources":["../../src/team/conflict-mailbox.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAyB5E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAoB9E;AAMD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhG;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlG"}
|