Skip to content

Version Packages#292

Merged
claytercek merged 1 commit into
developfrom
changeset-release/develop
May 22, 2026
Merged

Version Packages#292
claytercek merged 1 commit into
developfrom
changeset-release/develop

Conversation

@github-actions
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot commented May 21, 2026

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to develop, this PR will be updated.

Releases

@bluecadet/launchpad-cli@3.0.0

Major Changes

  • #283 73e0d1e - Remove the scaffold package and launchpad scaffold CLI command. Windows kiosk and exhibit machine configuration is now handled by Preflight, a dedicated tool by Bluecadet.

    Migration: If you relied on launchpad scaffold or @bluecadet/launchpad/scaffold, switch to Preflight.

  • #293 ce098d3 - Plugins can now declare CLI commands via manifest.cli. The hardcoded content and monitor CLI commands are removed — both plugins now declare their commands via their manifests. See the @bluecadet/launchpad changelog for migration details.

  • bde09a4 - Replaces the hook-based plugin system with a unified plugin model across all packages. See the @bluecadet/launchpad changelog for migration details.

  • #280 f18098c - Add log level flag to CLI to control verbosity of terminal output.

    npx launchpad <command> -v # or --verbose, includes verbose logs
    npx launchpad <command> -vv # for more verbosity, includes debug logs
  • #280 7debdda - Introduces StatusSnapshot and ctx.updateState() for plugin status and state management. See the @bluecadet/launchpad changelog for migration details.

Minor Changes

  • #280 7debdda - Breaking changes to the content fetch pipeline, path helpers, and file path defaults. See the @bluecadet/launchpad changelog for migration details.

  • #280 7debdda - Adds persistent controller mode with a JSON-RPC 2.0 IPC interface.

    launchpad start

    A new start command launches the controller in persistent mode, opening an IPC socket so subsequent CLI commands connect to the running instance:

    launchpad start         # foreground
    launchpad start -d      # background (detached)

    IPC

    The CLI communicates with a running controller over a JSON-RPC 2.0 socket. The IPCClient API (queryState(), executeCommand(), shutdown(), event subscriptions) is the programmatic interface for this. A CLI and daemon must be on the same version.

    LaunchpadConfig moved to utils

    LaunchpadConfig moves from @bluecadet/launchpad-cli to @bluecadet/launchpad-utils, enabling declaration merging without a direct dependency on the CLI package.

Patch Changes

@bluecadet/launchpad-content@3.0.0

Major Changes

  • #280 7debdda - Breaking changes to the content fetch pipeline, path helpers, and file path defaults. See the @bluecadet/launchpad changelog for migration details.

  • bde09a4 - Replaces the hook-based plugin system with a unified plugin model across all packages. See the @bluecadet/launchpad changelog for migration details.

  • #280 7debdda - Introduces StatusSnapshot and ctx.updateState() for plugin status and state management. See the @bluecadet/launchpad changelog for migration details.

Minor Changes

  • #280 8d6cf1e - Emit content:source:error event when an individual content source fails during a fetch.

    Previously, source errors were only surfaced through the fetch result. Now a content:source:error event is emitted on the event bus with { sourceId, error }, allowing subscribers to react to partial failures without waiting for the entire fetch to complete.

  • #280 8d6cf1e - Introduce EventBus<TEvents> and per-package event types.

    EventBus<TEvents extends Record<string, unknown>> is available from @bluecadet/launchpad-utils. The default TEvents is Record<string, unknown>, so untyped usage works out of the box. Plugins and custom integrations can create typed event buses scoped to their own event contracts.

    Each plugin package exports its event types directly:

    • ContentEvents from @bluecadet/launchpad-content
    • MonitorEvents from @bluecadet/launchpad-monitor
    • CoreEvents from @bluecadet/launchpad-utils
  • #293 ce098d3 - Plugins can now declare CLI commands via manifest.cli. The hardcoded content and monitor CLI commands are removed — both plugins now declare their commands via their manifests. See the @bluecadet/launchpad changelog for migration details.

  • #280 8d6cf1e - Add Zod runtime validation for plugin commands.

    Content and monitor plugins now validate incoming commands against Zod schemas before processing. Invalid commands are rejected with a typed error at the plugin boundary rather than failing deep in business logic.

    ContentCommandSchema and MonitorCommandSchema are exported from their respective packages for use in custom integrations.

Patch Changes

  • #280 1460cfd - Fix orphaned promises in data store

  • #280 b29a443 - Bump dependencies with vulnerabilities

  • #280 7debdda - Adds persistent controller mode with a JSON-RPC 2.0 IPC interface.

    launchpad start

    A new start command launches the controller in persistent mode, opening an IPC socket so subsequent CLI commands connect to the running instance:

    launchpad start         # foreground
    launchpad start -d      # background (detached)

    IPC

    The CLI communicates with a running controller over a JSON-RPC 2.0 socket. The IPCClient API (queryState(), executeCommand(), shutdown(), event subscriptions) is the programmatic interface for this. A CLI and daemon must be on the same version.

    LaunchpadConfig moved to utils

    LaunchpadConfig moves from @bluecadet/launchpad-cli to @bluecadet/launchpad-utils, enabling declaration merging without a direct dependency on the CLI package.

  • #280 22c2428 - Clear content data store when starting new fetch. Prevents stale content when refetching with persistent controller instance.

  • Updated dependencies [8d6cf1e, b29a443, 7debdda, ce098d3, bde09a4, 7debdda]:

    • @bluecadet/launchpad-utils@3.0.0

@bluecadet/launchpad-controller@1.0.0

Major Changes

  • bde09a4 - Replaces the hook-based plugin system with a unified plugin model across all packages. See the @bluecadet/launchpad changelog for migration details.

  • #280 7debdda - Introduces StatusSnapshot and ctx.updateState() for plugin status and state management. See the @bluecadet/launchpad changelog for migration details.

Minor Changes

  • #280 7debdda - Adds persistent controller mode with a JSON-RPC 2.0 IPC interface.

    launchpad start

    A new start command launches the controller in persistent mode, opening an IPC socket so subsequent CLI commands connect to the running instance:

    launchpad start         # foreground
    launchpad start -d      # background (detached)

    IPC

    The CLI communicates with a running controller over a JSON-RPC 2.0 socket. The IPCClient API (queryState(), executeCommand(), shutdown(), event subscriptions) is the programmatic interface for this. A CLI and daemon must be on the same version.

    LaunchpadConfig moved to utils

    LaunchpadConfig moves from @bluecadet/launchpad-cli to @bluecadet/launchpad-utils, enabling declaration merging without a direct dependency on the CLI package.

Patch Changes

  • #280 b0925c8 - Fix invalid named pipe on windows

  • #280 b29a443 - Bump dependencies with vulnerabilities

  • #280 8d6cf1e - Remove process.exit() calls from library code.

    Library code should never terminate the host process. The monitor and IPC transport now emit a system:shutdown event on the event bus instead of calling process.exit(0) on graceful shutdown. The CLI handles this event and exits cleanly. Programmatic users of the monitor or controller who relied on the implicit exit should listen for system:shutdown instead.

  • Updated dependencies [8d6cf1e, b29a443, 7debdda, ce098d3, bde09a4, 7debdda]:

    • @bluecadet/launchpad-utils@3.0.0

@bluecadet/launchpad@3.0.0

