cli.sgit.ai / Research / Roadmap: feature parity with Git, then more on top (28 Oct 2026)

Roadmap: feature parity with Git, then more on top (28 Oct 2026)

Date2026-10-28 · 02:22 UTCKindroadmapResearch topicsgitWritten bythe sgit-ai CLI team (Claude Code sessions), for Dinis CruzSourceteam/humans/dinis_cruz/claude-code-web/10/28/roadmap__git-parity.md in SGit-AI__CLI at 036e33b. Published here as written; the CLI repository is where the work happened.

The message: sgit does just about everything Git does, and then more on top. Git, the client, is the bar. GitHub's features (accounts, verified badges, protected branches, review, CI) belong to a future server product ("SGitHub"), not to the CLI.

Follows: review__article-what-sgit-does-that-git-does-not.md (same folder). That review mixed Git and GitHub features, and proposed an owner-signed signer registry for TM-R01. Under this scope, that registry moves to SGitHub (section 4). Signing becomes what Git does: sign with the key you already have, and let each verifier decide whom to trust.

Extension rule: every new feature is off by default and changes nothing for vaults and clients that don't use it. It is on through a setting, either local or a vault feature (sgit vault format --feature …, the mechanism packs and signatures-required already use). Only a feature that old clients would get wrong sets a minimum client version.


1. Already at parity

These Git commands already have an sgit equivalent.

Working with a clone

Gitsgit
clone, --depth, fetch --unshallowclone, --depth N, fetch --unshallow
partial clone + sparse-checkoutclone --path (repeatable), fetch <folder> to widen, clone --sparse
clone --no-checkout, --bareclone --no-checkout, checkout <paths> / --since-pull / --changed-since / --all; clone --bare
status, commit, commit --amendstatus, commit, commit --amend
push, pull, fetch, push --force-with-leasethe same
remoteremote
.gitignore.gitignore (read as is)
stashvault stash

Branches, tags and merges

Gitsgit
branch, switch, checkout <commit>branch new/list/switch/rename/checkout
mergebranch merge (whole-file: see 2.1)
merge --abortmerge-abort
conflict resolutionresolve
tag -s (signed), tag -vvault tag create/list/show/delete (signed, verified)

History

Gitsgit
log, --grep, --since, --until, --author, --stat, -p, -- <file>, --graph, --onelinehistory log with the same filters
diff, showhistory diff, history show
refloghistory reflog
reset --hardhistory reset
reverthistory revert --as-commit
(no single command)history undo
HEAD~2, HEAD^2, short ids, tag namesthe same revision syntax

Integrity and plumbing

Gitsgit
fsckcheck fsck
verify-commit (one commit)check verify (every commit to HEAD)
commit-graph, pack indexesindex packs (0.26.0)
packs, kept packs (fetch.unpackLimit)pack vaults, clone --pack-store
hash-object / commit-tree plumbingwrite --file … --also … --push --json (atomic commit of named files)
bundle / file:// remotes--transport local, vault backup / restore
dumb HTTP--transport static

2. Gaps: Git has it, sgit doesn't yet (the CLI roadmap)

All of these run on the client in Git too. None needs a server change.

Priority 1

#FeatureGitsgit planSizeGate?
2.1Line-level three-way mergeort merge, conflict markers, merge-fileOne function changes: Vault__Merge.three_way_merge. Every merge (pull, branch merge, revert, the rewind re-apply) goes through it. For a text file both sides changed: decrypt base/ours/theirs, run a three-way line merge, and store the result as a new blob. A clean merge commits as today; rough edges get <<<<<<< markers in the file instead of a .conflict copy. Binary files (a NUL byte) and files over a size cap stay whole-file. Tests use git merge-file -p as the oracle. Opt-in; whole-file with .conflict stays the default (the web UI works that way). Chosen per command (--merge lines / --merge files on pull and branch merge) or per clone (a merge_style field in .sg_vault/local/config.json, never synced, like Git's .git/config). A team-wide per-file rule, if ever wanted, is a committed attributes file (Git's .gitattributes), versioned like the .gitignore sgit already reads.2–3 daysNo: a merge result is an ordinary commit
2.2Sign with your own key (SSH or GPG) and verify against your allowed-signers fileuser.signingkey, gpg.format, commit.gpgSign, tag.gpgSign, gpg.ssh.allowedSignersFile, log --show-signature, verify-commit, verify-tagSection 33–4 daysNo (section 3)
2.3Commit some files, not allcommit <paths>, add -p + commitsgit commit <paths> reuses write's code (only the named paths' folders are rebuilt). commit -p picks hunks over history diff. A persistent staging area (sgit add) is a separate decision; pathspec plus -p covers most use.1 day / 2 daysNo

