@voiden/runner 0.1.0-beta.5 → 2.1.0

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.
Files changed (41) hide show
  1. package/README.md +117 -95
  2. package/dist/cliElectron.d.ts +1 -1
  3. package/dist/index.js +197 -51
  4. package/dist/index.js.map +1 -1
  5. package/dist/plugins/community.d.ts +4 -3
  6. package/dist/plugins/community.d.ts.map +1 -1
  7. package/dist/plugins/community.js +23 -19
  8. package/dist/plugins/community.js.map +1 -1
  9. package/dist/plugins/loader.d.ts +8 -0
  10. package/dist/plugins/loader.d.ts.map +1 -1
  11. package/dist/plugins/loader.js +78 -7
  12. package/dist/plugins/loader.js.map +1 -1
  13. package/dist/plugins/registry.d.ts +26 -21
  14. package/dist/plugins/registry.d.ts.map +1 -1
  15. package/dist/plugins/registry.js +69 -46
  16. package/dist/plugins/registry.js.map +1 -1
  17. package/dist/plugins/registryCache.d.ts +28 -0
  18. package/dist/plugins/registryCache.d.ts.map +1 -0
  19. package/dist/plugins/registryCache.js +95 -0
  20. package/dist/plugins/registryCache.js.map +1 -0
  21. package/dist/plugins/store.d.ts +6 -1
  22. package/dist/plugins/store.d.ts.map +1 -1
  23. package/dist/plugins/store.js +21 -1
  24. package/dist/plugins/store.js.map +1 -1
  25. package/dist/plugins/updateCheck.d.ts +14 -0
  26. package/dist/plugins/updateCheck.d.ts.map +1 -0
  27. package/dist/plugins/updateCheck.js +46 -0
  28. package/dist/plugins/updateCheck.js.map +1 -0
  29. package/dist/report/mail.d.ts +1 -0
  30. package/dist/report/mail.d.ts.map +1 -1
  31. package/dist/report/mail.js +199 -35
  32. package/dist/report/mail.js.map +1 -1
  33. package/dist/runner.d.ts +1 -1
  34. package/dist/runner.d.ts.map +1 -1
  35. package/dist/runner.js +19 -2
  36. package/dist/runner.js.map +1 -1
  37. package/dist/runtimeVars.d.ts +5 -0
  38. package/dist/runtimeVars.d.ts.map +1 -1
  39. package/dist/runtimeVars.js +36 -2
  40. package/dist/runtimeVars.js.map +1 -1
  41. package/package.json +10 -5
@@ -1,52 +1,75 @@
1
1
  /**
2
- * Plugin Registry
2
+ * Core Plugin Registry
3
3
  *
4
- * Derives the list of runner-capable core extensions from the @voiden/core-extensions
5
- * metadata registry the same source the Electron app uses.
4
+ * Derives the list of runner-capable core plugins from the same
5
+ * VoidenHQ/plugin-registry `extensions.json` that the Electron app reads
6
+ * (see registryCache.ts) — no separate static snapshot to keep in sync.
6
7
  *
7
- * All plugins (parser and hook alike) are treated identically: they each have a
8
- * runner.ts that exports a RunnerFactory and are opt-out by default (enabled unless
9
- * explicitly disabled in ~/.voiden/plugins.json). No plugin type is hard-coded as
10
- * "always active" if a plugin is disabled its runner.ts never loads, so its
11
- * onBuildRequest / pipeline hooks are never registered.
12
- *
13
- * ID_TO_FOLDER handles the few cases where the registry ID differs from the
14
- * folder name inside @voiden/core-extensions/src/.
8
+ * A core plugin is runner-capable when the registry marks it `hasRunner: true`
9
+ * (set by plugin-registry maintainers when the plugin publishes a headless
10
+ * runner.js bundle). Each such plugin is built and released as
11
+ * {pluginId}-runner.js in its own GitHub repo (VoidenHQ/plugin-{dir}).
12
+ * voiden-runner downloads and caches these files the same way community
13
+ * plugins do: ~/.voiden/extensions/{id}/runner.js
15
14
  */