Major Changes

  • bde09a4 - Breaking changes to the content fetch pipeline, path helpers, and file path defaults.

    Fetch API

    LaunchpadContent gains a loadSources() method. fetch() and clear() now accept source IDs (strings) instead of full source objects:

    // Before
    content.fetch(sourceObjects);
    
    // After
    content.fetch(sourceIds);

    Staged promotion model

    Fetches no longer write directly to downloadPath. Instead, each run stages output under an isolated directory inside tempPath, then atomically promotes it into the published downloadPath only after every source and transform succeeds:

    1. A fresh staged output tree is prepared under tempPath/runs/<runId>/downloads/.
    2. Files from the currently published downloadPath that match keep rules are copied into staging.
    3. Sources and transforms write into the staged tree only.
    4. On success, the staged tree is promoted into downloadPath.
    5. On failure, the staged tree is discarded and the previously published downloadPath is left unchanged.

    This means failed fetches no longer corrupt published content without requiring backupAndRestore. Backup is still available as an extra safety net but is no longer the primary rollback mechanism.

    Breaking for custom transforms: paths.getDownloadPath() now returns the staged run path, not the published path. If you need to read currently published files, use the new paths.getPublishedDownloadPath(). Do not write to the published path during a fetch run.

    New path helper methods: getPublishedDownloadPath(), getStagedDownloadPath(), getRunPath().

    Default file paths

    Default tempPath changes from .tmp/ to .launchpad/tmp/. Tokenization logic is removed from all path generation — backup, download, and temp paths are no longer namespaced by token.

  • #283 73e0d1e - Remove the scaffold package and launchpad scaffold CLI command. Windows kiosk and exhibit machine configuration is now handled by Preflight, a dedicated tool by Bluecadet.

    Migration: If you relied on launchpad scaffold or @bluecadet/launchpad/scaffold, switch to Preflight.

  • #293 ce098d3 - Plugins can now declare CLI commands in their manifest. The hardcoded content and monitor CLI commands are removed and replaced with manifest declarations inside their respective plugins.

    Plugin-declared CLI commands

    Third-party plugins can expose CLI commands by adding a cli field to their PluginManifest. The CLI loads plugin manifests at startup and registers declared commands as yargs commands — no CLI package changes needed.

    definePlugin({
      name: "my-plugin",
      manifest: {
        commands: [{ id: "my-plugin.sync" }],
        cli: [
          {
            name: "sync",
            description: "Sync data",
            commands: [{ type: "my-plugin.sync" }],
            flags: {
              force: {
                type: "boolean",
                alias: "f",
                description: "Force re-sync",
              },
            },
          },
        ],
      },
      // ...
    });
    launchpad sync           # dispatches my-plugin.sync
    launchpad sync --force   # dispatches { type: "my-plugin.sync", force: true }

    Leaf commands support flags (typed options with boolean, string, or number types, including array flags) and positionals (ordered arguments, including variadic). Group commands nest subcommands under a parent name:

    cli: [
      {
        name: "monitor",
        subcommands: [
          { name: "start", mode: "persistent", commands: [{ type: "monitor.connect" }, { type: "monitor.start" }] },
          { name: "stop",  mode: "task",       commands: [{ type: "monitor.stop" }] },
        ],
      },
    ],

    The CLI exits with a descriptive error at startup if two plugins declare the same top-level command name. If the config file is missing or invalid, built-in commands (start, stop, status) remain available — plugin commands are silently absent.

    Breaking: launchpad content and launchpad monitor command changes

    # Before
    launchpad content         # fetch all content
    launchpad monitor         # start monitor (persistent)
    
    # After
    launchpad content fetch   # fetch all content
    launchpad monitor start   # start monitor (persistent)
    launchpad monitor stop    # stop monitor
    launchpad monitor restart # restart monitored apps
  • #280 7debdda - Replaces the hook-based plugin system with a unified plugin model across all packages.

    Config shape

    The top-level content and monitor keys are replaced by a plugins array:

    // Before
    { content: { sources: [...] }, monitor: { apps: [...] } }
    
    // After
    import { content, monitor } from '@bluecadet/launchpad';
    { plugins: [content({ sources: [...] }), monitor({ apps: [...] })] }

    Renamed factory functions

    • createLaunchpadContentcontent (@bluecadet/launchpad-content)
    • createLaunchpadMonitormonitor (@bluecadet/launchpad-monitor)

    Content transforms

    The plugins config field is renamed to transforms, and ContentPlugin / ContentPluginDriver are replaced by ContentTransform:

    // Before
    {
      plugins: [sanityToHtml(), mediaDownloader()];
    }
    
    // After
    {
      transforms: [sanityToHtml(), mediaDownloader()];
    }

    Events renamed: content:plugin:start/done/errorcontent:transform:start/done/error; payload field pluginNametransformName.

    Monitor plugins removed

    The plugins config field and MonitorPlugin / MonitorPluginDriver types are removed. Previously, monitor plugins received lifecycle callbacks (beforeConnect, afterConnect, beforeAppStart, afterAppStart, onAppLog, etc.) invoked by the driver. All of those lifecycle moments — and more — are now emitted as typed events on the shared event bus:

    Old hook New event
    beforeConnect / afterConnect monitor:connect:start / monitor:connect:done
    beforeDisconnect / afterDisconnect monitor:disconnect:start / monitor:disconnect:done
    beforeAppStart / afterAppStart monitor:app:start / monitor:app:started
    beforeAppStop / afterAppStop monitor:app:stop / monitor:app:stopped
    onAppError monitor:app:error
    onAppLog / onAppErrorLog monitor:app:log / monitor:app:errorLog
    beforeShutdown monitor:beforeShutdown

    Additional events with no hook equivalent: monitor:app:online, monitor:app:exit, monitor:app:crash, monitor:app:restart / monitor:app:restarted, and Windows-specific monitor:window:foreground / monitor:window:minimize / monitor:window:hide / monitor:window:error.

    // Before
    { plugins: [{ beforeAppStart: ({ appName }) => { ... }, onAppLog: ({ appName, data }) => { ... } }] }
    
    // After
    eventBus.on('monitor:app:start', ({ appName }) => { ... })
    eventBus.on('monitor:app:log', ({ appName, data }) => { ... })

    Plugin author renames

    defineSubsystemdefinePlugin, SubsystemConfigPluginConfig, SubsystemContextPluginContext, InstantiatedSubsystemInstantiatedPlugin. A new optional startupCommands field is added to PluginConfig.

    PluginDriver and HookContextProvider are removed from @bluecadet/launchpad-utils. The new definePlugin model replaces the hook-based driver pattern entirely.

    Updated import paths

    Most re-exports have been removed from index files in favor of explicit sub-path exports. Nearly all import paths across the ecosystem have changed — see each package's package.json#exports for the updated paths.

    @bluecadet/launchpad (the meta package) now exposes sub-path exports that mirror the individual packages (e.g. @bluecadet/launchpad/content/transforms/media-downloader), replacing the previous flat re-export structure.

    New @bluecadet/launchpad-controller package

    Provides a centralized controller used internally by the CLI for command execution. End-user APIs are unchanged.

    Logging

    File logging config and logic move to the controller package; terminal logging moves to the CLI. Logs are now routed through the event bus, making them visible across processes.

    Subsystems are now functions

    Plugins are functional instead of class-based, allowing for simpler logic and easier testing. No changes to the CLI — only to the JS API.

    Declaration merging

    Declaration merging moves from the controller package to the utils package, improving type safety when the controller is not a direct dependency.

  • bde09a4 - Introduces StatusSnapshot and ctx.updateState() for plugin status and state management.

    Status: summarize()

    Plugins expose an optional summarize?(state) => Section | null property on the value returned by definePlugin(). It is a pure function over LaunchpadState — no chalk, no side effects.

    definePlugin({
      setup(ctx) {
        /* ... */
      },
      summarize(state): Section | null {
        const s = state.plugins.myPlugin;
        if (!s) return null;
        return {
          name: "myPlugin",
          order: 20,
          title: "My Plugin",
          rows: [{ type: "kv", label: "Phase", value: s.phase }],
        };
      },
    });

    The controller composes a StatusSnapshot from each plugin's summarize and exposes it over IPC via client.queryStatusSnapshot() and client.onStatusSnapshotChange(). The CLI's formatSnapshot() owns all chalk formatting.

    Tone, Row, Section, and StatusSnapshot are exported from @bluecadet/launchpad-utils/types.

    State: ctx.updateState()

    Plugins call ctx.updateState(patch) to establish and update their state slice. The controller lazily creates a scoped state store per plugin on first call, handling patch generation, versioning, and broadcasting across processes via Immer.

    CLI: --watch flag on status

    launchpad status --watch streams live state updates from a running controller.