Priority 2

#FeatureGitsgit planSize
2.4Rename detectiondiff -M, log --follow, renames in mergeExact renames: the same plaintext content_hash (already in tree entries) on a deleted and an added path. Similar renames: Git's similarity score, within a cap.1–2 days
2.5blameblamehistory blame <path>: walk the file's commits (the index pack's file → commits member makes it cheap) with a line diff per step. Blobs are fetched on demand; it stops at a shallow boundary.2 days
2.6bisectbisect start/good/bad/runhistory bisect …. State in .sg_vault/local/; the midpoint comes from generation numbers (index packs carry them).1–2 days
2.7grep, pickaxegrep, log -S / -Gsgit grep <regex> over HEAD or --rev C (decrypt locally); history log -S/-G.1–2 days
2.8cherry-pickcherry-pickhistory cherry-pick <commit>: a three-way merge of that commit's change onto HEAD (uses 2.1).1 day after 2.1
2.9Hooks.git/hooks/pre-commit, commit-msg, pre-push, post-merge.sg_vault/local/hooks/, local only and never synced (as in Git, a hook in a vault must never run on a clone).1 day
2.12rebase (moved up from priority 3: pull --rebase and rebase -i are daily Git)rebase, pull --rebase, rebase -i, --continue/--skip/--abortReplay this clone's unpushed commits onto the new head, one cherry-pick (2.8) per commit, with stop-and-continue on conflict. Opt-in like 2.1: merge stays the default for pull. Pushed history is never rewritten.2–3 days
2.13worktree (moved up from priority 3: agents use worktrees heavily)worktree add/list/remove/prunesgit worktree add <path> [--branch <named>]: a real clone with its own .sg_vault/local, clone branch and key, whose object store borrows from the main vault's (Git's alternates): own store, then the main store, then the network. Seconds and no network instead of a full clone. Merging is as today (push, then branch merge); merging another local clone branch without a push is a follow-up. Full shared refs (Git's commondir) is not planned: 81 hand-built .sg_vault/bare paths would need one resolver plus ref locking.2–3 days

Priority 3

#FeatureGitsgit planSize
2.10Garbage collectiongc, prunevault prune with the write key. Compute the set reachable from every branch, clone branch, tag and stash; delete the rest after a grace period (Git's two weeks) so in-flight pushes survive. On pack vaults, delete archive/ packs older than the grace period. It has to be client-side: the host cannot read trees.2–3 days
2.11Delta compressionrepack, delta packsAt push, delta a blob against its previous version before deflate and encryption. The reader rebuilds the blob and verifies it by content address.1–2 weeks; old clients can't read deltas, so it needs a vault feature with a gate
2.14archive, shortlog, describe, aliasesthe samePlaintext export of a commit as zip/tar; summaries; sgit config alias.*.small each
2.15SubmodulessubmoduleA vault referencing another vault at a commit. Needs a design; skip until someone asks.design

3. Signing the way Git does it

How Git does it. Git never asks who is allowed. It signs with the key the user already has: GPG (gpg.format openpgp), SSH (gpg.format ssh, signing through ssh-keygen -Y sign and so through ssh-agent and hardware keys) or X.509. It stores the signature in the commit (gpgsig), excluded from the signed bytes. Verification is each verifier's choice: a GPG keyring, or an allowed_signers file of principal → public key. GitHub then adds "verified" on top by matching keys to accounts. That last part is the SGitHub layer, not the CLI.

sgit, the same way:

Size: 3–4 days with tests (SSH first, GPG second), plus CHANGELOG and threat-model rows (TM-R01 gains "closed per verifier with an allowed-signers file").


4. Moved to SGitHub (server-side, later)

These were in the article's "Git is ahead" list or in yesterday's review. They are GitHub's features, not Git's, so they are out of scope for the CLI:

Under zero knowledge, an SGitHub server can do the access parts: tokens, ref ACLs keyed by the hashed ref ids, recording verification. The content parts (review, CI, search) run in the browser or in a runner that holds the key.


5. More on top: what sgit does that Git does not

The second half of the message. Already shipped unless marked.

Suggested order

  1. 2.1 line-level merge.
  2. 2.2 signing with your own key.
  3. 2.3 commit <paths>.
  4. Then 2.4–2.9, 2.12 (rebase) and 2.13 (worktree) as the priority-2 release.
  5. 2.10, 2.11, 2.14 and 2.15 when a workload asks (garbage collection is not needed for now).

Each is an extension: off or invisible until used, and no version gate except 2.11.

This page as markdown · its source, admin/content/research/git-parity-roadmap.md