Version: 1.0.0 Date: 2026-02-13 Author: Jason Hempstead Organization: casapps License: MIT Status: Pre-Implementation — Planning Complete
- Project Overview
- Brand Identity
- Architecture
- Binary & Distribution
- Configuration System
- Git Compatibility Layer
- Smart Operations Engine
- Commit Workflows
- Merge & Rebase Engine
- Undo System
- Recursive Operations Engine
- API Client Layer
- Provider Management
- Pull Request & Code Review
- Issue Management
- Gist Operations
- CI/CD Integration
- Release Automation
- Deploy Hooks
- Branch Management
- Stash Enhancement
- Worktree Management
- Submodule Management
- Subtree Support
- LFS Auto Mode
- Security & Credentials
- Commit Signing
- Secret Scanning
- Encrypted Files
- Format & Lint Orchestration
- Hooks System
- Repository Health
- .gitignore Management
- .gitattributes Management
- License Management
- Community Files
- Project Scaffolding
- Changelog Generation
- Documentation Generation
- Dependency Management
- Migration Tools
- Mirroring
- Archive & Backup
- Network Resilience
- Offline Mode
- Search
- Log Query Language
- Blame & History Intelligence
- Diff Engine
- Bisect Automation
- Statistics & Analytics
- Repository Size Management
- Sparse Checkout
- Shallow Clone Management
- Bundle Support
- Patch Workflow
- Snapshot / Checkpoint
- Time Tracking
- Snippet Manager
- Dotfile Management
- Workspace Management
- Repo Discovery & Index
- Repo Linking
- Feature Branch Tracking
- Stacked PRs / Patch Queue
- Multi-Identity Management
- Configuration Profiles
- Environment File Management
- Conflict Prevention
- Pre-Flight Checks
- Change Risk Assessment
- Repository Compliance Policies
- Commit Verification & Audit
- Repository Anomaly Detection
- Background Maintenance
- Scheduled Operations
- Notifications & Inbox
- Shell Integration
- Custom Commands & Plugins
- Terminal Sharing & Pair Programming
- Container Registry Integration
- Semantic Versioning Intelligence
- Test Impact Analysis
- Database Migration Awareness
- Protocol Debugging
- Git Internals Inspection
- CLI Interface
- TUI Interface
- GUI Interface
- Server — httpd
- Server — sshd
- Server — gitd
- Web UI
- Gitea-Compatible API
- CI Config Translation
- Crate Structure
- Dependencies
- Release Binaries
- Version 1.0.0 Scope
- Complete Command Reference
gitriven is a unified developer workflow tool built in Rust that provides a complete git implementation at its core, extended with comprehensive repository management, collaboration, code quality, security, compliance, deployment, and developer productivity features — all in a single static binary.
"Riven" — Old Norse origin, meaning split, torn apart, forked. A metaphor for git's branching model. "git" + "riven" = gitriven.
- git — complete VCS implementation via gix (gitoxide)
- gh / glab / tea — multi-provider CLI (GitHub, GitLab, Gitea, Forgejo, Codeberg, Gogs, Bitbucket, Azure DevOps, AWS CodeCommit)
- lazygit — terminal UI (ratatui)
- GitKraken — native GUI (egui)
- gitweb / cgit — repository web browser (axum, HTML5/CSS, no JavaScript)
- git-crypt — encrypted files in repos
- git-lfs — large file storage (automatic, no manual setup)
- pre-commit / husky — hooks framework
- conventional-commits tools — commit message enforcement
- gitleaks / trufflehog — secret scanning
- git-credential-manager — credential storage (encrypted SQLite)
- prettier / eslint / shellcheck runners — format/lint orchestration
- git-town / git-flow — workflow automation
- repo / git-subrepo — multi-repo management
- github-backup / ghorg — archival and bulk clone
- BFG Repo-Cleaner — history rewriting
- git-absorb — smart fixup
- An IDE or editor
- A CI/CD server
- A package manager (detects them, doesn't replace them)
- A full SAST/DAST security scanner
- A project management tool (no kanban, no sprints)
- A code review hosting platform (creates/participates in PRs, doesn't host the review UI)
Default behavior = git-identical with enhanced outcomes. Any script, CI/CD pipeline, Makefile, or automation that calls git <command> works identically with gitriven. Same exit codes, same stdout/stderr format, same flags. The enhanced behavior (auto-stash, guided resolution, better errors, secret scanning) is always active. TTY detection adjusts output formatting (interactive vs scripted) but never changes the resulting git state. If you swap git for gitriven in any existing workflow, things either work identically or work better. Never worse, never broken.
All intelligence in gitriven is deterministic, logic-based. No AI/ML models, no API calls to language models, no neural networks. "Smart" means well-engineered conditional logic, pattern matching, heuristics, and sensible defaults.
| Name | Hex | Usage |
|---|---|---|
| Dark | #0D1117 |
Backgrounds, dark theme |
| Teal | #2CADA8 |
Primary accent, "git" in wordmark |
| Amber | #E8922F |
Secondary accent, Rust language nod |
| Role | Font | Fallback |
|---|---|---|
| Display | Tektur | system sans-serif |
| Monospace | JetBrains Mono | ui-monospace, Cascadia Code, Source Code Pro, Menlo, Consolas, DejaVu Sans Mono, monospace |
| Sans-serif | Work Sans | -apple-system, BlinkMacSystemFont, Segoe UI, Noto Sans, Helvetica, Arial, sans-serif |
Trunk splitting into two diverging branches with teal and amber gradients. Wordmark: "git" in teal, "riven" in white (dark backgrounds) or dark (light backgrounds).
GitHub, crates.io, npm, domains — all available at time of specification.
| Interface | Technology | Activation |
|---|---|---|
| CLI | clap | Default. Standard command-line operation. |
| TUI | ratatui + crossterm | Auto-launches on SSH/mosh/telnet sessions, or via --tui flag |
| GUI | egui / eframe | Auto-launches when display server detected ($DISPLAY / Wayland), or via --gui flag |
| Server | axum | Via gitriven serve command |
SSH_CONNECTION or SSH_TTY or SSH_CLIENT set → TUI
MOSH_CONNECTION set → TUI
TERM = "screen" or "tmux" → TUI (already in multiplexer)
DISPLAY set or WAYLAND_DISPLAY set → GUI
None of the above → TUI
| Flag | Behavior |
|---|---|
--cli |
Force CLI mode, no TUI/GUI |
--tui |
Force TUI mode |
--gui |
Force GUI mode |
--no-tui |
Prevent TUI auto-launch |
--no-gui |
Prevent GUI auto-launch |
--no-smart |
Force script-safe mode even in TTY |
--smart |
Force interactive mode even in pipe |
isatty(stdout)ANDisatty(stderr)→ interactive mode (full smart features, progress bars, color, prompts)- Either piped/redirected → script-safe mode (pure git-compatible output, no prompts, no extra output)
The binary reads argv[0] at startup, strips the path, and adapts all user-facing output to the detected name.
What adapts to argv[0]:
- All help text:
Usage: {name} [options] [commands] - Error messages:
{name}: fatal: not a git repository - Subcommand references in suggestions
- Shell completions generation
- Credential helper registration
- Version output
- Man page references
What stays hardcoded "gitriven":
- Config directory path (always
gitriven/regardless of binary name) - Data directory path
- Cache directory path
- Internal stash/checkpoint markers (reflog prefixes)
- User-Agent for API calls
- Project branding in
aboutcommand
BusyBox-style argv[0] detection. Known multicall names are matched by filename:
| argv[0] filename | Behavior |
|---|---|
git |
Full command router (drop-in replacement) |
gitriven (or any unknown name) |
Full command router |
gitcommit |
Smart commit subcommands |
gitadmin |
Admin/repo management subcommands |
gitignore |
Ignore subcommands |
gitmerge |
Smart merge subcommands |
gist |
Gist subcommands |
Multicall names matched by suffix — my-gitcommit or /opt/gitcommit also work.
gitriven setup --symlinks # create all multicall symlinks
gitriven setup --symlinks --prefix /usr/local/bin
gitriven setup --alias # shell aliases instead of symlinkssetup --symlinks reads its own binary path and creates symlinks pointing back to itself. Detects and warns before overwriting existing targets.
Drop-in replacement:
mv gitriven /usr/local/bin/gitParallel install:
cp gitriven /usr/local/bin/gitriven
ln -s gitriven /usr/local/bin/gitcommit
ln -s gitriven /usr/local/bin/gitadmin
ln -s gitriven /usr/local/bin/gitignoreFull takeover:
cp gitriven /usr/local/bin/gitriven
ln -s gitriven /usr/local/bin/git
ln -s gitriven /usr/local/bin/gitcommit
ln -s gitriven /usr/local/bin/gitadmin
ln -s gitriven /usr/local/bin/gitignoreCustom name:
cp gitriven /usr/local/bin/vcs
# Works. Help says "Usage: vcs [options]..."Naming convention: gitriven-{platform}-{arch} (Windows: .exe suffix)
| Binary | Platform | Arch | Target |
|---|---|---|---|
gitriven-linux-amd64 |
Linux | x86_64 | x86_64-unknown-linux-musl |
gitriven-linux-arm64 |
Linux | aarch64 | aarch64-unknown-linux-musl |
gitriven-linux-armv7 |
Linux | armv7 | armv7-unknown-linux-musleabihf |
gitriven-linux-riscv64 |
Linux | riscv64 | riscv64gc-unknown-linux-musl |
gitriven-macos-amd64 |
macOS | x86_64 | x86_64-apple-darwin |
gitriven-macos-arm64 |
macOS | Apple Silicon | aarch64-apple-darwin |
gitriven-freebsd-amd64 |
FreeBSD | x86_64 | x86_64-unknown-freebsd |
gitriven-windows-amd64.exe |
Windows | x86_64 | x86_64-pc-windows-msvc |
gitriven-windows-arm64.exe |
Windows | aarch64 | aarch64-pc-windows-msvc |
- Linux: static linked with musl, stripped
- All binaries stripped (
strip = truein cargo profile) - No runtime dependencies, no config files required, no install process
- All HTML templates and CSS for web UI
- All .gitignore templates (GitHub's collection)
- All community file templates (CONTRIBUTING, CODE_OF_CONDUCT, SECURITY, etc.)
- All hook templates
- All license templates (MIT, Apache-2.0, GPL-3.0, BSD-2-Clause, BSD-3-Clause, ISC, MPL-2.0, LGPL, AGPL, Unlicense, WTFPL)
- Spell check dictionary with technical terms
- Default vulnerability database (updatable at runtime)
| Platform | Config | Data | Cache |
|---|---|---|---|
| Linux | ~/.config/gitriven/ |
~/.local/share/gitriven/ |
~/.cache/gitriven/ |
| macOS | ~/Library/Application Support/gitriven/ |
~/Library/Application Support/gitriven/ |
~/Library/Caches/gitriven/ |
| Windows | %APPDATA%\gitriven\ |
%LOCALAPPDATA%\gitriven\ |
%LOCALAPPDATA%\gitriven\cache\ |
Respects XDG overrides on Linux ($XDG_CONFIG_HOME, $XDG_DATA_HOME, $XDG_CACHE_HOME).
Directory paths always use gitriven/ regardless of binary name.
{config}/
├── config.toml # main configuration
├── profiles.toml # identity profiles
├── workspaces.toml # workspace definitions
├── dotfiles.toml # dotfile repo tracking
├── policy.toml # org-level compliance policy
├── mirrors.toml # global mirror relationships
{data}/
├── credentials.db # encrypted SQLite credentials store
├── repos.db # repo index database
├── audit.log # operation audit trail
├── server.pid # server PID + ports
├── ssh_host_ed25519 # server SSH host key
├── authorized_keys # server SSH authorized keys
├── templates/ # user-created project templates
├── snippets/ # saved code snippets
├── hooks/ # user-installed hook scripts
├── commands/ # custom command scripts
├── dictionary.txt # user-added spell check words
├── health-history/ # repo health score history
{cache}/
├── ignore-templates/ # downloaded .gitignore templates
├── api-cache/ # API response cache
├── search-index/ # cross-repo search index
├── vuln-db/ # vulnerability database
├── commit-graph-cache/ # commit graph optimization data
[global]
host = "0.0.0.0"
log_level = "info" # trace, debug, info, warn, error
[httpd]
enabled = true
port = 65042 # auto-assigned on first run, persisted
root = "" # repo root for serving
tls = false
tls_cert = ""
tls_key = ""
api = true # enable Gitea-compatible API
api_token = "" # if set, require token for API access
api_readonly = false
[sshd]
enabled = false
port = 65043 # auto-assigned when enabled, persisted
host_key = "" # auto-generated on first enable
authorized_keys = ""
[gitd]
enabled = false
port = 65044 # auto-assigned when enabled, persisted
export_all = false
[credentials]
keychain = true # use OS keychain for master key
cache_ttl = "8h" # memory cache TTL when no keychain
env_precedence = true # env vars override database
[signing]
enabled = true
method = "ssh" # "ssh" or "gpg"
key = "~/.ssh/id_ed25519"
auto_passphrase = true # use stored passphrase from credentials db
[lfs]
auto = true
threshold = "50MB"
always_fetch = true
patterns = [] # always LFS regardless of size
[submodules]
auto = true
auto_init = true
auto_update = true
auto_push = true
recurse_depth = 10
warn_dirty = true
warn_unpushed = true
[recursive]
exclude = [] # glob patterns to exclude
scan_depth = 5
jobs = 0 # 0 = CPU core count
[clone]
base_dir = "~/Projects"
pattern = "{provider}/{owner}/{repo}"
[providers]
# Custom provider mappings for self-hosted instances
# "git.example.com" = "gitea"
# "gitlab.work.com" = "gitlab"
[notifications]
enabled = true
threshold = "30s" # notify if operation takes longer
sound = false
desktop = true
[shell]
auto_fetch = true
auto_fetch_interval = "15m"
[format]
enabled = true
on_commit = true
staged_only = true
auto_suggest_install = true
[risk]
critical_paths = []
high_churn_threshold = 20
large_change_threshold = 500
[registries]
# Container registry configurations
# "ghcr.io" = { type = "ghcr", auth = "github" }
# "docker.io" = { type = "dockerhub", auth = "credentials" }gitriven reads and honors the entire git config chain:
/etc/gitconfig(system)~/.gitconfigor~/.config/git/config(global).git/config(repo-level).git/config.worktree(worktree-level)GIT_CONFIG_*environment variables
Every section, every key — [user], [core], [remote], [branch], [merge], [diff], [pull], [push], [fetch], [credential], [alias], [color], [init], [url], [http], [https], [ssh], [gpg], [commit], [tag], [rerere], [rebase], [stash], [status], [log], [format], [filter], [includeIf], [safe], and any custom or third-party sections.
gitriven also supports a [gitriven] section in .gitconfig for users who prefer everything in one file:
[gitriven]
smart = true
lfs-auto = true
lfs-threshold = 50MB
default-provider = githubgitriven config import # read .gitconfig, validate, map to gitriven config
gitriven config export # write gitriven settings back to .gitconfig format
gitriven config show # merged view of all config sources with origin labels
gitriven config edit [--global|--system|--local] # open config in editor
gitriven config team show # display repo-level .gitriven/config.toml
gitriven config team enforce # validate local setup matches team config.gitriven/ directory in repo root — team-shared gitriven configuration. Auto-applied on clone.
.gitriven/
├── config.toml # team settings (branch naming, protection, etc.)
├── format.toml # format/lint configuration
├── release.toml # release pipeline config
├── deploy.toml # deploy environments
├── hooks.toml # hook configuration
├── webhooks.toml # webhook listeners
├── mirrors.toml # mirror relationships
├── linked.toml # linked repos
├── policy.toml # compliance policy
├── changelog.toml # changelog generation config
├── dictionary.txt # project-specific spell check words
├── templates/ # commit message templates
│ ├── default.txt
│ ├── feature.txt
│ └── hotfix.txt
├── commands/ # team-shared custom commands
gitriven implements every git porcelain and plumbing command with full flag compatibility via the gix (gitoxide) crate ecosystem.
Porcelain commands (all flags from git man pages supported):
init, clone, add, commit, push, pull, fetch, merge, rebase, reset, checkout, switch, restore, tag, stash, branch, remote, log, diff, show, status, clean, mv, rm, bisect, blame, cherry-pick, revert, notes, describe, shortlog, grep, archive, bundle, format-patch, am, apply, gc, prune, reflog, fsck, worktree, submodule, subtree, lfs
Plumbing commands:
cat-file, hash-object, update-index, write-tree, commit-tree, read-tree, ls-tree, ls-files, rev-parse, rev-list, for-each-ref, update-ref, symbolic-ref, merge-base, diff-tree, diff-files, diff-index, pack-objects, unpack-objects, index-pack, verify-pack, count-objects, show-ref, name-rev, check-ref-format, var
All exit codes match git exactly:
- 0: success
- 1: general failure / diff found changes
- 128: fatal error
- 129+: killed by signal
In script-safe mode (no TTY), output format is byte-identical to git. In interactive mode, additional information may be appended after the standard output (never replacing it).
All smart features are always active. They enhance the experience without changing the resulting git state.
- Detect dirty working tree
- Auto-stash with meaningful message:
gitriven:auto-stash on {branch} before pull - Pull (fetch + merge/rebase per config)
- Auto-pop stash
- If LFS pointers changed, auto-fetch LFS objects
- If submodule refs changed, auto-update submodules
- If lockfile changed, notify:
⚠ Cargo.lock changed — consider running cargo build - Handle conflicts gracefully with clear options
| Condition | Action |
|---|---|
| Diverged branches | Offer rebase/merge/force push options |
| Detached HEAD | Offer branch creation before losing commits |
| Merge conflicts | Auto-resolve trivial (whitespace, import ordering), guided resolution for others |
| Broken refs | Detect and offer fsck + repair |
| Stale tracking branches | Auto-prune or suggest |
| Permission issues | Detect SSH key problems, suggest fixes |
| Large file detection | Warn before commit, suggest LFS or .gitignore |
| Credential failures | Detect expired tokens, guide re-auth |
| Wrong branch | Warn before committing to main/master directly |
| Empty commit | Detect and warn instead of silently succeeding |
| Submodule not pushed | Block parent push with clear explanation |
| LFS pointer without push | Detect and warn |
- Plain-language errors (technical detail via
--verbose) - "Did you mean?" suggestions for typos (Levenshtein distance matching)
- Context-aware hints
- Color-coded severity (warning/error/info) when TTY
- Links to relevant documentation
- Auto-diagnose network failures (run relevant checks from
gitriven doctor)
gitriven commit -m "message" works identically to git commit -m "message". All standard flags supported.
Status-filtered commits (stage only matching files):
| Command | Behavior |
|---|---|
gitriven commit all |
Stage everything, commit |
gitriven commit modified |
Stage only modified files, commit |
gitriven commit deleted |
Stage only deleted files, commit |
gitriven commit added |
Stage only added/new files, commit |
gitriven commit renamed |
Stage only renamed files, commit |
gitriven commit restored |
Stage only restored files, commit |
gitriven commit files |
Interactive — commit based on status grouping |
gitriven commit spelling |
Commit with "fix: spelling corrections" message |
Semantic commit types (conventional commit format):
| Command | Generated Prefix |
|---|---|
gitriven commit new "description" |
feat: description |
gitriven commit improved "description" |
improve: description |
gitriven commit fixes "description" |
fix: description |
gitriven commit release "description" |
release: description |
gitriven commit deploy "description" |
deploy: description |
gitriven commit docs "description" |
docs: description |
gitriven commit test "description" |
test: description |
gitriven commit breaking "description" |
breaking: description |
gitriven commit refactor "description" |
refactor: description |
gitriven commit performance "description" |
perf: description |
gitriven commit permissions "description" |
fix(permissions): description |
gitriven commit bugs "description" |
fix(bug): description |
Without a message, auto-generates one from changed files.
- Scope suggestion based on changed files
- Conventional commit enforcement (optional, per-repo config)
- Empty diff detection (warn on whitespace-only changes)
- Commit splitting assistance (interactive mode)
- Spell check on commit messages (built-in dictionary, project-specific dictionary)
- Commit message templates per branch pattern
gitriven fixup # amend last commit, auto-skip version bump commits
gitriven squash [N] [message] # squash last N commits (default: 2)gitriven absorb # auto-assign staged changes to the correct prior commitAnalyzes staged changes, determines which prior commit each change logically belongs to, creates fixup commits, and auto-squashes them into the right places. Replaces the manual git commit --fixup <sha> → git rebase -i --autosquash workflow.
gitriven commit --coauthor "Name <email>"
gitriven coauthors add <alias> "Name <email>"
gitriven commit --coauthor @aliasAdds Co-authored-by trailer to commit message. Saved coauthors stored in config.
Templates in .gitriven/templates/:
.gitriven/templates/
├── default.txt # default template
├── feature.txt # for feature/* branches
├── hotfix.txt # for hotfix/* branches
Branch pattern matching: any glob maps to a template. Templates support variables: {branch}, {date}, {author}, {ticket} (extracted from branch name like feature/JIRA-123-description).
gitriven merge <branch> # auto-picks best strategy
gitriven merge <branch> --strategy ff # force fast-forward
gitriven merge <branch> --strategy no-ff # force merge commit
gitriven merge <branch> --strategy squash # squash mergeAuto-strategy logic:
- If fast-forward possible and no merge commit needed → fast-forward
- If fast-forward possible but branch has multiple commits → merge commit (preserves topology)
- If not fast-forward → merge commit with conflict handling
Before merge: auto-stash dirty working tree, auto-checkpoint for undo safety.
gitriven merge-resolve status # show all conflicted files
gitriven merge-resolve show <file> # view conflicts in file
gitriven merge-resolve edit <file> # open in editor, validate after save
gitriven merge-resolve ours <file> # keep current branch version, auto-stage
gitriven merge-resolve theirs <file> # keep incoming version, auto-stage
gitriven merge-resolve abort # abort the mergeAuto-resolve trivial conflicts: whitespace-only, import ordering. Validate after manual edits — check that no conflict markers remain.
gitriven merge-driver add <name> <pattern> <command>Built-in drivers for conflict-prone files:
package-lock.json— regenerate instead of mergeCargo.lock— regenerate instead of merge*.pbxproj(Xcode) — union mergeCHANGELOG.md— take both sides, sort by date*.po(translations) — merge by msgid
gitriven rebase <branch> # auto-stash, rebase, pop, handle conflicts
gitriven rebase --onto <target> <from> <to> # with plain English confirmation
gitriven rebase --interactive # enhanced in TUI: drag-and-drop reorder, live previewAuto-checkpoint before rebase. Detect when rebase will definitely conflict and preview which files.
Enabled by default. When a conflict is resolved, gitriven remembers the resolution. Next time the same conflict appears, auto-resolved silently.
gitriven rerere list # show recorded resolutions
gitriven rerere forget <path> # forget a bad resolution
gitriven rerere export / import # share resolutions with teamgitriven pr create --auto-merge # merge when CI + approvals met
gitriven pr merge --when-ready # queue merge, monitor status
gitriven merge-queue add <branch> # queue for sequential merge into maingitriven undo # undo last operation
gitriven undo --list # show recent operations
gitriven undo --steps 3 # undo multipleWorks for: commits, merges, rebases, branch deletes, stash drops, tag deletes, cherry-picks, reverts, resets.
Under the hood: reflog + recorded operation history in gitriven history.
gitriven history # "2 hours ago: merged feature/auth into main"
gitriven history search "deleted branch"Visual timeline in TUI/GUI.
First-class multi-repo operations across any git command:
gitriven --recursive ~/Projects pull
gitriven --recursive ~/Projects --exclude "vendor/*" --jobs 8 fetch
gitriven --recursive ~/Projects log --since "today"
gitriven --recursive ~/Projects stash list- Discovery: Scans for
.gitdirectories, respects--excludeglobs - Parallelism: Default = CPU core count, configurable via
--jobs - Progress: Multi-line indicatif display with per-repo status
- Persistent excludes in config.toml
| Provider | Type Name | Default Server | Auth Env Var |
|---|---|---|---|
| GitHub | github |
api.github.com | GITHUB_TOKEN |
| GitLab | gitlab |
gitlab.com | GITLAB_TOKEN |
| Gitea | gitea |
(requires --api-server) | GITEA_TOKEN |
| Forgejo | forgejo |
(requires --api-server) | FORGEJO_TOKEN |
| Codeberg | codeberg |
codeberg.org | CODEBERG_TOKEN |
| Gogs | gogs |
(requires --api-server) | GOGS_TOKEN |
| Bitbucket | bitbucket |
bitbucket.org | BITBUCKET_TOKEN |
| Azure DevOps | azure |
dev.azure.com | AZURE_TOKEN |
| AWS CodeCommit | aws |
(region-based) | AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY |
| OpenGist | opengist |
(requires --api-server) | OPENGIST_TOKEN |
| gitriven | gitea |
(any gitriven server) | (per-server token) |
Codeberg and Gogs use the Gitea API (compatible) with different default endpoints. gitriven's own server exposes a Gitea-compatible API, making it a valid provider.
gitriven auth login [--api-type github] # interactive auth flow
gitriven auth status # show all stored credentials
gitriven auth refresh <provider> # re-authenticate
gitriven auth logout [--api-type] # remove credentials
gitriven auth export --env # output as env vars
gitriven auth import --env # import from env varsEnvironment variables take precedence over credentials database (CI/CD friendly).
gitriven clone --user <username> # all personal repos + owned org repos
gitriven clone --org <orgname> # all repos in org
gitriven clone --user <username> --all-orgs # include all owned orgsDirectory structure: {base_dir}/{provider}/{owner}/{repo}
Default: ~/Projects/github/jason/gitriven/
Custom provider mappings in config.toml.
Priority order:
- Explicit
--api-typeflag - Remote URL pattern matching
- Git remote URL in current repo
- Directory path pattern matching
- Default from config
If a provider doesn't support an operation (e.g., gists on Gogs), silently skip. No error, no warning. Bulk operations across providers skip unsupported providers and keep going.
gitriven repo create <owner/repo> [description] [--private|--public]
gitriven repo delete <owner/repo>
gitriven repo modify <owner/repo> [--description] [--homepage]
gitriven repo list [--user <name>] [--org <name>]
gitriven repo visibility <owner/repo> --private|--public
gitriven repo view [owner/repo]
gitriven repo fork <owner/repo> [--clone]
gitriven repo archive <owner/repo>All inherit --api-type, --api-server, and token config.
gitriven org list
gitriven org repos <orgname>
gitriven org clone <orgname> [--all-orgs]
gitriven org push|pull <orgname> [--all-orgs]
gitriven org visibility show|public|privategitriven user repos [username]
gitriven user clone [username] [--all-orgs]
gitriven user push|pull [username] [--all-orgs]gitriven ssh list
gitriven ssh add <keyfile> [--title]
gitriven ssh delete <id>gitriven release create <version> [message]
gitriven release delete <owner/repo>
gitriven release delete --user <name> [--all-orgs]
gitriven release list [owner/repo]
gitriven tag add <name> [message]
gitriven tag remove <name> [--remote]gitriven pr create [--title] [--body] [--base] [--draft] [--reviewer]
gitriven pr list [--state open|closed|merged|all]
gitriven pr view <number>
gitriven pr checkout <number>
gitriven pr merge <number> [--strategy merge|squash|rebase] [--delete-branch]
gitriven pr close <number>
gitriven pr diff <number>
gitriven pr review <number> [--approve|--comment|--request-changes]
gitriven pr create --auto-mergegitriven review <pr-number> # walk through diff in TUI
gitriven review comment <file> <line> "msg"
gitriven review approve|request-changes|comment <pr-number>
gitriven review pending # PRs awaiting your review (all providers)
gitriven review mine # your open PRs and their statusgitriven upstream set <url>
gitriven upstream sync # fetch upstream, merge/rebase, push to forkgitriven pr create auto-detects fork → upstream relationship.
gitriven pr works on all providers. GitHub says "Pull Request", GitLab says "Merge Request" — gitriven translates internally.
gitriven issue list [owner/repo]
gitriven issue count [owner/repo]
gitriven issue create [owner/repo]
gitriven issue edit <id>| Provider | Gist Equivalent | Supported |
|---|---|---|
| GitHub | Gists | ✓ |
| GitLab | Snippets | ✓ |
| Bitbucket | Snippets | ✓ |
| OpenGist | Gists | ✓ |
| Others | — | skip |
gitriven gist list [username]
gitriven gist clone <id> [directory]
gitriven gist create [--public|--private]
gitriven gist delete <id>
gitriven gist search <query>
gitriven gist edit <id>gitriven ci status # CI status for current branch
gitriven ci logs [run-id] # stream CI logs
gitriven ci retry [run-id] # re-trigger failed run
gitriven ci wait # block until CI completes
gitriven ci cancel [run-id]
gitriven ci badge # generate markdown badgegitriven run list
gitriven run view <id>
gitriven run watch <id> # live tail
gitriven run rerun <id>
gitriven run cancel <id>gitriven release create <version> executes a full pipeline:
- Validate version (semver, no duplicates)
- Run pre-release checks (tests, format, lint) if configured
- Generate changelog from conventional commits
- Bump version in project files (auto-detected: Cargo.toml, package.json, pyproject.toml, etc.)
- Update third-party licenses in LICENSE.md
- Commit version bump
- Create signed tag
- Push commit + tag
- Create release on provider with changelog as release notes
- Attach SBOM if configured
- Tag and push container image if configured
- Trigger release workflow if configured
gitriven release dry-run <version> # preview without executing
gitriven release undo # revert release# .gitriven/release.toml
[release]
version_files = ["Cargo.toml", "package.json"]
changelog = true
sbom = true
sign = true
tests = "cargo test"
pre_release = ["cargo fmt --check", "cargo clippy"]gitriven deploy <environment>
gitriven deploy status
gitriven deploy rollback# .gitriven/deploy.toml
[[environments]]
name = "staging"
branch = "staging"
webhook = "https://deploy.example.com/staging"
[[environments]]
name = "production"
branch = "main"
tag_pattern = "v*"
webhook = "https://deploy.example.com/production"
require_ci_pass = truegitriven branches --stale # merged to main but not deleted
gitriven branches --orphan # no remote tracking
gitriven branches --cleanup # interactive cleanup
gitriven branches --age # sort by last activity
gitriven branches compare # ahead/behind matrix
gitriven branches graph # ASCII topology visualization
gitriven branches divergence <a> <b> # detailed divergence analysis# .gitriven/config.toml
[branches]
pattern = "^(feature|bugfix|hotfix|release|chore)/[a-z0-9-]+$"
protected = ["main", "master", "develop", "release/*"]
max_age_days = 90
require_issue = falsegitriven branch create "my branch" auto-slugifies to feature/my-branch. Reject non-matching names with clear format example.
gitriven branch rename <new-name> # updates tracking, open PRs (via API), local refsDirect commit to protected branch: warning + confirmation (interactive), block (non-interactive). Force push to protected branch: requires --force-confirmed. Delete protected branch: requires explicit confirmation. Override: --no-protect.
gitriven archive branch <branch> # tag tip, delete branch, record metadata
gitriven archive restore <branch> # bring back from tag
gitriven archive list # show archived branches- Every stash auto-named:
feature/auth: modified auth.rs, config.toml gitriven stashwith no args stashes everything including untrackedgitriven stash list— meaningful names, age, branch, file countgitriven stash show <name-or-index>— preview diffgitriven stash apply <name>— apply by name not just index- Stash expiry warning: stashes older than 30 days flagged in health check
- Cross-repo visibility:
gitriven --recursive ~/Projects stash list
gitriven worktree create <branch> # sane default location: ../{repo}-{branch}/
gitriven worktree list # all worktrees with branch, status, dirty/clean
gitriven worktree remove <branch>
gitriven worktree switch <branch> # cd into worktree (shell integration)Auto-suggest worktree when checking out branch with uncommitted work.
- On clone: always recursive init + checkout. No missing submodule directories.
- On pull: auto-update submodules if pointers changed. No separate
git submodule updatestep. - On checkout/switch: auto-sync submodule state.
- On status: submodule dirty state always shown inline.
- On commit: warn if submodule has changes but pointer not updated.
- On push: detect and block if submodule commit not pushed to its remote.
- Submodule URL dead: report which failed, complete rest of clone.
- Submodule pointing at nonexistent commit:
gitriven healthflags it.gitriven sub repairattempts resolution. - Nested submodules: recursive with configurable depth limit (default: 10).
gitriven sub add <repo> [path]
gitriven sub update
gitriven sub status
gitriven sub sync # init + update + foreach pull in one
gitriven sub remove <path> # full removal (deinit, rm, .gitmodules, .git/modules)
gitriven sub repairgitriven subtree add <repo> <prefix> [--branch]
gitriven subtree pull <prefix>
gitriven subtree push <prefix>
gitriven subtree list
gitriven subtree split <prefix> # extract directory into own repoTracks relationships in .gitriven/config.toml so user doesn't need to remember remote URL and prefix.
- On commit: scan staged files against size threshold (default: 50MB). If exceeded, auto-track in
.gitattributesand commit via LFS. One-line notice in output. - On clone: always fetch LFS objects. No
git lfs installdance, nogit lfs pullafter clone. Actual files, not pointer stubs. - On pull: LFS objects fetched inline. No separate step.
- Retroactive:
gitriven healthflags large files in history.gitriven lfs migrate <pattern>rewrites history.
gitriven lfs track <pattern>
gitriven lfs status
gitriven lfs migrate <pattern>
gitriven lfs prune[lfs]
auto = true
threshold = "50MB"
always_fetch = true
patterns = ["*.bin", "*.model", "*.weights"]Override: --no-lfs on any command.
Encrypted SQLite database at {data}/credentials.db. Single source of truth for all sensitive data.
Stores:
- API tokens per provider
- GPG/SSH signing key passphrases
- HTTP/HTTPS credentials per remote
- OAuth refresh tokens
- SSH key passphrases
- Profile-specific credentials
- SMTP credentials
- Container registry credentials
Encryption: AES-256-GCM, master key derived via Argon2id from user passphrase. Master passphrase cached in OS keychain (macOS Keychain, Linux libsecret/kwallet, Windows Credential Manager). Fallback: configurable TTL memory cache (default: 8h) via lightweight background agent.
CREATE TABLE credentials (
id INTEGER PRIMARY KEY,
type TEXT NOT NULL, -- api_token, signing_passphrase, http_auth, oauth, ssh_passphrase, smtp, registry
provider TEXT, -- github, gitlab, gitea, etc.
profile TEXT, -- profile name (NULL for default)
server TEXT, -- hostname for self-hosted
username TEXT,
secret BLOB NOT NULL, -- encrypted
scopes TEXT,
expires_at TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
notes TEXT
);gitriven registers itself as a git credential helper:
[credential]
helper = gitriven credential-helperSpeaks standard git credential protocol (get/store/erase on stdin/stdout), reads from encrypted database. gitriven setup auto-configures this.
- Track expiration, warn before expiry
gitriven auth status— metadata only, secrets never displayedgitriven doctorchecks token validity and scopes
--no-credential-db global flag skips database entirely (pure env var mode).
If signing is configured in any config source (repo, global, gitriven config, or credentials database), every commit and tag is signed automatically. No flag needed, no prompt. If key requires passphrase and it's stored in credentials database, unlocked automatically.
gitriven sign setup # interactive: detect keys, create if needed, configureRecommends SSH signing as default (no GPG dependency, uses existing keys). Supports both GPG and SSH.
Multiple signing keys tied to profiles. Work profile uses work key, personal uses personal — auto-selected based on repo remote URL via identity config.
- Detect secrets/credentials in staged files before commit
- Built-in patterns: AWS, GitHub, GitLab, Stripe, Slack, generic API keys, private keys, connection strings
- Block commit by default if secrets detected
- Override:
--allow-secrets gitriven security scan— scan full history for leaked secrets- Runs as pre-commit hook, also part of pre-flight checks
gitriven encrypt track "*.env" "secrets/*.yaml"
gitriven encrypt add-key <user> <public-key>
gitriven encrypt statusFiles encrypted on commit, decrypted on checkout via clean/smudge filters. Key management via credentials database. Compatible with standard git (.gitattributes integration).
gitriven does not guess. If a config file exists, that tool is relevant. If not, skip.
| Config File | Tool |
|---|---|
.shellcheckrc |
shellcheck |
.eslintrc / eslint.config.js / eslint.config.mjs |
eslint |
.prettierrc / prettier.config.js |
prettier |
.stylelintrc / stylelint.config.js |
stylelint |
.markdownlint.json / .markdownlintrc |
markdownlint |
.yamllint / .yamllint.yml |
yamllint |
.htmlhintrc |
htmlhint |
.editorconfig |
editorconfig (whitespace rules) |
.clang-format |
clang-format |
.clang-tidy |
clang-tidy |
rustfmt.toml / .rustfmt.toml |
rustfmt |
clippy.toml / .clippy.toml |
clippy |
.rubocop.yml |
rubocop |
.flake8 / setup.cfg [flake8] |
flake8 |
pyproject.toml [tool.black] |
black |
pyproject.toml [tool.isort] |
isort |
pyproject.toml [tool.mypy] |
mypy |
pyproject.toml [tool.ruff] |
ruff |
.pylintrc / pyproject.toml [tool.pylint] |
pylint |
.php-cs-fixer.php / .php-cs-fixer.dist.php |
php-cs-fixer |
phpstan.neon / phpstan.neon.dist |
phpstan |
.golangci.yml / .golangci.yaml |
golangci-lint |
.hadolint.yaml |
hadolint |
.tflint.hcl |
tflint |
.sqlfluff |
sqlfluff |
biome.json / biome.jsonc |
biome |
deno.json / deno.jsonc |
deno fmt/lint |
.swiftlint.yml |
swiftlint |
.swiftformat |
swiftformat |
.ktlint |
ktlint |
detekt.yml |
detekt |
.credo.exs |
credo |
checkstyle.xml |
checkstyle |
- Only staged files, never unstaged work
- Formatters first (modify), then linters (report)
- If formatter changes a file, auto-restage
- Linter errors = warnings by default, configurable to block
- Multi-project repos: per-directory detection
- Tool not installed → one-time suggestion, never nag
- Project's config files are the source of truth (respects
.prettierrcsettings, etc.)
gitriven format check # dry run
gitriven format run # format staged files
gitriven format run --all # format entire repo
gitriven format install # suggest/install missing formatters
gitriven lint # lint staged files
gitriven lint --all # lint entire repo# .gitriven/format.toml
[format]
enabled = true
on_commit = true
staged_only = true
[format.overrides]
"*.min.js" = false
"vendor/*" = false
"*.generated.*" = false
[lint]
enabled = true
block_on_error = false
block_on_warning = falseShip with binary — no external dependencies:
- Lint check
- Conventional commit validation
- Secret scanning
- Large file detection
- WIP commit blocking
- Branch naming enforcement
- Conflict marker detection
- No-debug-statements check
- No-console-log check
- Require-tests-changed check
gitriven hooks add pre-commit --lint rust
gitriven hooks add commit-msg --conventional
gitriven hooks add pre-push --no-wip
gitriven hooks init # recommended hooks for detected project type
gitriven hooks list
gitriven hooks browse # browse available templates
gitriven hooks install <name> # install community hook
gitriven hooks export <name> # share as TOML config- Hooks run in parallel where possible
- Hook execution time tracked — surface slow hooks
.gitriven/hooks.tomlfor team-shared config, auto-applied on clone
gitriven health # full scan and reportChecks:
- Dangling objects, broken refs
- Oversized files in history (size + introducing commit)
- Stale branches (merged but not deleted, inactive)
- Missing .gitignore entries (tracked build artifacts)
- Submodule status
- Repo size breakdown (packfile efficiency, loose objects)
- Stale stashes (older than 30 days)
- Secrets in history
- Dependency vulnerabilities
- CODEOWNERS staleness
- Suggested maintenance actions
gitriven health score # 0-100 score
gitriven health report # detailed breakdown
gitriven health badge # generate badge for README
gitriven health history # score over time
gitriven health score --workspace casapps # average across workspaceScoring (configurable weights):
| Check | Points |
|---|---|
| Has .gitignore | +5 |
| Has LICENSE.md | +5 |
| Has README.md | +5 |
| Has CI configured | +10 |
| All commits signed | +10 |
| No secrets in history | +10 |
| No oversized files outside LFS | +10 |
| Branch hygiene | +10 |
| Dependencies up to date | +10 |
| No known vulnerabilities | +10 |
| Has .editorconfig | +5 |
| Commit message quality | +10 |
gitriven ignore add <templates...> # section-aware merge, duplicate filtering
gitriven ignore save <templates...> # create fresh .gitignore
gitriven ignore list # browse available templates
gitriven ignore search <query> # search templates
gitriven ignore update # refresh local cache
gitriven ignore console <templates...> # preview without writing
gitriven ignore --check # scan for tracked files that should be ignoredShips GitHub's gitignore collection embedded in binary. Falls back to gitignore.io API. Local template directory: {config}/templates/ignore/.
gitriven attrs init # generate from project detection
gitriven attrs add <pattern> <attributes>
gitriven attrs check # validate, flag missing entries
gitriven attrs linguist # show/override language statsgitriven license set MIT # generates/updates top section of LICENSE.md
gitriven license list # show available templatesBuilt-in templates: MIT, Apache-2.0, GPL-3.0, BSD-2-Clause, BSD-3-Clause, ISC, MPL-2.0, LGPL, AGPL, Unlicense, WTFPL.
gitriven license third-party # update third-party section in LICENSE.md
gitriven license check # verify all deps have identifiable licenses
gitriven license scan # list all dependency licenses, flag issues
gitriven license compatibility # advisory reportEverything goes in one file: LICENSE.md. Top section = your license. Bottom section = third-party attributions. Deduplicated on every update — keyed by package name. Runs automatically as part of gitriven release create.
# License
MIT License
Copyright (c) 2026 Jason Hempstead
[full license text]
---
# Third-Party Licenses
## clap (MIT/Apache-2.0)
Copyright (c) ...
## serde (MIT/Apache-2.0)
Copyright (c) ...Built-in templates embedded in binary, generated on demand with project-specific details auto-filled.
gitriven community init # generate all community files
gitriven community init --only contributing
gitriven community update # regenerate, preserve customizations.github/ # or .gitea/ .forgejo/ .gitlab/
├── CONTRIBUTING.md
├── CODE_OF_CONDUCT.md # Contributor Covenant v2.1
├── SECURITY.md
├── FUNDING.yml # provider-specific format
├── ISSUE_TEMPLATE/
│ ├── bug_report.md
│ └── feature_request.md
└── PULL_REQUEST_TEMPLATE.md
Templates use markers for generated vs custom sections:
<!-- gitriven:start:development-setup -->
## Development Setup
1. Clone the repo
2. Run `cargo build`
<!-- gitriven:end:development-setup -->
## Our Custom Section
This was written by the team and won't be touched by gitriven.gitriven community update only regenerates content between markers.
Project name, maintainer name/email, license type, default branch, project type, build/test/lint commands, supported versions, repo URL, issue tracker URL — all detected automatically from config and project files.
gitriven new <name> --type rust|node|python|go|docker
gitriven new <name> --template <template-name>
gitriven template list
gitriven template create <name> # save current repo as templateproject/
├── .git/
├── .gitriven/
│ └── config.toml
├── .github/ # or .gitea/ etc — provider-detected
│ └── workflows/
│ └── ci.yml
├── .editorconfig
├── .gitignore
├── src/
│ └── main.rs
├── Cargo.toml
├── LICENSE.md
└── README.md
Minimal. Every file has a reason. Provider directory auto-detected from configured default provider. CI stub appropriate for project type. Repo created on remote and pushed in one command.
gitriven changelog # auto-generate from conventional commits
gitriven changelog --since <tag> # since last releaseGroups by type: Features, Fixes, Breaking Changes, Performance, etc. Auto-runs during gitriven release create.
# .gitriven/changelog.toml
[changelog]
categories = ["feat", "fix", "breaking", "perf", "docs"]
exclude_scopes = ["deps"]
header = "# Changelog"gitriven docs contributors # generate CONTRIBUTORS section from git history
gitriven docs changelog # CHANGELOG.md as maintained file
gitriven docs setup # README.md skeleton from project detection
gitriven docs licenses # THIRD-PARTY section in LICENSE.md
gitriven docs stats # repo metricsgitriven audit # scan lockfile against vulnerability databases
gitriven audit update # refresh vulnerability databaseSupports: Cargo.lock, package-lock.json, yarn.lock, Gemfile.lock, requirements.txt, go.sum, composer.lock. Data source: OSV (Open Source Vulnerabilities).
gitriven deps tree # dependency tree
gitriven deps why <package> # why is this included
gitriven deps outdated # packages with newer versions
gitriven deps diff # dependency changes between commits/branchesWhen a lockfile changes on pull, show human-readable summary: "upgraded lodash 4.17.20 → 4.17.21, added express@4.18.2, removed moment" instead of raw lockfile diff.
gitriven sbom generate # SPDX or CycloneDX format
gitriven sbom verify # validate against repo stategitriven migrate <source> <dest> --from github --to gitea
gitriven migrate --user <username> --from github --to gitea [--all-orgs]Migrates: code, branches, tags, releases, issues, PRs/MRs, wikis, labels. Maps references (PRs → MRs, labels, issue numbers where possible). Preserves commit history and branch structure.
gitriven mirror add <source> <dest>
gitriven mirror sync
gitriven mirror sync --continuous # background daemon
gitriven mirror listOne-to-many: one source mirrored to multiple destinations. Stored in .gitriven/mirrors.toml (per-repo) or {config}/mirrors.toml (global).
gitriven archive <owner/repo> # full backup: branches, tags, LFS, submodules, wiki, issues, releases
gitriven archive --user <name> [--all-orgs]
gitriven archive restore <bundle>Output: git bundle + metadata JSON + LFS objects in a single tar.gz.
gitriven archive branch <branch> [--before <date>]
gitriven archive commits --before <date> --keep-merges
gitriven archive restore <branch>
gitriven archive list- Auto-retry on transient failures (configurable retries + exponential backoff)
- Resume interrupted clones/fetches
- Bandwidth estimation and ETA
- Connection pooling for recursive operations
gitriven doctorComprehensive check: SSH key loaded? SSH connection works? HTTPS credentials valid? Proxy configured? DNS resolving? Token expired? Token has required scopes? Per-provider health status.
Auto-runs relevant checks when any network operation fails.
- Queue push operations when no network
- Execute queued operations when connection returns
gitriven sync— push all queued, pull all remotes, update all submodulesgitriven offline status— show queuegitriven prefetch— aggressively cache for upcoming offline period
gitriven search code "fn main" --recursive ~/Projects
gitriven search code "TODO" --workspace casapps
gitriven search code "api_key" --all
gitriven search files "*.toml" --recursive ~/Projects
gitriven search commits "breaking change" --recursive ~/ProjectsBuilt-in ripgrep-style regex engine. Indexed for speed.
gitriven search code <query> [--repo] [--language]
gitriven search repos <query> [--language] [--sort stars|forks|updated]
gitriven search issues <query> [--state] [--label]gitriven log --query "author:jason since:last-week files:*.rs"
gitriven log --query "message:fix NOT message:merge"
gitriven log --query "changed:src/auth/ since:v1.0.0 until:v2.0.0"
gitriven log --query "additions:>100 author:jason"
gitriven log --query "merge branch:feature/*"Translates to correct git log flags internally.
Natural language dates: "yesterday", "last friday", "last week", "today".
gitriven log --since "yesterday"
gitriven diff @{last week}gitriven blame <file> # color-coded by age
gitriven blame <file> --ignore-whitespace
gitriven blame <file> --ignore-revs-file # auto-detect bulk reformat commits
gitriven blame <file> --history <line-range>gitriven why <file> <line> # full chain: who, what commit, what PR, what issue
gitriven who <path> # primary maintainer by commit frequency/recency
gitriven impact <commit> # downstream impact: follow-up fixes, reverts
gitriven depends <commit> # child commits in DAG
gitriven depends --cherry-pick-safe <commit>gitriven history <file> # complete history including renames
gitriven history <file> --follow-copies- Moved code detection (not delete + add, but "moved from line X to line Y")
- Refactored function detection
- Whitespace change collapsing (separate from logic changes)
- Semantic diff for supported languages
- All in CLI, TUI, and GUI
gitriven diff stat # summary across repo
gitriven diff between <branch1> <branch2> # cleaner syntax
gitriven diff share # upload to gist provider, return URL
gitriven diff share <commit-range>
gitriven diff export <file> # standalone HTML with syntax highlighting, no JS
gitriven diff email <address> # send via SMTPFor common formats, show metadata instead of "binary files differ":
- Images: dimensions changed, file size delta
- PDFs: text content diff
- SQLite: schema and row count diff
- Archives: file listing diff
gitriven graph # ASCII commit graph with branch topology
gitriven graph --branches # branch topology onlygitriven bisect auto <test-command> # fully automated
gitriven bisect auto <test-command> --parallel
gitriven bisect blame <test-command> # find commit AND specific file/function
gitriven bisect visual # TUI/GUI progress on commit graph
gitriven bisect save / resume / replaygitriven stats # contribution summary
gitriven stats --author <name>
gitriven stats --files # hotspots (most-changed files)
gitriven stats --churn # instability indicator
gitriven activity # commit frequency graph
gitriven activity --author <name>
gitriven activity --files # file-level heatmap
gitriven activity --team # cross-repo in workspaceVisual charts in TUI/GUI.
gitriven size # breakdown: packfiles, loose objects, LFS, worktrees
gitriven size --history # what's taking space in history
gitriven clean # guided cleanup
gitriven clean --aggressive # full repack with max compression
gitriven clean --filter <path> # rewrite history to remove file (BFG-style)gitriven sparse add <path>
gitriven sparse remove <path>
gitriven sparse list
gitriven sparse resetCone mode by default. Combined with auto-shallow for massive monorepos.
- Auto-shallow for repos over configurable size threshold
gitriven deepen [N]— fetch more historygitriven unshallow— convert to full clone- Auto-deepen when operation needs unavailable history (blame, bisect)
gitriven bundle create <file>
gitriven bundle verify <file>
gitriven bundle apply <file>
gitriven bundle create --incremental --since <commit>For offline repo transfer / air-gapped environments.
gitriven patch create [commits]
gitriven patch apply <file|url>
gitriven patch send <email> # format and send via SMTPLighter than commit, heavier than stash. Local-only, auto-expires, never pushed.
gitriven checkpoint "before refactor"
gitriven checkpoint --list
gitriven checkpoint restore "before refactor"Remote-backed WIP saves:
gitriven draft "wip: trying new approach" # commit to drafts/{branch}/{timestamp} ref
gitriven draft list
gitriven draft restore <id>
gitriven draft cleangitriven timer start
gitriven timer stop
gitriven timer status
gitriven timer report [--since "last week"]Auto-stop on branch switch, auto-start on switch back. Stored locally, never pushed. Optional trailer: Time-spent: 2h15m.
gitriven snippet save <name>
gitriven snippet list
gitriven snippet apply <name>
gitriven snippet share <name> # push to gistStored in {data}/snippets/.
gitriven dotfiles init <repo>
gitriven dotfiles track <file> # move to repo, symlink back
gitriven dotfiles sync
gitriven dotfiles bootstrap # new machine: clone + create all symlinks
gitriven dotfiles list
gitriven dotfiles untrack <file>Supports multiple dotfile repos (personal, work, machine-specific).
gitriven workspace create <name>
gitriven workspace add <repo-path>
gitriven workspace status
gitriven workspace pull|push|commit
gitriven workspace switch <name>Curated set of repos, not "everything under a directory". Stored in {config}/workspaces.toml.
gitriven repos # index all repos across providers + local
gitriven repos search <query> # fuzzy search
gitriven repos where <name> # find which provider/directory
gitriven repos update # refresh indexLocal index in {data}/repos.db.
gitriven pin <path-or-name>
gitriven pin list
gitriven pin remove <name>
gitriven cd <pinned-name> # jump to repoFor related repos that aren't submodules:
# .gitriven/linked.toml
[[linked]]
name = "cashost-docs"
repo = "casapps/cashost-docs"
path = "../cashost-docs"
[[linked]]
name = "cashost-ui"
repo = "casapps/cashost-ui"
path = "../cashost-ui"gitriven linked clone
gitriven linked status
gitriven linked pull|pushgitriven feature start <name>
gitriven feature status
gitriven feature finish # merge PR, delete branch, close issue, update changelog
gitriven feature listNot git-flow — no rigid model. Just awareness of feature lifecycle.
gitriven stack create <name>
gitriven stack push # add current branch as next layer
gitriven stack list
gitriven stack rebase # rebase entire stack
gitriven stack submit # create chained PRs
gitriven stack sync # update all PRs after rebase# {config}/profiles.toml
[[identity]]
match = "~/Projects/github/work-org/*"
user = "Jason Hempstead"
email = "jason@work.com"
signing_key = "~/.ssh/work_ed25519"
token_profile = "work-github"
[[identity]]
match = "~/Projects/github/jason/*"
user = "Jason"
email = "jason@casjaysdev.pro"
signing_key = "~/.ssh/personal_ed25519"
token_profile = "personal-github"Auto-switch based on directory pattern. Zero manual switching.
gitriven profile list
gitriven profile create <name> --user "Name" --email "email" --signing-key "key"
gitriven profile switch <name>
gitriven profile auto # auto-select from remote URL patternsgitriven env init # copy .env.example to .env, prompt for values
gitriven env check # verify .env has all keys from .env.example
gitriven env diff # missing keys (onboarding help)
gitriven env encrypt # encrypt .env in-repo.env auto-added to .gitignore if not already there.
gitriven watch <branch> # alert when remote diverges from yours
gitriven lock <file> # advisory lock (not enforced)Periodic notification on long-lived branches: "main has 47 new commits since you branched."
# .gitriven/config.toml
[preflight.push]
checks = ["secrets", "lint", "no-wip"]
[preflight.merge]
checks = ["ci-pass", "no-conflicts", "branch-current"]
[preflight.release]
checks = ["tests", "audit", "changelog", "version-bump"]gitriven preflight # run checks manuallyChecks run in parallel where possible.
gitriven risk # assess staged/committed changes
gitriven risk --pr <number>Factors: files changed count, lines changed, hot paths, critical files, new dependencies, CI/deploy config changes. Output: low/medium/high with reasoning.
# .gitriven/policy.toml
[policy]
require_signed_commits = true
require_conventional_commits = true
require_pr_for_protected_branches = true
max_commit_size_mb = 10
forbidden_files = ["*.env", "*.pem", "*.key", "id_rsa"]
required_files = ["README.md", "LICENSE.md", ".gitignore"]
min_reviewers = 1
branch_naming = "^(feature|fix|hotfix|release|chore)/[a-z0-9-]+$"
max_branch_age_days = 90gitriven policy check
gitriven policy enforce # set up hooksOrg-level policy in {config}/policy.toml applies as baseline. Per-repo can be stricter but not looser.
gitriven audit log [--since <date>] # full operation audit trail
gitriven audit verify <commit-range> # verify signature chain
gitriven audit export # JSON, CSV
gitriven audit policy # check repo against policyDetects:
- Force pushes to shared branches
- Uncommonly large commits
- Binary files that shouldn't be binary
- Commits with future timestamps
- Unsigned commits in normally-signed repo
- Unusual author identities
Runs as part of gitriven health and pre-push check. All logic-based, no AI.
- Auto-gc: intelligent garbage collection triggered by conditions, not timers
- Auto-repack: optimize packfiles during idle
- Commit graph maintenance
- Multi-pack index maintenance
- Prefetch: background fetch from remotes on schedule
- Never blocks the user
gitriven maintenance status
gitriven maintenance rungitriven schedule add "pull --recursive ~/Projects" --every 1h
gitriven schedule add "health" --every 1d
gitriven schedule add "maintenance run" --every 6h
gitriven schedule list
gitriven schedule remove <id>Lightweight background daemon or system cron/systemd/launchd integration.
gitriven inbox # all notifications across providers
gitriven inbox --unread
gitriven inbox mark-read [id|--all]
gitriven inbox watch <owner/repo>Desktop notifications when long operations complete or review requests arrive. Configurable threshold.
gitriven shell install # install hooks for bash/zsh/fish
gitriven shell completions bash|zsh|fish
gitriven cd <repo-name> # fuzzy-find and jump to repoFeatures:
- Prompt integration (branch, dirty state, ahead/behind)
- Auto-fetch on directory enter (background, non-blocking, with cooldown interval)
- Tab completions (generated by clap)
Drop a script or binary in {data}/commands/ — it becomes a subcommand. gitriven <custom-name> runs it with gitriven's environment.
.gitriven/commands/ in repo for team-shared custom commands.
gitriven pair start
gitriven pair join <session-id>
gitriven pair share <session-id>
gitriven pair record # asciinema-compatible recordingAuto-add co-author trailers during pair sessions.
gitriven container list [registry]
gitriven container tag <image> <tag>
gitriven container delete <image:tag>
gitriven container prune <image> --keep 5Supports: Docker Hub, GHCR, Harbor, GitLab Registry, Gitea Registry, any OCI-compatible. Ties into release workflow.
gitriven version next # auto-determine from conventional commits
gitriven version check # verify consistency across all version files
gitriven version history # version timeline with changelogs
gitriven version set <version> # update all detected files
gitriven version next --pre alpha # pre-release: 1.2.0-alpha.1
gitriven version stamp # embed version info for builds
gitriven version bump [major|minor|patch]gitriven impact <commit-range> # map changed files to affected tests
gitriven test suggest # suggest tests based on staged changesMapping: import analysis, naming conventions, explicit config.
- Auto-detect migration directories
- Warn on pull if new migrations detected
- Flag migration sequence conflicts on merge
gitriven migrations listgitriven migrations check— verify sequence integrity
gitriven debug push|pull|clone <url> # full protocol trace
gitriven debug remote <name> # test connectivity
gitriven debug ssh <host> # SSH diagnosticsHuman-readable output: DNS, TCP, TLS, SSH negotiation, git protocol, pack negotiation, transfer stats.
gitriven inspect object <sha>
gitriven inspect packfile
gitriven inspect refs
gitriven inspect index
gitriven inspect fsck
gitriven inspect config # merged config with origin labelsDefault interface. clap-based argument parsing with full git command compatibility.
- Progress bars via indicatif for long operations
- Color output when TTY detected
--no-colorflag for plain output--verbosefor detailed output--quietfor minimal output
lazygit-inspired. Built with ratatui + crossterm.
| Key | Panel |
|---|---|
| 1 | Status |
| 2 | Log |
| 3 | Diff |
| 4 | Branches |
| 5 | Stash |
| 6 | Remotes |
| Key | Action |
|---|---|
| Space | Stage/unstage |
| Tab | Into diff for hunk staging |
| c | Commit |
| P | Push |
| p | Pull |
| b | Create branch |
| r | Interactive rebase |
| s | Stash |
| / | Search |
| q | Quit |
- Real-time file watcher
- Inline diff preview
- Commit message editor
- Progress bars
- Brand color scheme (teal/amber)
- Notifications panel
- Dependency graph visualization
GitKraken-inspired. Built with egui/eframe.
- Commit graph renderer
- Visual staging panel
- History panel with search
- Diff viewer with syntax highlighting
- Branch/tag sidebar
- Remote operations panel
- Brand color scheme
Default: web only. gitriven serve starts HTTP server.
First run: scan 65000-65535, find unused port, save to config. Subsequent: use saved port. If saved port in use: find new, update config. Override: --port <n>.
| Path | Handler |
|---|---|
/api/v1/... |
Gitea-compatible REST API |
/{owner}/{repo} |
Web repo browser |
/{owner}/{repo}.git/... |
Smart HTTP git protocol (push/pull) |
/{owner} |
Repo list for owner |
/ |
Owner list (index page) |
Two levels max from root. dirname = owner, basename = repo.
{root}/
├── jason/
│ ├── gitriven/ → /jason/gitriven
│ └── casfinance/ → /jason/casfinance
├── casapps/
│ ├── cashost/ → /casapps/cashost
│ └── casdash/ → /casapps/casdash
Only api. If a directory named api exists at root, warn on startup — system routes take precedence, conflicting directory skipped.
[[httpd.roots]]
path = "~/Projects/github"
prefix = "github"
[[httpd.roots]]
path = "~/Projects/gitea"
prefix = "gitea"gitriven serve --enable-ssh # enables, finds port, saves to config
gitriven serve --enable-git
gitriven serve --info # print config without startinggitriven server started
Web: http://localhost:65042
With SSH/git enabled:
gitriven server started
Web: http://localhost:65042
SSH: ssh://localhost:65043
Git: git://localhost:65044
Opt-in via config. Embedded SSH server for push/pull over SSH.
[sshd]
enabled = false
port = 65043
host_key = ""
authorized_keys = ""Opt-in via config. Native git protocol (fast, no auth).
[gitd]
enabled = false
port = 65044
export_all = false- Pure HTML5 and CSS. Zero JavaScript.
- Semantic HTML5 elements throughout
- CSS-only interactivity (
<details>/<summary>,:target, checkbox hack) - Mobile-first responsive design
- WCAG 2.1 AA accessible
- Progressive enhancement (works with CSS disabled)
- Server-side rendering only
- All templates and CSS embedded in binary
Three modes: auto (system), dark, light.
auto:@media (prefers-color-scheme: dark)media query- Manual:
?theme=dark|lightquery param, server sets cookie +data-themeattribute - Toggle is plain
<a>links, no JS
CSS custom properties with brand colors:
:root {
--bg-primary: #ffffff;
--accent: #2cada8; /* teal */
--accent-secondary: #e8922f; /* amber */
/* ... */
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--bg-primary: #0d1117;
/* ... */
}
}System font stack — no web fonts:
- Sans:
-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif - Mono:
ui-monospace, "Cascadia Code", "Source Code Pro", Menlo, Consolas, "DejaVu Sans Mono", monospace
Partials (reusable fragments):
_header.html— doctype, head, meta, embedded CSS, top bar_nav.html— breadcrumb navigation_search.html— search form_footer.html— footer with version info_pagination.html— prev/next links_branch_selector.html— branch/tag dropdown (<details>/<summary>)_clone_urls.html— clone URL display_commit_row.html— single commit entry_diff_hunk.html— diff hunk block_repo_card.html— repo card for listings_theme_toggle.html— dark/light/auto links_empty_state.html— friendly empty message
Templates (full pages, include partials):
| Template | URL Pattern |
|---|---|
index.html |
/ |
owner.html |
/{owner} |
repo.html |
/{owner}/{repo} |
tree.html |
/{owner}/{repo}/tree/{branch}/{path} |
blob.html |
/{owner}/{repo}/blob/{branch}/{path} |
commits.html |
/{owner}/{repo}/commits/{branch} |
commit.html |
/{owner}/{repo}/commit/{sha} |
branches.html |
/{owner}/{repo}/branches |
tags.html |
/{owner}/{repo}/tags |
blame.html |
/{owner}/{repo}/blame/{branch}/{path} |
compare.html |
/{owner}/{repo}/compare/{base}...{head} |
search_results.html |
/{owner}/{repo}/search |
error.html |
(404, 500, etc.) |
Special URLs:
/{owner}/{repo}/raw/{branch}/{path}— raw file download/{owner}/{repo}/archive/{ref}.tar.gz— archive download
| Feature | HTML5/CSS Solution |
|---|---|
| Collapsible file trees | <details> / <summary> |
| Tab switching | :target selector |
| Mobile menu toggle | Checkbox hack |
| Theme switching | Server cookie + data-theme |
| Search | <form> submit |
| Pagination | <a> links with query params |
| Sort columns | Links with ?sort=&order= |
| Syntax highlighting | Server-side syntect, CSS classes |
| Line number linking | id per line, :target highlights |
| Tooltips | CSS :hover + ::after + data- attributes |
| Modals | <dialog> via :target |
| Sticky header | position: sticky |
| Code word wrap toggle | Checkbox hack + white-space |
| Expandable content | <details> / <summary> |
- Side-by-side on desktop (CSS grid), unified on mobile
- Line numbers via
data-attributes + CSS::before - Syntax highlighting via server-side syntect
- Expandable context via
<details>
- Single HTML document per page (CSS inline in
<head>) - No external requests
- Syntax highlighting server-side
- No web fonts
- Only inline SVG: gitriven logo
- Pages load in milliseconds (server is local)
Exposed at /api/v1/. Any tool that talks to Gitea works with gitriven's server.
/api/v1/repos/ # list repos
/api/v1/repos/{owner}/{repo} # repo details
/api/v1/repos/{owner}/{repo}/branches # branches
/api/v1/repos/{owner}/{repo}/tags # tags
/api/v1/repos/{owner}/{repo}/commits # commit history
/api/v1/repos/{owner}/{repo}/contents/ # file contents
/api/v1/repos/{owner}/{repo}/raw/ # raw file access
/api/v1/repos/{owner}/{repo}/archive/ # download archive
/api/v1/repos/{owner}/{repo}/git/refs # git references
/api/v1/repos/{owner}/{repo}/git/trees # tree objects
/api/v1/repos/{owner}/{repo}/git/blobs # blob objects
/api/v1/repos/{owner}/{repo}/compare/ # compare
/api/v1/repos/{owner}/{repo}/hooks # webhooks
/api/v1/repos/search # search
/api/v1/user # authenticated user
/api/v1/users/{username} # user info
/api/v1/users/{username}/repos # user repos
/api/v1/orgs/ # organizations
/api/v1/orgs/{org}/repos # org repos
/api/v1/version # API version
/api/v1/settings/api # server capabilities
Implemented: repos, branches, tags, refs, commits, trees, blobs, contents, raw, archives, compare, webhooks, user/org, search, create/delete/modify repos.
Skipped (not applicable): issues, PRs, milestones, labels, teams, permissions, OAuth, admin, package registry.
[httpd]
api = true
api_token = ""
api_readonly = false
[httpd.repos]
root = "/srv/git"
create_allowed = true
delete_allowed = falseSwagger docs at /api/v1/swagger.
When a repo has CI config for one provider but is cloned/used on another, gitriven copies and translates.
Repo has .github/workflows/ but no .gitea/. Cloned to Gitea → copy and translate.
| Source | Destination | Effort |
|---|---|---|
.github/workflows/ |
.gitea/workflows/ |
Minimal (Gitea Actions is GitHub-compatible) |
.github/workflows/ |
.forgejo/workflows/ |
Minimal |
.github/workflows/ |
.gitlab-ci.yml |
Full syntax translation |
.gitlab-ci.yml |
.github/workflows/ |
Full |
| Any → Any | Bidirectional | Best-effort with comments for untranslatable parts |
Non-CI files also translate: CODEOWNERS, issue templates, PR templates (format differences handled).
gitriven ci translate --from github --to gitea
gitriven ci translate --from github --to all
gitriven ci diff # detect drift between configs
gitriven ci sync # re-translate from primary# .gitriven/config.toml
[ci]
primary = "github"
auto_translate = true
providers = ["gitea", "forgejo", "gitlab"]Generated files include a comment header: # Auto-generated by gitriven from .github/workflows/ — edit the primary instead.
project/
├── .github/workflows/ci.yml # primary
├── .gitea/workflows/ci.yml # auto-translated
├── .forgejo/workflows/ci.yml # auto-translated
├── .gitlab-ci.yml # auto-translated
gitriven/ (workspace root)
├── Cargo.toml (workspace definition)
├── gitriven-core/ # glue over gix + custom logic
│ ├── src/
│ └── Cargo.toml
├── gitriven-api/ # hosting platform API client
│ ├── src/
│ └── Cargo.toml
├── gitriven-cli/ # CLI argument parsing & dispatch
│ ├── src/
│ └── Cargo.toml
├── gitriven-tui/ # terminal UI (ratatui)
│ ├── src/
│ └── Cargo.toml
├── gitriven-gui/ # native GUI (egui)
│ ├── src/
│ └── Cargo.toml
├── gitriven-server/ # built-in server (axum)
│ ├── src/
│ │ ├── templates/ # embedded HTML templates
│ │ │ ├── partials/
│ │ │ └── pages/
│ │ └── style.css # embedded CSS
│ └── Cargo.toml
└── src/
└── main.rs # binary entrypoint, mode selection, multicall dispatch
| Crate | Purpose |
|---|---|
| gix | Git implementation (gitoxide ecosystem) |
| clap | CLI argument parsing + completions |
| tokio | Async runtime |
| rayon | Parallel processing |
| serde | Serialization |
| toml | Config file parsing |
| reqwest | HTTP client for API calls |
| Crate | Purpose |
|---|---|
| ratatui | TUI rendering |
| crossterm | Terminal backend |
| egui / eframe | GUI rendering |
| axum | HTTP server |
| Crate | Purpose |
|---|---|
| indicatif | Progress bars |
| syntect | Syntax highlighting |
| rusqlite | SQLite (credentials db, repo index) |
| ring / argon2 | Cryptography (credential encryption) |
| regex | Pattern matching |
| globset | Glob pattern matching |
| chrono | Date/time handling |
| dirs | Platform directory detection |
| notify | File system watcher |
See Section 4: Binary & Distribution for full binary matrix.
All builds: static linked (musl on Linux), stripped, single file, no runtime dependencies.
All four interfaces ship together:
- CLI — complete git replacement + all smart features
- TUI — interactive terminal UI
- GUI — native visual client
- Server — web browser + API + optional SSH/git protocol
Plus all features defined in this specification.
- Core git operations (gitriven-core over gix)
- CLI with all git commands
- Smart operations engine
- Commit/merge/rebase workflows
- Recursive engine
- API client + provider management
- Credentials database
- Format/lint orchestration
- Hooks system
- TUI
- Server (httpd + web UI + API)
- GUI
- All remaining features
gitriven will only create these files in the project root:
README.mdLICENSE.mdCHANGELOG.md.gitignore.gitattributes.editorconfig.gitriven/(directory).github//.gitea//.forgejo//.gitlab/(provider-specific).gitlab-ci.yml/Jenkinsfile/bitbucket-pipelines.yml(only when provider mandates root placement)
Nothing else. Root is sacred. Community files go in provider directories. Third-party licenses go in LICENSE.md. No file clutter.
| Flag | Description |
|---|---|
--cli |
Force CLI mode |
--tui |
Force TUI mode |
--gui |
Force GUI mode |
--no-tui |
Prevent TUI auto-launch |
--no-gui |
Prevent GUI auto-launch |
--no-smart |
Script-safe mode |
--smart |
Force interactive mode |
--no-color |
Plain output |
--verbose |
Detailed output |
--quiet |
Minimal output |
--no-lfs |
Skip LFS handling |
--no-submodules |
Skip submodule handling |
--no-protect |
Bypass branch protection |
--no-credential-db |
Skip credentials database |
--recursive <path> |
Multi-repo operation |
--exclude <glob> |
Exclude pattern for recursive |
--jobs <n> |
Parallelism for recursive |
--api-type <provider> |
Specify provider |
--api-server <host> |
Specify server |
gitriven serve [--port] [--enable-ssh] [--enable-git] [--info]
gitriven setup [--symlinks] [--alias] [--prefix]
gitriven auth login|status|refresh|logout|export|import
gitriven sign setup
gitriven config import|export|show|edit|team
gitriven profile list|create|switch|auto
gitriven doctor
gitriven health [score|report|badge|history]
gitriven is clean|dirty
gitriven commit all|modified|deleted|added|renamed|restored|files|spelling
gitriven commit new|improved|fixes|release|deploy|docs|test|breaking|refactor|performance|permissions|bugs
gitriven fixup
gitriven squash [N] [message]
gitriven absorb
gitriven coauthors add
gitriven merge-resolve status|show|edit|ours|theirs|abort
gitriven merge-driver add
gitriven merge-queue add
gitriven undo [--list] [--steps N]
gitriven history [search]
gitriven checkpoint [--list|restore]
gitriven draft [list|restore|clean]
gitriven repo create|delete|modify|list|visibility|view|fork|archive
gitriven org list|repos|clone|push|pull|visibility
gitriven user repos|clone|push|pull
gitriven ssh list|add|delete
gitriven release create|delete|list|dry-run|undo
gitriven pr create|list|view|checkout|merge|close|diff|review
gitriven review [comment|approve|request-changes|pending|mine]
gitriven issue list|count|create|edit
gitriven gist list|clone|create|delete|search|edit
gitriven run list|view|watch|rerun|cancel
gitriven ci status|logs|retry|wait|cancel|badge|translate|diff|sync
gitriven deploy [status|rollback]
gitriven upstream set|sync
gitriven migrate
gitriven mirror add|sync|list
gitriven ignore add|save|list|search|update|console|--check
gitriven attrs init|add|check|linguist
gitriven license set|list|third-party|check|scan|compatibility
gitriven community init|update
gitriven new [--type] [--template]
gitriven template list|create
gitriven changelog [--since]
gitriven docs contributors|changelog|setup|licenses|stats
gitriven format check|run|install
gitriven lint [--all]
gitriven hooks add|init|list|browse|install|export
gitriven security scan
gitriven encrypt track|add-key|status
gitriven audit [log|verify|export|policy|update]
gitriven sbom generate|verify
gitriven deps tree|why|outdated|diff
gitriven risk [--pr]
gitriven policy check|enforce
gitriven branches [--stale|--orphan|--cleanup|--age|compare|graph|divergence]
gitriven archive branch|commits|restore|list
gitriven worktree create|list|remove|switch
gitriven sub add|update|status|sync|remove|repair
gitriven subtree add|pull|push|list|split
gitriven lfs track|status|migrate|prune
gitriven sparse add|remove|list|reset
gitriven deepen [N]
gitriven unshallow
gitriven bundle create|verify|apply
gitriven patch create|apply|send
gitriven search code|files|commits|repos|issues
gitriven log --query
gitriven blame [--ignore-whitespace|--ignore-revs-file|--history]
gitriven why <file> <line>
gitriven who <path>
gitriven impact <commit>
gitriven depends [--reverse|--cherry-pick-safe]
gitriven diff stat|between|share|export|email
gitriven graph [--branches]
gitriven bisect auto|blame|visual|save|resume|replay
gitriven compare-repos
gitriven inspect object|packfile|refs|index|fsck|config
gitriven stats [--author|--files|--churn]
gitriven activity [--author|--files|--team]
gitriven size [--history]
gitriven clean [--aggressive|--filter]
gitriven mailmap show|duplicates|add|generate
gitriven owners show|generate|drift|coverage
gitriven version next|check|history|set|stamp|bump
gitriven timer start|stop|status|report
gitriven snippet save|list|apply|share
gitriven dotfiles init|track|sync|bootstrap|list|untrack
gitriven workspace create|add|status|pull|push|commit|switch
gitriven repos [search|where|update]
gitriven pin [list|remove]
gitriven cd <name>
gitriven linked clone|status|pull|push
gitriven feature start|status|finish|list
gitriven stack create|push|list|rebase|submit|sync
gitriven env init|check|diff|encrypt
gitriven watch <branch>
gitriven lock <file>
gitriven preflight
gitriven notifications [--unread|mark-read]
gitriven inbox [--unread|mark-read|watch]
gitriven web
gitriven shell install|completions
gitriven schedule add|list|remove
gitriven container list|tag|delete|prune
gitriven pair start|join|share|record
gitriven debug push|pull|clone|remote|ssh
gitriven sync
gitriven offline status
gitriven prefetch
gitriven preview <file> [--watch]
gitriven migrations list|check
gitriven rerere list|forget|export|import
gitriven conflict clean|check
gitriven maintenance status|run
gitriven test suggest
gitriven about
End of Specification