Skip to main content
Changes to @wolfstar/http-framework. For the weekly summary across all packages, see the changelog overview.

6.5.1 (2026-10-18)

Updates

  • Dependencies — Updated @wolfstar/cli to 2.11.0, @wolfstar/schema to 0.12.0.

6.5.0 (2026-10-17)

New features

  • getRootData re-export — @wolfstar/http-framework now re-exports getRootData from @sapphire/pieces. Module locales added with ctx.addLocales use it to find the default languages directory. (#339)

Updates

  • Dependencies — Updated @wolfstar/schema to 0.11.0, @wolfstar/cli to 2.10.0.

6.4.0 (2026-10-12)

New features

  • Startup command registration — Opt in through ClientOptions.commands to register commands when the client starts. Synchronize global or guild commands, get conflicts reported, and keep unknown deployed commands by default. Use when to pick the single process that registers. A registration failure logs a warning without stopping the HTTP server. (#325)
  • ApplicationCommandRegistry.sync() — Incrementally synchronizes registered commands with Discord.

6.3.2 (2026-10-11)

Bug fixes

  • No crash after an answered interaction — A command, autocomplete, or interaction handler that threw right after answering no longer crashes the process with ERR_STREAM_WRITE_AFTER_END. The framework now skips the error reply when the response has already ended. The error is still emitted. (#322)

6.3.1 (2026-10-09)

Updates

  • Dependencies — Updated @wolfstar/schema to 0.10.0, @wolfstar/cli to 2.7.0.

6.3.0 (2026-10-08)

New features

  • Preconditions — You can now run checks before a command, its autocomplete, or an interaction handler, following @sapphire/framework. Add a Precondition piece to the new preconditions store and implement chatInputRun, contextMenuRun, autocompleteRun, and/or interactionHandlerRun, returning ok() or error() (a PreconditionError for the piece). A piece with a position is global and runs in ascending order of it. There are no built-in preconditions. (#300)
  • preconditions option — List the preconditions to run in Command.Options or InteractionHandler.Options: by name, by name with a context, or as a PreconditionFunction. The list is an AND, a nested array is an OR, and nesting alternates from there, for example ['Connect', ['Moderator', ['DJ', 'SongAuthor']]]. Pass { entries, mode: PreconditionRunMode.Parallel } to start every entry at once.
  • Precondition events — The first denial skips the method and emits chatInputCommandDenied, contextMenuCommandDenied, autocompleteDenied, or interactionHandlerDenied. New events preChatInputCommandRun, preContextMenuCommandRun, chatInputCommandAccepted, contextMenuCommandAccepted, autocompleteAccepted, and interactionHandlerAccepted let you observe the flow. A piece with no method for a chat input or context menu command denies it; for an autocomplete or an interaction handler it is skipped.
  • New exports — AllFlowsPrecondition, PreconditionStore, runPreconditions, PreconditionRunMode, PreconditionRunCondition, the array types, and the related types are exported. Identifiers gains PreconditionMissingChatInputHandler and PreconditionMissingContextMenuHandler.
  • isUserError — A new helper checks whether an error is a UserError, and also recognizes a UserError from another copy of the package by its shape. (#298)

Updates

  • UserError routed to *Denied events — A UserError thrown by a command, an autocomplete handler, or an interaction handler now goes to chatInputCommandDenied / contextMenuCommandDenied (Events.ChatInputCommandDenied, Events.ContextMenuCommandDenied), autocompleteDenied, or interactionHandlerDenied with (error: UserError, context), instead of commandError, autocompleteError, or interactionHandlerError. Other errors still reach the *Error events; the error event and the HTTP response are unchanged. (#298)
  • Run events emitted after preconditions — commandRun, autocompleteRun, and interactionHandlerRun now fire only after the preconditions pass, so a denied interaction does not emit them. Without preconditions nothing changes.
  • Dependencies — Updated @wolfstar/cli to 2.6.1.

Migration

  • Move UserError replies to *Denied listeners — If a listener on commandError, autocompleteError, or interactionHandlerError replies to the user with a UserError (including the PreconditionError from @wolfstar/decorators), move that logic to chatInputCommandDenied, contextMenuCommandDenied, autocompleteDenied, or interactionHandlerDenied. Those errors no longer reach the *Error events.

6.2.2 (2026-10-07)

Updates

  • Dependencies — Updated @wolfstar/cli to 2.6.0, @wolfstar/schema to 0.9.0.

6.2.1 (2026-10-06)

Updates

  • Dependencies — Updated @wolfstar/cli to 2.5.0, @wolfstar/schema to 0.8.0.

6.2.0 (2026-10-06)

New features

  • Typed command options with stars codegen — Set codegen.commands in stars.config (true, or { output }, default src/@types/commands.d.ts) and stars codegen reads the commands from the built bot and writes a CommandOptionsRegistry entry per command path ('ping', 'math add', 'subscriptions twitch add'). Use Command.OptionsOf<'math add'> instead of a hand-written interface Options: required options are non-optional, choices become a literal union, and channel_types narrow the channel. stars codegen --check fails with CODEGEN_OUTDATED when the file is stale, and --json reports the result. (#275)

Updates

  • Dependencies — Updated @wolfstar/cli to 2.4.0, @wolfstar/schema to 0.7.0.

6.1.1 (2026-10-04)

New features

  • stars commands diff and stars commands deploy — stars commands diff compares the commands your built bot defines with those deployed on Discord (--check for CI); stars commands deploy overwrites them after a confirmation (--yes for scripts). Both need @wolfstar/http-framework 6.1 or later and a built project. (#257)
  • stars doctor — Checks the runtime, the framework, credentials, the dev port, the tunnel, and generated files, with a fix for each problem (--online also queries Discord, --json for scripts).
  • stars completions <bash|zsh|fish> — Prints a shell completion script for the registered commands.

Updates

  • stars info — Lists the installed modules and the new dev options. The README now documents the dev options of stars.config.
  • Dependencies — Updated @wolfstar/cli to 2.3.0, @wolfstar/schema to 0.6.0.

6.1.0 (2026-10-02)

New features

  • Object-based plugins — Define Vite-style plugins with definePlugin and the StarsPlugin type (name, enforce: 'pre' | 'post', apply, and the five lifecycle hooks as (client, options) => …). Add per-client plugins with the new plugins option in ClientOptions. A failing hook throws PluginHookError, which names the plugin. (#246)

Updates

  • Plugin ordering — PluginManager runs hooks as pre, plain, then post, in registration order within each group. Client.use accepts plugin objects and nested arrays.
  • Legacy plugins deprecated — The Plugin class, symbol hooks, and registerXHook keep working through an adapter but emit a one-time DeprecationWarning (HTTP_FRAMEWORK_LEGACY_PLUGIN) per plugin.
  • Dependencies — Updated @wolfstar/schema to 0.5.0, @wolfstar/cli to 2.2.0.

6.0.1

New features

  • env option in stars.config — Added an env option that mirrors @wolfstar/env-utilities’ setup options and is registered automatically as the first import of the built entry, before plugin registrations and the bot’s own modules. Added Nuxt-style lifecycle hooks (config:resolved, env:options, prepare:*, builder:created, tsdown:options, build:*, dev:*) run with hookable.
  • future.compatibilityVersion: 5 by default — Version 5 is now the default: it is version 4 plus the automatic env registration, which turns on when the project depends on @wolfstar/env-utilities (and stays off with Nitro). Version 4 is still supported. Version 3 is end-of-life: it still works, now reports a COMPATIBILITY_VERSION_EOL warning, and will be removed in the next major. Projects generated by @wolfstar/create-http-framework with the tsdown or vite build no longer call setup() from @wolfstar/env-utilities by hand; tsc and JavaScript projects keep it and set env: false. (#243)

Updates

  • Dependencies — Updated @wolfstar/schema to 0.4.0, @wolfstar/cli to 2.1.0.

6.0.0 (2026-09-24)

New features

  • Client.fetch() — client.fetch(request) is the Web Request/Response counterpart of listen(). It runs the same signature verification and routing without binding a port, for Workers, Bun.serve, Deno.serve, and similar runtimes.
  • stars binary ships with http-framework — Installing @wolfstar/http-framework now gives you the stars command, with no separate @wolfstar/cli install.

Updates

Migration

  • Utility decorators moved to @wolfstar/decorators — ApplyOptions, RequiresGuildContext, RequiresDMContext, RequiresUserPermissions, RequiresClientPermissions, Enumerable, EnumerableMethod, createClassDecorator, createMethodDecorator, createProxy, createFunctionPrecondition, and the PieceConstructor/ContextFallback types are no longer exported by the framework. Install @wolfstar/decorators and import them from there instead; their behaviour is unchanged. The Register* decorators and RestrictGuildIds stay in the framework. @wolfstar/decorators declares @wolfstar/http-framework as a peer dependency. @wolfstar/schema now includes @wolfstar/decorators in its default imports.presets, so projects using the stars CLI’s auto imports keep getting the decorators without an explicit import once the package is installed. (#238)

5.1.3

Updates

  • Dependencies — Updated @wolfstar/cli to 2.0.3, @wolfstar/schema to 0.2.1.

5.1.2

Bug fixes

  • Require @wolfstar/cli release with plugin registration fix — Upgrading the framework alone now also stops stars build/stars dev from crashing with ERR_PACKAGE_PATH_NOT_EXPORTED on @wolfstar/plugin-cache, @wolfstar/plugin-gateway, or @wolfstar/plugin-sharder. (#231)

Updates

  • Dependencies — Updated @wolfstar/cli to 2.0.2.

5.1.1

Bug fixes

  • Fix auto-imports clash with setup() — Stopped auto-importing @wolfstar/env-utilities’ setup, which clashed with the setup() scaffolded projects export from src/lib/setup/all.ts and printed a duplicated import warning on every build. (#222)

5.1.0

New features

  • Align configuration entry points with Nuxt — Added framework schema and package metadata exports, a lightweight schema/config helper, and split schema input types from config resolution while preserving existing exports. (#209)
  • Split stars.config.* schema into @wolfstar/schema — The stars.config.* schema and loader (defineConfig, loadStarsConfig, configDiagnostics, and friends) now live in a new package, @wolfstar/schema. @wolfstar/http-framework/config re-exports @wolfstar/schema’s public surface unchanged, so existing import { defineConfig } from '@wolfstar/http-framework/config' code keeps working with no changes needed. @wolfstar/http-framework now depends on @wolfstar/cli and ships a stars bin (bin/stars.mjs, re-exporting @wolfstar/cli/cli), so installing @wolfstar/http-framework is now enough to get the stars command. (#209)

Updates

  • Dependencies — Updated @wolfstar/cli to 2.0.0, @wolfstar/schema to 0.2.0.

Migration

  • @wolfstar/cli no longer depends on @wolfstar/http-framework — Matching how @nuxt/cli has no dependency on nuxt, @wolfstar/cli now depends on @wolfstar/schema instead. Projects that installed @wolfstar/cli without also depending on @wolfstar/http-framework directly now need to add @wolfstar/http-framework themselves. Every project scaffolded by @wolfstar/create-http-framework, or that already depends on @wolfstar/http-framework, is unaffected. @wolfstar/cli’s own public exports (loadStarsConfig, configDiagnostics, ConfigDiagnosticCode, ResolvedStarsConfig, re-exported from @wolfstar/schema) are unchanged. (#209)

5.0.0 (2026-09-24)

New features

  • Client.fetch() — client.fetch(request) is the Web Request/Response counterpart of listen(). It runs the same signature verification and routing without binding a port, for Workers, Bun.serve, Deno.serve, and similar runtimes.
  • stars binary ships with http-framework — Installing @wolfstar/http-framework now gives you the stars command, with no separate @wolfstar/cli install.
  • experimental.enableNitro implemented — stars dev/stars build now build the bot through Nitro v3’s own Vite plugin (nitro/vite, requires Vite 8). @wolfstar/http-framework: Client now has a fetch(request, options?) method, the Web Request/Response counterpart of listen(), running the exact same signature verification, routing, and replies without binding a port, for anything that speaks Fetch instead of node:http (Nitro, a Worker, Bun.serve, Deno.serve, Vite’s own dev middleware). The previously-unannounced @wolfstar/http-framework/fetch submodule (createFetchHandler/FetchHandler/FetchHandlerOptions) is removed in favour of this method on Client itself. @wolfstar/cli: NitroBuilder reuses the project’s own vite.config.*/stars.config#vite, adds a generated server entry, and produces .output/ laid out for the configured experimental.nitro.preset (node-server by default, deployable to anything Nitro targets). stars dev rebuilds and restarts on every change. stars prepare’s generated .stars/tsconfig.json now emits the same ~/@/~~/@@ aliases. (#207)

Updates

  • Config schema moved to @wolfstar/schema — The stars.config.* schema and loader now live in @wolfstar/schema. Imports from @wolfstar/http-framework/config keep working unchanged.
  • Plugin support — @wolfstar/plugin-api, @wolfstar/plugin-i18next, @wolfstar/plugin-logger, and @wolfstar/plugin-subcommands-advanced now target 5.x.
  • Replace ConfigError and CliError with nostics diagnostics — @wolfstar/http-framework/config no longer exports ConfigError/ConfigErrorOptions. Every stars.config.* validation and load failure is now built from configDiagnostics (also exported) and thrown as a nostics Diagnostic. Catch it with instanceof Diagnostic (from nostics) instead of instanceof ConfigError. The option path is folded into the diagnostic’s message; the configuration file is now in .sources. @wolfstar/cli no longer exports CliError/CliErrorOptions. Its errors are now built from cliDiagnostics and are Diagnostic instances too. formatError renders a Diagnostic with nostics’ own ANSI formatter; exitCodeOf maps stars.config.* diagnostic codes to exit code 2 and BUILD_FAILED to 3. ExitCode, exitCodeOf, and formatError keep their existing exports and behaviour for every other case. (#205)

4.0.2

Updates

  • Dependencies — Updated unimport to v7.

4.0.1

Updates

  • Dependencies — Updated all non-major dependencies.

4.0.0 (2026-09-17)

New features

  • Compatibility version 4 by default — The Stars workflow is now convention-first: stars dev forces development mode, src/locales is copied and watched automatically, and environment files are discovered under both src/ and the project root. The interactive dev UI now supports t to open or close a public quick tunnel without configuring dev.tunnel. (#182)

Updates

  • Structured logging — Replaced direct console calls with @wolfstar/logger for structured, leveled logging (HMR events, command router warnings). (#182)

3.6.0

New features

  • Aligned stars dev terminal UI with Nuxt — The tsdown builder now leaves dependencies external with deps.neverBundle, removing the deprecated option and keeping shared dependencies external for dynamically loaded pieces. Its entry list, target, and output-size table are suppressed; warnings and errors remain available in the log browser and log file. The bottom-aligned panel displays an animated Stars wordmark, aligned URLs, build-phase progress and elapsed time, readiness timing, and diagnostic counts. dev.banner accepts custom text/lines or false to hide the wordmark. Log, help, and session-info views use the alternate screen and restore the panel when closed. Logs support search, source/level filters, selection, copying, and jumping to the last error with context. Stack frames are dimmed and no longer counted as separate errors; Node warnings are classified as warnings rather than errors. Rebuild state and duration now reset on Rolldown’s per-build hook, including recovery from a failed build. Reduced motion preserves the elapsed clock, and redirected input, dumb terminals, and small panes get a safe plain fallback. (#168)

Updates

  • Dependencies — Updated chokidar to v5.

3.5.0

New features

  • Configure tsdown build from stars.config — The tsdown block is now the project’s build configuration, typed with the options a bot actually reaches for (entry, format, unbundle, plugins, alias, define, deps, hooks, …). What stars.config already says fills in the rest, so most projects need nothing in it at all. build.tsconfig is now resolved for tsdown builds too. build.configFile reports which file the build tool is configured from. Two new validation errors: TSDOWN_OPTIONS_REQUIRE_TSDOWN and VITE_OPTIONS_REQUIRE_VITE. A project that only declares tsdown: {} now resolves build.tool: 'auto' to tsdown. (#164)
  • Add future.compatibilityVersion — future carries the defaults of the next major. future: { compatibilityVersion: 4 } changes three things: auto imports are on with the tsdown build tool (wired into the build itself); tsdown is configured from stars.config alone (a tsdown.config.* raises TSDOWN_CONFIG_FILE_UNSUPPORTED); build.tool: 'auto' resolves to tsdown for any TypeScript entry without looking for a tsdown.config.* or tsdown dependency first. 3 is the default and keeps today’s behaviour. An unknown version raises INVALID_COMPATIBILITY_VERSION. (#164)

3.4.0

New features

  • Built-in logger — container.logger is now always available and defaults to a minimal Logger that writes to the console, filtered by LogLevel. The new ILogger interface is the extension point: a plugin can set options.logger.instance from a preGenericsInitialization hook to replace the built-in implementation, and new Client({ logger: { level: LogLevel.Debug } }) tunes the default one. The framework internals now log through container.logger instead of console. (#159)
  • stars dev loop pieces — Added dev.typecheck (runs a type checker next to the bot, supporting tsc, golar, and tsz), dev.tunnel (exposes the bot’s interactions endpoint publicly via cloudflared or a custom URL, with optional updateEndpoint), dev.logFile (mirrors dev session logs to disk), stars commands (lists and cleans deployed application commands), and stars info improvements. The interactive stars dev UI is now an Ink (React) application. stars commands clean without --name/--yes now runs an interactive wizard. @wolfstar/cli requires Node 22 or newer. (#158)
  • Typed project configuration and the stars CLI — The typed stars.config.* schema and loader are owned by @wolfstar/http-framework (@wolfstar/http-framework/config: defineConfig, loadStarsConfig, ConfigError). @wolfstar/cli ships the stars binary: stars dev builds and restarts the bot, stars build runs the build once, stars info prints resolved configuration, and stars codegen runs i18next type generation. stars --help and stars --version never load the configuration machinery. (#158)
  • experimental block in stars.config.* — Added experimental.enableVite (build through own vite), experimental.enableExternalVite (watch external build output), and experimental.enableNitro (declared but not implemented yet). stars info reports which flags are on. (#158)

3.3.0

New features

  • Events enum — Every event emitted by Client is now available as a member of the Events enum, mirroring discord.js’ Events, so client.on(Events.CommandError, ...) can be used instead of the 'commandError' string literal. Existing string literals keep working. The library now emits through the enum, and the new ClientEventName type aliases keyof ClientEvents. (#157)
  • Hot Module Reloading — Client now accepts an hmr option that starts a HotModuleReloader at the end of Client#load(). It watches every path registered in every store and loads, reloads, and unloads pieces in place as their files are created, changed, and deleted, without restarting the process. It accepts all of chokidar’s options plus enabled (default true) and silent (default false), is exposed as client.hmr, and reports operations through new client events (hmrStart, hmrStop, hmrPiecesLoaded, hmrPieceReloaded, hmrPieceUnloaded, hmrError). Unloading a command now also deletes its entry from the ApplicationCommandRegistry, so reloading a command no longer leaves the previous entry behind. (#155)

3.2.1

Updates

  • Dev tooling — Replaced tsc with golar as the typechecker and bumped TypeScript to 7.0.2. This is a dev-tooling-only change with no effect on published output. (#151)

3.2.0

New features

  • Utility decorators — Added ApplyOptions, RequiresGuildContext, RequiresDMContext, RequiresUserPermissions, RequiresClientPermissions, Enumerable, EnumerableMethod, createClassDecorator, createMethodDecorator, createProxy, and createFunctionPrecondition, modelled after @sapphire/decorators and adapted to HTTP-only Discord interactions. The existing Register* decorators and RestrictGuildIds are now built on the same primitives. (#131)
  • Sapphire-style error types — Added UserError, ArgumentError, PreconditionError, and an Identifiers enum, modelled after @sapphire/framework’s error hierarchy but adapted to the HTTP framework. ChatInputRouterError now extends UserError and is exported from the package root together with the new errors. (#132)

3.1.4

Updates

  • Dependencies — Updated all non-major dependencies. (#126)

3.1.3

Updates

  • Dependencies — Updated all non-major dependencies. (#102)

3.1.2

Updates

  • Restore npm provenance attestation — Restored npm provenance attestation on publish for all packages. (#107)

3.1.1

Updates

  • Upgrade tsdown — Upgraded tsdown to 0.22.14 and migrated deps.skipNodeModulesBundle to deps.neverBundle. (#93)

3.1.0

New features

  • Imperative command registration — Added an optional Command#registerApplicationCommands(registry) instance method, mirroring @sapphire/framework’s ApplicationCommandRegistry API, so chat input, subcommand, subcommand group, and context menu commands can be registered imperatively instead of via TypeScript decorators. This also makes the framework usable from plain JavaScript. (#85)

3.0.0

New features

  • Plugin system — Added a Sapphire-style plugin system. Plugins extend the Plugin base class and define static lifecycle hooks (preGenericsInitialization, preInitialization, postInitialization, preLoad, postListen) which are registered through Client.use(plugin) and run across the Client constructor, load(), and listen(). A pluginLoaded event is emitted as each hook runs. (#65)

2.3.1

Updates

  • Provenance attestation — Added provenance attestation to publishConfig for all packages. (#59)

2.3.0

New features

  • Testing library — Introduced a dedicated library for testing http-framework bots. Added the @wolfstar/http-framework-test-utils package for writing tests against the framework. (#43)