diff --git a/README.md b/README.md index 2468f3c..7c45500 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,11 @@ integration PRs, follows `main` through production, and pauses after failures. ## Install -Install the reviewed `v0.2.6` source commit directly from GitHub: +Install the reviewed `v0.2.7` source commit directly from GitHub: ```bash python3 -m pip install \ - 'deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@a0e2c833282e63bf5db4339f99773aa9ba2f0c82' + 'deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@b768fd0d77bc6def505f1cd0c101d37db6edba4d' deploybot init ``` @@ -86,7 +86,7 @@ aligned with `pipeline.ci_workflows`. The privileged worker never checks out or executes pull-request code. Pin the Action to the full reviewed release commit: ```yaml -- uses: Forward-Future/DeployBot@a0e2c833282e63bf5db4339f99773aa9ba2f0c82 +- uses: Forward-Future/DeployBot@b768fd0d77bc6def505f1cd0c101d37db6edba4d ``` The Action uses GitHub's built-in workflow token. GitHub intentionally does not diff --git a/adapters/claude-code/.mcp.json b/adapters/claude-code/.mcp.json index 5921093..cb1c297 100644 --- a/adapters/claude-code/.mcp.json +++ b/adapters/claude-code/.mcp.json @@ -4,7 +4,7 @@ "command": "uvx", "args": [ "--from", - "deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@a0e2c833282e63bf5db4339f99773aa9ba2f0c82", + "deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@b768fd0d77bc6def505f1cd0c101d37db6edba4d", "deploybot-mcp" ] } diff --git a/adapters/codex/agent-merge-queue/.mcp.json b/adapters/codex/agent-merge-queue/.mcp.json index 5921093..cb1c297 100644 --- a/adapters/codex/agent-merge-queue/.mcp.json +++ b/adapters/codex/agent-merge-queue/.mcp.json @@ -4,7 +4,7 @@ "command": "uvx", "args": [ "--from", - "deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@a0e2c833282e63bf5db4339f99773aa9ba2f0c82", + "deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@b768fd0d77bc6def505f1cd0c101d37db6edba4d", "deploybot-mcp" ] } diff --git a/adapters/cursor/.cursor/mcp.json b/adapters/cursor/.cursor/mcp.json index 5921093..cb1c297 100644 --- a/adapters/cursor/.cursor/mcp.json +++ b/adapters/cursor/.cursor/mcp.json @@ -4,7 +4,7 @@ "command": "uvx", "args": [ "--from", - "deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@a0e2c833282e63bf5db4339f99773aa9ba2f0c82", + "deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@b768fd0d77bc6def505f1cd0c101d37db6edba4d", "deploybot-mcp" ] } diff --git a/examples/github-workflow.yml b/examples/github-workflow.yml index cdc2c06..af2fc85 100644 --- a/examples/github-workflow.yml +++ b/examples/github-workflow.yml @@ -55,5 +55,5 @@ jobs: with: ref: ${{ github.event.repository.default_branch }} persist-credentials: false - # v0.2.6 implementation; keep the full commit for privileged workflows. - - uses: Forward-Future/DeployBot@a0e2c833282e63bf5db4339f99773aa9ba2f0c82 + # v0.2.7 implementation; keep the full commit for privileged workflows. + - uses: Forward-Future/DeployBot@b768fd0d77bc6def505f1cd0c101d37db6edba4d diff --git a/pyproject.toml b/pyproject.toml index 865d432..87f62bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "deploybot-merge-queue" -version = "0.2.6" +version = "0.2.7" description = "DeployBot: a provider-neutral GitHub merge queue for coding agents" readme = "README.md" license = "MIT" diff --git a/src/agent_merge_queue/__init__.py b/src/agent_merge_queue/__init__.py index b30d4d6..38b9e28 100644 --- a/src/agent_merge_queue/__init__.py +++ b/src/agent_merge_queue/__init__.py @@ -1,3 +1,3 @@ """DeployBot: a provider-neutral GitHub merge queue for coding agents.""" -__version__ = "0.2.6" +__version__ = "0.2.7" diff --git a/src/agent_merge_queue/cli.py b/src/agent_merge_queue/cli.py index aeaba91..a34adfe 100755 --- a/src/agent_merge_queue/cli.py +++ b/src/agent_merge_queue/cli.py @@ -2757,7 +2757,7 @@ def command_react( ) raise release: dict[str, Any] | None = None - if follow and drained.get("merged"): + if follow: release = command_follow( client, timeout_seconds=timeout_seconds, diff --git a/tests/test_cli.py b/tests/test_cli.py index f9a4733..f897777 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1191,6 +1191,37 @@ def test_reactor_dispatches_ci_once_after_a_merged_batch(self) -> None: client.dispatch_ci_workflows.assert_called_once_with() self.assertEqual(result["dispatched_ci"], [{"id": 7, "name": "CI"}]) + def test_reactor_follows_release_without_a_new_merge(self) -> None: + client = Mock() + client.config = CONFIG + client.pipeline_control.return_value = {"state": "running"} + empty = FreezeResult(None, [], [], [], []) + release = {"state": "verified", "main_sha": "a" * 40} + with ( + patch("agent_merge_queue.cli.promote_integrations", return_value=[]), + patch("agent_merge_queue.cli.command_promote", return_value={}), + patch("agent_merge_queue.cli.freeze_queue", return_value=empty), + patch( + "agent_merge_queue.cli.command_drain", + return_value={"merged": []}, + ), + patch( + "agent_merge_queue.cli.command_follow", + return_value=release, + ) as follow_release, + redirect_stdout(io.StringIO()), + ): + result = command_react(client, follow=True, timeout_seconds=10) + + follow_release.assert_called_once_with( + client, + timeout_seconds=10, + poll_seconds=10, + json_output=False, + emit=False, + ) + self.assertEqual(result["release"], release) + def test_reactor_pauses_when_post_merge_ci_dispatch_fails(self) -> None: client = Mock() client.config = CONFIG diff --git a/tests/test_skill.py b/tests/test_skill.py index f8623eb..1af1ec0 100644 --- a/tests/test_skill.py +++ b/tests/test_skill.py @@ -6,7 +6,7 @@ ROOT = Path(__file__).resolve().parents[1] CANONICAL = ROOT / "skills" / "deploybot" / "SKILL.md" -RELEASE_COMMIT = "a0e2c833282e63bf5db4339f99773aa9ba2f0c82" +RELEASE_COMMIT = "b768fd0d77bc6def505f1cd0c101d37db6edba4d" CHECKOUT_COMMIT = "9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0"