gulp-mu-gulp-api
v0.3.9
Published
Public task API for the µGulp orchestrator: progress reporting, sound signals, speech output, localized console output (i18x) and interactive UI inputs (text, password, number, textarea, color, font, select, radio, multi-select checkbox, range slider, dat
Maintainers
Readme
gulp-mu-gulp-api
Public task API of the µGulp™ orchestrator — progress reporting, i18x console output and interactive dashboard inputs from within gulp tasks.
· µGulp™ on GitHub · source tree
English
Rock your Gulp! — µGulp™, the interactive near-zero-latency task orchestrator with rich visuals, webview controls, and audio feedback.
gulp-mu-gulp-api gives gulp tasks (and any npm package inside the task stream) access to the extended µGulp™ dashboard features: progress bars, validated text inputs, color and font pickers, single and multi selections, sliders and complete forms.
The module is deliberately dependency-free and knows nothing about µGulp™ internals: when the task runs under µGulp™, it talks directly to the engine over the worker process IPC channel. When the gulpfile runs through the classic gulp CLI, every function degrades gracefully — progress renders on the terminal, inputs are asked via readline (TTY) or answered with the declared defaults (CI/non-TTY). Tasks stay fully runnable without µGulp™.
Installation
npm install gulp-mu-gulp-api0.3.8
- Added structured log elements rendered directly in the run log (JSON payloads, Content-Security-Policy safe, no plugin/iframe needed):
LogCallout()(info/success/warning/error box),LogKeyValue()(metrics/summary list),LogBadges()(status chips),LogCode()(monospace code block) andLogChart()(inline-SVG bar chart). - Each new helper degrades to a readable stdout fallback when running outside µGulp (bracketed callout, aligned key/value lines, bracketed badges, verbatim code, ASCII bar chart).
0.3.7
- Added engine date/time placeholders:
weekofyear,dayofyear,utcweekofyear,utcdayofyear,timezoneoffset,timezoneshort,timezoneplace. - Added
TimeZoneOffset()— JavaScript-compatible offset in minutes (same sign asDate.getTimezoneOffset()). - Added hyphenation API:
WordHyphenation(),Hyphenation(),LoadHyphenData(),InstallHyphenPrototypes()with µLib (WordHyphenation/Hyphenation) and i18xe-sync (wordHyphenation/hyphenation) aliases; without<lid>.hyphen.jsondata the methods no-op. - Added i18xe-sync lowercase format aliases:
Number.prototype.format()/.formatTimestamp()/.formatTicks(),Date.prototype.format(). - Changed
Translate(text, values?, timeZone?)and.i18xTrans(values?, timeZone?)accept an optional IANA timezone override.
0.3.6
- Added full eval-free i18x engine (
i18x-engine.mjs):FormatValue()/Translate()now honor the complete i18x notation —if/ifnot/ifinconditions, nested formats,expression="…", enumerations, digit fill/padding, date/time parts and roman numerals. - Added µLib-compatible
Number.prototype.Format(),Number.prototype.FormatTimestamp(),Number.prototype.FormatTicks(),Date.prototype.Format()andString.prototype.Format()(installed automatically on import; seeInstallFormatPrototypes()). - Changed
FormatValue(value, format, lid?, timeZone?)gained the optionaltimeZoneargument; date/time formats interpret the value as Unix milliseconds.
0.3.5
- Added
PlaySound(sample, { loop? })andStopSound(sample)— play named samples from the dashboard µAU sound atlas;loop: truerepeats untilStopSound. - Changed npm README: clearer i18x section (
Log/Warnvs.i18xTrans()/.i18xRegister()).
0.3.3
- Changed npm README: centered µGulp logo and µGulp ready badge (absolute raw URLs from the µGulp repo).
0.3.2
- Added
FormatValue()— renders<name format="…"/>placeholders from<format …>XML definitions in the consumer project'si18x/gulp/<lid>.json. - Changed built-in format IDs to CamelCase (
floatFix2,stdDate,progressDuration,byteSize, …); lifecycle duration logs expect raw milliseconds withformat="progressDuration".
0.3.0
- Added integrated i18x console layer:
Log,Warn,LogError,Translate,GetLid,SetLid,GetTimeZone,DateInTimeZone,InstallStringExtensions— translations live in the consumer project'si18x/gulp/<lid>.json; language followsMICROGULP_LANG(set by the µGulp dashboard) with locale fallback. - Added µLib-compatible
String.prototype.i18xTrans()/.i18xRegister()(installed automatically on import). - Removed
µMeta()/MicroGulpMeta— embed the context tag in the source phrase and use.i18xRegister()instead (see below).
Usage
import { ReportProgress, CreateProgress, PlaySignal, PlaySound, StopSound, Speak, RequestTextInput, RequestColorInput, RequestFontInput, RequestSelectInput, RequestMultiSelectInput, RequestForm, IsMicroGulp, IsµGulp, InstallStringExtensions } from 'gulp-mu-gulp-api';
// Enables "phrase<context=\"…\"/>".i18xRegister()/.i18xTrans() on strings.
InstallStringExtensions();
export async function BUILD_THEME() {
// single inputs
let accent = await RequestColorInput({ label: 'Accent color', default: '#00e5ff' });
let font = await RequestFontInput({ label: 'Headline font', options: ['Segoe UI', 'Cascadia Mono'] });
let title = await RequestTextInput({
label: 'Product title',
validate: { required: true, minLength: 3, pattern: '^[A-Za-z0-9 ]+$' },
});
let servers = await RequestMultiSelectInput({
label: 'Rollout servers',
options: [{ value: 'SMPMD', checked: true }, 'iMedOne', 'ACM'],
});
// progress (determinate neon bar in the µGulp dashboard)
let progress = CreateProgress('compiling theme');
for (let step = 1; step <= 10; step++) {
// ... work ...
progress.Update(step / 10);
}
progress.Done();
// sound + speech (rendered by the dashboard, configured in its settings)
PlaySignal('success'); // preset: success | error | attention
PlaySound('success'); // named atlas sample
PlaySound('engine', { loop: true }); // loop until StopSound('engine')
StopSound('engine');
Speak('Theme build finished.');
}
BUILD_THEME.µDisplayName = 'Build Theme<context="µDisplayName"/>'.i18xRegister();
BUILD_THEME.µDescription = 'Compiles the Carbon/Neon dashboard skin.<context="µDescription"/>'.i18xRegister();Complete forms in one go:
let values = await RequestForm({
title: 'Build parameters',
fields: [
{ id: 'mode', type: 'radio', label: 'Build mode', default: 'release', options: ['debug', 'release'] },
{ id: 'threads', type: 'range', label: 'Worker threads', min: 1, max: 16, step: 1, default: 4 },
{ id: 'notes', type: 'textarea', label: 'Release notes', rows: 4, placeholder: 'What changed?' },
{ id: 'apikey', type: 'password', label: 'API key', validate: { required: true } },
{ id: 'targets', type: 'checkbox', label: 'Targets', options: ['Alpha', 'Beta', 'Gamma'], validate: { minSelected: 1 } },
],
});
// values => { mode: 'release', threads: '8', notes: '…', apikey: '…', targets: ['Alpha', 'Gamma'] }API reference
| Function | Purpose |
| :--- | :--- |
| IsMicroGulp() / IsµGulp() | true when the task runs under µGulp™ with an attached dashboard |
| InstallStringExtensions() | Installs µLib-compatible String.prototype.i18xTrans()/i18xRegister() and the Format prototypes (auto-run on import) |
| InstallFormatPrototypes() | Installs Number/Date/String.prototype.Format() (auto-run on import) |
| Log(text, values?) / Warn / LogError | Localized console.* via i18x (<context="task log"/> etc.) — preferred for task log output |
| Translate(text, values?) | Low-level: returns the translated string without logging (rarely needed directly) |
| FormatValue(value, format, lid?, timeZone?) | Formats a number/date with a named i18x format (int, floatFix2, byteSize, stdDateTime, …) |
| (1536).Format('byteSize') | Prototype sugar for FormatValue; .FormatTimestamp()/.FormatTicks() on numbers, .Format() on dates |
| "phrase".i18xTrans(values?) | Prototype sugar for Translate — same result, ergonomic in expressions |
| "phrase".i18xRegister() | Registers metadata text (returns the source phrase unchanged as the i18x key) |
| GetLid() / SetLid(lid?) | Active language id; SetLid clears to automatic when omitted |
| ReportProgress(value, label?) | Report progress 0..1 to the task progress bar |
| CreateProgress(label?) | Reporter object with Update(value, stepLabel?) and Done() |
| PlaySignal(signal?) | Preset acoustic signal: 'success' | 'error' | 'attention' (default) |
| PlaySound(sample, options?) | Named sample from the dashboard sound atlas; options.loop repeats until StopSound |
| StopSound(sample) | Stops a looping sample started with PlaySound(sample, { loop: true }) |
| Speak(text, options?) | Speech output in the dashboard; options: { rate?, pitch?, volume? } per-call overrides |
| RequestForm(form) | Request a complete form; resolves with { fieldId: value, … } |
| RequestTextInput(options) | Single text field (with validate rules) |
| RequestColorInput(options) | Color picker, returns #rrggbb |
| RequestFontInput(options) | Font selection (options: font list) |
| RequestSelectInput(options) | Single selection from a fixed option list |
| RequestMultiSelectInput(options) | Multi selection (checkbox group), always resolves to a string[] |
Localized task metadata (.i18xRegister() + placeholders)
Write the i18xe context tag into the source phrase and mark it with .i18xRegister() — that marker is what the i18xe-sync tooling scans for, and at runtime it returns the phrase unchanged (the classic gulp CLI keeps seeing a plain string). Use i18xe placeholder tags in the source text. The dashboard substitutes a standard property set when translating:
| Placeholder | Source |
| :--- | :--- |
| version | µI18xContext.version export, else package.json |
| project | µI18xContext.project export, else package.json name |
| workspace | workspace folder name |
| source | gulpfile path relative to the workspace |
| gulpfile | gulpfile file name |
| task | technical export name |
| taskId | composite id source::task |
Export defaults from the gulpfile (overrides package.json):
export const µI18xContext = { version: '1.13', project: 'eMP' };
MAKE_BUILDS.µDisplayName = 'Make Build V<version/><context="µDisplayName"/>'.i18xRegister();
// => "Make Build V1.13" in the dashboard (translatable per language)Field types (for RequestForm)
A field descriptor is { id, type, label, default?, options?, validate?, min?, max?, step?, rows?, placeholder? }.
| type | Dashboard control | Notes |
| :--- | :--- | :--- |
| text | text field | default type |
| password | masked text field | |
| number | number field | honors min, max, step |
| textarea | multi-line text field | rows, placeholder |
| color | native color picker | value as #rrggbb |
| font | font selection | options: font family names |
| select | dropdown | single choice |
| radio | radio group | single exclusive choice, vertical option column |
| checkbox | checkbox group | multi-select — resolves to a string[] |
| range | slider + synced number box | min, max, step, default |
| date / time / datetime | native date/time pickers | |
| file | file selection | |
Options (select, radio, checkbox) accept plain strings or objects { value, label?, checked?, disabled? } — checked preselects checkbox options, disabled greys an option out.
Validation rules: { required?, minLength?, pattern?, minSelected? } (minSelected applies to checkbox). Checks run asynchronously in the dashboard; invalid forms cannot be submitted.
Fallback behavior without µGulp™
| Function | TTY (interactive shell) | non-TTY (CI, pipe) |
| :--- | :--- | :--- |
| ReportProgress | updating progress line | log line every 10% step |
| PlaySignal | terminal bell (attention/error) | silent |
| PlaySound / StopSound | [sound] <name> log line | silent |
| Speak | [speech] log line | [speech] log line |
| text/password/number/range input | readline prompt (Enter = default) | default value |
| font/select/radio input | numbered list + readline | default value |
| checkbox input | numbered list, comma-separated picks | values of the checked options |
Sound and speech playback (mute, volume, speech rate/pitch) is configured centrally in the µGulp™ dashboard settings (gear icon in the header) — tasks never need to care about the user's audio preferences.
License
MIT — © 2026 Meinolf Amekudzi
Publishing (maintainers)
npm accounts with 2FA reject npm publish with EOTP when ~/.npmrc holds a
web-login session token (npm login --auth-type=web). The reliable fix is a
Granular Access Token with Bypass 2FA and write access to this package:
- npmjs.com → Access Tokens → Generate → Granular
- Permissions: Read and write, Packages:
gulp-mu-gulp-api(or All packages) - Enable Bypass 2FA, copy the token, then:
npm config set //registry.npmjs.org/:_authToken <TOKEN>After that, publish without any OTP:
npm run publish:apiBump gulp-mu-gulp-api/package.json before publishing. The task runs the module
tests first. As a one-off, a 2FA code still works via NPM_OTP:
$env:NPM_OTP="123456"; npm run publish:apiDeutsch
gulp-mu-gulp-api ist die öffentliche Task-API des µGulp™-Orchestrators. Gulp-Tasks (und beliebige npm-Pakete innerhalb des Task-Streams) erhalten damit Zugriff auf die erweiterten µGulp™-Dashboard-Funktionen: Fortschrittsanzeige, i18x-Konsolenausgabe, Texteingaben mit Validierung, Farb- und Schriftart-Auswahl, Einzel- und Mehrfachauswahl, Slider und komplette Formulare.
Das Modul ist bewusst abhängigkeitsfrei und kennt keine µGulp™-Interna: Läuft der Task unter µGulp™, spricht es direkt über den IPC-Kanal des Worker-Prozesses mit der Engine. Läuft das Gulpfile klassisch über die gulp-CLI, degradieren alle Funktionen sauber — Fortschritt landet auf dem Terminal, Eingaben werden per readline abgefragt (TTY) oder mit den deklarierten Default-Werten beantwortet (CI/non-TTY). Tasks bleiben ohne µGulp™ voll lauffähig.
Installation
npm install gulp-mu-gulp-api0.3.8
- Neu strukturierte Log-Elemente, die direkt im Run-Log gerendert werden (JSON-Payloads, Content-Security-Policy-sicher, ohne Plugin/iframe):
LogCallout()(Info/Success/Warning/Error-Box),LogKeyValue()(Metriken/Zusammenfassung),LogBadges()(Status-Chips),LogCode()(Monospace-Codeblock) undLogChart()(Inline-SVG-Balkendiagramm). - Jeder neue Helfer fällt außerhalb von µGulp auf eine lesbare stdout-Ausgabe zurück (Callout in Klammern, ausgerichtete Key/Value-Zeilen, Badges in Klammern, Code wortgetreu, ASCII-Balkendiagramm).
0.3.7
- Neu Engine-Datum/Zeit-Platzhalter:
weekofyear,dayofyear,utcweekofyear,utcdayofyear,timezoneoffset,timezoneshort,timezoneplace. - Neu
TimeZoneOffset()— JavaScript-kompatibler Offset in Minuten (gleiches Vorzeichen wieDate.getTimezoneOffset()). - Neu Silbentrennungs-API:
WordHyphenation(),Hyphenation(),LoadHyphenData(),InstallHyphenPrototypes()mit µLib- (WordHyphenation/Hyphenation) und i18xe-sync-Aliasen (wordHyphenation/hyphenation); ohne<lid>.hyphen.json-Daten No-op. - Neu i18xe-sync-Lowercase-Format-Aliase:
Number.prototype.format()/.formatTimestamp()/.formatTicks(),Date.prototype.format(). - Geändert
Translate(text, values?, timeZone?)und.i18xTrans(values?, timeZone?)akzeptieren optional eine IANA-Zeitzone.
0.3.6
- Neu vollständige eval-freie i18x-Engine (
i18x-engine.mjs):FormatValue()/Translate()beherrschen jetzt die komplette i18x-Notation —if/ifnot/ifin-Bedingungen, verschachtelte Formate,expression="…", Enumerationen, Ziffern-Fill/Padding, Datum/Zeit-Teile und römische Zahlen. - Neu µLib-kompatible
Number.prototype.Format(),Number.prototype.FormatTimestamp(),Number.prototype.FormatTicks(),Date.prototype.Format()undString.prototype.Format()(werden beim Import automatisch installiert; sieheInstallFormatPrototypes()). - Geändert
FormatValue(value, format, lid?, timeZone?)um das optionaletimeZone-Argument erweitert; Datum/Zeit-Formate interpretieren den Wert als Unix-Millisekunden.
0.3.5
- Neu
PlaySound(sample, { loop? })undStopSound(sample)— benannte Samples aus dem Dashboard-µAU-Sound-Atlas;loop: truewiederholt bisStopSound. - Geändert npm-README: klarere i18x-Sektion (
Log/Warnvs..i18xTrans()/.i18xRegister()).
0.3.3
- Geändert npm-README: zentriertes µGulp-Logo und µGulp-ready-Badge (absolute raw-URLs aus dem µGulp-Repo).
0.3.2
- Neu
FormatValue()— rendert<name format="…"/>-Platzhalter aus<format …>-XML-Definitionen ini18x/gulp/<lid>.jsondes Verbraucherprojekts. - Geändert Format-IDs auf CamelCase (
floatFix2,stdDate,progressDuration,byteSize, …); Lifecycle-Dauer-Logs erwarten Roh-Millisekunden mitformat="progressDuration".
0.3.0
- Neu integrierte i18x-Konsolenschicht:
Log,Warn,LogError,Translate,GetLid,SetLid,GetTimeZone,DateInTimeZone,InstallStringExtensions— Übersetzungen liegen im Verbraucherprojekt unteri18x/gulp/<lid>.json; die Sprache folgtMICROGULP_LANG(vom µGulp-Dashboard gesetzt) mit Locale-Fallback. - Neu µLib-kompatible
String.prototype.i18xTrans()/.i18xRegister()(werden beim Import automatisch installiert). - Entfernt
µMeta()/MicroGulpMeta— Kontext-Tag in die Textphrase schreiben und.i18xRegister()verwenden (siehe unten).
Verwendung
import { ReportProgress, CreateProgress, PlaySignal, PlaySound, StopSound, Speak, RequestTextInput, RequestColorInput, RequestFontInput, RequestSelectInput, RequestMultiSelectInput, RequestForm, IsMicroGulp, IsµGulp, InstallStringExtensions } from 'gulp-mu-gulp-api';
// Enables "phrase<context=\"…\"/>".i18xRegister()/.i18xTrans() on strings.
InstallStringExtensions();
export async function BUILD_THEME() {
// Einzeleingaben
let accent = await RequestColorInput({ label: 'Accent color', default: '#00e5ff' });
let font = await RequestFontInput({ label: 'Headline font', options: ['Segoe UI', 'Cascadia Mono'] });
let title = await RequestTextInput({
label: 'Product title',
validate: { required: true, minLength: 3, pattern: '^[A-Za-z0-9 ]+$' },
});
let servers = await RequestMultiSelectInput({
label: 'Rollout servers',
options: [{ value: 'SMPMD', checked: true }, 'iMedOne', 'ACM'],
});
// Fortschritt (determinierte Neon-Progressbar im µGulp-Dashboard)
let progress = CreateProgress('compiling theme');
for (let step = 1; step <= 10; step++) {
// ... Arbeit ...
progress.Update(step / 10);
}
progress.Done();
// sound + speech (rendered by the dashboard, configured in its settings)
PlaySignal('success'); // preset: success | error | attention
PlaySound('success'); // named atlas sample
PlaySound('engine', { loop: true }); // loop until StopSound('engine')
StopSound('engine');
Speak('Theme build finished.');
}
BUILD_THEME.µDisplayName = 'Build Theme<context="µDisplayName"/>'.i18xRegister();
BUILD_THEME.µDescription = 'Kompiliert den Carbon/Neon-Dashboard-Skin.<context="µDescription"/>'.i18xRegister();Komplette Formulare in einem Rutsch:
let values = await RequestForm({
title: 'Build parameters',
fields: [
{ id: 'mode', type: 'radio', label: 'Build mode', default: 'release', options: ['debug', 'release'] },
{ id: 'threads', type: 'range', label: 'Worker threads', min: 1, max: 16, step: 1, default: 4 },
{ id: 'notes', type: 'textarea', label: 'Release notes', rows: 4, placeholder: 'What changed?' },
{ id: 'apikey', type: 'password', label: 'API key', validate: { required: true } },
{ id: 'targets', type: 'checkbox', label: 'Targets', options: ['Alpha', 'Beta', 'Gamma'], validate: { minSelected: 1 } },
],
});
// values => { mode: 'release', threads: '8', notes: '…', apikey: '…', targets: ['Alpha', 'Gamma'] }API-Referenz
| Funktion | Zweck |
| :--- | :--- |
| IsMicroGulp() / IsµGulp() | true, wenn der Task unter µGulp™ mit angebundenem Dashboard läuft |
| InstallStringExtensions() | Installiert µLib-kompatible String.prototype.i18xTrans()/i18xRegister() und die Format-Prototypes (läuft beim Import automatisch) |
| InstallFormatPrototypes() | Installiert Number/Date/String.prototype.Format() (läuft beim Import automatisch) |
| FormatValue(value, format, lid?, timeZone?) | Formatiert Zahl/Datum mit einem benannten i18x-Format (int, floatFix2, byteSize, stdDateTime, …) |
| (1536).Format('byteSize') | Prototype-Kurzform für FormatValue; .FormatTimestamp()/.FormatTicks() an Zahlen, .Format() an Dates |
| Log(text, values?) / Warn / LogError | Lokalisierte console.*-Ausgabe über i18x — bevorzugt für Task-Logs |
| Translate(text, values?) | Low-Level: übersetzter String ohne Log (selten direkt nötig) |
| "phrase".i18xTrans(values?) | Prototype-Kurzform für Translate |
| "phrase".i18xRegister() | Metadaten-Text registrieren (gibt die Quellphrase unverändert zurück) |
| GetLid() / SetLid(lid?) | Aktive Sprach-ID; SetLid ohne Argument = automatische Auflösung |
| ReportProgress(value, label?) | Fortschritt 0..1 an die Task-Progressbar melden |
| CreateProgress(label?) | Reporter-Objekt mit Update(value, stepLabel?) und Done() |
| PlaySignal(signal?) | Vorgabe-Signal: 'success' | 'error' | 'attention' (Default) |
| PlaySound(sample, options?) | Benanntes Sample aus dem Sound-Atlas; options.loop wiederholt bis StopSound |
| StopSound(sample) | Stoppt eine Schleife von PlaySound(sample, { loop: true }) |
| Speak(text, options?) | Sprachausgabe im Dashboard; options: { rate?, pitch?, volume? } je Aufruf |
| RequestForm(form) | Komplettes Formular anfordern; löst mit { fieldId: value, … } auf |
| RequestTextInput(options) | Einzelnes Textfeld (mit validate-Regeln) |
| RequestColorInput(options) | Farbwähler, Rückgabe #rrggbb |
| RequestFontInput(options) | Schriftart-Auswahl (options: Font-Liste) |
| RequestSelectInput(options) | Einzelauswahl aus fester Optionsliste |
| RequestMultiSelectInput(options) | Mehrfachauswahl (Checkbox-Gruppe), löst immer mit string[] auf |
Lokalisierte Task-Metadaten (.i18xRegister() + Platzhalter)
Den i18xe-Kontext-Tag in die Textphrase schreiben und mit .i18xRegister() markieren — genau diese Markierung scannt das i18xe-sync-Tooling, zur Laufzeit gibt sie den Text unverändert zurück (die klassische gulp-CLI sieht weiterhin einen einfachen String). i18xe-Platzhalter im Quelltext verwenden. Beim Übersetzen setzt das Dashboard einen Standardsatz ein:
| Platzhalter | Quelle |
| :--- | :--- |
| version | µI18xContext.version-Export, sonst package.json |
| project | µI18xContext.project-Export, sonst package.json name |
| workspace | Workspace-Ordnername |
| source | Gulpfile-Pfad relativ zum Workspace |
| gulpfile | Gulpfile-Dateiname |
| task | technischer Exportname |
| taskId | zusammengesetzte Id source::task |
Defaults im Gulpfile exportieren (package.json wird überschrieben):
export const µI18xContext = { version: '1.13', project: 'eMP' };
MAKE_BUILDS.µDisplayName = 'Make Build V<version/><context="µDisplayName"/>'.i18xRegister();
// => „Make Build V1.13“ im Dashboard (pro Sprache übersetzbar)Feldtypen (für RequestForm)
Ein Feld-Deskriptor ist { id, type, label, default?, options?, validate?, min?, max?, step?, rows?, placeholder? }.
| type | Dashboard-Steuerelement | Hinweise |
| :--- | :--- | :--- |
| text | Textfeld | Standardtyp |
| password | maskiertes Textfeld | |
| number | Zahlenfeld | berücksichtigt min, max, step |
| textarea | mehrzeiliges Textfeld | rows, placeholder |
| color | nativer Farbwähler | Wert als #rrggbb |
| font | Schriftart-Auswahl | options: Font-Familiennamen |
| select | Dropdown | Einzelauswahl |
| radio | Radiogruppe | exklusive Einzelauswahl, vertikale Optionsspalte |
| checkbox | Checkbox-Gruppe | Mehrfachauswahl — löst mit string[] auf |
| range | Slider + synchronisiertes Zahlenfeld | min, max, step, default |
| date / time / datetime | native Datums-/Zeitwähler | |
| file | Dateiauswahl | |
Options (select, radio, checkbox) akzeptieren einfache Strings oder Objekte { value, label?, checked?, disabled? } — checked selektiert Checkbox-Optionen vor, disabled graut eine Option aus.
Validierungsregeln: { required?, minLength?, pattern?, minSelected? } (minSelected gilt für checkbox). Die Prüfung läuft asynchron im Dashboard; ungültige Formulare können nicht abgeschickt werden.
Fallback-Verhalten ohne µGulp™
| Funktion | TTY (interaktive Shell) | non-TTY (CI, Pipe) |
| :--- | :--- | :--- |
| ReportProgress | aktualisierende Fortschrittszeile | Log-Zeile je 10-%-Schritt |
| PlaySignal | Terminal-Glocke (attention/error) | stumm |
| PlaySound / StopSound | [sound]-Log-Zeile | stumm |
| Speak | [speech]-Log-Zeile | [speech]-Log-Zeile |
| Text-/Passwort-/Zahlen-/Range-Eingabe | readline-Prompt (Enter = Default) | Default-Wert |
| Font-/Select-/Radio-Eingabe | nummerierte Liste + readline | Default-Wert |
| Checkbox-Eingabe | nummerierte Liste, Kommaeingabe | Werte der checked-Optionen |
Die Sound- und Sprachwiedergabe (Mute, Lautstärke, Sprechgeschwindigkeit/-höhe) wird zentral in den µGulp™-Dashboard-Settings konfiguriert (Zahnrad im Kopfbereich) — Tasks müssen sich um die Audio-Einstellungen der Anwender nicht kümmern.
Lizenz
MIT — © 2026 Meinolf Amekudzi