16
- import { coreExtensions } from '@voiden/core-extensions/registry.js';
17
- // ─── ID folder mapping ──────────────────────────────────────────────────────
18
- // Most extension IDs match their folder name inside @voiden/core-extensions/src.
19
- // List exceptions here.
20
- const ID_TO_FOLDER = {
21
- 'voiden-sockets-grpcs': 'voiden-sockets',
22
- };
23
- function folder(id) {
24
- return ID_TO_FOLDER[id] ?? id;
25
- }
26
- // ─── IDs that have a headless runner.ts in @voiden/core-extensions ────────────
27
- // All core extensions listed here are treated equally: they are opt-out (enabled
28
- // by default) and each owns its runner.ts entry point.
29
- const RUNNER_IDS = new Set([
30
- 'voiden-rest-api',
31
- 'voiden-graphql',
32
- 'voiden-sockets-grpcs',
33
- 'voiden-scripting',
34
- 'simple-assertions',
35
- 'voiden-faker',
36
- 'voiden-advanced-auth',
37
- ]);
38
- // ─── Derive plugin definitions from the shared registry ───────────────────────
39
- export const CORE_PLUGINS = coreExtensions
40
- .filter(e => RUNNER_IDS.has(e.id))
41
- .map(e => ({
42
- name: e.id,
43
- description: e.description,
44
- pluginPath: `@voiden/core-extensions/${folder(e.id)}/runner`,
45
- }));
46
- export function findPlugin(name) {
47
- return CORE_PLUGINS.find(p => p.name === name);
48
- }
49
- export function listPluginNames() {
50
- return CORE_PLUGINS.map(p => p.name);
15
+ import { join } from 'path';
16
+ import { homedir } from 'os';
17
+ import { existsSync } from 'fs';
18
+ import { pathToFileURL } from 'url';
19
+ import { getRegistry } from './registryCache.js';
20
+ // ─── Runner paths (priority: bundled-at-build-time > user cache > download) ───
21
+ const RUNNER_CACHE_DIR = join(homedir(), '.voiden', 'extensions');
22
+ // Bundled runners pre-downloaded by cleanup.sh at Voiden build time
23
+ function getBundledRunnerPath(pluginId) {
24
+ const candidates = [
25
+ join(new URL('.', import.meta.url).pathname, '../../../../packages/voiden-runner/bundled-runners', `${pluginId}-runner.js`),
26
+ join(new URL('.', import.meta.url).pathname, '../../../bundled-runners', `${pluginId}-runner.js`),
27
+ ];
28
+ for (const p of candidates) {
29
+ if (existsSync(p))
30
+ return p;
31
+ }
32
+ return null;
33
+ }
34
+ export function getCoreRunnerPath(pluginId) {
35
+ return join(RUNNER_CACHE_DIR, pluginId, 'runner.js');
36
+ }
37
+ export function hasCoreRunner(pluginId) {
38
+ return !!getBundledRunnerPath(pluginId) || existsSync(getCoreRunnerPath(pluginId));
39
+ }
40
+ export function getCoreRunnerImportUrl(pluginId) {
41
+ // User cache (~/.voiden/extensions) takes priority over the bundled snapshot —
42
+ // mirrors Electron's OTA-cache-over-bundled resolution (seedBundledPluginsToCache /
43
+ // isOtaCached) — so `plugin update` can actually supersede a bundled runner.
44
+ if (existsSync(getCoreRunnerPath(pluginId)))
45
+ return pathToFileURL(getCoreRunnerPath(pluginId)).href;
46
+ const bundled = getBundledRunnerPath(pluginId);
47
+ if (bundled)
48
+ return pathToFileURL(bundled).href;
49
+ return pathToFileURL(getCoreRunnerPath(pluginId)).href;
50
+ }
51
+ function toPluginDefinition(entry) {
52
+ return {
53
+ name: entry.id,
54
+ description: entry.description,
55
+ repo: entry.repo,
56
+ runnerAsset: entry.runnerAsset ?? `${entry.id}-runner.js`,
57
+ version: entry.version,
58
+ pluginPath: hasCoreRunner(entry.id) ? getCoreRunnerImportUrl(entry.id) : undefined,
59
+ };
60
+ }
61
+ /** Core, runner-capable plugins — derived live from the plugin registry. */
62
+ export async function getCorePlugins() {
63
+ const entries = await getRegistry();
64
+ return entries
65
+ .filter((p) => p.type === 'core' && p.hasRunner)
66
+ .map(toPluginDefinition);
67
+ }
68
+ export async function findPlugin(name) {
69
+ const plugins = await getCorePlugins();
70
+ return plugins.find((p) => p.name === name);
71
+ }
72
+ export async function listPluginNames() {
73
+ return (await getCorePlugins()).map((p) => p.name);
51
74
  }
52
75
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AAcpE,iFAAiF;AACjF,iFAAiF;AACjF,wBAAwB;AACxB,MAAM,YAAY,GAA2B;IAC3C,sBAAsB,EAAE,gBAAgB;CACzC,CAAA;AAED,SAAS,MAAM,CAAC,EAAU;IACxB,OAAO,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAA;AAC/B,CAAC;AAED,iFAAiF;AACjF,iFAAiF;AACjF,uDAAuD;AACvD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,iBAAiB;IACjB,gBAAgB;IAChB,sBAAsB;IACtB,kBAAkB;IAClB,mBAAmB;IACnB,cAAc;IACd,sBAAsB;CACvB,CAAC,CAAA;AAEF,iFAAiF;AAEjF,MAAM,CAAC,MAAM,YAAY,GAAuB,cAAc;KAC3D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KACjC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACT,IAAI,EAAS,CAAC,CAAC,EAAE;IACjB,WAAW,EAAE,CAAC,CAAC,WAAW;IAC1B,UAAU,EAAG,2BAA2B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS;CAC9D,CAAC,CAAC,CAAA;AAEL,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AACtC,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,WAAW,EAAsB,MAAM,oBAAoB,CAAA;AAEpE,iFAAiF;AACjF,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAA;AAEjE,oEAAoE;AACpE,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,oDAAoD,EAAE,GAAG,QAAQ,YAAY,CAAC;QAC3H,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,0BAA0B,EAAE,GAAG,QAAQ,YAAY,CAAC;KAClG,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,IAAI,CAAC,gBAAgB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAA;AACpF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,+EAA+E;IAC/E,oFAAoF;IACpF,6EAA6E;IAC7E,IAAI,UAAU,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,aAAa,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA;IACnG,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IAC9C,IAAI,OAAO;QAAE,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAA;IAC/C,OAAO,aAAa,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA;AACxD,CAAC;AAkBD,SAAS,kBAAkB,CAAC,KAAoB;IAC9C,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,EAAE;QACd,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,GAAG,KAAK,CAAC,EAAE,YAAY;QACzD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,UAAU,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;KACnF,CAAA;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAA;IACnC,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC;SAC/C,GAAG,CAAC,kBAAkB,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAA;IACtC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,OAAO,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AACpD,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Shared registry cache — fetches the community plugin-registry's
3
+ * `extensions.json` (the same source the Electron app reads, see
4
+ * apps/electron/src/main/extension/extensionFetcher.ts) and caches it so
5
+ * `voiden-runner` doesn't refetch on every invocation and keeps working
6
+ * offline after the first successful fetch.
7
+ */
8
+ export interface RegistryEntry {
9
+ type: 'core' | 'community';
10
+ id: string;
11
+ name: string;
12
+ description: string;
13
+ author: string;
14
+ version: string;
15
+ repo: string;
16
+ hasRunner?: boolean;
17
+ runnerAsset?: string;
18
+ icon?: string;
19
+ voidenVersion?: string;
20
+ }
21
+ /**
22
+ * Returns the full plugin-registry catalogue (core + community plugins).
23
+ * Cached in-memory for the process lifetime and on-disk for 24h. If the
24
+ * registry is unreachable, falls back to the last known-good on-disk cache
25
+ * (even if stale) so `run` keeps working offline.
26
+ */
27
+ export declare function getRegistry(): Promise<RegistryEntry[]>;
28
+ //# sourceMappingURL=registryCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registryCache.d.ts","sourceRoot":"","sources":["../../src/plugins/registryCache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAmDD;;;;;GAKG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAsB5D"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Shared registry cache — fetches the community plugin-registry's
3
+ * `extensions.json` (the same source the Electron app reads, see
4
+ * apps/electron/src/main/extension/extensionFetcher.ts) and caches it so
5
+ * `voiden-runner` doesn't refetch on every invocation and keeps working
6
+ * offline after the first successful fetch.
7
+ */
8
+ import * as https from 'https';
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
10
+ import { join } from 'path';
11
+ import { homedir } from 'os';
12
+ const REGISTRY_URL = 'https://raw.githubusercontent.com/VoidenHQ/plugin-registry/main/extensions.json';
13
+ const CACHE_PATH = join(homedir(), '.voiden', 'registry-cache.json');
14
+ const CACHE_TTL = 24 * 60 * 60 * 1000; // 1 day
15
+ let memCache;
16
+ function httpsGetText(url, maxRedirects = 5) {
17
+ return new Promise((resolve, reject) => {
18
+ const options = {
19
+ headers: {
20
+ 'User-Agent': 'voiden-runner',
21
+ 'Accept': 'application/vnd.github.v3+json',
22
+ },
23
+ };
24
+ function doGet(u, hops) {
25
+ https.get(u, options, (res) => {
26
+ if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
27
+ if (hops <= 0) {
28
+ reject(new Error('Too many redirects'));
29
+ return;
30
+ }
31
+ doGet(res.headers.location, hops - 1);
32
+ return;
33
+ }
34
+ if (res.statusCode && res.statusCode >= 400) {
35
+ reject(new Error(`HTTP ${res.statusCode}`));
36
+ return;
37
+ }
38
+ let data = '';
39
+ res.on('data', (c) => (data += c));
40
+ res.on('end', () => resolve(data));
41
+ res.on('error', reject);
42
+ }).on('error', reject);
43
+ }
44
+ doGet(url, maxRedirects);
45
+ });
46
+ }
47
+ function readDiskCache() {
48
+ if (!existsSync(CACHE_PATH))
49
+ return undefined;
50
+ try {
51
+ return JSON.parse(readFileSync(CACHE_PATH, 'utf-8'));
52
+ }
53
+ catch {
54
+ return undefined;
55
+ }
56
+ }
57
+ function writeDiskCache(entries) {
58
+ try {
59
+ mkdirSync(join(homedir(), '.voiden'), { recursive: true });
60
+ writeFileSync(CACHE_PATH, JSON.stringify({ fetchedAt: Date.now(), entries }, null, 2), 'utf-8');
61
+ }
62
+ catch {
63
+ // Best-effort — the on-disk cache is an offline optimization, not a requirement.
64
+ }
65
+ }
66
+ /**
67
+ * Returns the full plugin-registry catalogue (core + community plugins).
68
+ * Cached in-memory for the process lifetime and on-disk for 24h. If the
69
+ * registry is unreachable, falls back to the last known-good on-disk cache
70
+ * (even if stale) so `run` keeps working offline.
71
+ */
72
+ export async function getRegistry() {
73
+ if (memCache)
74
+ return memCache;
75
+ const disk = readDiskCache();
76
+ if (disk && Date.now() - disk.fetchedAt < CACHE_TTL) {
77
+ memCache = disk.entries;
78
+ return memCache;
79
+ }
80
+ try {
81
+ const raw = await httpsGetText(REGISTRY_URL);
82
+ const entries = JSON.parse(raw);
83
+ memCache = entries;
84
+ writeDiskCache(entries);
85
+ return entries;
86
+ }
87
+ catch (err) {
88
+ if (disk) {
89
+ memCache = disk.entries;
90
+ return memCache;
91
+ }
92
+ throw err;
93
+ }
94
+ }
95
+ //# sourceMappingURL=registryCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registryCache.js","sourceRoot":"","sources":["../../src/plugins/registryCache.ts"],"names":[],"mappings":"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"}
@@ -5,13 +5,18 @@ export interface InstalledPlugin {
5
5
  name: string;
6
6
  enabled: boolean;
7
7
  installedAt: string;
8
+ /** Runner bundle version that was downloaded — compared against the registry to detect updates */
9
+ version?: string;
8
10
  }
