Add plugin cli-agent-bridge - #7
Conversation
Delegate coding tasks from MiniMax Code to locally installed coding CLIs (Claude Code, Codex, Kimi Code, ZCode, DSH) through a dependency-free stdio MCP server with git-diff review. See NOTICE for upstream credits.
- claude template gains --permission-mode acceptEdits so headless runs can actually edit files (verified end-to-end with Claude Code 2.1.226) - kimi keeps plain -p prompt mode: --auto/-y are mutually exclusive with -p on current Kimi Code versions - git snapshot now lists untracked files (git ls-files --others) so new files created by workers appear in changed files - README/SKILL document permission defaults and honest backend verification status
npm-style .ps1/.cmd shims cannot be spawned directly on Windows, so runCommand retries them through the bundled ps1-runner.ps1 (Windows PowerShell 5.1) with verbatim argument forwarding. README documents the fallback and the custom-wrapper caveat.
- per-workspace serialization of delegate_task - SIGTERM then SIGKILL force kill after timeout grace - snapshots include staged, untracked files and committed deltas - delegate_task marked destructiveHint, isError on failures - notifications/cancelled kills the worker - honest protocol version negotiation - fail closed when git snapshot commands fail - ring-buffer output capture without repeated large copies - README discloses supported operating systems
SKILL workflow and README tool description now cover before/after snapshots, committed deltas, same-workspace serialization, isError semantics, force-kill timeouts, and cancellation.
Seven self-contained tests cover protocol negotiation, tool list, snapshots, dirty-tree guard, unknown backends, cancellation, and before/after snapshots. SKILL wording now notes same-workspace serialization.
- workspace lock is now keyed by the canonical realpath of the git worktree root (git rev-parse --show-toplevel + fs.realpath), so the same checkout reached via a subdirectory, casing, or symlink shares one mutex (P1) - a delegation cancelled while queued for the lock re-checks the cancel flag after acquiring it and returns before spawning the worker (P1) - timeout and cancellation now terminate the whole process tree: taskkill /PID /T /F on Windows, signal to the detached process group on POSIX, instead of only killing the top-level child (P1) - git snapshots tolerate an unborn HEAD (fresh git init) and committedDelta reports the first commits when the worker started from no commits (P2) - codex templates delimit the prompt with -- so option-like tasks are not parsed as CLI flags (P2) - README comparison example now requires two independent git worktrees; the queued same-checkout second run is documented as follow-up work (P2) - SKILL resume guidance no longer implies results carry backend session ids Tests extended to 11 (protocol, tools, snapshots, dirty guard, unknown backend, in-flight cancel, before/after, worktree-root lock serialization, cancel-while-queued, unborn HEAD, codex -- delimiter); 3 consecutive runs green locally
- gitSnapshot/committedDelta executed their git commands via Promise.all; git status and git diff both refresh the index, so concurrent processes raced for .git/index.lock and intermittently failed with exit code 128, surfacing as random 'git snapshot unreliable' errors (reproduced 1-in-15 on Windows; the fail-closed guard turned it into a JSON-RPC error) - commands now run serially per repository; 10/10 Windows runs and a full npm run check in a Linux node:22 container pass - test harness: every server now stops in a finally block (a leaked server kept stdin/stdout pipes open and hung node --test when an assertion failed - the cause of the stalled CI validate job), in-flight cancel test bounds its worker with an explicit timeoutMs
…ribution - disclose repository concurrency: linked worktrees share refs, so snapshots detect other active leases plus completed runs' history records and mark attribution as potentially overlapping (repositoryConcurrency) - attribute only genuinely new commits: ranges exclude all pre-delegation refs, so a branch checkout is reported as a HEAD move with no new commits, and non-commit refs (blob tags) are reported without failing the run - verify process identity before signaling: Windows tracks creation times, POSIX groups are signaled only while the original leader identity matches, and reused PIDs are dropped from the tracked tree - make lease state updates interruptible by the request cancellation/deadline and resync the interrupted release by owner token - move quarantined leases to a recoverable state: removing the quarantine marker authorizes the next delegation to reclaim - catch process-tree inspection failures in the close handler (fail closed instead of an unhandled rejection) and slow the Linux /proc monitor to 250ms - tests: 55 total (checkout attribution, blob refs, concurrency disclosure, lease interruption, quarantined reclaim, PID-reuse identity)
- deduplicate HEAD and branch-ref targets so a commit on the checked-out branch is logged, diffed, and counted once with both labels - diff new refs from their merge-base with the pre-delegation state, so a branch forked from a divergent branch never attributes pre-existing differences to the worker - register list_backends in activeRequests and terminate a hanging version probe on cancellation, skipping the remaining probes - signal the process group when enumeration is unavailable (containment wins when identity cannot be verified) - strip only Git's line terminator from rev-parse --show-toplevel so a worktree root ending in whitespace canonicalizes correctly - tests: 60 total, all green locally
Add cross-process repository locking, fail-closed process containment, safe Git attribution, explicit quarantine recovery, Windows Job Object execution, and regression coverage for reviewed lifecycle and documentable safety boundaries.
hetaoBackend
left a comment
There was a problem hiding this comment.
Please address the repository-scope regression before merge:
This plugin changes the root package.json test script from node --test to node --test --test-concurrency=1. That changes test execution semantics for every existing plugin and masks concurrency regressions globally. Please move the serialization requirement into the cli-agent-bridge-specific test command/fixtures, or provide a repository-level justification and regression evidence showing why all tests must become serial.
The plugin is Windows-only and that limitation is disclosed; the blocking issue here is the unrelated root-level test behavior change. The current [code]smith check is SKIPPED.
hetaoBackend
left a comment
There was a problem hiding this comment.
当前 head 18e26e2 的自带 suite 实测为 218 tests:194 pass、4 fail、20 skipped,仍有阻塞:
- a cross-process lock waiter obeys the delegation deadline 在 tests/server.test.mjs:2458 得到缺失 result,随后 TypeError: Cannot read properties of undefined (reading structuredContent)。
- provenance reads are bounded and interruptible、successive fetches are detected even after FETCH_HEAD is overwritten、a partially successful nonzero fetch makes provenance uncertain 均实际 sawFetch: false,未达到预期的 fail-closed 证据。
- 插件声明 production 仅支持 Windows,但跨平台/Trace2 相关测试没有正确 gate;Windows Job Object 路径在当前环境被跳过。需要修复这些测试/实现问题,或提供可靠的目标平台 CI 证据,不能在所有 [code]smith Checks 为 SKIPPED 时放行。
请先解决 deadline/provenance 失败并补足 Windows 运行证据,再重新提交。
…est script. These tests share git/tmpdir fixtures and deadline-sensitive waits, so they take turns via an exclusive directory lock while the repository-wide `node --test` runner stays file-parallel.
…ck so Node 22 file-parallel runs cannot skip-fail.
…so waiters return a structured MCP result.
Return structured lock-deadline MCP results and realpath-aware Trace2 worktree matching.
|
Head
The Windows Job Object path remained platform-gated on this head, and no new Windows CI log was available at that point. |
…Object containment.
|
Head The job was configured to invoke the cli-agent-bridge test directories. The existing Ubuntu |
|
Current head is This follow-up closes the three review threads left on the merged fork PR:
Current-head local evidence:
The PR body now reflects the actual head and Windows-only production support. It explicitly leaves the GitHub-hosted Windows run unchecked; no skipped |
What changes
Adds the hosted Plugin
plugins/Hylouis233/cli-agent-bridge: a dependency-free stdio MCP serverand same-name Skill that let MiniMax Code delegate bounded coding tasks to locally installed
Claude Code, Codex CLI, Kimi Code, ZCode, or DSH processes inside a Git repository, then review
the resulting workspace and commit changes.
The server exposes three tools:
list_backendsreports configured CLIs, availability, versions, and experimental notes.workspace_statusreturns a bounded Git snapshot: status, staged/unstaged diff stats, changedfiles (including untracked paths), HEAD and symbolic HEAD, and refs.
delegate_taskruns one backend and returns bounded output, before/after Git snapshots, movedrefs, and an attributed commits block. Dirty worktrees are rejected unless
allowDirty=true;unsupported resume requests fail instead of silently starting a fresh session.
Safety and concurrency behavior
linked worktrees, independent MCP clients, and bridge processes. Independent clones can run in
parallel.
enters the target repository. Lease acquisition and recovery use compare-and-swap owner records;
uncertain worker termination fails closed behind a shared quarantine marker.
post-run attribution. The supported Windows path uses a kill-on-close Job Object and confirms
tree termination before releasing the repository lease.
fetched history, more than 256 baseline tips, linked worktrees, submodules, unusual path bytes,
and staged/untracked changes without presenting truncated evidence as complete.
repeated identities, and fails commit attribution closed when a POSIX realpath cannot be proven.
CLI uses the user's own authentication and may send task/workspace data to its provider.
Requirements and platform disclosure
PATH; the target workspace must be a Git repository.fail closed before backend configuration, workspace access, Git resolution, or executable
probing because this dependency-free server cannot prove containment after an arbitrary local
worker asks a host service to launch outside its original process tree.
Codex, and Kimi templates are non-experimental; ZCode and DSH remain explicitly experimental.
Latest review follow-ups
Current head also closes the review gaps left after the earlier Copilot follow-up:
rejected
realpathpromise unhandled;closed;
context.skip();canonical 40-character
actions/checkout@v7.0.1commit SHA.Verification
Verified locally on current head
902b194:npm run validate: all 9 hosted Plugins and both examples validated.The skips are Windows-only or other OS-specific fixtures on the macOS verification host.
unresolved-identity fail-closed behavior, successive fetch detection, and partial-fetch
uncertainty.
node --checkpasses for the server and integration test file.actionlintreports zero diagnostics for.github/workflows/ci.yml.git diff --checkis clean.The upstream PR currently has no GitHub-hosted Windows run for this head. The workflow is present
and statically validated, but no hosted runner result is currently available. No skipped
[code]smithcheck is being presented as test evidence.Submission checklist
behavior, and experimental backends are disclosed.
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.