17 KiB
gitflow — Solution Documentation & Agent-Era Roadmap
1. What gitflow is
gitflow is a single-binary CLI agent written in Go that discovers every Git repository under a parent directory, snapshots each one's state, and presents the findings — on demand, on a schedule, or in an interactive terminal UI. When an AI provider is configured, it suggests the next concrete action for every repository that needs attention.
It operates on the user's own machine: no daemon, no central server, no telemetry. The full scan pipeline runs in-process with bounded concurrency. Every external call (git porcelain commands, AI provider HTTP requests, webhook dispatches) has a timeout and never blocks the next scan frame.
1.1 Architecture at a glance
┌─────────────────────────────────────────────────────────┐
│ CLI (cobra) — scan · watch · tui · config · completion │
├─────────────────────────────────────────────────────────┤
│ App (orchestration) │
│ discover → scan (errgroup, 8 workers) → ScanResult │
├───────────────┬───────────────┬─────────────────────────┤
│ Presenter │ AI (agent) │ Scheduler (interval loop)│
│ table / json │ OpenAI │ Webhooks (Slack/Discord) │
│ compact / TUI │ Ollama/Anthropic │ Notify (desktop) │
├───────────────┴───────────────┴─────────────────────────┤
│ Domain model (pkg/status): RepoInfo, ScanResult, Summary │
├─────────────────────────────────────────────────────────┤
│ Git porcelain wrapper (internal/git) │
│ Scanner (discovery + concurrent status) │
├─────────────────────────────────────────────────────────┤
│ Config (viper: flags > env > ~/.gitflow.yaml > defaults) │
└─────────────────────────────────────────────────────────┘
Every layer is tested in isolation (httptest for providers and webhooks, canned porcelain output for the git parser, bubbletea model tests for TUI state transitions). Cross-compilation is verified for linux/amd64, darwin/arm64, and windows/amd64.
1.2 What it does today
| Capability | How |
|---|---|
| Discover repos | filepath.WalkDir with depth limits and glob exclusions; detects working trees (.git dir or .git gitfile), bare repos (*.git dir with HEAD/objects/refs) |
| Scan status | git --porcelain=v2 --branch -z (NUL-separated, zero quoting issues), git stash list, git config --get-regexp remote.*.url; 10 s timeout per repo |
| Classify | 8 states: clean, modified, ahead, behind, diverged, detached, bare, error |
| Render | Colourised table, indented JSON, compact one-liner; dark/light theme; NO_COLOR |
| Watch | tea.Tick-driven interval loop with change detection (▲ markers, status.Changed), graceful SIGINT/SIGTERM |
| Notify | notify-send -t 30000 -u critical (persist-until-clicked, 30 s cap) or macOS osascript display notification |
| AI suggest | System prompt + status table → structured JSON; three providers (OpenAI, Ollama, Anthropic); priority-coloured output |
| AI execute | Allowlist-guarded command execution with per-command y/N confirmation |
| Custom rules | Threshold evaluator: field op value → label (e.g. behind >= 10 → stale) |
| Webhooks | Slack (Block Kit), Discord (embeds), generic JSON POST; per-webhook rate-limit + retry+backoff |
| TUI | bubbletea + lipgloss: repo list with cursor, detail pane, AI panel, countdown status bar |
| Completions | bash, zsh, fish, PowerShell via cobra generators |
1.3 Quality posture
- 13 packages, all tested with
go test -race - 77–91% line coverage across domain packages
- gofmt + go vet + golangci-lint in CI (Go 1.24 / 1.26 matrix)
- Functional-options constructors, no
init(), enum zero values asUnknown,defer Close()immediately after open
2. The agent era — from scanner to collaborator
The current tool does one thing well: observe and report. You run it, it tells you what's happening, and — when AI is enabled — it suggests what to do next. This is the "Level 1" of an agent: a contextual advisor.
Level 2 is an autonomous participant that can act within guardrails
(like --ai-execute but with richer context and a persistent memory of
what it did across scans).
Level 3 is a team-level orchestrator that understands what every developer is working on, cross-references repositories, integrates with issue trackers and CI, and proactively drives work forward — essentially a "repo ops agent" that lives alongside the team.
The following sections map the concrete features that bridge from today to that vision.
3. Extended features — the agent-era roadmap
3.1 Agent memory & statefulness
Today each scan is stateless. The change-detection map lives only for the duration of the watch session. An agent needs memory.
| Feature | Description |
|---|---|
| Scan journal | Persist each scan result (SQLite or flat JSONL) with a monotonic scan ID. Enables historic diffs: "what changed between Tuesday and today?" |
| Repo identity fingerprint | Hash remote.origin.url + branch to track the same logical repo across renames and directory moves. De-duplicate when the same repo appears at multiple paths (due to symlinks, mounts, or multiple clones). |
| Action log | Record every AI suggestion that was accepted or executed and its outcome (did the git pull succeed? Did the commit pass CI?). Feed this back into the prompt so the agent learns what worked. |
| Dwell-time thresholds | Flag a repo only after it has been modified for N scans (e.g. "dirty for 3 hours"). Suppress noise from transient in-progress work. |
| Session resumption | When watch restarts, reload the previous scan journal and continue from where it left off instead of starting from zero. |
3.2 Autonomous actions (Level 2 agent)
Today --ai-execute asks for a y/N confirmation per command. An agent
should be able to act within a declared policy — you tell it what you're
comfortable with, and it stays inside that boundary.
| Feature | Description |
|---|---|
| Policy files | .gitflow-policy.yaml per repo or per directory tree: auto_pull: true, auto_stash: true, max_push_commits: 5, require_ci_green: true. The agent checks the policy before acting. |
| Pre-flight hooks | Before executing a suggested command, run a user-defined script (pre-pull.sh) that can abort. Example: "don't pull if the VPN is down" or "don't commit if the test suite is red". |
| Post-action hooks | After a successful action, trigger a script: rebuild, re-run tests, notify the team. |
| Dry-run mode | --ai-execute --dry-run prints every command it would run without executing anything. Useful for trust-building and policy tuning. |
| Action batching | Group suggestions across repos (e.g. "pull main on these 5 repos" as a single user confirmation). |
| Rollback | If an action fails, revert to the previous state (e.g. git stash pop if a pull created a merge conflict). Record the rollback in the action log. |
3.3 Multi-repository operations
Today each repo is scanned in isolation. Many teams manage dozens or hundreds of microservices in a monorepo-adjacent layout.
| Feature | Description |
|---|---|
| Cross-repo dependency view | Parse go.mod, package.json, Cargo.toml, requirements.txt to build a dependency graph. Flag downstream repos when an upstream dependency has changed. |
| Consistent-branch operations | "Create a feat/oauth-update branch on all 12 service repos that import the auth library." The agent creates the branches, updates the dependency, and opens PRs. |
| Cross-cutting search | gitflow grep "deprecated-call" --all-repos — search across every repo with a single command. |
| Bulk status dashboards | A grouped view by team, by project, by technology stack. Surface the "health of the fleet" at a glance. |
3.4 CI & issue-tracker integration
An agent that bridges the gap between "I saw this problem" and "I opened a ticket for it" closes the loop.
| Feature | Description |
|---|---|
| Auto-PR creation | When AI suggests push and the policy allows it, create the PR automatically with a body that includes the scan context and the AI's reasoning. |
| CI status overlay | Pull the latest CI status for each repo's current branch and show it in the scan table as an extra column (✅ CI green, ❌ CI red, ⏳ running). |
| Issue auto-link | When a repo is in diverged or behind state for N days, automatically open a GitHub/GitLab/Jira issue assigned to the last committer. |
| Release-train awareness | Know the release schedule: "main is frozen until Friday" → suppress push suggestions, flag repos that merged after the cut. |
3.5 Natural-language interface
Today you invoke gitflow scan and optionally --ai for suggestions. The
next step is conversational.
| Feature | Description |
|---|---|
| Chat mode | gitflow chat opens a REPL: "what's stale right now?", "create a branch on all go services", "summarise last week's changes across the monorepo". The AI interprets intent, calls the appropriate scan/action functions, and responds. |
| Contextual reasoning | The agent remembers the last scan and can answer follow-ups: "tell me more about the web repo" without re-scanning. |
| Voice / assistant integration | Expose an MCP (Model Context Protocol) server so tools like Claude Code, Copilot Chat, or a custom Slack bot can invoke gitflow as a tool. The agent becomes a sub-agent of a larger workflow. |
| Summarisation | "What happened this week?" → the agent scans the journal and produces a human-readable summary with trends, anomalies, and top risks. |
3.6 Team coordination & multi-user awareness
Today gitflow is a single-user tool. Multi-user scenarios need coordination and shared state.
| Feature | Description |
|---|---|
| Shared scan journal | A central (optional) server or a shared SQLite file on a network mount so the team sees the same view. |
| Conflict prediction | If two developers are working on the same file in different branches, flag it before it becomes a merge conflict. |
| Review-load balancing | "Which team member has the fewest open reviews?" — suggest assigning PRs to balance the load. |
| Standup summaries | gitflow standup — "here's what changed since yesterday, here's what needs attention today, here's the AI-suggested priority order." |
3.7 Operational resilience & security
| Feature | Description |
|---|---|
| Secret detection | Scan staged diffs for accidentally-committed keys, tokens, or credentials. Flag as critical and prevent the commit in policy-enforcement mode. |
| Dependency vulnerability overlay | Cross-reference go.mod / package.json versions with known CVEs. Surface repos running vulnerable dependencies. |
| Disk-space forecasting | Track .git directory growth over time; flag repos approaching a size threshold where git gc or shallow cloning would help. |
| Signed-commit enforcement | Flag repos and branches where unsigned commits have landed. |
| Branch-protection audit | Verify that protected branches (main/master) have required reviews, status checks, and signed-commit policies enabled on the remote. |
3.8 Platform & ecosystem
| Feature | Description |
|---|---|
| MCP server mode | gitflow serve --mcp exposes a Model Context Protocol endpoint so any MCP-compatible client (Claude Desktop, Continue.dev, etc.) can use gitflow as a tool. |
| Prometheus metrics endpoint | gitflow serve --metrics :9090 exports scan summaries, repo counts, attention ratios, webhook latencies. Grafana dashboard out of the box. |
| Kubernetes CronJob deployment | Run gitflow as a periodic job in a cluster, scanning repos cloned into a shared volume. Push metrics to Prometheus and alerts to Slack. |
| Systemd timer unit | gitflow watch as a user-level systemd service with a timer, so it survives reboots. |
| VSCode / JetBrains extension | Sidebar panel showing the scan status of the current project's dependency repos, with one-click actions (pull, stash, create PR). |
4. From where we are to where we're going
gitflow today
┌────────┐ ┌──────────────────────────────────┐
│ scan │──────────▶ table / json / compact │
│ watch │──────────▶ ▲ change markers │
│ tui │──────────▶ AI suggestions (on demand) │
└────────┘ └──────────────────────────────────┘
gitflow agent-era
┌────────────┐ ┌──────────────────────────────────┐
│ scan │ │ journal (SQLite) │
│ watch │───────│ policy engine │
│ tui │ │ chat REPL │
│ chat │ │ MCP server │
│ serve │ │ Prometheus metrics │
│ standup │ │ CI / issue-tracker bridges │
│ grep │ │ dependency graph │
└────────────┘ │ cross-repo operations │
│ team coordination │
└──────────────────────────────────┘
The current codebase is structured so that each of these extensions drops in cleanly:
- Journal → new
internal/journalpackage with aJournalinterface (in-memory for tests, SQLite for production);app.ScanOncewrites to it - Policy →
internal/policyevaluates a.gitflow-policy.yamlper repo against the scan result and the AI suggestion before execution - Chat →
internal/chatreuses the AI provider interface and adds a REPL loop with conversation history - MCP →
internal/mcpexposes the existingapp.ScanOnce,ai.Suggest, andrules.Evalas MCP tools over stdio or HTTP - CI bridge →
internal/ciwith a provider interface (GitHub Actions, GitLab CI, Jenkins) that fetches status per branch - Dependency graph →
internal/depsparser registry that readsgo.mod,package.json, etc. and builds aDepGraphstruct
None of these require restructuring the core domain model — RepoInfo,
ScanResult, Summary, and Suggestion are already general enough to
carry the extra metadata these features would attach.
5. Immediate next steps (near-term, low-risk)
These can be implemented in the current architecture without any restructuring and without breaking the existing CLI contract:
- Scan journal (SQLite) — adds persistence to watch mode; enables
gitflow historyandgitflow diff SCAN1 SCAN2 - Dwell-time rules — extend
ruleswith ascans:matcher ("flag only after N consecutive scans"), config-only change - Cross-repo grep —
gitflow grep <pattern>that walks discovered repos and runsgit grepconcurrently, presents unified output - Auto-PR —
--ai-executecreates a PR viagh pr createor the GitHub API when the suggestion iscreate_prand a token is present gitflow chat— a REPL that holds the last scan result in memory and answers natural-language questions about it
These five items together would move gitflow from a "scanner with AI suggestions" to a "repo management agent" without a single breaking change to the existing surface. Each one is independently shippable.
Document version: 1.0 — reflects the codebase at commit series
feat/tui-webhooks-m1 through feat/tui-webhooks-m6, merged into main
with --no-ff.