9
11
  export interface PluginStore {
10
12
  installedPlugins: Record<string, InstalledPlugin>;
11
13
  }
12
14
  export declare const STORE_DIR: string;
13
15
  export declare function readStore(): PluginStore;
14
- export declare function installPlugin(name: string): boolean;
16
+ export declare function installPlugin(name: string, version?: string): boolean;
17
+ /** Records the runner bundle version for an installed plugin (used by `plugin update`). */
18
+ export declare function setPluginVersion(name: string, version: string): void;
19
+ export declare function getInstalledVersion(name: string): string | undefined;
15
20
  export declare function uninstallPlugin(name: string): boolean;
16
21
  export declare function setPluginEnabled(name: string, enabled: boolean): void;
17
22
  export declare function getEnabledPlugins(): InstalledPlugin[];
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/plugins/store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAClD;AAED,eAAO,MAAM,SAAS,QAA6B,CAAA;AAOnD,wBAAgB,SAAS,IAAI,WAAW,CAOvC;AAOD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYnD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMrD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAYrE;AAED,wBAAgB,iBAAiB,IAAI,eAAe,EAAE,CAGrD;AAED,wBAAgB,sBAAsB,IAAI,eAAe,EAAE,CAE1D"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/plugins/store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,kGAAkG;IAClG,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAClD;AAED,eAAO,MAAM,SAAS,QAA6B,CAAA;AAOnD,wBAAgB,SAAS,IAAI,WAAW,CAOvC;AAOD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAarE;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAapE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMrD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAYrE;AAED,wBAAgB,iBAAiB,IAAI,eAAe,EAAE,CAGrD;AAED,wBAAgB,sBAAsB,IAAI,eAAe,EAAE,CAE1D"}
@@ -23,7 +23,7 @@ function writeStore(store) {
23
23
  mkdirSync(STORE_DIR, { recursive: true });
24
24
  writeFileSync(STORE_PATH, JSON.stringify(store, null, 2) + '\n', 'utf-8');
25
25
  }
