Skip to content

[External Plugin]: bulkhead #6371

Closed
Closed

Description

@dooly6276

Plugin name

bulkhead

Short description

Guards for a machine where many Copilot CLI, Claude Code, Codex and other agent sessions run at once. Before a shell command runs, it blocks name-based kills of another session's processes, port collisions, git commands that would move or delete another session's tree, whole-disk scans and long foreground sleeps, and holds heavy commands back when RAM runs low.

GitHub repository

dooly6276/claude-bulkhead

Plugin path inside the repository

No response

Ref to review

v0.3.7

Commit SHA to review

a7d6c81d60c1f96187fbf7f673a61752cc2de61a

Version

0.3.7

License identifier

MIT

Author name

Myeongseok Kang

Author URL

https://github.com/dooly6276

Homepage URL

https://github.com/dooly6276/claude-bulkhead#readme

Keywords

hooks, guard, processes, ports, memory, worktrees, git, parallel, agents, copilot-cli

Additional notes for reviewers

The Agent Plugins 1.0.0 manifest is plugin.json at the repository root. The Copilot hook is com.github.copilot/hooks/hooks.json (preToolUse, bash and powershell) and runs node "$BULKHEAD_PLUGIN_ROOT/bin/bulkhead" hook --agent copilot with BULKHEAD_PLUGIN_ROOT set from ${PLUGIN_ROOT}. The hook only reads the tool payload and the local process, port and git state, and answers allow or deny. There are no network calls and no telemetry, and the source is plain Node.js with no runtime dependencies. hooks/hooks.json and commands/ at the root belong to the Claude Code plugin in the same repository and are not read by Copilot CLI. Node must be on PATH. I checked the manifest with your schema script and the skill with @microsoft/vally lint locally, and installed it with copilot plugin install (1.0.109). A recorded two-session Copilot CLI run is in docs/copilot-live-run.md.

Submission checklist

  • The plugin lives in a public GitHub repository.
  • The ref and/or sha I provided is immutable (release tag and/or full 40-character commit SHA), not a branch.
  • This submission follows this repository's contribution, security, and responsible AI policies.
  • This plugin is not already listed in the Awesome Copilot marketplace.

