@mudah-cli/core 0.8.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/i18n.js ADDED
@@ -0,0 +1,228 @@
1
+ import { readdirSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const FALLBACK_LOCALE = 'en';
4
+ const catalogs = new Map();
5
+ let currentLocale = FALLBACK_LOCALE;
6
+ const EN = {
7
+ // Command descriptions (mirrored by each built-in's `descriptionKey`).
8
+ 'cmd.help.description': 'Show help for the CLI or a specific command',
9
+ 'cmd.version.description': 'Show the application version',
10
+ 'cmd.make.description': 'Scaffold a command, provider, config file, TUI screen, or plugin',
11
+ 'cmd.build.description': 'Build the application (runs the package.json build script)',
12
+ 'cmd.doctor.description': 'Check the runtime, app, and terminal setup',
13
+ 'cmd.dev.description': 'Watch mode: re-run a command when files change',
14
+ 'cmd.watch.description': 'Watch files and re-run a command',
15
+ 'cmd.test.description': 'Discover *.test.ts files and run vitest',
16
+ 'cmd.info.description': 'Show runtime, app, and config information',
17
+ 'cmd.tutorial.description': 'Interactive walkthrough: create app, make command, TestTui, doctor',
18
+ 'cmd.replay.description': 'Replay a structured TUI session JSON file',
19
+ 'cmd.gallery.description': 'Open a TUI widget gallery with live resize',
20
+ 'cmd.docs.widgets.description': 'Print the TUI widget reference generated from inspect()',
21
+ 'cmd.lsp.description': 'Language server for mudah.json keys and command signatures',
22
+ 'cmd.graph.description': 'Render the provider dependency graph',
23
+ 'cmd.cache.description': 'List or clear the local Mudah cache',
24
+ 'cmd.telemetry.description': 'Summarize or clear the local telemetry log',
25
+ 'cmd.autocomplete.description': 'Emit a shell completion script',
26
+ 'cmd.complete.description': 'Print tab-completion candidates',
27
+ 'cmd.config.show.description': 'Dump configuration (secrets are redacted by default)',
28
+ 'cmd.config.diff.description': 'Diff current config against a baseline JSON file (secrets are redacted)',
29
+ 'cmd.config.set.description': 'Set a config value (dotted key)',
30
+ 'cmd.config.source.description': 'Show which layer a config key resolved from (secrets are redacted)',
31
+ 'cmd.config.validate.description': 'Run a schema check against the (current) config tree',
32
+ 'cmd.plugins.list.description': 'List discovered plugins',
33
+ 'cmd.plugins.update.description': 'Check the npm registry for plugin updates and optionally install them',
34
+ 'cmd.plugins.watch.description': 'Watch node_modules and reload plugin providers',
35
+ // Prompts and shared output.
36
+ 'prompt.continue': 'Continue?',
37
+ 'plugins.none': 'No plugins discovered',
38
+ 'plugins.upToDate': 'Plugins are up to date',
39
+ 'plugins.listed': '{count} plugin(s)',
40
+ 'plugins.loaded.one': '{count} plugin loaded',
41
+ 'plugins.loaded.other': '{count} plugins loaded',
42
+ 'plugins.reloaded': 'Plugins reloaded',
43
+ 'cache.empty': 'Cache is empty',
44
+ 'telemetry.empty': 'Telemetry log is empty',
45
+ 'telemetry.absent': 'No telemetry log yet',
46
+ };
47
+ const DE = {
48
+ 'cmd.help.description': 'Hilfe für die CLI oder einen bestimmten Befehl anzeigen',
49
+ 'cmd.version.description': 'Die Anwendungsversion anzeigen',
50
+ 'cmd.make.description': 'Befehl, Provider, Konfigurationsdatei, TUI-Bildschirm oder Plugin erzeugen',
51
+ 'cmd.build.description': 'Die Anwendung bauen (führt das build-Skript der package.json aus)',
52
+ 'cmd.doctor.description': 'Laufzeit, Anwendung und Terminal-Einrichtung prüfen',
53
+ 'cmd.dev.description': 'Watch-Modus: einen Befehl bei Dateiänderungen erneut ausführen',
54
+ 'cmd.watch.description': 'Dateien beobachten und einen Befehl erneut ausführen',
55
+ 'cmd.test.description': '*.test.ts-Dateien finden und vitest ausführen',
56
+ 'cmd.info.description': 'Informationen zu Laufzeit, Anwendung und Konfiguration anzeigen',
57
+ 'cmd.tutorial.description': 'Interaktive Einführung: App erstellen, Befehl anlegen, TestTui, doctor',
58
+ 'cmd.replay.description': 'Eine strukturierte TUI-Sitzung aus einer JSON-Datei abspielen',
59
+ 'cmd.gallery.description': 'Eine TUI-Widget-Galerie mit Live-Größenänderung öffnen',
60
+ 'cmd.docs.widgets.description': 'Die aus inspect() erzeugte TUI-Widget-Referenz ausgeben',
61
+ 'cmd.lsp.description': 'Sprachserver für mudah.json-Schlüssel und Befehlssignaturen',
62
+ 'cmd.graph.description': 'Den Provider-Abhängigkeitsgraphen darstellen',
63
+ 'cmd.cache.description': 'Den lokalen Mudah-Cache auflisten oder leeren',
64
+ 'cmd.telemetry.description': 'Das lokale Telemetrie-Protokoll zusammenfassen oder leeren',
65
+ 'cmd.autocomplete.description': 'Ein Shell-Vervollständigungsskript ausgeben',
66
+ 'cmd.complete.description': 'Tab-Vervollständigungsvorschläge ausgeben',
67
+ 'cmd.config.show.description': 'Konfiguration ausgeben (Geheimnisse werden standardmäßig maskiert)',
68
+ 'cmd.config.diff.description': 'Aktuelle Konfiguration mit einer Baseline-JSON-Datei vergleichen (Geheimnisse maskiert)',
69
+ 'cmd.config.set.description': 'Einen Konfigurationswert setzen (Punkt-Schlüssel)',
70
+ 'cmd.config.source.description': 'Anzeigen, aus welcher Ebene ein Konfigurationsschlüssel stammt (Geheimnisse maskiert)',
71
+ 'cmd.config.validate.description': 'Eine Schema-Prüfung gegen den (aktuellen) Konfigurationsbaum ausführen',
72
+ 'cmd.plugins.list.description': 'Gefundene Plugins auflisten',
73
+ 'cmd.plugins.update.description': 'Die npm-Registry auf Plugin-Aktualisierungen prüfen und sie optional installieren',
74
+ 'cmd.plugins.watch.description': 'node_modules beobachten und Plugin-Provider neu laden',
75
+ 'prompt.continue': 'Fortfahren?',
76
+ 'plugins.none': 'Keine Plugins gefunden',
77
+ 'plugins.upToDate': 'Plugins sind aktuell',
78
+ 'plugins.listed': '{count} Plugin(s)',
79
+ 'plugins.loaded.one': '{count} Plugin geladen',
80
+ 'plugins.loaded.other': '{count} Plugins geladen',
81
+ 'plugins.reloaded': 'Plugins neu geladen',
82
+ 'cache.empty': 'Cache ist leer',
83
+ 'telemetry.empty': 'Telemetrie-Protokoll ist leer',
84
+ 'telemetry.absent': 'Noch kein Telemetrie-Protokoll',
85
+ };
86
+ /** Merge `dict` into the catalog for `locale` (later keys win). */
87
+ export function addMessages(locale, dict) {
88
+ const existing = catalogs.get(locale) ?? {};
89
+ catalogs.set(locale, { ...existing, ...dict });
90
+ }
91
+ /** True when a catalog exists for this exact locale tag. */
92
+ export function hasLocale(locale) {
93
+ return catalogs.has(locale);
94
+ }
95
+ /** Every registered locale tag, sorted. */
96
+ export function locales() {
97
+ return [...catalogs.keys()].sort();
98
+ }
99
+ /**
100
+ * Load `<locale>.json` catalogs from a directory into the registry.
101
+ * Malformed files are skipped. Returns the locale tags that loaded.
102
+ */
103
+ export function loadMessages(dir) {
104
+ let entries;
105
+ try {
106
+ entries = readdirSync(dir);
107
+ }
108
+ catch {
109
+ return [];
110
+ }
111
+ const loaded = [];
112
+ for (const entry of entries) {
113
+ if (!entry.endsWith('.json'))
114
+ continue;
115
+ const locale = entry.slice(0, -'.json'.length);
116
+ if (locale.length === 0)
117
+ continue;
118
+ try {
119
+ const parsed = JSON.parse(readFileSync(join(dir, entry), 'utf8'));
120
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
121
+ continue;
122
+ const dict = {};
123
+ for (const [key, value] of Object.entries(parsed)) {
124
+ if (typeof value === 'string')
125
+ dict[key] = value;
126
+ }
127
+ addMessages(locale, dict);
128
+ loaded.push(locale);
129
+ }
130
+ catch {
131
+ // A malformed catalog is skipped rather than taking the app down.
132
+ }
133
+ }
134
+ return loaded.sort();
135
+ }
136
+ /** Switch the active locale. Unknown locales still fall back to `en`. */
137
+ export function setLocale(locale) {
138
+ currentLocale = locale;
139
+ }
140
+ /** Current locale (last value passed to {@link setLocale}). */
141
+ export function getLocale() {
142
+ return currentLocale;
143
+ }
144
+ /**
145
+ * Resolve a locale tag from the environment. `MUDAH_LOCALE` wins, then
146
+ * `LC_ALL` / `LC_MESSAGES` / `LANG`. `de_DE.UTF-8` → `de-DE`. Returns
147
+ * undefined for unset, `C`, and `POSIX`.
148
+ */
149
+ export function localeFromEnv(env = process.env) {
150
+ const raw = env['MUDAH_LOCALE'] ?? env['LC_ALL'] ?? env['LC_MESSAGES'] ?? env['LANG'];
151
+ if (raw === undefined)
152
+ return undefined;
153
+ const cleaned = (raw.split('.')[0] ?? '').split('@')[0]?.trim() ?? '';
154
+ if (cleaned === '' || cleaned === 'C' || cleaned === 'POSIX')
155
+ return undefined;
156
+ return cleaned.replace('_', '-');
157
+ }
158
+ /**
159
+ * Adopt the locale from the environment. Returns the locale that was set
160
+ * (`en` when the environment names none).
161
+ */
162
+ export function setLocaleFromEnv(env = process.env) {
163
+ const resolved = localeFromEnv(env) ?? FALLBACK_LOCALE;
164
+ currentLocale = resolved;
165
+ return resolved;
166
+ }
167
+ /** True when `key` resolves in the fallback chain for `locale`. */
168
+ export function hasMessage(key, locale = currentLocale) {
169
+ for (const candidate of candidateLocales(locale)) {
170
+ if (lookup(candidate, key) !== undefined)
171
+ return true;
172
+ }
173
+ return false;
174
+ }
175
+ /**
176
+ * Look up `key` in the active locale, falling back to the base language and
177
+ * then `en`, and finally returning the key itself. `{name}` placeholders are
178
+ * replaced from `vars`; a numeric `count` selects a plural form first.
179
+ */
180
+ export function t(key, vars) {
181
+ const count = vars?.['count'];
182
+ let template;
183
+ for (const locale of candidateLocales(currentLocale)) {
184
+ if (typeof count === 'number') {
185
+ const category = pluralCategory(locale, count);
186
+ template = lookup(locale, `${key}.${category}`) ?? lookup(locale, `${key}.other`);
187
+ }
188
+ template ??= lookup(locale, key);
189
+ if (template !== undefined)
190
+ break;
191
+ }
192
+ return interpolate(template ?? key, vars);
193
+ }
194
+ /** Exact-catalog lookup — no fallback. */
195
+ function lookup(locale, key) {
196
+ return catalogs.get(locale)?.[key];
197
+ }
198
+ /** `de-AT` → `['de-AT', 'de', 'en']`; `en` → `['en']`. */
199
+ function candidateLocales(locale) {
200
+ const out = [locale];
201
+ const base = locale.split('-')[0];
202
+ if (base !== undefined && base !== '' && base !== locale)
203
+ out.push(base);
204
+ if (!out.includes(FALLBACK_LOCALE))
205
+ out.push(FALLBACK_LOCALE);
206
+ return out;
207
+ }
208
+ /** CLDR plural category for a locale, with an English-shaped fallback. */
209
+ function pluralCategory(locale, count) {
210
+ try {
211
+ return new Intl.PluralRules(locale).select(count);
212
+ }
213
+ catch {
214
+ return count === 1 ? 'one' : 'other';
215
+ }
216
+ }
217
+ function interpolate(template, vars) {
218
+ if (vars === undefined)
219
+ return template;
220
+ let out = template;
221
+ for (const [name, value] of Object.entries(vars)) {
222
+ out = out.replaceAll(`{${name}}`, String(value));
223
+ }
224
+ return out;
225
+ }
226
+ addMessages(FALLBACK_LOCALE, EN);
227
+ addMessages('de', DE);
228
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,10 @@
1
- export { Application, isCommandExport, type CommandClass, type BootOptions, type BootProfile, type CommandModule, type CommandShape, type LazyProviderOptions, type ProviderClass, type ProviderTiming, } from './application.js';
2
- export { EventBus, type AppEvents, type EventHandler } from './events.js';
1
+ export { Application, type BootOptions, type BootProfile, type CommandClass, type CommandModule, type CommandShape, type IoStreams, isCommandExport, type LazyProviderOptions, type ProviderClass, type ProviderHealth, type ProviderTiming, } from './application.js';
2
+ export { type AppEvents, EventBus, type EventHandler } from './events.js';
3
3
  export { CommandCancelled, ExitError, UsageError } from './exceptions.js';
4
- export { loadManifest, MudahManifestError, type MudahManifest, type MudahUiOptions } from './manifest.js';
4
+ export { formatGraph, type GraphEdge, type ProviderGraph, pluginGraph } from './graph.js';
5
+ export { addMessages, getLocale, hasLocale, hasMessage, loadMessages, localeFromEnv, locales, type MessageDict, setLocale, setLocaleFromEnv, t, } from './i18n.js';
6
+ export { loadManifest, type MudahManifest, MudahManifestError, type MudahUiOptions } from './manifest.js';
7
+ export { CORE_VERSION, discoverPlugins, findPluginPackages, gatePlugin, loadPlugin, type PluginDiscoveryOptions, type PluginGateContext, type PluginGateResult, type PluginInfo, satisfiesPeerRange, sortPluginsByDependency, } from './plugins.js';
5
8
  export { ServiceProvider } from './service-provider.js';
6
- export { discoverPlugins, findPluginPackages, loadPlugin, type PluginDiscoveryOptions, type PluginInfo, } from './plugins.js';
7
- export { checkForUpdate, clearUpdateCache, compareSemVer, defaultCacheDir, formatUpdateNudge, isNewer, parseSemVer, updateKind, type SemVer, type UpdateCheckOptions, type UpdateCheckResult, type UpdateInfo, } from './updates.js';
9
+ export { clearTelemetryLog, createFanoutSink, createJsonlSink, createMemorySink, createStreamSink, createTelemetry, parseTelemetryLog, readTelemetryLog, resolveTelemetry, summarizeTelemetry, TELEMETRY_FILE, type Telemetry, type TelemetryEvent, type TelemetryOptions, type TelemetrySink, type TelemetrySummary, type TelemetrySummaryRow, } from './telemetry.js';
10
+ export { checkForUpdate, clearUpdateCache, compareSemVer, defaultCacheDir, formatUpdateNudge, isNewer, parseSemVer, type SemVer, type UpdateCheckOptions, type UpdateCheckResult, type UpdateInfo, updateKind, } from './updates.js';
package/dist/index.js CHANGED
@@ -1,8 +1,11 @@
1
1
  export { Application, isCommandExport, } from './application.js';
2
2
  export { EventBus } from './events.js';
3
3
  export { CommandCancelled, ExitError, UsageError } from './exceptions.js';
4
+ export { formatGraph, pluginGraph } from './graph.js';
5
+ export { addMessages, getLocale, hasLocale, hasMessage, loadMessages, localeFromEnv, locales, setLocale, setLocaleFromEnv, t, } from './i18n.js';
4
6
  export { loadManifest, MudahManifestError } from './manifest.js';
7
+ export { CORE_VERSION, discoverPlugins, findPluginPackages, gatePlugin, loadPlugin, satisfiesPeerRange, sortPluginsByDependency, } from './plugins.js';
5
8
  export { ServiceProvider } from './service-provider.js';
6
- export { discoverPlugins, findPluginPackages, loadPlugin, } from './plugins.js';
9
+ export { clearTelemetryLog, createFanoutSink, createJsonlSink, createMemorySink, createStreamSink, createTelemetry, parseTelemetryLog, readTelemetryLog, resolveTelemetry, summarizeTelemetry, TELEMETRY_FILE, } from './telemetry.js';
7
10
  export { checkForUpdate, clearUpdateCache, compareSemVer, defaultCacheDir, formatUpdateNudge, isNewer, parseSemVer, updateKind, } from './updates.js';
8
11
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,eAAe,GAShB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAqC,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAA2C,MAAM,eAAe,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,UAAU,GAGX,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,WAAW,EACX,UAAU,GAKX,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAOX,eAAe,GAKhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAkB,QAAQ,EAAqB,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAsC,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EACL,WAAW,EACX,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,aAAa,EACb,OAAO,EAEP,SAAS,EACT,gBAAgB,EAChB,CAAC,GACF,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAsB,kBAAkB,EAAuB,MAAM,eAAe,CAAC;AAC1G,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,UAAU,EAKV,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GAOf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,WAAW,EAKX,UAAU,GACX,MAAM,cAAc,CAAC"}
@@ -21,6 +21,15 @@ export interface MudahManifest {
21
21
  commands?: string[];
22
22
  /** Extra provider file paths (relative to the app root) beyond src/providers. */
23
23
  providers?: string[];
24
+ /** Opt in to boot/perf telemetry (disabled by default). */
25
+ telemetry?: boolean;
26
+ /** Declarative `mudah watch` defaults. */
27
+ watch?: {
28
+ command?: string;
29
+ glob?: string;
30
+ ignore?: string[];
31
+ debounceMs?: number;
32
+ };
24
33
  }
25
34
  export declare class MudahManifestError extends Error {
26
35
  constructor(message: string);
package/dist/manifest.js CHANGED
@@ -44,6 +44,19 @@ export function loadManifest(basePath) {
44
44
  manifest.commands = data.commands.filter((c) => typeof c === 'string');
45
45
  if (Array.isArray(data.providers))
46
46
  manifest.providers = data.providers.filter((p) => typeof p === 'string');
47
+ if (data.telemetry === true)
48
+ manifest.telemetry = true;
49
+ if (data.watch && typeof data.watch === 'object') {
50
+ const watch = data.watch;
51
+ manifest.watch = {
52
+ command: typeof watch.command === 'string' ? watch.command : undefined,
53
+ glob: typeof watch.glob === 'string' ? watch.glob : undefined,
54
+ ignore: Array.isArray(watch.ignore)
55
+ ? watch.ignore.filter((v) => typeof v === 'string')
56
+ : undefined,
57
+ debounceMs: typeof watch.debounceMs === 'number' ? watch.debounceMs : undefined,
58
+ };
59
+ }
47
60
  return manifest;
48
61
  }
49
62
  //# sourceMappingURL=manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA4BjC,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC1C,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,kBAAkB,CAC1B,wBAAwB,IAAI,KAAK,MAAM,gHAAgH,CACxJ,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,kBAAkB,CAAC,wCAAwC,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,GAA8B,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC;IACxB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,kBAAkB,CAAC,qDAAqD,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,kBAAkB,CAAC,wDAAwD,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,kBAAkB,CAAC,oDAAoD,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,QAAQ,GAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACpF,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;QAAE,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IAClF,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IACvE,IAAI,IAAI,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;QAAE,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,EAAoB,CAAC;IACpF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IACtH,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IACzH,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
package/dist/plugins.d.ts CHANGED
@@ -17,10 +17,20 @@ import { type CommandModule, type ProviderClass } from './application.js';
17
17
  export interface PluginInfo {
18
18
  /** Package name, as installed. */
19
19
  readonly name: string;
20
+ /** Installed package version, when the manifest could be read. */
21
+ readonly version?: string;
20
22
  /** Provider classes found in the package. */
21
23
  readonly providers: readonly ProviderClass[];
22
24
  /** Command modules found in the package. */
23
25
  readonly commands: readonly CommandModule[];
26
+ /** Other plugin names this plugin must boot after. */
27
+ readonly depends?: readonly string[];
28
+ /** Declared peer range (e.g. `@mudah-cli/core`: `^0.8.0`) for compatibility gates. */
29
+ readonly peers?: Readonly<Record<string, string>>;
30
+ /** Runtime feature flags the host must satisfy. */
31
+ readonly features?: readonly string[];
32
+ /** When set, the plugin is deprecated (string is the reason). */
33
+ readonly deprecated?: boolean | string;
24
34
  }
25
35
  export interface PluginDiscoveryOptions {
26
36
  /**
@@ -40,6 +50,15 @@ export interface PluginDiscoveryOptions {
40
50
  readPackage?: (path: string) => Promise<unknown>;
41
51
  /** Import a resolved module URL. Injectable for tests. */
42
52
  importModule?: (url: string) => Promise<Record<string, unknown>>;
53
+ /** Host `@mudah-cli/core` version used by compatibility gates. */
54
+ coreVersion?: string;
55
+ /** Runtime feature flags the host currently provides. */
56
+ features?: readonly string[];
57
+ /**
58
+ * Bust the ESM import cache so hot-reload can re-evaluate plugin modules.
59
+ * `true` uses `Date.now()`; a string/number is appended as `?mudahReload=`.
60
+ */
61
+ bustCache?: boolean | string | number;
43
62
  }
44
63
  /**
45
64
  * Find installed plugin packages: dependencies of `basePath` that declare
@@ -51,6 +70,30 @@ export declare function findPluginPackages(basePath: string, options?: PluginDis
51
70
  * Returns empty arrays (not an error) when the package exports neither.
52
71
  */
53
72
  export declare function loadPlugin(name: string, basePath: string, options?: PluginDiscoveryOptions): Promise<PluginInfo>;
73
+ /**
74
+ * Topological sort of plugins by `depends`. Unknown edges are ignored.
75
+ * Cycles fall back to original order for the remaining nodes.
76
+ */
77
+ export declare function sortPluginsByDependency(plugins: readonly PluginInfo[]): PluginInfo[];
78
+ /** Semver-lite: `^1.2.3` / `>=1.0.0` / `1.2.3` satisfied by `actual`. */
79
+ export declare function satisfiesPeerRange(actual: string, range: string): boolean;
80
+ /** Host core version used by compatibility gates. */
81
+ export declare const CORE_VERSION: string;
82
+ export interface PluginGateContext {
83
+ /** Installed `@mudah-cli/core` version. */
84
+ coreVersion: string;
85
+ /** Runtime feature flags the host currently provides. */
86
+ features?: readonly string[];
87
+ }
88
+ export interface PluginGateResult {
89
+ readonly ok: boolean;
90
+ readonly reason?: string;
91
+ }
92
+ /**
93
+ * Compatibility gate: skip a plugin when its declared peer range or
94
+ * required feature flags are not satisfied by the host.
95
+ */
96
+ export declare function gatePlugin(plugin: PluginInfo, context: PluginGateContext): PluginGateResult;
54
97
  /**
55
98
  * Discover every installed plugin and collect what it provides. Individual
56
99
  * failures are skipped: one broken plugin must not break the host app.
package/dist/plugins.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createRequire } from 'node:module';
2
1
  import { readFile } from 'node:fs/promises';
2
+ import { createRequire } from 'node:module';
3
3
  import { dirname, join } from 'node:path';
4
4
  import { pathToFileURL } from 'node:url';
5
5
  import { isCommandExport } from './application.js';
@@ -43,7 +43,7 @@ export async function findPluginPackages(basePath, options = {}) {
43
43
  return plugins;
44
44
  }
45
45
  function explicitlyIncluded(name, include) {
46
- return include !== undefined && include.includes(name);
46
+ return include?.includes(name) === true;
47
47
  }
48
48
  /** Explicit includes still apply when there is no manifest to scan. */
49
49
  function explicitlyIncludedNames(include, exclude) {
@@ -53,9 +53,7 @@ async function readPluginManifest(basePath, name, readPackage, resolve) {
53
53
  try {
54
54
  // Resolve to the package's entry file, then find its manifest.
55
55
  const entryUrl = await resolve(name, basePath);
56
- const entryPath = entryUrl.startsWith('file:')
57
- ? new URL(entryUrl).pathname
58
- : entryUrl;
56
+ const entryPath = entryUrl.startsWith('file:') ? new URL(entryUrl).pathname : entryUrl;
59
57
  const packageRoot = await packageRootFromEntry(entryPath, name, readPackage);
60
58
  if (packageRoot === null)
61
59
  return null;
@@ -100,7 +98,7 @@ function declaresKeyword(pkg, keyword) {
100
98
  export async function loadPlugin(name, basePath, options = {}) {
101
99
  const resolve = options.resolve ?? defaultResolve;
102
100
  const importModule = options.importModule ?? defaultImport;
103
- const url = await resolve(name, basePath);
101
+ const url = cacheBust(await resolve(name, basePath), options.bustCache);
104
102
  const mod = await importModule(url);
105
103
  const providers = [];
106
104
  const commands = [];
@@ -133,7 +131,145 @@ export async function loadPlugin(name, basePath, options = {}) {
133
131
  if (isCommandExport(mod.default) && commands.length === 0) {
134
132
  commands.push({ default: mod.default });
135
133
  }
136
- return { name, providers, commands };
134
+ const depends = Array.isArray(mod.depends)
135
+ ? mod.depends.filter((v) => typeof v === 'string')
136
+ : [];
137
+ const peers = mod.peers && typeof mod.peers === 'object' && !Array.isArray(mod.peers)
138
+ ? mod.peers
139
+ : {};
140
+ const features = Array.isArray(mod.features)
141
+ ? mod.features.filter((v) => typeof v === 'string')
142
+ : [];
143
+ const deprecated = typeof mod.deprecated === 'string' || mod.deprecated === true
144
+ ? mod.deprecated
145
+ : undefined;
146
+ let version;
147
+ try {
148
+ const manifest = await readPluginManifest(basePath, name, options.readPackage ?? readJson, resolve);
149
+ if (manifest && typeof manifest.version === 'string')
150
+ version = manifest.version;
151
+ }
152
+ catch {
153
+ // Version is optional metadata.
154
+ }
155
+ return { name, version, providers, commands, depends, peers, features, deprecated };
156
+ }
157
+ /**
158
+ * Topological sort of plugins by `depends`. Unknown edges are ignored.
159
+ * Cycles fall back to original order for the remaining nodes.
160
+ */
161
+ export function sortPluginsByDependency(plugins) {
162
+ const byName = new Map(plugins.map((plugin) => [plugin.name, plugin]));
163
+ const incoming = new Map();
164
+ const edges = new Map();
165
+ for (const plugin of plugins) {
166
+ incoming.set(plugin.name, incoming.get(plugin.name) ?? 0);
167
+ for (const dep of plugin.depends ?? []) {
168
+ if (!byName.has(dep))
169
+ continue;
170
+ edges.set(dep, [...(edges.get(dep) ?? []), plugin.name]);
171
+ incoming.set(plugin.name, (incoming.get(plugin.name) ?? 0) + 1);
172
+ }
173
+ }
174
+ const queue = [...incoming.entries()].filter(([, n]) => n === 0).map(([name]) => name);
175
+ const ordered = [];
176
+ while (queue.length > 0) {
177
+ const name = queue.shift();
178
+ const plugin = byName.get(name);
179
+ if (plugin)
180
+ ordered.push(plugin);
181
+ for (const next of edges.get(name) ?? []) {
182
+ const left = (incoming.get(next) ?? 1) - 1;
183
+ incoming.set(next, left);
184
+ if (left === 0)
185
+ queue.push(next);
186
+ }
187
+ }
188
+ if (ordered.length === plugins.length)
189
+ return ordered;
190
+ const seen = new Set(ordered.map((p) => p.name));
191
+ return [...ordered, ...plugins.filter((p) => !seen.has(p.name))];
192
+ }
193
+ /** Semver-lite: `^1.2.3` / `>=1.0.0` / `1.2.3` satisfied by `actual`. */
194
+ export function satisfiesPeerRange(actual, range) {
195
+ const clean = actual.replace(/^v/, '');
196
+ const [maj = 0, min = 0, pat = 0] = clean.split('.').map((p) => Number.parseInt(p, 10) || 0);
197
+ const value = maj * 1_000_000 + min * 1_000 + pat;
198
+ const match = /^(>=|>|\^|~|=)?\s*v?(\d+)(?:\.(\d+))?(?:\.(\d+))?/.exec(range.trim());
199
+ if (!match)
200
+ return true;
201
+ const op = match[1] ?? '=';
202
+ const hasMinor = match[3] !== undefined;
203
+ const hasPatch = match[4] !== undefined;
204
+ const rMaj = Number(match[2]);
205
+ const rMin = Number(match[3] ?? 0);
206
+ const rPat = Number(match[4] ?? 0);
207
+ const required = rMaj * 1_000_000 + rMin * 1_000 + rPat;
208
+ if (op === '>')
209
+ return value > required;
210
+ if (op === '>=')
211
+ return value >= required;
212
+ if (op === '^') {
213
+ // Caret is a range, not a prefix match on major. ^0.x must not allow a
214
+ // minor bump (^0.8.0 ≡ >=0.8.0 <0.9.0) and ^0.0.x must not allow a patch
215
+ // bump (^0.0.3 ≡ >=0.0.3 <0.0.4).
216
+ const [uMaj, uMin, uPat] = caretUpperBound(rMaj, rMin, rPat, hasMinor, hasPatch);
217
+ return value >= required && value < uMaj * 1_000_000 + uMin * 1_000 + uPat;
218
+ }
219
+ if (op === '~') {
220
+ const [uMaj, uMin] = hasMinor ? [rMaj, rMin + 1] : [rMaj + 1, 0];
221
+ return value >= required && value < uMaj * 1_000_000 + uMin * 1_000;
222
+ }
223
+ return value === required;
224
+ }
225
+ /** Exclusive upper bound of a caret range. */
226
+ function caretUpperBound(rMaj, rMin, rPat, hasMinor, hasPatch) {
227
+ if (rMaj > 0)
228
+ return [rMaj + 1, 0, 0];
229
+ if (!hasMinor)
230
+ return [1, 0, 0];
231
+ if (rMin > 0)
232
+ return [0, rMin + 1, 0];
233
+ if (!hasPatch)
234
+ return [0, 1, 0];
235
+ return [0, 0, rPat + 1];
236
+ }
237
+ /** Host core version used by compatibility gates. */
238
+ export const CORE_VERSION = (() => {
239
+ try {
240
+ const pkg = createRequire(import.meta.url)('../package.json');
241
+ return typeof pkg.version === 'string' ? pkg.version : '0.9.0';
242
+ }
243
+ catch {
244
+ return '0.9.0';
245
+ }
246
+ })();
247
+ const CORE_PEER_KEYS = new Set(['@mudah-cli/core', 'core', '@mudah-cli/mudah']);
248
+ /**
249
+ * Compatibility gate: skip a plugin when its declared peer range or
250
+ * required feature flags are not satisfied by the host.
251
+ */
252
+ export function gatePlugin(plugin, context) {
253
+ const peers = plugin.peers ?? {};
254
+ for (const [pkg, range] of Object.entries(peers)) {
255
+ if (!CORE_PEER_KEYS.has(pkg))
256
+ continue;
257
+ if (!satisfiesPeerRange(context.coreVersion, range)) {
258
+ return {
259
+ ok: false,
260
+ reason: `${plugin.name} requires ${pkg} ${range} (have ${context.coreVersion})`,
261
+ };
262
+ }
263
+ }
264
+ const required = plugin.features ?? [];
265
+ if (required.length > 0) {
266
+ const have = new Set(context.features ?? []);
267
+ const missing = required.filter((flag) => !have.has(flag));
268
+ if (missing.length > 0) {
269
+ return { ok: false, reason: `${plugin.name} requires features: ${missing.join(', ')}` };
270
+ }
271
+ }
272
+ return { ok: true };
137
273
  }
138
274
  /**
139
275
  * Discover every installed plugin and collect what it provides. Individual
@@ -157,7 +293,7 @@ export async function discoverPlugins(basePath, options = {}) {
157
293
  // Unresolvable or unimportable: skip it.
158
294
  }
159
295
  }
160
- return loaded;
296
+ return sortPluginsByDependency(loaded);
161
297
  }
162
298
  async function readJson(path) {
163
299
  const text = await readFile(path, 'utf8');
@@ -172,4 +308,11 @@ function defaultResolve(specifier, from) {
172
308
  function defaultImport(url) {
173
309
  return import(/* @vite-ignore */ url);
174
310
  }
311
+ function cacheBust(url, token) {
312
+ if (token === undefined || token === false)
313
+ return url;
314
+ const value = token === true ? Date.now() : token;
315
+ const joiner = url.includes('?') ? '&' : '?';
316
+ return `${url}${joiner}mudahReload=${encodeURIComponent(String(value))}`;
317
+ }
175
318
  //# sourceMappingURL=plugins.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}