npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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

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.

npm version · µGulp™ on GitHub · source tree

English · Deutsch


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-api

0.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) and LogChart() (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 as Date.getTimezoneOffset()).
  • Added hyphenation API: WordHyphenation(), Hyphenation(), LoadHyphenData(), InstallHyphenPrototypes() with µLib (WordHyphenation/Hyphenation) and i18xe-sync (wordHyphenation/hyphenation) aliases; without <lid>.hyphen.json data 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/ifin conditions, 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() and String.prototype.Format() (installed automatically on import; see InstallFormatPrototypes()).
  • Changed FormatValue(value, format, lid?, timeZone?) gained the optional timeZone argument; date/time formats interpret the value as Unix milliseconds.

0.3.5

  • Added PlaySound(sample, { loop? }) and StopSound(sample) — play named samples from the dashboard µAU sound atlas; loop: true repeats until StopSound.
  • Changed npm README: clearer i18x section (Log/Warn vs .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's i18x/gulp/<lid>.json.
  • Changed built-in format IDs to CamelCase (floatFix2, stdDate, progressDuration, byteSize, …); lifecycle duration logs expect raw milliseconds with format="progressDuration".

0.3.0

  • Added integrated i18x console layer: Log, Warn, LogError, Translate, GetLid, SetLid, GetTimeZone, DateInTimeZone, InstallStringExtensions — translations live in the consumer project's i18x/gulp/<lid>.json; language follows MICROGULP_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:

  1. npmjs.com → Access Tokens → Generate → Granular
  2. Permissions: Read and write, Packages: gulp-mu-gulp-api (or All packages)
  3. Enable Bypass 2FA, copy the token, then:
npm config set //registry.npmjs.org/:_authToken <TOKEN>

After that, publish without any OTP:

npm run publish:api

Bump 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:api

Deutsch

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.

npm version · µGulp™ auf GitHub

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-api

0.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) und LogChart() (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 wie Date.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() und String.prototype.Format() (werden beim Import automatisch installiert; siehe InstallFormatPrototypes()).
  • Geändert FormatValue(value, format, lid?, timeZone?) um das optionale timeZone-Argument erweitert; Datum/Zeit-Formate interpretieren den Wert als Unix-Millisekunden.

0.3.5

  • Neu PlaySound(sample, { loop? }) und StopSound(sample) — benannte Samples aus dem Dashboard-µAU-Sound-Atlas; loop: true wiederholt bis StopSound.
  • Geändert npm-README: klarere i18x-Sektion (Log/Warn vs. .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 in i18x/gulp/<lid>.json des Verbraucherprojekts.
  • Geändert Format-IDs auf CamelCase (floatFix2, stdDate, progressDuration, byteSize, …); Lifecycle-Dauer-Logs erwarten Roh-Millisekunden mit format="progressDuration".

0.3.0

  • Neu integrierte i18x-Konsolenschicht: Log, Warn, LogError, Translate, GetLid, SetLid, GetTimeZone, DateInTimeZone, InstallStringExtensions — Übersetzungen liegen im Verbraucherprojekt unter i18x/gulp/<lid>.json; die Sprache folgt MICROGULP_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