Activity

  1. github-actions commented on Nov 11, 2026

    @github-actions
    Contributor

    🔴 Contributor Reputation Check: HIGH risk

    Check Risk
    Profile HIGH
    Credential audit NONE

    Maintainers: please review this contributor before merging.
    See the workflow run for full details.
    Automated check powered by AGT.

  2. added
    needs-review:HIGHContributor reputation check flagged HIGH risk
    awaiting-reviewSubmission is waiting for automated intake validation
    external-pluginPublic external plugin submission
    ready-for-reviewSubmission passed intake validation and is ready for maintainer review
    and removed
    awaiting-reviewSubmission is waiting for automated intake validation
    on Nov 11, 2026
  3. github-actions commented on Nov 11, 2026

    @github-actions
    Contributor

    ✅ External plugin intake passed

    This submission passed automated intake validation and quality checks and is ready for maintainer review.

    View workflow run · Download full quality gate logs

    Reviewer signals

    These are non-blocking heuristics for maintainer review; they are not evidence of misconduct or low quality.

    Signal Result
    Repository age 30 day(s)
    Repository activity no configured signal
    Repository counts 32 stars · 2 watchers · 4 forks · 2 open issues/PRs
    Homepage heuristics ⚠️ pricing, checkout

    Quality gate summary

    Legend: ✅ pass · ⚠️ warning · 🛑 fail

    Gate Status
    spec compliance ✅ pass
    vally lint ✅ pass
    install smoke test ✅ pass
    version match ✅ pass
    ref/sha consistency ✅ pass
    canvas structure ⚪ not_run
    • spec compliance: pass
    • vally lint: pass
    • install smoke test: pass
    • version match: pass
    • ref/sha consistency: pass
    • canvas structure: not_run
    • overall: pass
    spec compliance output (✅ pass)
    Agent Plugins v1.0.0 manifest checks passed for plugin.json.
    
    vally lint output (✅ pass)
    ✅ bulkhead (2/2 checks passed)
        ✓ [spec-compliance] All 1 skill(s) are spec-compliant.
            ✓ spec-compliance: All spec checks passed.
        ✓ [valid-refs] All file references across 1 skill(s) are valid.
            ✓ valid-refs: All file references resolve to existing files within the skill directory.
    
    1 skill(s) linted, 1 passed
    
    install smoke test output (✅ pass)
    Install smoke test succeeded. Verified /tmp/external-plugin-quality-TG6sOq/copilot-home/.copilot/installed-plugins/external-plugin-intake/bulkhead/plugin.json.
    
    Version match output
    - v0.3.7: matched version "0.3.7" at "plugin.json".
    - a7d6c81d60c1f96187fbf7f673a61752cc2de61a: matched version "0.3.7" at "plugin.json".
    
    Ref/SHA consistency output
    source.ref "v0.3.7" resolves to the same commit as source.sha "a7d6c81d60c1f96187fbf7f673a61752cc2de61a".
    
    Canvas structure output
    Canvas structure gate skipped because plugin is not tagged with "canvas".
    

    Canonical external.json payload

    {
      "name": "bulkhead",
      "description": "Guards for a machine where many Copilot CLI, Claude Code, Codex and other agent sessions run at once. Before a shell command runs, it blocks name-based kills of another session's processes, port collisions, git commands that would move or delete another session's tree, whole-disk scans and long foreground sleeps, and holds heavy commands back when RAM runs low.",
      "version": "0.3.7",
      "author": {
        "name": "Myeongseok Kang",
        "url": "https://github.com/dooly6276"
      },
      "repository": "https://github.com/dooly6276/claude-bulkhead",
      "homepage": "https://github.com/dooly6276/claude-bulkhead#readme",
      "license": "MIT",
      "keywords": [
        "hooks",
        "guard",
        "processes",
        "ports",
        "memory",
        "worktrees",
        "git",
        "parallel",
        "agents",
        "copilot-cli"
      ],
      "source": {
        "source": "github",
        "repo": "dooly6276/claude-bulkhead",
        "ref": "v0.3.7",
        "sha": "a7d6c81d60c1f96187fbf7f673a61752cc2de61a"
      }
    }
  4. aaronpowell commented on Nov 12, 2026

    @aaronpowell
    Contributor

    /request-fixes The cross-session port/process ownership checks and memory-aware scheduling add more than a static command blacklist. Please update the submitted pin to include the upstream fixes and explain any remaining CI failures. The shared skill also promises session-exit cleanup that your other-agents guide says is unavailable in Copilot, and invokes bare CLI commands that the plugin-only install does not put on PATH. Please make those instructions Copilot-specific and include a live Copilot run showing a cross-session operation being blocked while the equivalent own-session operation is allowed. Native permissions remain the safety boundary.

  5. added
    requires-submitter-fixesSubmission has quality-gate findings that submitter must fix before maintainer review
    and removed
    ready-for-reviewSubmission passed intake validation and is ready for maintainer review
    on Nov 12, 2026
  6. github-actions commented on Nov 12, 2026

    @github-actions
    Contributor

    🛠️ Changes requested by a maintainer

    Maintainer aaronpowell used /request-fixes to move this submission to requires-submitter-fixes.

    Requested fixes

    The cross-session port/process ownership checks and memory-aware scheduling add more than a static command blacklist. Please update the submitted pin to include the upstream fixes and explain any remaining CI failures. The shared skill also promises session-exit cleanup that your other-agents guide says is unavailable in Copilot, and invokes bare CLI commands that the plugin-only install does not put on PATH. Please make those instructions Copilot-specific and include a live Copilot run showing a cross-session operation being blocked while the equivalent own-session operation is allowed. Native permissions remain the safety boundary.

    Once you've addressed these, edit the issue or comment /rerun-intake to send it back through intake for review.

  7. dooly6276 commented on Nov 12, 2026

    @dooly6276
    Author

    Thanks for the review. Everything you listed is addressed in v0.3.7, and I updated the pin in the issue form to v0.3.7 / a7d6c81d60c1f96187fbf7f673a61752cc2de61a.

    CI. The failures at v0.3.2 were in the repository's own test workflow. On Linux and macOS, a 1 MB fuzz case ran past its time limit on slower runners. 0.3.3 fixed that by having port-guard look up programs by name in very long pipelines. On Windows, some tests assumed /bin/sh and paths without a drive letter. One failure was a real bug: bulkhead worktree prune did not match an 8.3 short path to its long form, fixed in 0.3.4. Every job has passed on main since 0.3.4, including the v0.3.7 commits.

    Skill. skills/bulkhead/SKILL.md no longer promises cleanup at session exit outside Claude Code. It says orphan-reaper is Claude Code only, and that in Copilot CLI the agent stops the servers it started, by PID, before it finishes. It also says a plugin-only install does not put bulkhead or bulkhead-slot on PATH, and gives the node "<plugin>/bin/bulkhead" ... form with Copilot's location, ~/.copilot/installed-plugins/<marketplace>/bulkhead (or under $COPILOT_HOME). 0.3.7 also finds Copilot sessions when COPILOT_HOME moves the config folder; before, bulkhead skipped the process scan on such a machine.

    Live run. I used Copilot CLI 1.0.109 on macOS, with the plugin installed through copilot plugin install, and ran two non-interactive sessions in one folder. Session A started node server.js 4310 & and kept running. Session B was asked to free port 4310 with lsof -ti :4310 | xargs kill, then to start and stop its own server on 4311:

     ✗ Shell  Denied by preToolUse hook: [bulkhead] port-guard: `lsof -ti :4310 | xargs kill` would stop node
       pid 37535, the server another Copilot session runs on port 4310 (session 37012 in ~/demo on
       branch main).
     $ Shell  node server.js 4311 > server-b.log 2>&1 &
     $ Shell  curl -s localhost:4311          # demo server on 4311, pid 42240
     $ Shell  kill 42240                      # its own server: allowed
    

    The full output of both sessions and the bulkhead log line are in docs/copilot-live-run.md.

    Your point that native permissions stay the boundary showed up in the same run. B's first try at stopping its own server, lsof -ti :4311 | xargs kill, was refused by Copilot's own shell check ("The 'kill' command must specify at least one numeric PID") before bulkhead saw it, so B used kill <pid>. bulkhead only adds denials inside what Copilot already allows; it never approves a command. In the same run, Copilot loaded the skill, found bulkhead missing from PATH, and ran it from the plugin folder as the skill describes.

  8. added
    awaiting-reviewSubmission is waiting for automated intake validation
    ready-for-reviewSubmission passed intake validation and is ready for maintainer review
    and removed
    requires-submitter-fixesSubmission has quality-gate findings that submitter must fix before maintainer review
    awaiting-reviewSubmission is waiting for automated intake validation
    on Nov 12, 2026
  9. raminmortazavi212-code commented on Nov 12, 2026

    @raminmortazavi212-code
  10. raminmortazavi212-code commented on Nov 12, 2026

    @raminmortazavi212-code
  11. aaronpowell commented on Nov 13, 2026

    @aaronpowell
    Contributor

    /approve

  12. added
    approvedSubmission was approved by a maintainer
    and removed
    ready-for-reviewSubmission passed intake validation and is ready for maintainer review
    on Nov 13, 2026
  13. github-actions commented on Nov 13, 2026

    @github-actions
    Contributor

    ✅ External plugin approved

    A maintainer approved bulkhead, and the submission issue has been closed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    approvedSubmission was approved by a maintainerexternal-pluginPublic external plugin submissionneeds-review:HIGHContributor reputation check flagged HIGH risk

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions