source-control
v0.62.2Git and GitHub delivery workflow: /commit (Conventional Commits + Co-authored-by trailer via safe heredoc mechanics), /pull-request (prep, create, CI monitoring, review-comment triage, merge, CI-log fetch), /babysit-prs (self-pacing fleet loop, safe by default; opt-in worker/autopilot tiers add gate-checked merge and thread resolution behind a deterministic Python engine), /babysit-loop (the loop-lane merge lane: a standing or drain loop that invokes babysit-prs per cycle, configured through repo-scoped babysit_loop_* keys on the layered source-control.md seam, with merge authority human-only until the target repo's tracked config adopts the lane, a gate-proven C2-mechanical baseline once adopted, and standing merge-rung raises binding from the team-tracked layer only, with one named exception, where an invocation line explicitly typing both the autopilot tier keyword and the dedicated raise argument --merge c3-this-run widens that single invocation's merge authority up to C3 behind a fresh independent frontier-tier resolver, while C4-structural and C5-untrusted-provenance stay unconditionally human-merge), /worktree (create, status, cleanup, audit for parallel-session isolation), /setup (check the effective commit-subject / PR-title convention merged across its config layers and the babysit-prs config, or apply, which interviews the repo and writes the convention config to a chosen layer), and /resolve-conflicts (intent-first merge/rebase conflict resolution with a semantic-conflict sweep, never --abort). The commit-subject / PR-title convention is configurable via a source-control.md config written by a re-runnable setup skill, layered across a ~/.claude user-global file, the tracked team file, and a gitignored .claude/source-control.local.md personal overlay merged per key; Conventional Commits is the default when no convention is declared.
By Melodic SoftwareLicense: MIT20 GitHub starsUpdated 1 hour ago
Directory evidence
- Runtimes
- Claude Code
- Parsed components
- 7 skill or MCP entries
- Source updated
- Sep 28, 2026
- Manifest status
- Canonical path parsed
The directory validates manifest shape and source location. It does not execute the plugin or provide a security endorsement. Review the indexing methodology →
Install source-control for Claude Code
claude plugin marketplace add IchenDEV/agent-plugin-mkt
claude plugin marketplace update agent-plugin-marketplace
claude plugin install source-control@agent-plugin-marketplacePaste and run these commands in a terminal with Claude Code. They add and refresh the PluginsMP catalog, then install this plugin.
The installer fetches third-party code from the source repository shown on this page. This directory validates manifest structure and source location, but does not perform a security audit; review the manifest, components, and source before installing.
Get the source manually
git clone https://github.com/melodic-software/claude-code-pluginsClone the source repository, then follow its setup instructions to add the plugin to a compatible client. The plugin root is plugins/source-control/.
Plugin files
├── .claude-plugin/plugin.json├── skills/babysit-loop/SKILL.md├── skills/babysit-prs/SKILL.md├── skills/commit/SKILL.md├── skills/pull-request/SKILL.md├── skills/resolve-conflicts/SKILL.md├── skills/setup/SKILL.md└── skills/worktree/SKILL.md
Included Skills7
Run one repository's pull-request queue as the merge lane of the loop-lane topology: a self-paced standing or drain loop invoking /source-control:babysit-prs each cycle at the resolved autonomy tier, with grace windows, do-not-merge respect, escalation, and lane telemetry. Merge authority is human-only until the target repo's tracked config adopts the lane; the body owns the rung rules and the single paired-argument exception. Use when asked to run or stand up the babysit loop or merge lane for a repository, or to drain its PR queue. Required argument: <owner/repo>. Launch via /loop. Sibling skills: /source-control:babysit-prs (single-pass mechanic), /source-control:pull-request (single-PR lifecycle).
Babysit the user's own open GitHub pull requests as a tiered fleet loop. The safe default discovers the user's own PRs under the current repo's owner, checks readiness, fixes clear branch-owned issues, and reports, it never resolves threads or merges. Explicit 'worker' tier adds auto-resolving outdated bot threads and gate-proven merges; explicit 'autopilot' adds all authors under the watched owners. Use when asked to babysit, watch, or advance open pull requests as a fleet (the safe tier), to run the worker or autopilot tier by name, or when pairing with /loop for continuous coverage; not for the single-PR lifecycle: prep, create, monitor one PR, or merge (use /pull-request).
Create a git commit with a subject matching the resolved convention (layered `source-control.md` config → project convention → Conventional Commits default), a Claude Co-authored-by trailer, and surgical staging (never `git add -A`), feeding the message to git via Bash heredoc. Use when: 'commit this', 'make a commit', 'commit with message <hint>', not for push, branch creation, or PR creation (use /pull-request).
Orchestrate the full PR lifecycle: prep (review + verify), create as a draft, ready (merge the base, security review + verify, flip), monitor CI + review comments, merge, and fetch CI logs. Use when: 'create pr', 'ship it', 'pr prep', 'mark ready', 'ready for review', 'fix CI', 'address comments', 'monitor PR', 'merge this', 'check pr status', not for the all-PR babysit loop (use /babysit-prs), branch/worktree lifecycle (use /worktree), or committing without a PR (use /commit).
Resolve an in-progress merge/rebase/cherry-pick conflict by recovering both sides' intent from history before touching any hunk, composing both changes wherever possible, then sweeping for semantic conflicts the markers don't show. Use when: 'resolve conflicts', 'merge conflict', 'rebase stopped', 'CONFLICT (content)', git status shows unmerged paths, not for choosing merge vs rebase or PR lifecycle (use /pull-request), and not for ordinary commits (use /commit).
Configure the source-control plugin. check (read-only, default) reports the effective commit-subject / PR-title convention merged across the user-global, team, and personal-overlay layers plus the babysit-prs userConfig surface; apply interviews the repo, writes the convention config to a chosen layer, and walks the sanctioned babysit reconfigure paths. Use when setting up or inspecting this plugin's configuration, choosing or overriding a commit convention at any layer, configuring or checking babysit, or when /commit, /pull-request, or /babysit-prs report missing configuration. Re-runnable and safe.
Manage git worktree lifecycle for parallel-session isolation: create (guided naming via EnterWorktree), status (PR + staleness inventory), cleanup (file-lock-aware removal), audit (infrastructure health). Use when: 'create worktree', 'worktree status', 'clean up worktrees', 'orphaned worktrees', or proactively when on main before writing code, not for PR lifecycle (use /pull-request).
Plugin manifests1
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "source-control",
"version": "0.62.2",
"description": "Git and GitHub delivery workflow: /commit (Conventional Commits + Co-authored-by trailer via safe heredoc mechanics), /pull-request (prep, create, CI monitoring, review-comment triage, merge, CI-log fetch), /babysit-prs (self-pacing fleet loop, safe by default; opt-in worker/autopilot tiers add gate-checked merge and thread resolution behind a deterministic Python engine), /babysit-loop (the loop-lane merge lane: a standing or drain loop that invokes babysit-prs per cycle, configured through repo-scoped babysit_loop_* keys on the layered source-control.md seam, with merge authority human-only until the target repo's tracked config adopts the lane, a gate-proven C2-mechanical baseline once adopted, and standing merge-rung raises binding from the team-tracked layer only, with one named exception, where an invocation line explicitly typing both the autopilot tier keyword and the dedicated raise argument --merge c3-this-run widens that single invocation's merge authority up to C3 behind a fresh independent frontier-tier resolver, while C4-structural and C5-untrusted-provenance stay unconditionally human-merge), /worktree (create, status, cleanup, audit for parallel-session isolation), /setup (check the effective commit-subject / PR-title convention merged across its config layers and the babysit-prs config, or apply, which interviews the repo and writes the convention config to a chosen layer), and /resolve-conflicts (intent-first merge/rebase conflict resolution with a semantic-conflict sweep, never --abort). The commit-subject / PR-title convention is configurable via a source-control.md config written by a re-runnable setup skill, layered across a ~/.claude user-global file, the tracked team file, and a gitignored .claude/source-control.local.md personal overlay merged per key; Conventional Commits is the default when no convention is declared.",
"author": {
"name": "Melodic Software",
"email": "[email protected]"
},
"license": "MIT",
"keywords": [
"git",
"github",
"commit",
"pull-request",
"babysit",
"worktree",
"merge-conflict",
"rebase",
"ci",
"code-review",
"delivery",
"skill"
],
"userConfig": {
"lane_instance": {
"type": "string",
"title": "Lane instance id",
"description": "Writer identity for this machine's loop-lane telemetry, per the loop-lane convention's lane-instance identity rule. It becomes the suffix of the babysit-loop telemetry sentinel marker (`source-control:babysit-loop@<id>`), so each concurrently running lane instance owns its own comment and none can overwrite another's durable state. Must match ^[a-z0-9][a-z0-9-]{0,31}$, be stable across restarts, and be distinct across concurrent instances; two lanes on one machine each need an explicit value. Absent: the sanitized lowercased hostname. The value appears verbatim in tracker comments. Set an opaque id if a machine name should not be published in a public tracker."
},
"pr_body_linkage_gate_enabled": {
"type": "boolean",
"title": "pr-body-linkage-gate hook",
"description": "Block a `gh pr create`/`gh pr edit` whose statically-readable PR body would fail the repository's required PR-contract check (missing a closing keyword, or a missing/empty `## Summary`, `## Fix`, `## Verification`, or `## Related` section). Enforced only in a repository whose .github/workflows carry a workflow that uses the pr-contract composite step; a body the hook cannot read statically always passes.",
"default": true
},
"pr_linkage_mcp_gate_enabled": {
"type": "boolean",
"title": "pr-linkage-mcp-gate hook",
"description": "Block a GitHub MCP create_pull_request/update_pull_request whose PR body would fail the repository's required PR-contract check (closing keyword plus non-empty `## Summary`, `## Fix`, `## Verification`, and `## Related`), the MCP-surface sibling of pr-body-linkage-gate, covering cloud/remote sessions that open PRs without the gh CLI. Same policy scope: enforced only in a repository whose .github/workflows carry a workflow that uses the pr-contract composite step, and only for the repository the origin remote names.",
"default": true
},
"worktree_add_containment_gate_enabled": {
"type": "boolean",
"title": "worktree-add-containment-gate hook",
"description": "Block a raw Bash `git worktree add` whose resolved target lands inside a git repository, meaning a working tree or a .git / bare directory, with a message naming the configured external root (worktreeroot.path git config key, then the worktree_root plugin option, then the plugin data dir). Blocks ONLY the nesting class: a conforming target passes silently, with no advisory, and a target the hook cannot resolve statically (dynamic path, prior cd, unreadable payload) always passes. The nesting invariant's measurement, disputed arms and expiry live in exactly one place: `skills/worktree/SKILL.md` § \"The nesting invariant, verified\".",
"default": true
},
"worktree_add_claim_gate_enabled": {
"type": "boolean",
"title": "worktree-add-claim-gate hook",
"description": "After a raw Bash `git worktree add`, lock the parsed add target with a session-distinct claim (host + session id + timestamp). Only that path is claimed, not every currently unlocked linked worktree, so two concurrent adds cannot steal each other's trees. Existing reasons, including the worktree-create.sh helper string, are never rewritten. The lock is a claim other agents can read, not a write mutex. Turning this OFF leaves plain-add trees unclaimed; `scripts/worktree-claim.sh report` still lists them and `check-enter` still surfaces a foreign live claim. Kill switch only: worktree_add_claim_gate_enabled.",
"default": true
},
"worktree_create_gate_enabled": {
"type": "boolean",
"title": "worktree-create-gate hook",
"description": "Redirect a WorktreeCreate away from Claude Code's default location, which may be inside the repository, to the configured worktree_root. Turning this OFF does NOT hand placement back to Claude Code: a WorktreeCreate hook has no 'not applicable' channel, and measured on Claude Code 2.1.228, a non-zero exit and an exit-0-without-a-path both fail the creation. That is why `false` makes the gate refuse out loud, and every harness-driven creation path (`claude --worktree`, a subagent with `isolation: \"worktree\"`, a background session) fails with a message naming the real stand-downs. To let Claude Code place worktrees itself, set `worktree.bgIsolation` to `\"none\"` in settings, or disable this plugin. Probe, verbatim harness output and the as-of stamp: `skills/worktree/fixtures/README.md`.",
"default": true
},
"babysit_watched_owners": {
"type": "string",
"multiple": true,
"title": "Babysit watched owners",
"description": "GitHub owners (users/orgs) babysit-prs may act under. Absent: the current repo's owner is inferred per run."
},
"babysit_self_logins": {
"type": "string",
"multiple": true,
"title": "Babysit extra self identities",
"description": "Extra GitHub posting identities (e.g. a project bot account) added to your `gh api user` login, forming the self set babysit-prs treats as its own: self-comment suppression, same-login classification, readiness-gate classification rows, the merge-gate self-exemption, and the resolve-thread bot-only test (a self-authored reply to a bot thread no longer counts as a disqualifying human participant). Not a discovery filter. Which authors' PRs the queue discovers is `--author`'s job, independent of this set. Absent: your gh login alone."
},
"babysit_intended_write_identity": {
"type": "string",
"title": "Babysit intended write identity",
"description": "The single GitHub login babysit-prs's own writes are intended to land under, typically the bot posting identity. When a write the orchestrator recorded performing lands under a different `babysit_self_logins` identity (e.g. a bot-token mint failed and the write silently fell back to your personal login), the cycle status surfaces an attribution-drift material finding instead of proceeding silently. Set it to one of your self logins; a value that is not actually a posting identity would flag every write. Absent: the check is dormant."
},
"babysit_default_tier": {
"type": "string",
"title": "Babysit default tier",
"description": "Tier an explicit bare /source-control:babysit-prs invocation runs: safe, worker, or autopilot. Never applies to auto-routed invocations.",
"default": "safe"
},
"babysit_merge_method": {
"type": "string",
"title": "Babysit merge method",
"description": "Merge method for gate-proven merges: merge, squash, or rebase. Absent: repo convention, then squash."
},
"babysit_autopilot_merge_tier": {
"type": "boolean",
"title": "Babysit autopilot merge tier",
"description": "Enable the #476 autopilot merge tier: a distinct bot account submits a genuine approving review, then the gate merges only when every criterion holds (issue-linked, lane-authored, no do-not-merge label, distinct-bot approval on the live head, no human blocking comment). Ships DISABLED; a deliberate operator opt-in. Requires babysit_lane_logins, babysit_approver_bot_logins, and babysit_merge_block_labels to be set. Absent/false: the tier does not exist and PRs go to the human merge-ready list.",
"default": false
},
"babysit_lane_logins": {
"type": "string",
"multiple": true,
"title": "Babysit pipeline lane logins",
"description": "Author logins recognized as pipeline lanes for the autopilot merge tier's lane-authored criterion. Absent: the tier (when enabled) refuses fail-closed."
},
"babysit_approver_bot_logins": {
"type": "string",
"multiple": true,
"title": "Babysit approver bot logins",
"description": "Bot logins whose approving review satisfies the autopilot merge tier's author != approver criterion. Absent: the tier (when enabled) refuses fail-closed."
},
"babysit_merge_block_labels": {
"type": "string",
"multiple": true,
"title": "Babysit merge block labels",
"description": "Labels that veto an autopilot-merge-tier merge, e.g. do-not-merge. Absent: the tier (when enabled) refuses fail-closed."
},
"babysit_review_trigger_phrase": {
"type": "string",
"title": "Babysit review trigger phrase",
"description": "Comment phrase that requests an AI re-review (posted and recognized). Absent: the review-trigger module stays dormant."
},
"babysit_review_bot_logins": {
"type": "string",
"multiple": true,
"title": "Babysit review bot logins",
"description": "Logins of the AI review bots the trigger phrase addresses, and whose review of the live head the merge gate waits for. Absent: the review-trigger module stays dormant and the merge gate's review-settle hold stays dormant."
},
"babysit_review_settle_minutes": {
"type": "string",
"title": "Babysit review settle minutes",
"description": "How long after a head appears a review bot's re-review may still be in flight. The merge gate holds a head that bot has not reviewed yet until the window elapses, then stops waiting. Requires babysit_review_bot_logins; absent, the hold stays dormant. Set it above the reviewer's observed latency."
},
"babysit_review_gate_context": {
"type": "string",
"title": "Babysit review gate context",
"description": "Check/status context name of the AI-review gate. Absent: gate treated as absent (degrade)."
},
"babysit_ci_gateway_context": {
"type": "string",
"title": "Babysit CI gateway context",
"description": "Check/status context name of a CI gateway check. Absent: gateway classification unused."
},
"babysit_extra_bot_logins": {
"type": "string",
"multiple": true,
"title": "Babysit extra bot logins",
"description": "Additional logins to treat as bots when structural detection cannot identify them. Absent: structural detection only."
},
"babysit_extra_dependency_manager_logins": {
"type": "string",
"multiple": true,
"title": "Babysit extra dependency-manager logins",
"description": "Additional dependency-manager bot logins beyond the built-in dependabot/renovate set whose PRs the merge gate holds absent --allow-dependency, the same as the built-ins. Absent: built-in dependency-manager set only."
},
"babysit_approval_downgrade_logins": {
"type": "string",
"multiple": true,
"title": "Babysit approval-downgrade reviewer logins",
"description": "AI reviewer logins whose approval is surfaced as a `material` finding instead of `ignored` in the one case the structural approval-downgrade reaches: a review body carrying blocking-looking prose that still parses as an approval verdict (no CRITICAL/IMPORTANT or required-fix marker). Every bot's such approval is downgraded to non-blocking regardless; naming a login opts its own into the more-conservative `material` bucket rather than being ignored. Does not affect a review already in the APPROVED state or a plain clean approval with no blocking-looking prose. Both are ignored regardless. Absent: such approvals are ignored for every bot."
},
"babysit_skip_downgrade_logins": {
"type": "string",
"multiple": true,
"title": "Babysit skip-downgrade reviewer logins",
"description": "AI reviewer logins whose skip/no-op review is not treated as an approval. Absent: the downgrade heuristic stays dormant."
},
"babysit_max_quiet_recheck_seconds": {
"type": "number",
"title": "Babysit max quiet recheck seconds",
"description": "Longest a quiet PR may go without a worker recheck.",
"default": 14400
},
"babysit_stuck_check_age_seconds": {
"type": "number",
"title": "Babysit stuck-check age threshold (seconds)",
"description": "Minimum age before a pending non-required check under UNSTABLE is reported stuck (stuck_queued / never_settling material finding). Orphaned status contexts with no backing run are detected structurally and ignore this threshold.",
"default": 1800
},
"babysit_advisory_fix_round_cap": {
"type": "number",
"title": "Babysit advisory fix-round cap",
"description": "Per-PR cap on advisory-only fix rounds (never caps blocking defects).",
"default": 100
},
"babysit_worker_concurrency_cap": {
"type": "number",
"title": "Babysit worker concurrency cap",
"description": "Maximum per-PR workers dispatched concurrently in one cycle.",
"default": 10
},
"babysit_worktree_root": {
"type": "directory",
"title": "Babysit worktree root",
"description": "Root directory for babysit-managed ephemeral worktrees. Absent: the worktrees/ subdirectory of the plugin data dir."
},
"worktree_root": {
"type": "directory",
"title": "Worktree root",
"description": "External root under which /worktree create places worktrees, as <root>/<owner>-<repo>-<slug>, a path OUTSIDE every repository (on Windows, the same drive as the repo). Absent: the worktrees/ subdirectory of the plugin data dir, which the skill supplies explicitly rather than reading from the environment (not per-plugin in a Bash-tool subprocess). Deliberately outside the repository tree AND outside repository-discovery roots such as a ghq root, which a checkout-relative default would land inside. Never the in-repo .claude/worktrees/ default, whose nested placement the nesting invariant forbids. That claim is stated, measured, dated and given an expiry in exactly one place: `skills/worktree/SKILL.md` § \"The nesting invariant, verified\"."
},
"worktree_stale_days": {
"type": "number",
"title": "Worktree staleness threshold (days)",
"description": "Days since last commit before /worktree status classifies a worktree as stale",
"default": 14,
"min": 1
},
"fetch_logs_max_bytes": {
"type": "number",
"title": "CI-log fetch size cap (bytes)",
"description": "Abort a CI-log ZIP fetch larger than this",
"default": 52428800,
"min": 1
},
"branch_issue_pattern": {
"type": "string",
"title": "Branch-to-issue grammar (ERE)",
"description": "Deprecated: set `branch_issue_pattern` on the layered .claude/source-control.md surface instead; this value is read only as a fallback. POSIX ERE for extracting the numeric GitHub issue number from the current branch name; the LAST capture group holds it and must resolve to digits (Closes #N honors only a numeric issue). Set this for a non-default branch scheme that places the number differently, e.g. '^[^/]+/([0-9]+)-' for 'alice/1234-slug' or '-([0-9]+)$' for 'feat/add-widget-1234'. Absent: the built-in '<type>/<N>-<slug>' (and routine-issue-<N>) convention."
},
"setup_inference_window": {
"type": "string",
"title": "Setup inference history window",
"description": "git log --since window /source-control:setup samples for commit-subject convention inference (any git-approxidate, e.g. '1 year', '6 months'). Absent: 1 year.",
"default": "1 year"
},
"setup_inference_recency_days": {
"type": "number",
"title": "Setup inference recency split (days)",
"description": "Boundary for the recency split in /source-control:setup's convention-inference report: subjects newer than this many days are the 'recent' bucket, weighted as the live convention when its share diverges from the older bucket. Absent: 90.",
"default": 90,
"min": 1
},
"setup_inference_min_commits": {
"type": "number",
"title": "Setup inference low-confidence threshold (commits)",
"description": "Below this many classifiable subjects in the window, /source-control:setup widens inference to full history; still below it, the inference is reported low-confidence rather than authoritative. Absent: 50.",
"default": 50,
"min": 1
}
}
}For maintainers
If you maintain this plugin, link to this source-backed listing from your README so users can review its manifest and indexed components.
[source-control on Agent Plugins Marketplace](https://pluginsmp.com/plugins/source-control)