ConsoleKit 1.0.1
dotnet add package ConsoleKit --version 1.0.1
NuGet\Install-Package ConsoleKit -Version 1.0.1
<PackageReference Include="ConsoleKit" Version="1.0.1" />
<PackageVersion Include="ConsoleKit" Version="1.0.1" />
<PackageReference Include="ConsoleKit" />
paket add ConsoleKit --version 1.0.1
#r "nuget: ConsoleKit, 1.0.1"
#:package ConsoleKit@1.0.1
#addin nuget:?package=ConsoleKit&version=1.0.1
#tool nuget:?package=ConsoleKit&version=1.0.1
<div align="center">
π₯οΈ ConsoleKit
Professionelle, theme-fΓ€hige Konsolenausgabe fΓΌr .NET β ohne Boilerplate.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
MEINE ANWENDUNG v1.0
Willkommen beim Deployment-Tool
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Server erfolgreich gestartet auf http://localhost:5000
β Datenbankverbindung fehlgeschlagen: Timeout nach 30s
β Konfigurationsdatei nicht gefunden β Standardwerte werden verwendet
βΉ NΓ€chstes Backup: heute um 02:00 Uhr
Downloading [ββββββββββββββββββββββββββββββββββββββββ] 40% 40/100 ETA 0m36s
</div>
Was ist ConsoleKit?
Jeder .NET-Entwickler hat irgendwann dieselbe Datei geschrieben: Eine ConsoleHelper.cs mit hartcodierten Farben, Copy-Paste-Trennlinien und einer WriteError-Methode. ConsoleKit ist die professionelle, fertige Version davon.
ConsoleKit ist eine Zero-Dependency-Bibliothek fΓΌr .NET 8+, die folgende Probleme lΓΆst:
- Formatierung β Trennlinien, zentrierte Γberschriften, EinrΓΌckungen konsistent ΓΌber die ganze App
- Farb-Themes β alle Farben zentral definiert, austauschbar zur Laufzeit, keine hardcodierten
ConsoleColor-Werte - Animierter Fortschritt β ProgressBar mit ETA und Throughput, animierter Spinner fΓΌr unbekannte Dauer
- Pipelines visualisieren β StepTracker zeigt Deployment-Schritte mit Live-Statussymbolen
- Tabellen β Box-Drawing-Zeichen, automatische Spaltenbreite, typsichere Zeilen per Lambda
- User-Prompts β Texteingabe, PasswΓΆrter, Zahlen mit Bereichsvalidierung, MenΓΌs, Mehrfachauswahl
Die gesamte Bibliothek ist thread-safe β alle Ausgaben sind synchronisiert, Timer-Callbacks (ProgressBar, Spinner) kΓΆnnen gefahrlos parallel zum Hauptthread laufen.
π¦ Installation
dotnet add package ConsoleKit
<PackageReference Include="ConsoleKit" Version="1.0.0" />
Voraussetzungen: .NET 8.0 oder hΓΆher, keine weiteren AbhΓ€ngigkeiten.
β‘ Schnellstart
Der einfachste Einstieg ist die statische Facade-Klasse CK. Ein einzelnes using reicht aus:
using ConsoleKit;
// Bildschirm lΓΆschen + zentrierte Titelbox
CK.Header("Meine App", "Version 1.0.0");
// Farbige Statusmeldungen
CK.Ok("Verbindung hergestellt");
CK.Error("Fehler beim Laden der Konfiguration");
CK.Warn("Speicher niedrig: noch 200 MB verfΓΌgbar");
CK.Info("NΓ€chster Sync in 5 Minuten");
// SchlΓΌssel-Wert-Paare
CK.KeyValue("Umgebung", "Production");
CK.KeyValue("Datenbank", "PostgreSQL 16");
// Trennlinie
CK.Separator();
Wer mehr Kontrolle braucht, kann direkt auf ConsoleWriter, ProgressBar, ConsoleTable usw. zugreifen (siehe Abschnitte unten).
π¨ Themes
Alle Farben in ConsoleKit kommen aus einem einzigen ConsoleTheme-Objekt. Das Theme lΓ€sst sich jederzeit β auch mitten im Programmlauf β austauschen.
Eingebaute Themes
using ConsoleKit.Themes;
CK.Theme = ConsoleTheme.Default; // Cyan/Blau β Standard fΓΌr dunkle Terminals
CK.Theme = ConsoleTheme.Retro; // GrΓΌn-auf-Schwarz, klassisches Terminal-Feeling
CK.Theme = ConsoleTheme.HighContrast; // Maximaler Kontrast fΓΌr Barrierefreiheit
Eigenes Theme
Alle 16 Farbrollen sind einzeln konfigurierbar:
CK.Theme = new ConsoleTheme
{
Header = ConsoleColor.White,
Separator = ConsoleColor.DarkGray,
SectionTitle = ConsoleColor.Cyan,
Success = ConsoleColor.Green,
Error = ConsoleColor.Red,
Warning = ConsoleColor.Yellow,
Info = ConsoleColor.Cyan,
Progress = ConsoleColor.DarkCyan,
ProgressFill = ConsoleColor.Cyan,
Prompt = ConsoleColor.White,
MenuOption = ConsoleColor.Yellow,
TableHeader = ConsoleColor.Cyan,
TableRow = ConsoleColor.Gray,
TableAlt = ConsoleColor.DarkGray,
Muted = ConsoleColor.DarkGray,
Highlight = ConsoleColor.Magenta,
};
π ProgressBar
Die ProgressBar lΓ€uft auf einem eigenen Hintergrundtimer (100ms) und aktualisiert sich auch ohne explizite Report()-Aufrufe. Sie implementiert IProgress<int> und IDisposable.
Downloading [ββββββββββββββββββββββββββββββββββββββββ] 40% 40/100 ETA 0m36s
Installing β ββββββββββββββββββββββββββββββββββββββββ£ 77% 77/100 12.3/s
Grundlegende Verwendung
using ConsoleKit.Progress;
// Absoluten Wert melden (0 β¦ total)
using var pb = new ProgressBar(total: 500, label: "Verarbeite Dateien");
for (int i = 0; i <= 500; i++)
{
pb.Report(i);
await ProcessFileAsync(i);
}
pb.Complete("Alle Dateien verarbeitet");
// Inkrementell
using var pb = new ProgressBar(100, "Upload");
foreach (var chunk in chunks)
{
await UploadAsync(chunk);
pb.Increment();
}
pb.Complete("Upload abgeschlossen");
Als IProgress<int> fΓΌr bestehende APIs
using var pb = new ProgressBar(100, "Konvertierung");
await converter.RunAsync(progress: pb); // direkt an APIs ΓΌbergeben, die IProgress<int> erwarten
pb.Complete();
Visuell-Stile
ProgressBarStyle ist ein record und unterstΓΌtzt with-Expressions fΓΌr nicht-destruktive Anpassung:
// Eingebaute Stile
ProgressBarStyle.Default // [ββββββββ]
ProgressBarStyle.Slim // |β¬β¬β¬βββββ|
ProgressBarStyle.Block // ββ β β β‘β‘β‘β‘β
ProgressBarStyle.Smooth // β ββββββββ£
// Anpassung per with-Expression
var myStyle = ProgressBarStyle.Default with
{
Fill = 'β',
Empty = 'β',
Width = 50,
ShowPercent = true,
ShowEta = true,
ShowThroughput = true // zeigt z.B. "45.2/s" oder "1.5k/s"
};
Optionen
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
Fill |
char |
β |
Zeichen fΓΌr den gefΓΌllten Bereich |
Empty |
char |
β |
Zeichen fΓΌr den leeren Bereich |
Left / Right |
char |
[ / ] |
Rahmenzeichen |
Width |
int |
40 |
Breite des Balkens in Zeichen |
ShowPercent |
bool |
true |
Prozentzahl anzeigen |
ShowEta |
bool |
true |
Verbleibende Zeit anzeigen |
ShowThroughput |
bool |
false |
Durchsatz (Items/Sekunde) anzeigen |
π Spinner
Der Spinner eignet sich fΓΌr Operationen mit unbekannter Dauer. Er animiert sich selbst ΓΌber einen Hintergrundtimer und erlaubt das Aktualisieren der Beschriftung wΓ€hrend der Laufzeit.
β Verbinde mit Datenbankβ¦
β Verbunden! (PostgreSQL 16.2)
β Schema-Validierung fehlgeschlagen
Verwendung
using ConsoleKit.Progress;
// Einfacher Spinner im using-Block
using var spin = new Spinner("Verbinde mit Datenbankβ¦");
var conn = await ConnectAsync();
spin.Complete($"Verbunden! ({conn.ServerVersion})");
// Beschriftung live aktualisieren
using var spin = new Spinner("Initialisierungβ¦");
spin.UpdateLabel("Lade Konfigurationβ¦");
await LoadConfigAsync();
spin.UpdateLabel("Starte Diensteβ¦");
await StartServicesAsync();
spin.Complete("Alle Dienste gestartet");
// Fehler oder Warnung signalisieren
spin.Fail("Verbindung abgelehnt");
spin.Warn("Timeout β Retry in 5s");
Hinweis: Bei
Dispose()ohne vorherigesComplete()/Fail()/Warn()zeigt der Spinner ein neutralesβ-Symbol statt eines Fehler-Icons.
Animations-Stile
| Style | Frames | Beschreibung |
|---|---|---|
SpinnerStyle.Dots |
β β β Ήβ Έβ Όβ ΄β ¦β §β β |
Braille-Punkte (Standard) |
SpinnerStyle.Line |
- \ \| / |
Klassischer ASCII-Spinner |
SpinnerStyle.Circle |
ββββ |
Halbkreise |
SpinnerStyle.Arrows |
ββββββββ |
Richtungspfeile |
SpinnerStyle.Triangle |
β’β£β€β₯ |
Dreiecke |
SpinnerStyle.Pulse |
ββββββ |
Pulsierendes FΓΌllzeichen |
SpinnerStyle.Clock |
πππβ¦π |
Uhr-Emoji |
// Eigene Frames und Geschwindigkeit
var spin = new Spinner("Arbeiteβ¦", frames: ["β","β ","β","β","β‘","β"], intervalMs: 120);
π StepTracker
Der StepTracker visualisiert mehrstufige Prozesse mit live aktualisierten Status-Icons. Jede Zeile wird direkt im Terminal ΓΌberschrieben β keine endlose Ausgabe, nur ein sauberer Block.
ββββββββββββββββββββββββββββββββββββββββββββββββββ
Deployment Pipeline
ββββββββββββββββββββββββββββββββββββββββββββββββββ
1. β Packages wiederherstellen β bin/packages
2. β Quellcode kompilieren
3. β Unit Tests ausfΓΌhren β 3 Tests fehlgeschlagen
4. β Artefakte publizieren β ΓΌbersprungen
5. β Benachrichtigung senden β ΓΌbersprungen
Verwendung
using ConsoleKit.Progress;
using var steps = new StepTracker("Deployment Pipeline",
"Packages wiederherstellen",
"Quellcode kompilieren",
"Unit Tests ausfΓΌhren",
"Artefakte publizieren",
"Benachrichtigung senden");
steps.Start(0);
await RestoreAsync();
steps.Complete(0, "312 Pakete installiert");
steps.Start(1);
var build = await BuildAsync();
if (!build.Success)
{
steps.Fail(1, build.ErrorMessage);
steps.Skip(2, "ΓΌbersprungen wegen Fehler");
steps.Skip(3);
return;
}
steps.Complete(1);
Methoden im Γberblick:
| Methode | Symbol | Farbe | Bedeutung |
|---|---|---|---|
Start(i, note?) |
βΊ |
Cyan | Schritt lΓ€uft gerade |
Complete(i, note?) |
β |
GrΓΌn | Erfolgreich abgeschlossen |
Fail(i, note?) |
β |
Rot | Fehlgeschlagen |
Skip(i, note?) |
β |
Grau | Γbersprungen |
Der optionale note-Parameter erscheint als β Hinweistext neben dem Schrittnamen.
π ConsoleTable
ConsoleTable rendert Tabellen mit Box-Drawing-Zeichen. Spaltenbreiten werden automatisch berechnet. Die API ist fluent β alle Konfigurationsmethoden geben this zurΓΌck.
ββββββ¦βββββββββββββββββββ¦ββββββββββββββββββββββ¦βββββββββββ¦ββββββββ
β # β Name β Role β City β Score β
β βββββ¬βββββββββββββββββββ¬ββββββββββββββββββββββ¬βββββββββββ¬ββββββββ£
β 1 β Alice MΓΌller β Backend Developer β Berlin β 98 β
ββββββ«βββββββββββββββββββ«ββββββββββββββββββββββ«βββββββββββ«ββββββββ’
β 2 β Bob Schneider β Frontend Developer β Hamburg β 87 β
ββββββ«βββββββββββββββββββ«ββββββββββββββββββββββ«βββββββββββ«ββββββββ’
β 3 β Clara Fischer β DevOps / Platformβ¦ β Munich β 93 β
ββββββ©βββββββββββββββββββ©ββββββββββββββββββββββ©βββββββββββ©ββββββββ
Grundlegende Verwendung
using ConsoleKit.Tables;
ConsoleTable.Create("Name", "Stadt", "Punkte")
.WithTitle("Rangliste")
.WithRowNumbers()
.AddRow("Alice", "Berlin", "98")
.AddRow("Bob", "MΓΌnchen", "87")
.Write();
Typsichere Zeilen mit Lambdas
var users = await db.Users.ToListAsync();
ConsoleTable.Create("ID", "Name", "E-Mail", "Registriert")
.WithMaxColumnWidth(30)
.AddRows(users,
u => u.Id.ToString(),
u => u.FullName,
u => u.Email,
u => u.CreatedAt.ToString("dd.MM.yyyy"))
.Write();
Fluent-Konfiguration
| Methode | Beschreibung |
|---|---|
.WithTitle(string) |
Γberschrift ΓΌber der Tabelle |
.WithRowNumbers() |
Erste Spalte mit laufender Nummer # |
.WithAlternateRows(bool) |
Abwechselnde Zeilenfarben (Standard: true) |
.WithMaxColumnWidth(int) |
Max. Zeichenbreite; lΓ€ngere Werte werden mit β¦ gekΓΌrzt |
.AddRow(params string[]) |
Einzelne Zeile als String-Array |
.AddRows(IEnumerable<string[]>) |
Mehrere Zeilen auf einmal |
.AddRows<T>(items, selectors...) |
Typsichere Zeilen per Objekt + Lambda |
π¬ Prompts
βΆ Dein Name [Welt]: Alice
βΆ Passwort: ******
βΆ Port (1β65535) [8080]:
βΆ Deployment starten? [Y/n]:
Texteingabe
// Optional β gibt null zurΓΌck wenn leer
string? name = CK.Ask("Dein Name");
// Mit Standardwert β Enter ΓΌbernimmt den Wert in []
string? host = CK.Ask("Hostname", defaultValue: "localhost");
// Pflichtfeld β wiederholt bis etwas eingegeben wird
string email = CK.AskRequired("E-Mail-Adresse");
// Passwort β Eingabe wird mit * maskiert
string pass = CK.AskPassword("Passwort");
Zahlen
// Integer mit Bereichsvalidierung
int port = CK.AskInt("Port", min: 1, max: 65535, def: 8080);
int timeout = CK.AskInt("Timeout", min: 1, max: 300, def: 30);
// Dezimalzahl (InvariantCulture β Punkt als Dezimaltrenner)
double rate = CK.AskDouble("Prozentsatz", min: 0.0, max: 100.0, def: 50.0);
UngΓΌltige Eingaben werden automatisch abgewiesen und die Frage wiederholt.
BestΓ€tigung
bool ok = CK.Confirm("Alle Dateien lΓΆschen?"); // Standard: Nein
bool ok = CK.Confirm("Weiter?", defaultYes: true); // Standard: Ja
AuswahlmenΓΌs
// Einfachauswahl β gibt 0-basierten Index zurΓΌck
int choice = CK.Select("Ziel-Umgebung", "Development", "Staging", "Production");
// Mehrfachauswahl β Eingabe: "1,3" oder "all"
int[] features = CK.MultiSelect("Aktiviere Features",
"Authentifizierung", "Logging", "Caching", "Rate Limiting");
π’ Statusmeldungen & Ausgabe
CK.Ok("Backup erfolgreich abgeschlossen"); // β grΓΌn
CK.Error("Verbindung zum Server unterbrochen"); // β rot
CK.Warn("Zertifikat lΓ€uft in 7 Tagen ab"); // β gelb
CK.Info("Neues Update verfΓΌgbar: v2.1.0"); // βΉ cyan
CK.Muted("DEBUG: Config geladen aus app.json"); // β grau
CK.Highlight("β
Premium-Feature aktiviert"); // β
magenta
// Struktur
CK.Header("Mein Tool", "Deployment v2.0"); // Bildschirm lΓΆschen + Titelbox
CK.Section("Datenbankverbindung"); // Abschnittstitel mit Trennlinien
CK.Separator(); // Einfache Trennlinie (β)
CK.Separator('β'); // Beliebiges Zeichen
CK.KeyValue("Host", "db.example.com"); // SchlΓΌssel: Wert
CK.Blank(); // Leerzeile
ποΈ Architektur
ConsoleKit/
βββ CK β Statische Facade β empfohlener Einstiegspunkt
βββ Core/
β βββ ConsoleWriter β Basis-Ausgabe, thread-safe, theme-bewusst
βββ Themes/
β βββ ConsoleTheme β 16 Farbrollen, 3 eingebaute Themes
βββ Progress/
β βββ ProgressBar β IProgress<int> + IDisposable, Hintergrundtimer
β βββ ProgressBarStyle β record mit with-Expression-Support
β βββ Spinner β Indeterminater Spinner, IDisposable
β βββ SpinnerStyle β 8 eingebaute Animationssequenzen
β βββ StepTracker β Pipeline-Visualisierung, IDisposable
βββ Tables/
β βββ ConsoleTable β Fluent Builder, Box-Drawing, Generic-Support
βββ Prompts/
βββ Prompt β Ask, AskInt, AskDouble, AskPassword, Confirm, Select, MultiSelect
Thread-Safety im Detail
- Alle
ConsoleWriter-Methoden sind mit einem gemeinsamenlock-Objekt synchronisiert ProgressBarundSpinnerrendern aufSystem.Threading.Timer-Callbacks β der Render-Pfad ist gelockt_disposed/_completed/_stoppedsindvolatileβ lesbar ΓΌber Thread-Grenzen ohne Lock-Overhead- Cursor-Positionen werden vor jedem Render gespeichert und im
finally-Block wiederhergestellt - Mehrere parallele
ProgressBar-Instanzen sind mΓΆglich, da jede ihre eigene Terminal-Zeile reserviert
π VollstΓ€ndiges Beispiel
using ConsoleKit;
using ConsoleKit.Progress;
using ConsoleKit.Themes;
CK.Theme = ConsoleTheme.Default;
CK.Header("Deployment Tool", "Production Release v2.0.0");
CK.Section("Konfiguration");
CK.KeyValue("Umgebung", "Production");
CK.KeyValue("Server", "prod-01.example.com");
CK.KeyValue("Branch", "main @ a3f9c12");
CK.Blank();
bool proceed = CK.Confirm("Deployment starten?", defaultYes: false);
if (!proceed) { CK.Warn("Abgebrochen."); return; }
using var steps = CK.Steps("Deployment-Pipeline",
"AbhΓ€ngigkeiten installieren",
"Tests ausfΓΌhren",
"Docker-Image bauen",
"Image pushen",
"Kubernetes aktualisieren",
"Health Check");
steps.Start(0);
using (var pb = CK.Progress(100, "npm install", ProgressBarStyle.Slim))
{
for (int i = 0; i <= 100; i++) { pb.Report(i); await Task.Delay(10); }
pb.Complete();
}
steps.Complete(0, "312 Pakete");
steps.Start(1);
using (var spin = CK.Spin("Testeβ¦", SpinnerStyle.Dots))
{
await RunTestsAsync();
spin.Complete("142 Tests bestanden");
}
steps.Complete(1);
// ... weitere Schritte
CK.Table("Schritt", "Dauer", "Status")
.WithTitle("Zusammenfassung")
.AddRow("npm install", "8.2s", "β")
.AddRow("Tests", "23.1s", "β")
.AddRow("Docker build", "45.7s", "β")
.Write();
CK.Ok("Deployment erfolgreich abgeschlossen!");
CK.PressAnyKey();
π€ Beitragen
BeitrΓ€ge sind willkommen! Bitte lies zuerst CONTRIBUTING.md.
- Repository forken
- Feature-Branch erstellen:
git checkout -b feature/mein-feature - Γnderungen committen:
git commit -m 'feat: mein neues Feature' - Branch pushen:
git push origin feature/mein-feature - Pull Request ΓΆffnen
π Lizenz
VerΓΆffentlicht unter der MIT-Lizenz β siehe LICENSE fΓΌr Details.
<div align="center">
Mit β€οΈ gebaut fΓΌr .NET-Entwickler, die ihre CLI-Apps professionell aussehen lassen wollen.
NuGet Β· Dokumentation Β· Changelog Β· Issues
</div>
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.