- src/stats/: OwnEmailMatcher (config emails + GH no-reply per account) + git-side --author filtering (cheap even on the pterodactyl fork's 4700+ commits); streak (current/longest, midnight-grace rule), 52-week heatmap, day/hour histograms — one scan feeds all of them, data layer only for now (visual Stats-tab redesign stays in Sprint D's mockup-first cycle) - src/stats/cadence.rs: release cadence (median tag gap, local tags, Tier A) - src/stats/size.rs + cache.rs: git-object vs working-tree size, persisted in new ~/.vulp/stats_cache.toml (max 1 sample/day), recorded only during [R]/vulp refresh — confirms vulp's own filter-repo cleanup (539MB->834KB) - src/digest.rs: WeeklyDigest struct + 3 renderers (Discord embed/markdown archive/plaintext); vulp digest [send discord|webhook <url>] CLI, webhook stored via existing auth token store (~/.vulp/.tokens, 0600), never logged; send respects --dry-run - TUI: [d] on Stats previews the digest in a Modal::Info before anything is ever sent - fix: list_contributors used --all (double-counts after fetching remotes), now --branches - config: stats_author_emails field (TUI-editable) - verified: streak/delta/top-repo/release math against a hand-built commit history, webhook validation+permissions, dry-run, real refresh (51 repos, vulp's own entry confirms the filter-repo win), TUI preview via pyte
Vulp
Multi-repository git workflow manager. Jeden terminal, cały workspace: stan wszystkich repozytoriów, batch sync, projekty, todos, PR-y/issues, statystyki — plus pełne, bezpromptowe CLI, którego mogą używać skrypty i asystenci AI.
- TUI (
vulpbez argumentów) — interfejs dla ludzi - CLI (
vulp <komenda>) — dla ludzi, skryptów i AI;--json, kody wyjścia, zero interaktywnych pytań → pełna referencja: docs/cli.md
Instalacja
Gotowa binarka (Linux/Windows), bez Rusta:
# Linux
curl -fsSL https://raw.githubusercontent.com/dualfroz/fxg/main/install/vulp-installer.sh | bash
# Windows
irm https://raw.githubusercontent.com/dualfroz/fxg/main/install/vulp-installer.ps1 | iex
Albo ze źródeł: cargo install --path .
Pierwsze uruchomienie
vulp config # ustaw workspace_root, username, email
vulp auth import # zaimportuj konto z gh CLI (najprościej)
# albo: vulp auth add --provider github --token ghp_xxx
vulp # odpal TUI
TUI
vulp otwiera hub z zakładkami (przełączanie: Tab/←→ albo 1-9):
| # | Zakładka | Co robi |
|---|---|---|
| 1 | Overview | bento-dashboard: statystyki workspace, projekty, top repo po commitach, scalony feed aktywności (commity + akcje vulpa), todos/PRs/issues |
| 2 | Repos | tabela wszystkich rep: branch, dirty/ahead/behind, język, gwiazdki; multi-select do operacji hurtowych |
| 3 | Projects | grupy repozytoriów (kolor + przypisania) |
| 4 | Todos | zadania ręczne + zaimportowane skanem TODO/FIXME z kodu |
| 5/6 | PRs / Issues | otwarte PR-y i issues ze wszystkich rep (cache, odświeżane [R]) |
| 7 | Stats | statystyki commitów per okres (1d–all) |
| 8 | Activity | feed: commity + akcje wykonane vulpem |
| 9 | Settings | edytor, schowek, workspace, konta, szablony repo, bulk import |
Najważniejsze klawisze (pełna lista: ? w aplikacji):
m— kontekstowe menu akcji. Na każdej zakładce pokazuje wszystkie dostępne akcje z ich skrótami — nie musisz nic pamiętać.Enter— szczegóły repo/projektu (historia, branch'e, pliki, diff, ustawienia zdalne, akcje: sync/release/collaboratorzy…)Spacezaznacz do batcha ·ssync (pull/commit+push) ·rrelease/filtr ·Ssort i filtry ·d/b/ftylko dirty/behind/aheadNnowe repo (clone/create/link) ·Rodśwież metadane z APIootwórz w edytorze ·Ww przeglądarce ·y/ukopiuj ścieżkę/URL
CLI (skrypty + AI)
Każda operacja TUI ma odpowiednik w CLI. Przykłady:
vulp list --dirty --json # co wymaga uwagi (JSON dla AI)
vulp status <repo> # szczegóły jednego repo
vulp sync --project X --action commit-push -m "chore: update"
vulp release <repo> --tag v1.2.0
vulp todo add "tytuł" && vulp todo done 3
vulp pr create --repo R --title T --head branch
vulp repo collab <repo> <user> --role push
vulp init nazwa --private # git init + repo na providerze + push
vulp stats --period 7d --json
vulp refresh # dociągnij meta/PR/issues z API
Kontrakt: --json na komendach odczytu, stdout = wynik / stderr = postęp,
kody wyjścia 0 ok · 1 błąd · 2 złe użycie · 3 auth · 4 nie znaleziono.
Szczegóły i przepisy: docs/cli.md.
Konfiguracja
vulp config (interaktywnie) albo edycja ~/.vulp/config.toml:
| Pole | Domyślnie | Opis |
|---|---|---|
workspace_root |
~/projects |
katalog skanowany w poszukiwaniu rep |
workspace_groups |
[] |
foldery-grupy, których dzieci są repami (np. ["clients", "opensource"]) |
data_dir |
~/.vulp |
dane vulpa |
default_provider |
github |
provider bez --provider |
default_branch / default_visibility |
main / private |
dla nowych rep |
editor |
$EDITOR/vim |
do o / otwierania plików |
clipboard_cmd |
auto | komenda kopiowania (wl-copy, xclip …) |
username / email |
— | tożsamość gita |
Pliki danych
~/.vulp/
├── config.toml # ustawienia
├── accounts.toml # konta (tokeny w keyringu / .tokens 0600)
├── projects.toml # projekty (grupy rep)
├── todos.toml # zadania
├── labels.toml # etykiety wyświetlania rep
├── bookmarks.toml / pins.toml
├── templates.toml # szablony nowych rep
├── meta_cache.toml # cache metadanych/PR/issues z API
└── activity.log # log akcji vulpa (JSONL)
Providery
| Provider | --provider |
Zakres wsparcia |
|---|---|---|
| GitHub | github |
pełny (repo, PR, issues, release, collaboratorzy, search) |
| GitLab | gitlab |
podstawowy (tworzenie rep, collaboratorzy) |
| Gitea/Forgejo | gitea |
podstawowy (tworzenie rep, collaboratorzy; wymaga --url) |
Listy PR/issues są dziś GitHub-only — na innych providerach zakładki 5/6 będą puste (known limitation).
Licencja
MIT — patrz LICENSE.