Git that an agent can propose to
One normalized contract for local Git and for GitHub, GitLab and Bitbucket, in PHP and in Node. A React UI that only renders what you pass it. Writes that arrive as proposals until a person confirms them.
Stage, commit and open a pull request as yourself; a checkout is proposed and waits for your Confirm. Then use the agent panel and let it propose the same things. Nothing runs git and nothing leaves this page: the repository is seeded data, and each intent is answered in local state.
What it does
Each claim below is checkable in the packages' own source and READMEs.
One contract, three hosts
GitProvider normalizes identify, repository, listReviews, getReview, createReview, compare and checks. GitHubProvider, GitLabProvider and BitbucketProvider each implement it, so a pull request and a merge request are both a Review.
PHP and Node, mirrored
GitRepository runs the installed git binary from PHP (through Symfony Process) and from Node. Every provider adapter ships in both languages, and the core carries no GitHub, GitLab or Bitbucket SDK.
Proposal-first writes
Repository writes can return a JSON proposal instead of changing anything: pendingMode: "propose" in Node (stage, unstage, commit, checkout, fetch, pull, push) and propose: true in PHP (the same, less commit).
An agent bridge that asks first
registerGitBridge exposes git_status, git_log and git_diff to read, plus git_reviews_list and git_checks when your adapter supports them. Its write tools (git_stage through git_review_create) return proposals, and apply is refused unless the host opts in with allowApply.
Controlled, provider-neutral UI
Eight components (WorkingTree, DiffViewer, CommitHistory, RepositoryBrowser, ReviewList, BranchPicker, CommitComposer, CreateReviewForm) take a value and emit intents. None calls git or a provider API, and each entity carries a stable data-git-* handle.
Diffs with a review state
DiffViewer takes the unified patch fancy-git returns, unified or split, with per-hunk accept and reject. A hunk with no decision is pending, which is not the same as rejected.
How it fits
The engine and every provider adapter ship as a PHP and Node pair; the UI is one React package that works with either backend.
Human+ bridge
An agent drives this surface over MCP, through the same state a person sees, never the DOM.
import { registerGitBridge } from "@particle-academy/agent-integrations/bridges/git";tools: git_*
Install
Install the engine for your backend, an adapter for each host you use, and the UI.
composer require particle-academy/fancy-gitnpm install @particle-academy/fancy-gitnpm install @particle-academy/fancy-git-uicomposer require particle-academy/fancy-git-githubnpm install @particle-academy/fancy-git-githubcomposer require particle-academy/fancy-git-gitlabnpm install @particle-academy/fancy-git-gitlabcomposer require particle-academy/fancy-git-bitbucketnpm install @particle-academy/fancy-git-bitbucket
The packages
Framework-agnostic PHP Git engine with normalized provider contracts and proposal-first mutations.
Node/TypeScript Git engine and normalized GitHub, GitLab, and Bitbucket provider contracts.
Controlled Human+ React surfaces for repositories, working trees, diffs, commits, branches, and pull/merge requests.
GitHub.com and GitHub Enterprise adapter for particle-academy/fancy-git.
GitHub.com and GitHub Enterprise adapter for @particle-academy/fancy-git.
GitLab.com and Self-Managed adapter for particle-academy/fancy-git.
GitLab.com and GitLab Self-Managed adapter for @particle-academy/fancy-git.
Bitbucket Cloud adapter for particle-academy/fancy-git.
Bitbucket Cloud adapter for @particle-academy/fancy-git.
Put a repository in front of a person and an agent
Start from fancy-git-ui's component pages: each one runs against a fixture repository, with the props it takes.
