$ git status --feature

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.

PHPNode / TypeScriptReact
fancy-git-ui + registerGitBridgeLive demo

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.

  1. particle-academy/fancy-gitPHP
    composer require particle-academy/fancy-git
  2. @particle-academy/fancy-gitNode / TypeScript
    npm install @particle-academy/fancy-git
  3. fancy-git-uiReact
    npm install @particle-academy/fancy-git-ui
  4. particle-academy/fancy-git-githubPHP
    composer require particle-academy/fancy-git-github
  5. @particle-academy/fancy-git-githubNode / TypeScript
    npm install @particle-academy/fancy-git-github
  6. particle-academy/fancy-git-gitlabPHP
    composer require particle-academy/fancy-git-gitlab
  7. @particle-academy/fancy-git-gitlabNode / TypeScript
    npm install @particle-academy/fancy-git-gitlab
  8. particle-academy/fancy-git-bitbucketPHP
    composer require particle-academy/fancy-git-bitbucket
  9. @particle-academy/fancy-git-bitbucketNode / TypeScript
    npm install @particle-academy/fancy-git-bitbucket

The packages

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.