xPulse
🇩🇪 DE

Anleitung

Installation

@xpulse/cli wird lokal im Projekt installiert – kein globales Install nötig.

npm install @xpulse/cli

Wichtig: Die package.json des Projekts muss "type": "module" enthalten, da das gesamte xPulse Ökosystem ESM (import/export) verwendet:

{
"name": "mein-projekt",
"type": "module",
"dependencies": {
"@xpulse/cli": "^1.0.0"
}
}

Aufruf – immer mit `npx`

@xpulse/cli wird immer via npx aufgerufen. npx nutzt die lokale Version aus node_modules/.bin/xpulse – konsistent, reproduzierbar, kein Versions-Mismatch.

npx xpulse --version
npx xpulse --list
npx xpulse --help
npx xpulse --help tapp:hello
npx xpulse tapp:hello --help
npx xpulse tapp:hello Johnny -lang="en" --shout -V

Wie funktioniert das?

@xpulse/cli startet und discovert automatisch alle Command-Klassen:

npx xpulse doc:fetch chat --dry-run
@xpulse/cli discovert:
1. node_modules/@xpulse/*/src/commands/*.js ← installierte xParts
2. src/commands/*.js ← lokales Projekt
→ findet FetchCommand (name = 'doc:fetch')
→ baut Input + Output auf, injiziert keepAlive
→ new FetchCommand().run(input, output)
FetchCommand.run() führt aus → return 0
@xpulse/cli → process.exit(0)

Einen Command schreiben

Datei unter src/commands/ anlegen, Command extenden – fertig. @xpulse/cli findet sie automatisch.

// src/commands/HelloCommand.js
import { Command } from '@xpulse/cli/command';
export class HelloCommand extends Command {
configure() {
this
.setName('tapp:hello')
.setAlias('hi')
.setDescription('Sag Hallo')
.setHelp('Gibt eine Begrüßung aus.')
.addArgument('name', 'Anon', 'Name des Empfängers')
.addOption('lang', 'de', 'Sprache (de/en)')
.addFlag('shout', false, 'In Großbuchstaben');
}
async run(input, output) {
const name = input.getArgument('name');
const shout = input.getFlag('shout');
let msg = `Hallo ${name}!`;
if (shout) msg = msg.toUpperCase();
output.success(msg);
return 0;
}
}

Kein import event, kein cli:done emittieren – run() gibt einfach einen Exit Code zurück.

Argument vs. Option vs. Flag

Typ Definition Aufruf
Argument addArgument('name', ...) npx xpulse cmd Johnny (positional)
Option addOption('lang', ...) npx xpulse cmd -lang="en"
Flag addFlag('shout', ...) npx xpulse cmd --shout

Wichtig: Optionen müssen immer mit = übergeben werden:

npx xpulse tapp:hello -lang="en" # ✓ korrekt
npx xpulse tapp:hello --lang="en" # ✓ korrekt
npx xpulse tapp:hello -lang en # ✗ Warnung – "en" wird als positionales Argument interpretiert
npx xpulse tapp:hello --lang en # ✗ Warnung – "en" wird als positionales Argument interpretiert

Bei falschem Syntax gibt @xpulse/cli eine Warnung aus:

! Ungültige Syntax: "--lang en" – meintest du --lang="en"?
"en" wird als positionales Argument interpretiert.

`--help` für einen Command

Beide Varianten sind gleichwertig:

npx xpulse --help tapp:hello # Flag vor dem Command-Namen
npx xpulse tapp:hello --help # Flag nach dem Command-Namen

Exit Codes

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

Long-running Commands

Commands die länger als CLI_TIMEOUT (Default: 30s) laufen, rufen periodisch this.keepAlive() auf um den Timeout zurückzusetzen:

async run(input, output) {
while (!done) {
await doWork();
this.keepAlive(); // Timeout zurücksetzen – kein Event-Import nötig
}
return 0;
}

Timeout konfigurieren

CLI_TIMEOUT=60 npx xpulse repo:changelog:generate
de/guide.md 2026-03-16