-
#436
5ebb82eThanks @forinda! - docs: point package metadata and doc links at the canonical docs host (https://kickjs.app)The
homepagefield, README documentation links, CLI generator templates, and error-message doc URLs now reference https://kickjs.app instead of the retired GitHub Pages URL. No API or runtime behavior changes. -
Updated dependencies [
5ebb82e]:- @forinda/kickjs-devtools-kit@7.0.1
-
#419
8bbf484Thanks @forinda! - Livekick/dbquery telemetry in DevTools.@forinda/kickjs-dbnow republishes every successful query to the DevTools event bus asdb:query({ sql, parameters, durationMs, dialect }), alongside the existingdb:slow-query/db:query-error. Zero-overhead when no bus is wired (unchanged). Thedb:queryevent is added to theKickDevtoolsEventRegistryaugmentation (@forinda/kickjs-db/devtools-events).@forinda/kickjs-devtoolsgains a Database tab: a live recent-query table (time, dialect, duration with slow-query highlight, rows, SQL/error) with SQL filter and headline counters (queries / errors / slow / avg duration). It subscribes todb:query(successes) anddb:query-error(failures) on the shared bus.
-
#420
02fc80eThanks @forinda! - DevTools dashboard: lean, space-efficient redesign- Grouped resizable sidebar replaces the horizontal tab strip. Tabs are organised into collapsible sections (Overview · Runtime · Architecture · Data & Jobs · Activity). Drag the divider to resize; width and collapsed groups persist across reloads.
- Density control (Small / Medium / Large) scales the whole dashboard's spacing and font size from one lever. Defaults to Small to maximise data on screen.
- Settings gear menu in the header — a discoverable home for the density control (and future preferences), with an outside-click / Esc dismiss.
-
#415
7864609Thanks @forinda! - DevTools now surfaces the active HTTP runtime and reports uptime correctly.Application.getActiveRuntime()(new) — returns{ name, capabilities }for the active engine (express/fastify/h3), so tooling can show which runtime an app runs on.- DevTools
/healthincludesruntime;/runtimeincludes aprocessblock (nodeVersion,pid,platform,arch,runtime) — the Runtime tab now shows a strip making explicit that the memory / CPU / event-loop stats are for this Node process (the one running your app), with the engine, Node version, platform, and pid. - Uptime fix — uptime was derived from a timestamp reset in
beforeMount, which re-runs on every HMR rebuild / dev re-bootstrap and pinned it near0s. It now readsprocess.uptime(), which is monotonic from process start and survives reloads.
-
#415
5ba703fThanks @forinda! - Upgrade the DevTools dashboard SPA to Tailwind CSS 4.3.1 and rebuild the shippedpublic/spaassets so consumers get the current build. -
Updated dependencies []:
- @forinda/kickjs-devtools-kit@7.0.0
-
#379
7528356Thanks @forinda! - Migrate the devtools adapter off the raw Expressapp/Routeronto the engine-agnosticctx.httpfacade (final M2 adapter). A thin localroutershim forwards.get/.post/.usetoctx.http.route/ctx.http.use, so every dashboard handler — the ~20 JSON routes, the SSE streams, the heap-snapshot download, the static dashboard, and the token guard — is kept verbatim. Registration order is preserved and the guard still sees router-relativereq.path(the facade scopes it tobasePath, and Express strips the prefix), so behavior is unchanged under the default Express runtime.ctx.appis still used only as the documented escape hatch for__kickApp(topology needs the live Application instance). -
Updated dependencies []:
- @forinda/kickjs-devtools-kit@7.0.0
-
#379
7528356Thanks @forinda! - Migrate the devtools adapter off the raw Expressapp/Routeronto the engine-agnosticctx.httpfacade (final M2 adapter). A thin localroutershim forwards.get/.post/.usetoctx.http.route/ctx.http.use, so every dashboard handler — the ~20 JSON routes, the SSE streams, the heap-snapshot download, the static dashboard, and the token guard — is kept verbatim. Registration order is preserved and the guard still sees router-relativereq.path(the facade scopes it tobasePath, and Express strips the prefix), so behavior is unchanged under the default Express runtime.ctx.appis still used only as the documented escape hatch for__kickApp(topology needs the live Application instance). -
Updated dependencies [
d6622d5,fe1b578,79f2989,3e5d03e,d049c48,335c247,c6e4d73,8fc8c1a,0e18440,d0bc46d,07a3a15,d66dc5b,841637e,6c59776,d500c8a]:- @forinda/kickjs@5.18.0-alpha.0
- @forinda/kickjs-devtools-kit@7.0.0-alpha.0
- Updated dependencies []:
- @forinda/kickjs-devtools-kit@6.0.0
- Updated dependencies [
f04da5b,0d9a895,a4fc68c]:- @forinda/kickjs@5.14.0-alpha.0
- @forinda/kickjs-devtools-kit@6.0.0-alpha.0
-
#271
860b366Thanks @forinda! - chore(meta): focus npm keywords per-package, drop sibling self-referencesEvery published package's
keywordsarray used to list the entire@forinda/kickjs-*family —@forinda/kickjs-authhad@forinda/kickjs-drizzle,@forinda/kickjs-prisma,@forinda/kickjs-viteetc. in its keywords, none of which describe what the auth package does. That's classic keyword stuffing: npm's search algorithm doesn't reward it, some implementations actively demote noisy packages, and it diluted the genuine signal for each package.Rewrote the keywords on all 19 published packages so each array describes that specific package — what a developer would actually type into npm search to find it. A shared 4-keyword header (
kickjs,nodejs,typescript,decorator-driven) stays on each package so the family is still discoverable as a family. Removed: every@forinda/kickjs-*sibling self-reference, irrelevantvitefrom non-vite packages, irrelevantframework/backend/apifrom leaf adapters, and genericdatabase/query-builderfrom packages where it doesn't add signal.No code change, no test impact. Metadata-only — npm search ranking will refresh on next publish.
-
Updated dependencies [
860b366]:- @forinda/kickjs-devtools-kit@5.4.1
-
#267
04cd61dThanks @forinda! - deps: movewsfromdependenciestopeerDependenciesin both packagesBoth
@forinda/kickjs-wsand@forinda/kickjs-devtoolsshippedws@^8.20.1as a harddependency. Adopters who already hadwsinstalled (very common — it's used directly, throughsocket.io, throughundici, through tons of other libs) could end up with two copies innode_modules, which breaksinstanceof WebSocketchecks and confuses some bundlers.Both packages now declare
wsas apeerDependenciesentry at^8.0.0.ws@^8.20.1stays indevDependenciesso the workspace install/build/test still resolves a copy. Modern package managers auto-install peers (pnpm 8+ withauto-install-peers=true, npm 7+), so most adopters need no action; pnpm strict-mode users addwsto their dependencies explicitly. -
Updated dependencies []:
- @forinda/kickjs-devtools-kit@5.4.0
-
#252
9f1e90eThanks @forinda! - feat(devtools): render full introspect snapshot + surface module-level contributors with intact dependsOnThree related fixes addressing two adopter reports: the DevTools dashboard wasn't surfacing data that
introspect()and context-contributordependsOnwere already providing.1. PrimitiveRow renders all
IntrospectionSnapshotfieldsThe server side has been collecting
introspect()snapshots correctly for every adapter / plugin in/_debug/topology. The SPA'sPrimitiveRowinTopologyTab.tsxonly renderedname,version,tokens.provides, andmetrics— silently droppingstate,tokens.requires,memoryBytes, andkind. Adopters whoseintrospect()returned (say){ state, memoryBytes, tokens: { requires } }saw a row with just the name.PrimitiveRow now renders all six fields, with
memoryBytesformatted as B/KB/MB/GB andstaterendered as key/value pairs (JSON-stringified for nested objects).2. Module-level contributors surface via
Application.getContributors()The framework's
getContributors()deliberately skipped module-level registrations because module instances aren't retained on theApplicationinstance post-bootstrap. Adopters who declaredAppModule.contributors?()returning a typeddependsOnsaw the contributor missing entirely from the DevTools Contributors table, which read as "empty deps."Application.setup()now retains a snapshot of every module-level registration (just the frozen{ key, dependsOn }view — noresolveclosures kept), andgetContributors()returns those entries withsource: 'module'. The snapshot is cleared at the start of eachsetup()pass so test harnesses and dev-server restarts don't accumulate stale entries.Per-route (method/class decorator) contributors still aren't enumerated — they live on the route registry and warrant a separate RPC; flagged as a follow-up.
3.
TopologyContributorEntry.sourcewidens to the full unionThe kit's
sourcefield was typed as barestringwith a JSDoc-documented enum; the server collapsed'plugin' | 'global'→'adapter'because of an earlier narrower mapping. Both are now removed: kit ships a properTopologyContributorSourceunion ('method' | 'class' | 'module' | 'adapter' | 'plugin' | 'global'), and the server passessourcethrough unchanged. Dashboards can now badge / filter by the real origin. Wire-format change is backward-compatible (new enum value added to an existing string field).4.
IntrospectionSnapshotreachable from@forinda/kickjsdirectlyAppAdapter.introspect?()andKickPlugin.introspect?()were typed asunknown— the JSDoc told adopters to importIntrospectionSnapshotfrom@forinda/kickjs-devtools-kitto satisfy the contract, taking on a dep just for the type. The snapshot type now lives canonically in@forinda/kickjs(core/introspect.ts); the kit's existingIntrospectionSnapshotstays structurally identical for back-compat. Adopters who don't already use the kit can writeintrospect()with full inference, no extra import:export const MyAdapter = defineAdapter({ name: 'MyAdapter', build: () => ({ introspect() { // Return-type fully inferred — no `import type` needed. return { protocolVersion: 1, name: 'MyAdapter', kind: 'adapter', state: { connectedAt: Date.now() }, memoryBytes: 12_345, tokens: { provides: ['REDIS'], requires: [] }, version: '1.0', metrics: { activeConnections: 3 }, } }, }), })
Tests
application-get-contributors.test.tsadds three cases:dependsOnsurvivesgetContributors()(regression guard); module-level contributors appear aftersetup()withsource: 'module'and intactdependsOn; re-setup doesn't accumulate stale module entries.
- Updated dependencies [
9f1e90e]:- @forinda/kickjs-devtools-kit@5.4.0
-
#238
98f9ef0Thanks @forinda! - fix(devtools): surface every peer adapter on/_debug/health+ OverviewTwo related bugs caused the DevTools Overview > Health card to list only
DevToolsAdaptereven when the app booted with several adapters:adapterStatuseswas only ever written inbeforeMount/shutdownfor the DevTools adapter itself — peers were never added, so the/_debug/healthJSON returnedadapters: { DevToolsAdapter: 'running' }regardless of how many other adapters were registered.- The Overview > Health card's Adapters accordion defaulted to collapsed, hiding the list further.
The fix seeds
adapterStatusesfromgetPeerAdapters()inafterStart(every mounted peer appears asrunning), refreshes each entry frompeer.onHealthCheck()when present at request time so the status is live rather than a frozen boot snapshot, and defaults the Overview accordion to open. No public-API change. -
#240
4eebd43Thanks @forinda! - fix(devtools): two audit-found correctness winsrouteLatencymap no longer grows unboundedly under 404 probing (@forinda/kickjs-devtools).The request-tracking middleware keyed
routeLatencyby${req.method} ${req.route?.path ?? req.path}— when no route matched, the fallback used the raw URL, so every probed 404 path became its own entry. The samples ring buffer was capped at 1000, but the map itself had no cap; an attacker hammering random paths could inflate/_debug/metricspayloads and leak memory indefinitely. Unmatched requests now collapse into a single<unmatched>bucket per HTTP method.DEVTOOLS_BUStoken doc drift (@forinda/kickjs-devtools-kit).The JSDoc claimed the adapter registered the bus in
beforeStart, but it actually registers inbeforeMount. Doc-only fix — no runtime change. -
Updated dependencies [
4eebd43]:- @forinda/kickjs-devtools-kit@5.3.2
-
#166
a6d0dd6Thanks @forinda! - Minify published build output via the tsdown / oxc minifier.- Library packages use
minify: { compress: true, mangle: false }. Whitespace and comments are stripped and constants folded, but identifiers stay intact so adopter stack traces remain readable. - CLI uses
minify: { compress: true, mangle: true }. The CLI is an operator tool, not a library — full mangle is fine and gives a smaller binary.
Net effect: roughly 30–40% smaller
dist/*.mjsper package on disk, no public-API or behavior change. - Library packages use
-
Updated dependencies [
a6d0dd6]:- @forinda/kickjs-devtools-kit@5.3.1
-
#161
5de61d9Thanks @forinda! - ImportDEVTOOLS_BUSfrom the new@forinda/kickjs-devtools-kit/bus/tokensubpath instead of/bus. The SPA bundle drops from 1025 kB to 92 kB now that the framework runtime is no longer transitively pulled through the bus re-export.Test fix: vitest aliases switched to anchored regex so longer subpaths match before shorter ones (the previous string-prefix alias rewrote
/bus/tokenintobus.ts/tokenand threwENOTDIR). -
Updated dependencies [
5de61d9]:- @forinda/kickjs-devtools-kit@5.3.0