Naar inhoud

Alpheus

Een rivier door de stallen. Hij veegt de rommel van de agent uit je working tree voordat je commit.

Alpheus (Ἀλφειός) is de riviergod wiens stroom Heracles door de stallen van Augias leidde, waarmee hij dertig jaar mest in één middag naar zee spoelde. Die stallen waren niet smerig omdat iemand dat zo wilde. Er was alleen nooit iemand aan toegekomen.

Wat hij doet

Alpheus leest wat er in je working tree veranderd is en wijst aan wat daarvan nooit bedoeld was om mee de commit in te gaan. Een debug print die een agent neerzette om te zien waar het misging. Een // @ts-ignore waarmee een type error verdween. Vier regels dode code die als commentaar bleven staan, voor het geval dat. Een hardcoded pad naar iemands home-map. Een temp.json die niemand weggooide.

Niets daarvan gebeurt met opzet. Een agent die één bug oplost en daarvoor acht bestanden aanraakt, laat in alle acht een print achter. De suite wordt groen, git commit -am neemt alles mee, en die prints gaan mee de historie in. Een diff vertelt je dát die regels erbij kwamen. Welke ervan je bedoelde, staat er niet in.

De uitvoer van alpheus check: vijf bevindingen gegroepeerd per class, elk met bestand en regelnummer, de regel zelf en de reden waarom hij opviel, en als slot een regel die de interactieve review aanbiedt of het opruimen in één keer

Hij leest de toevoegingen in je staged en je unstaged diff, en toetst untracked bestanden aan een aantal scratch-patronen. Alleen toevoegingen: code die al in het bestand stond, gaat Alpheus niet aan, dus een console.log die er al een jaar staat blijft precies waar hij staat.

De detectie is deterministisch. Patronen per taal, het herkennen van commentaarregels, en een lijst die elke bestandsextensie aan een taal koppelt. Geen model, geen tokens, geen netwerkverzoek, en dezelfde working tree levert twee keer hetzelfde antwoord op.

De vijf classes

ClassWat hij opmerkt
LOGDebug-uitvoer die is toegevoegd om te zien wat er draait: console.log/debug/dir/time, Python print, breakpoint, pdb.set_trace, logging.debug, Rust dbg! en println!, Go fmt.Print* en log.Print*, PHP var_dump, print_r, dd, shell set -x en echo "DEBUG:..."
SUPPRESSEen checker die het zwijgen is opgelegd: @ts-ignore, @ts-expect-error, @ts-nocheck, eslint-disable, biome-ignore, prettier-ignore, # noqa, # type: ignore, #[allow(...)], //nolint, @phpstan-ignore, @psalm-suppress
TOMBSTONEDrie of meer opeenvolgende regels die als commentaar zijn weggezet en nog als code te lezen zijn
PATHEen hardcoded pad naar een home-map: /home/<user>/, /Users/<user>/, C:\Users\<user>\
SCRATCHEen untracked restant: *.tmp, *.scratch en *.bak overal, plus temp.*, scratch.*, dump.json, debug.log en wegwerpscripts als t.py in de root van de repository of onder scratch/ en tmp/

Zeven talen herkent hij aan de extensie: TypeScript, JavaScript, Python, Rust, Go, PHP en shell. Een bestand in iets anders leest hij nog steeds op workstation-paden en dode code, want voor die twee regels doet de taal er niet toe.

Eerst kijken, dan weggooien

alpheus zonder argumenten opent een gesplitst scherm: links de bevindingen, rechts de omringende code, met de regel die weggaat gemarkeerd op zijn plek. / of j/k lopen door de lijst, spatie zet één bevinding aan of uit, a doet dat voor allemaal, enter ruimt op wat je hebt aangevinkt, en q of escape sluit af zonder één bestand aan te raken.

De terminalinterface van Alpheus: links een lijst bevindingen met selectievakjes en de badge van hun class, rechts een diff-preview met de regel die weggaat, tussen de regels eromheen

Er is ook een niet-interactieve helft, voor de gevallen waarin niemand meekijkt. alpheus check eindigt met exit code 1 zodra er iets gevonden is, en dat maakt hem bruikbaar in CI of in een git hook. Met --json komen dezelfde bevindingen terug in een vorm die een script kan lezen. alpheus clean ruimt alles in één keer op, en --dry-run vertelt wat dat weggehaald zou hebben zonder het weg te halen.

Terugdraaien

Voordat er één regel verdwijnt, kopieert hij elk betrokken bestand naar .alpheus/backups/<timestamp>_<id>/, met een manifest.json waarin per bestand de sha256 staat van de versie die er stond. alpheus restore zet de working tree byte voor byte terug, en alpheus backups somt op wat er te herstellen valt. Ook een verwijderd scratch-bestand wordt eerst gekopieerd, dus dat komt net zo goed terug.

De uitvoer van alpheus clean: vier items opgeruimd in drie bestanden, één scratch-bestand bij naam verwijderd, en het pad van de backup waaruit het terug te halen is

Twee details zijn belangrijker dan ze lijken. .alpheus/ komt in .git/info/exclude terecht en je .gitignore blijft ongemoeid, dus de snapshots duiken nooit op in git status en belanden nooit in een commit. De repository die je met anderen deelt krijgt zo geen regel over een tool die alleen jij draait.

En aanpassingen worden op regelnummer van onder naar boven toegepast, zodat het weghalen van de ene regel nooit de regel verschuift waar de volgende bevinding naar wijst.

In Claude Code

Alpheus is behalve een CLI ook een plugin. /alpheus draait de scan en laat de agent de bevindingen aan je voorleggen. Een PreToolUse-hook let bij elke Bash-call op een git commit en noemt, als er nog bevindingen in de working tree staan, de eerste vijf daarvan voordat de commit draait.

Die hook waarschuwt en verder niets. De commit gaat gewoon door, en wat de hook schrijft komt in je transcript terecht en niet in de context van het model. Het is dus een notitie aan jou, geen opdracht aan Claude.

Snel starten

Vereist Bun 1.1 of nieuwer en git 2.25 of nieuwer.

bash
claude plugin marketplace add https://aranea-development.nl/plugins/marketplace.json
claude plugin install alpheus@aranea

Hooks worden bij de start van een sessie geregistreerd, dus start een nieuwe sessie na de installatie.

Loopt de installatie vast op ssh: connect to host github.com port 22, dan haalt git de plugin uit de GitHub-repository over SSH en lukt dat op die machine niet. De melding wijst naar toegangsrechten, maar de repository is openbaar. Het transport is het probleem. Eén regel zet git op HTTPS, daarna kun je opnieuw installeren:

bash
git config --global --add url."https://github.com/".insteadOf "git@github.com:"

De CLI staat op zichzelf, met of zonder Claude Code:

bash
bun install -g github:AraneaDev/alpheus

Wat hij niet doet

Hij oordeelt niet. println! in Rust is hoe een programma zijn uitvoer schrijft en net zo goed hoe iemand een fout naspeurt, en hij merkt ze allebei op. Dat geldt ook voor een print in een Python-script dat niets anders doet dan printen. Daarom kijk je er eerst naar: hij levert kandidaten, en welke daarvan rommel zijn beslis jij.

Hij commit nooit en hij zet nooit iets in de staging area. Hij maakt een working tree schoon en daar houdt het op. De beslissing om te committen blijft bij jou.

Hij doet geen enkel netwerkverzoek, stuurt geen telemetrie en roept geen model aan. Alles wat hij weet, heeft hij van je schijf gelezen.

Alpheus is pre-release. Welke versie je installeert staat op de release-pagina, en de vorm van de bevindingen kan nog veranderen.