xPulse
🇩🇪 DE

COMP_cli_adr-001 – Command-Registrierung via Autodiscovery

Status: ACCEPTED Datum: 2026-03-16 Autor: xPulse


Kontext

@xpulse/cli braucht einen Mechanismus um Commands aus verschiedenen xParts zusammenzuführen ohne von ihnen abhängen zu müssen – und ohne Boilerplate in jedem xPart.

Zusätzlich soll ein Command vollständig von CLI-Internals abstrahiert sein: kein Import von @xpulse/event, kein manuelles Emittieren von cli:done, kein Wissen über Timeout-Mechanismen.

Entscheidung

@xpulse/cli ist ein Runner – kein Command-Owner.

@xpulse/cli discovert → @xpulse/doc/src/commands/FetchCommand.js
@xpulse/config/src/commands/ConfigShowCommand.js

Command-Contract

import { Command } from '@xpulse/cli/command';
export class FetchCommand extends Command {
configure() {
this
.setName('doc:fetch')
.setAlias('df')
.setDescription('Docs via git archive fetchen')
.addArgument('tool', null, 'Tool name')
.addOption('tag', null, 'Git tag')
.addFlag('dry-run', false, 'Dry run');
}
async run(input, output) {
while (!done) {
await doWork();
this.keepAlive(); // ← kein Event-Import nötig
}
output.success('Fertig!');
return 0; // ← Exit Code statt cli:done Event
}
}

Vollständige Abstraktion

Ein Command importiert nichts von @xpulse/event und weiß nichts von CLI-Internals. @xpulse/cli übernimmt alles:

Aufgabe Wer macht es
Autodiscovery @xpulse/cli
Input aufbauen @xpulse/cli
Output aufbauen @xpulse/cli
keepAlive-Funktion injizieren @xpulse/cli
Timer starten + stoppen @xpulse/cli
process.exit(code) @xpulse/cli
Logik implementieren xPart

Exit Codes

run() gibt einen numerischen Exit Code zurück – bekanntes Unix-Schema:

Code Bedeutung
0 Erfolg
1 Fehler
2 Misuse – falsche oder fehlende Argumente

@xpulse/cli ruft process.exit(exitCode) nach run() auf. Kein cli:done Event – run() resolved und der Prozess endet.

`cli:keepalive` – intern

cli:keepalive existiert weiterhin als internes Event in @xpulse/cli. xParts sehen es nicht – sie rufen this.keepAlive() auf, die Basisklasse emittiert das Event intern via eine injizierte Funktion.

`--help` + `--list`

xpulse --help # alle Commands mit Name, Alias, Description
xpulse --help doc:fetch # Command-Detail mit Arguments, Options, Flags, Beispiel
xpulse --list # nur Namen, maschinenlesbar – für Autocomplete/Scripting

Dependencies

@xpulse/cli → @xpulse/event ← intern für keepAlive

Begründung

Konsequenzen

Alternativen die verworfen wurden

de/adr/adr-001-command-registration.md 2026-03-27