26
- export function installPlugin(name) {
26
+ export function installPlugin(name, version) {
27
27
  const store = readStore();
28
28
  const alreadyInstalled = !!store.installedPlugins[name];
29
29
  if (!alreadyInstalled) {
@@ -31,11 +31,31 @@ export function installPlugin(name) {
31
31
  name,
32
32
  enabled: true,
33
33
  installedAt: new Date().toISOString(),
34
+ version,
34
35
  };
35
36
  writeStore(store);
36
37
  }
37
38
  return !alreadyInstalled;
38
39
  }
40
+ /** Records the runner bundle version for an installed plugin (used by `plugin update`). */
41
+ export function setPluginVersion(name, version) {
42
+ const store = readStore();
43
+ if (!store.installedPlugins[name]) {
44
+ store.installedPlugins[name] = {
45
+ name,
46
+ enabled: true,
47
+ installedAt: new Date().toISOString(),
48
+ version,
49
+ };
50
+ }
51
+ else {
52
+ store.installedPlugins[name].version = version;
53
+ }
54
+ writeStore(store);
55
+ }
56
+ export function getInstalledVersion(name) {
57
+ return readStore().installedPlugins[name]?.version;
58
+ }
39
59
  export function uninstallPlugin(name) {
40
60
  const store = readStore();
41
61
  if (!store.installedPlugins[name])
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/plugins/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/plugins/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Plugin update detection — compares each installed plugin's recorded runner
3
+ * version (store.ts) against the latest version published in the shared
4
+ * plugin-registry (registryCache.ts). Used by `plugin update` and the
5
+ * post-command update notice in index.ts.
6
+ */
7
+ export interface PluginUpdateInfo {
8
+ id: string;
9
+ type: 'core' | 'community';
10
+ installedVersion: string;
11
+ latestVersion: string;
12
+ }
13
+ export declare function checkForPluginUpdates(): Promise<PluginUpdateInfo[]>;
14
+ //# sourceMappingURL=updateCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateCheck.d.ts","sourceRoot":"","sources":["../../src/plugins/updateCheck.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;CACtB;AAeD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAsBzE"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Plugin update detection — compares each installed plugin's recorded runner
3
+ * version (store.ts) against the latest version published in the shared
4
+ * plugin-registry (registryCache.ts). Used by `plugin update` and the
5
+ * post-command update notice in index.ts.
6
+ */
7
+ import { getAllInstalledPlugins } from './store.js';
8
+ import { getRegistry } from './registryCache.js';
9
+ /** Compares dotted version strings numerically, segment by segment. */
10
+ function isNewer(latest, installed) {
11
+ const a = latest.split('.').map((n) => parseInt(n, 10) || 0);
12
+ const b = installed.split('.').map((n) => parseInt(n, 10) || 0);
13
+ const len = Math.max(a.length, b.length);
14
+ for (let i = 0; i < len; i++) {
15
+ const x = a[i] ?? 0;
16
+ const y = b[i] ?? 0;
17
+ if (x !== y)
18
+ return x > y;
19
+ }
20
+ return false;
21
+ }
22
+ export async function checkForPluginUpdates() {
23
+ const installed = getAllInstalledPlugins();
24
+ if (installed.length === 0)
25
+ return [];
26
+ const registry = await getRegistry();
27
+ const byId = new Map(registry.map((e) => [e.id, e]));
28
+ const updates = [];
29
+ for (const plugin of installed) {
30
+ if (!plugin.version)
31
+ continue;
32
+ const entry = byId.get(plugin.name);
33
+ if (!entry)
34
+ continue;
35
+ if (isNewer(entry.version, plugin.version)) {
36
+ updates.push({
37
+ id: plugin.name,
38
+ type: entry.type,
39
+ installedVersion: plugin.version,
40
+ latestVersion: entry.version,
41
+ });
42
+ }
43
+ }
44
+ return updates;
45
+ }
46
+ //# sourceMappingURL=updateCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateCheck.js","sourceRoot":"","sources":["../../src/plugins/updateCheck.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAShD,uEAAuE;AACvE,SAAS,OAAO,CAAC,MAAc,EAAE,SAAiB;IAChD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5D,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACnB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACnB,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAA;IAC1C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAErC,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAA;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpD,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,SAAQ;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,CAAC,KAAK;YAAE,SAAQ;QACpB,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,MAAM,CAAC,IAAI;gBACf,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,gBAAgB,EAAE,MAAM,CAAC,OAAO;gBAChC,aAAa,EAAE,KAAK,CAAC,OAAO;aAC7B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -9,6 +9,7 @@ export interface MailReportOptions {
9
9
  smtpUser?: string;
10
10
  smtpPass?: string;
11
11
  csvPath?: string;
12
+ jsonPath?: string;
12
13
  }
13
14
  export declare function sendMailReport(results: Array<{
14
15
  file: string;
@@ -1 +1 @@
1
- {"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../../src/report/mail.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAmED,wBAAsB,cAAc,CAClC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC,EACnD,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
1
+ {"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../../src/report/mail.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AA+OD,wBAAsB,cAAc,CAClC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC,EACnD,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAmCf"}