Patch Changes

@bluecadet/launchpad-monitor@3.0.0

Major Changes

  • bde09a4 - Replaces the hook-based plugin system with a unified plugin model across all packages. See the @bluecadet/launchpad changelog for migration details.

  • #280 7debdda - Introduces StatusSnapshot and ctx.updateState() for plugin status and state management. See the @bluecadet/launchpad changelog for migration details.

Minor Changes

  • #280 8d6cf1e - Introduce EventBus<TEvents> and per-package event types.

    EventBus<TEvents extends Record<string, unknown>> is available from @bluecadet/launchpad-utils. The default TEvents is Record<string, unknown>, so untyped usage works out of the box. Plugins and custom integrations can create typed event buses scoped to their own event contracts.

    Each plugin package exports its event types directly:

    • ContentEvents from @bluecadet/launchpad-content
    • MonitorEvents from @bluecadet/launchpad-monitor
    • CoreEvents from @bluecadet/launchpad-utils
  • #293 ce098d3 - Plugins can now declare CLI commands via manifest.cli. The hardcoded content and monitor CLI commands are removed — both plugins now declare their commands via their manifests. See the @bluecadet/launchpad changelog for migration details.

  • #280 8d6cf1e - Add Zod runtime validation for plugin commands.

    Content and monitor plugins now validate incoming commands against Zod schemas before processing. Invalid commands are rejected with a typed error at the plugin boundary rather than failing deep in business logic.

    ContentCommandSchema and MonitorCommandSchema are exported from their respective packages for use in custom integrations.

Patch Changes

  • #280 41f432d - Fix monitor shutdown not working properly.

  • #280 b29a443 - Bump dependencies with vulnerabilities

  • #280 8d6cf1e - Remove process.exit() calls from library code.

    Library code should never terminate the host process. The monitor and IPC transport now emit a system:shutdown event on the event bus instead of calling process.exit(0) on graceful shutdown. The CLI handles this event and exits cleanly. Programmatic users of the monitor or controller who relied on the implicit exit should listen for system:shutdown instead.

  • #280 7debdda - Adds persistent controller mode with a JSON-RPC 2.0 IPC interface.

    launchpad start

    A new start command launches the controller in persistent mode, opening an IPC socket so subsequent CLI commands connect to the running instance:

    launchpad start         # foreground
    launchpad start -d      # background (detached)

    IPC

    The CLI communicates with a running controller over a JSON-RPC 2.0 socket. The IPCClient API (queryState(), executeCommand(), shutdown(), event subscriptions) is the programmatic interface for this. A CLI and daemon must be on the same version.

    LaunchpadConfig moved to utils

    LaunchpadConfig moves from @bluecadet/launchpad-cli to @bluecadet/launchpad-utils, enabling declaration merging without a direct dependency on the CLI package.

  • #273 9061c4d - Fix pm2 'ENOENT' bug

  • Updated dependencies [8d6cf1e, b29a443, 7debdda, ce098d3, bde09a4, 7debdda]:

    • @bluecadet/launchpad-utils@3.0.0

@bluecadet/launchpad-utils@3.0.0

Major Changes

  • bde09a4 - Replaces the hook-based plugin system with a unified plugin model across all packages. See the @bluecadet/launchpad changelog for migration details.

  • #280 7debdda - Introduces StatusSnapshot and ctx.updateState() for plugin status and state management. See the @bluecadet/launchpad changelog for migration details.

Minor Changes

  • #280 8d6cf1e - Introduce EventBus<TEvents> and per-package event types.

    EventBus<TEvents extends Record<string, unknown>> is available from @bluecadet/launchpad-utils. The default TEvents is Record<string, unknown>, so untyped usage works out of the box. Plugins and custom integrations can create typed event buses scoped to their own event contracts.

    Each plugin package exports its event types directly:

    • ContentEvents from @bluecadet/launchpad-content
    • MonitorEvents from @bluecadet/launchpad-monitor
    • CoreEvents from @bluecadet/launchpad-utils
  • #293 ce098d3 - Plugins can now declare CLI commands via manifest.cli. The hardcoded content and monitor CLI commands are removed — both plugins now declare their commands via their manifests. See the @bluecadet/launchpad changelog for migration details.

Patch Changes

  • #280 b29a443 - Bump dependencies with vulnerabilities

  • #280 7debdda - Adds persistent controller mode with a JSON-RPC 2.0 IPC interface.

    launchpad start

    A new start command launches the controller in persistent mode, opening an IPC socket so subsequent CLI commands connect to the running instance:

    launchpad start         # foreground
    launchpad start -d      # background (detached)

    IPC

    The CLI communicates with a running controller over a JSON-RPC 2.0 socket. The IPCClient API (queryState(), executeCommand(), shutdown(), event subscriptions) is the programmatic interface for this. A CLI and daemon must be on the same version.

    LaunchpadConfig moved to utils

    LaunchpadConfig moves from @bluecadet/launchpad-cli to @bluecadet/launchpad-utils, enabling declaration merging without a direct dependency on the CLI package.

@bluecadet/create-launchpad@1.1.0

Minor Changes

  • #280 076eb64 - Introduces @bluecadet/create-launchpad, a scaffolding CLI invoked via npm create @bluecadet/launchpad. Interactively guides users through selecting plugins (content, monitor), sources, and transforms, then generates or patches package.json, tsconfig.json, launchpad.config.ts, and .gitignore.

@claytercek claytercek force-pushed the changeset-release/develop branch 2 times, most recently from 0dcd059 to 4818218 Compare May 22, 2026 15:34
@github-actions github-actions Bot force-pushed the changeset-release/develop branch from 4818218 to 71fa6d5 Compare May 22, 2026 15:37
@github-actions github-actions Bot force-pushed the changeset-release/develop branch 2 times, most recently from 418b4ff to 5c3ad56 Compare May 22, 2026 17:28
@github-actions github-actions Bot force-pushed the changeset-release/develop branch from 5c3ad56 to 5479042 Compare May 22, 2026 18:30
@claytercek claytercek merged commit 7dab274 into develop May 22, 2026
2 checks passed
@claytercek claytercek deleted the changeset-release/develop branch May 22, 2026 18:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant