@nifrajs/cli 3.2.0 → 3.3.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.
package/dist/cli.js CHANGED
@@ -192,7 +192,7 @@ set in the process environment is never overwritten by a file.
192
192
 
193
193
  ${renderCommandCatalogHelp()}`;
194
194
  // Kept in lockstep with packages/cli/package.json by check:publish's version-consistency gate.
195
- const CLI_VERSION = "3.2.0";
195
+ const CLI_VERSION = "3.3.0";
196
196
  // A render adapter + nifra server are opaque to the CLI (it just forwards them); cast at the seam.
197
197
  const asAdapter = (v) => v;
198
198
  const asBunPlugins = (v) => v;
package/dist/mcp-http.js CHANGED
@@ -23,7 +23,7 @@ import { loadTypesCorpus } from "./types-search.js";
23
23
  export { examplesAppTool, examplesWidget } from "./mcp-app-tool.js";
24
24
  export { docsTools } from "./mcp-docs-tools.js";
25
25
  // Kept in lockstep with packages/cli/package.json by check:publish's version-consistency gate.
26
- const VERSION = "3.2.0";
26
+ const VERSION = "3.3.0";
27
27
  const SERVER_INFO = { name: "nifra-docs", version: VERSION };
28
28
  // Derive the GET/health tool list from the tools actually served, so the line can never drift from them.
29
29
  const docsHealth = (tools) => `nifra docs MCP - POST JSON-RPC 2.0 here (methods: initialize, tools/list, tools/call). Tools: ${tools
@@ -361,19 +361,19 @@
361
361
  },
362
362
  {
363
363
  "name": "BUILD",
364
- "topic": "Nifra - Rendering: SSG & ISR",
364
+ "topic": "Nifra - Rendering: SSR, streaming, SSG & ISR",
365
365
  "slug": "rendering",
366
366
  "code": "// build.ts - buildClient, then prerender opted-in routes to static HTML.\nimport { buildClient, prerenderRoutes, cloudflarePagesRoutes } from \"@nifrajs/web/build\"\nimport { discoverRoutes } from \"@nifrajs/web/fs\"\n\nawait buildClient({ routesDir: \"./routes\", outDir: \"./dist\", clientModule: \"@nifrajs/web-react/client\" })\nconst { app } = await import(\"./server\")\nconst { prerendered } = await prerenderRoutes({\n app,\n routes: discoverRoutes(\"./routes\").routes,\n outDir: \"./dist\", // writes <path>/index.html + <path>/_data.json per prerendered route\n})\n\n// Hybrid deploy (Cloudflare Pages): serve prerendered HTML + _data.json from the CDN; everything\n// else falls through to the SSR worker.\nconst paths = prerendered.map((p) => p.path)\nBun.write(\"./dist/_routes.json\", JSON.stringify(cloudflarePagesRoutes({ prerendered: paths })))"
367
367
  },
368
368
  {
369
369
  "name": "FONTS",
370
- "topic": "Nifra - Rendering: SSG & ISR",
370
+ "topic": "Nifra - Rendering: SSR, streaming, SSG & ISR",
371
371
  "slug": "rendering",
372
372
  "code": "// fonts.css - a CLS-safe @font-face for a self-hosted font (the pipeline bundles + hashes it).\nimport { fontFace } from \"@nifrajs/web\"\nexport default fontFace({\n family: \"Inter\",\n src: [{ url: \"/fonts/inter-var.woff2\" }], // self-host it - never hotlink a CDN\n weight: \"100 900\", // variable font\n sizeAdjust: \"100.06%\", ascentOverride: \"90%\", // optional: stop fallback->web-font layout shift\n})\n\n// a root layout - preload the file so it downloads WITH the document (not after CSS parse):\nimport { fontPreload } from \"@nifrajs/web\"\nexport const meta = { link: [fontPreload({ href: \"/fonts/inter-var.woff2\" })] }"
373
373
  },
374
374
  {
375
375
  "name": "ISR",
376
- "topic": "Nifra - Rendering: SSG & ISR",
376
+ "topic": "Nifra - Rendering: SSR, streaming, SSG & ISR",
377
377
  "slug": "rendering",
378
378
  "code": "// server.ts - wrap the app with Incremental Static Regeneration.\nimport { createWebApp, withISR, MemoryCacheStore } from \"@nifrajs/web\"\nimport { reactAdapter } from \"@nifrajs/web-react\"\nimport { clientEntry, manifest } from \"./server-manifest\" // generated by buildServer\n\nconst app = createWebApp({ adapter: reactAdapter, manifest, clientEntry })\nconst store = new MemoryCacheStore() // dev / single-instance only\n\n// GET text/html responses are cached + served stale-while-revalidate. Default freshness 60s.\nconst isr = withISR(app, { store, revalidate: 60, now: () => Date.now() })\nBun.serve({ fetch: (req) => isr(req) })"
379
379
  },
@@ -473,6 +473,12 @@
473
473
  "slug": "types-first",
474
474
  "code": "import { client } from \"@nifrajs/client\"\nimport type { app } from \"./server\" // a TYPE import - server code never ships to the client\n\nconst api = client<typeof app>(\"https://api.example.com\")\n\nconst res = await api.users({ id: \"42\" }).get() // path + params autocomplete, no codegen\nif (res.ok) {\n res.data.name // typed from the route's response schema\n} else {\n res.error // client-call failures are returned, never thrown\n}"
475
475
  },
476
+ {
477
+ "name": "INLINE",
478
+ "topic": "Nifra - Types-first architecture",
479
+ "slug": "types-first",
480
+ "code": "import { server } from \"@nifrajs/core/server\"\n\nexport const app = server()\n .get(\"/users/:id\", (c) => ({ id: c.params.id, name: \"Ada\" }))\n // c.params.id is inferred from the path; the return type becomes the client response.\n .post(\"/users\", () => ({ created: true }))\n\n// No schema, annotation, or codegen is required for the route types."
481
+ },
476
482
  {
477
483
  "name": "OPENAPI",
478
484
  "topic": "Nifra - Types-first architecture",
@@ -489,7 +495,7 @@
489
495
  "name": "SCHEMA",
490
496
  "topic": "Nifra - Types-first architecture",
491
497
  "slug": "types-first",
492
- "code": "import { t } from \"@nifrajs/schema\"\n\n// One contract, defined once. Everything below is derived from it.\nexport const GetUser = {\n params: t.object({ id: t.string() }),\n response: t.object({\n id: t.string(),\n name: t.string(),\n role: t.union([t.literal(\"admin\"), t.literal(\"user\")]),\n }),\n}"
498
+ "code": "import { t } from \"@nifrajs/schema\"\n\n// Add a schema when the boundary needs runtime validation or a declared contract.\nexport const GetUser = {\n params: t.object({ id: t.string() }),\n response: t.object({\n id: t.string(),\n name: t.string(),\n role: t.union([t.literal(\"admin\"), t.literal(\"user\")]),\n }),\n}"
493
499
  },
494
500
  {
495
501
  "name": "BASIC",
@@ -958,15 +958,48 @@ function Row({ id }: { id: string }) {
958
958
  const anyPending = useFetchers().some((f) => f.snapshot().pending)
959
959
  ```
960
960
 
961
- ## Nifra - Rendering: SSG & ISR
961
+ ## Nifra - Rendering: SSR, streaming, SSG & ISR
962
962
 
963
- > Prerender static routes, enumerate dynamic ones, and cache rendered pages with stale-while-revalidate - on every runtime including the edge.
963
+ > Render critical HTML first, stream deferred data progressively, prerender static routes, and cache rendered pages with stale-while-revalidate - on every runtime including the edge.
964
964
 
965
965
  Nifra renders on one framework-agnostic seam, so the same app can be server-rendered per
966
- request (the default), **prerendered** to static files at build (SSG), or cached and served
966
+ request (the default), streamed progressively, **prerendered** to static files at build (SSG), or cached and served
967
967
  **stale-while-revalidate** (ISR) - and every strategy works on Bun, Node, Deno, **and**
968
968
  the edge.
969
969
 
970
+ ### Progressive rendering with `defer()`
971
+
972
+ Keep critical loader data in the first HTML shell and mark slower, non-critical values with
973
+ `defer()`. Nifra flushes the document shell and the adapter's rendered stream first,
974
+ then sends each deferred resolution through `<Await>` without a second data
975
+ fetch. The same protocol works for actions and soft navigations, including NDJSON on the client
976
+ side.
977
+
978
+ ```ts
979
+ import { defer } from "@nifrajs/web"
980
+
981
+ export async function loader({ api }: LoaderArgs<typeof app>) {
982
+ return {
983
+ product: (await api.products.get()).data, // critical: rendered in the first shell
984
+ reviews: defer(api.reviews.get()), // non-critical: streamed when ready
985
+ }
986
+ }
987
+
988
+ export default function Product(props: { data: LoaderData<typeof loader> }) {
989
+ return (
990
+ <>
991
+ <ProductSummary product={props.data.product} />
992
+ <Await resolve={props.data.reviews} fallback={<p>Loading reviews…</p>}>
993
+ {(reviews) => <Reviews items={reviews} />}
994
+ </Await>
995
+ </>
996
+ )
997
+ }
998
+ ```
999
+
1000
+ This is request-time progressive SSR/partial rendering. It is distinct from build-time SSG:
1001
+ the shell is not a precomputed PPR artifact, and deferred values remain request-scoped.
1002
+
970
1003
  ### SSG - prerender at build
971
1004
 
972
1005
  Opt a static route into prerendering with `export const prerender = true`. Its
@@ -4240,7 +4273,7 @@ the command printed by the build.
4240
4273
 
4241
4274
  ## Nifra - Coding agents
4242
4275
 
4243
- > Nifra's agent layer: live MCP tools for coding agents, bounded typed turns, resumable evidence, a coding-agent host, browser views, A2A and AG-UI bridges, and token-only telemetry.
4276
+ > Nifra's agent layer: live MCP tools, bounded repairable turns, native approvals, resumable evidence, content-free browser views, capability registry, decision inbox, Run Studio, A2A, and AG-UI.
4244
4277
 
4245
4278
  Nifra ships an MCP server. It is not a documentation lookup bolted onto a framework: an agent
4246
4279
  can read the project, learn the real API, run actual requests against the backend it just
@@ -4324,6 +4357,8 @@ nifra_check # typecheck + lints, each with a structured fix
4324
4357
  nifra_fix # applies the mechanical ones
4325
4358
  nifra_run {request} # a real request through the backend: status, headers, parsed body
4326
4359
  nifra_render {path} # SSR a page route, returns the HTML
4360
+ nifra_inspect {port} # recent dev-server request traces: status, duration, ISR hit/miss
4361
+ nifra_explain {error} # turn a failure into a structured diagnostic and fix
4327
4362
  nifra_test # bun test, bounded structured results
4328
4363
 
4329
4364
  # 4. What does it now prove?
@@ -4465,8 +4500,28 @@ bunx nifra-agent --backend pi --message "run the checks and explain failures"
4465
4500
  ```
4466
4501
 
4467
4502
  The public host keeps live queues and captured evidence bounded, filters verification process
4468
- environments, and treats extensions as an explicit opt-in. The local process adapter and
4469
- extension worker are crash-containment helpers, not hostile-code sandboxes.
4503
+ environments, and treats extensions as an explicit opt-in. Post-turn `check`,
4504
+ `assure`, or `test` gates emit `verification.completed` and
4505
+ `repair.required`; when enabled, the host sends a bounded repair prompt and reruns
4506
+ the gate until it passes or the attempt cap is reached. The local process adapter and extension
4507
+ worker are crash-containment helpers, not hostile-code sandboxes.
4508
+
4509
+ ```ts
4510
+ # Post-turn gates are opt-in. A failed gate becomes bounded repair work.
4511
+ bunx nifra-agent --backend pi --message "implement the change" \
4512
+ --verify-after-turn check,assure --max-repair-attempts 2
4513
+
4514
+ # Set --max-repair-attempts 0 for observe-only verification.
4515
+ ```
4516
+
4517
+ ### Native approval protocol
4518
+
4519
+ `@nifrajs/coding-agent` can pause a native tool call at the decision boundary and
4520
+ emit `approval.required` with an opaque approval id, action, capability, and bounded
4521
+ coordinates. Resolve it through the host or RPC with `approval.resolve`; the backend
4522
+ emits `approval.resolved` and only then executes the tool. Denial, cancellation,
4523
+ timeout, and closed sessions all fail closed, and `approvalTimeoutMs` bounds how long
4524
+ a pending decision can remain open.
4470
4525
 
4471
4526
  ### Expose the same agent to other clients
4472
4527
 
@@ -4509,11 +4564,15 @@ auth and authorization middleware, and scope every injected port to the request
4509
4564
  ### Browser views and the Workbench
4510
4565
 
4511
4566
  `@nifrajs/agent-app` is a backend-free browser SDK for negotiated commands, ordered
4512
- and resumable event streams, approvals, handoffs, and Run Studio projections. Its public views
4513
- contain structure - statuses, counters, coordinates, and error codes - rather than prompts,
4514
- tool payloads, model output, or filesystem paths. The optional Workbench uses that same surface:
4515
- run `bun run --filter '@nifrajs/workbench' dev -- --cwd /path/to/project` for the
4516
- local browser client.
4567
+ and resumable event streams, approvals, handoffs, and Run Studio projections. It negotiates
4568
+ optional features including `approvals`, `checkpoint`,
4569
+ `fork`, `handoff`, `inbox`, `reload`,
4570
+ `resume`, and `workflows`, so a browser can degrade deliberately when a
4571
+ host does not offer one. Its public views contain structure - statuses, counters, coordinates,
4572
+ and error codes - rather than prompts, tool payloads, model output, or filesystem paths. The
4573
+ optional Workbench uses that same surface: run
4574
+ `bun run --filter '@nifrajs/workbench' dev -- --cwd /path/to/project` for the local
4575
+ browser client.
4517
4576
 
4518
4577
  ```ts
4519
4578
  import { AgentAppClient, HttpAgentTransport } from "@nifrajs/agent-app"
@@ -4532,14 +4591,30 @@ for await (const view of client.send("summarize the diff")) {
4532
4591
  }
4533
4592
  ```
4534
4593
 
4594
+ ### Capability registry, decision inbox, and Run Studio
4595
+
4596
+ The Workbench's `registry.list` view shows content-free identity cards for admitted
4597
+ capabilities: kind, name, version, schema digest, required capability tokens, and approval,
4598
+ retry, idempotency, and isolation classes. It never renders a prompt, input schema, tool
4599
+ payload, model output, or filesystem path.
4600
+
4601
+ The `inbox` feature lists pending approval and handoff boundaries by exact structural
4602
+ coordinate - run, node, capability, child vector, request id, and expiry. Every approve, deny,
4603
+ assign, resolve, or cancel command carries that coordinate, so stale, mismatched, or expired
4604
+ decisions are refused by the host. `run.studio` projects the same bounded evidence
4605
+ into a run graph, retry/recovery timeline, eval comparison, and deterministic fault-injection
4606
+ view. These are presentation-safe views: content stays in the host.
4607
+
4535
4608
  ### Evidence, streaming, and telemetry
4536
4609
 
4537
4610
  `@nifrajs/agent` runs bounded typed turns with tool contracts, budgets, approvals,
4538
4611
  resumable token-only evidence, model deltas, and a transient shared-state channel. Add an
4539
4612
  `evidenceLog` to the HTTP seams for SSE replay after a dropped connection; replay
4540
- resumes evidence and never re-executes the turn. `@nifrajs/agent-telemetry` converts
4541
- the same constrained evidence into fail-open OpenTelemetry run and step spans. Providers,
4542
- credentials, durable storage, retention, and tenant policy remain application-owned ports.
4613
+ resumes evidence and never re-executes the turn. The additive run-lifecycle contract supplies
4614
+ content-free snapshots, ordered evidence refs, feature negotiation, handoff state, and cursor
4615
+ resume. `@nifrajs/agent-telemetry` converts the same constrained evidence into
4616
+ fail-open OpenTelemetry run and step spans. Providers, credentials, durable storage, retention,
4617
+ and tenant policy remain application-owned ports.
4543
4618
 
4544
4619
  ### Projects without a web config
4545
4620
 
@@ -7962,21 +8037,41 @@ isolated fixtures and a test database. Never point a contract laboratory at prod
7962
8037
 
7963
8038
  ## Nifra - Types-first architecture
7964
8039
 
7965
- > One schema is the single source of truth: it drives runtime validation, inferred TypeScript types, the no-codegen typed client, an OpenAPI document, and the MCP contract your agents read.
8040
+ > Nifra infers route types from path literals and handlers automatically, with optional Standard Schemas for validation, explicit contracts, OpenAPI, and agent-readable APIs.
8041
+
8042
+ Nifra starts with automatic inference. A route's path literal, handler context, and return
8043
+ value produce its TypeScript surface; add a Standard Schema when you need runtime validation,
8044
+ coercion, or an explicit request/response contract. The same server type then drives the
8045
+ no-codegen client and the agent-readable API surface.
8046
+
8047
+ ### Inline inference first
8048
+
8049
+ The chainable builder is fully type-inferred. Path parameters are parsed from the route
8050
+ pattern, handler context is typed automatically, and plain return values become the success
8051
+ response seen by the client. This is the quick-start style, similar to Elysia's inline route
8052
+ inference.
7966
8053
 
7967
- In Nifra a single schema is the **source of truth**. The same definition drives runtime
7968
- validation, inferred TypeScript types, the no-codegen typed client, an OpenAPI document, and
7969
- the contract your coding agents read - so the five never drift apart.
8054
+ ```ts
8055
+ import { server } from "@nifrajs/core/server"
8056
+
8057
+ export const app = server()
8058
+ .get("/users/:id", (c) => ({ id: c.params.id, name: "Ada" }))
8059
+ // c.params.id is inferred from the path; the return type becomes the client response.
8060
+ .post("/users", () => ({ created: true }))
7970
8061
 
7971
- ### One schema
8062
+ // No schema, annotation, or codegen is required for the route types.
8063
+ ```
8064
+
8065
+ ### Schemas at the trust boundary
7972
8066
 
7973
- Define request inputs and the response shape once with `t`. Nothing here is
7974
- framework-specific; it's a plain object you attach to a route.
8067
+ Attach a Standard Schema when inputs must be validated before the handler runs, or when you
8068
+ want an explicit response contract. Path params are already inferred from `:id`;
8069
+ the `params` schema below adds runtime constraints/coercion as well.
7975
8070
 
7976
8071
  ```ts
7977
8072
  import { t } from "@nifrajs/schema"
7978
8073
 
7979
- // One contract, defined once. Everything below is derived from it.
8074
+ // Add a schema when the boundary needs runtime validation or a declared contract.
7980
8075
  export const GetUser = {
7981
8076
  params: t.object({ id: t.string() }),
7982
8077
  response: t.object({
@@ -8006,9 +8101,10 @@ export const app = server().get("/users/:id", GetUser, (c) => {
8006
8101
 
8007
8102
  ### Inferred types
8008
8103
 
8009
- The same schema types the handler: `c.params.id` is `string`, and the
8010
- return value is checked against `response`. Change the schema and the handler
8011
- stops compiling until it matches - types and validation can't disagree.
8104
+ Without a schema, `c.params.id` is still `string` and the handler return
8105
+ is captured automatically. With a schema, its output types the handler and its declared
8106
+ `response` constrains what the handler may return. Change either the route or the
8107
+ contract and the typed client follows at compile time.
8012
8108
 
8013
8109
  ### The typed client
8014
8110
 
@@ -8030,6 +8126,16 @@ if (res.ok) {
8030
8126
  }
8031
8127
  ```
8032
8128
 
8129
+ ### Contract-first when the surface must be separate
8130
+
8131
+ Inline inference is the default. If the API needs to be shared, versioned, or implemented by
8132
+ more than one service, declare it with `defineContract` and connect handlers with
8133
+ `implement`. That keeps the contract type available without importing a server
8134
+ implementation into the client.
8135
+
8136
+ See [Framework contract](/docs/contract) for the decoupled form and its scaling
8137
+ guidance.
8138
+
8033
8139
  ### OpenAPI
8034
8140
 
8035
8141
  The `openapi()` middleware builds an OpenAPI 3.1 document from your registered
package/docs/types.json CHANGED
@@ -10237,7 +10237,7 @@
10237
10237
  "name": "NativeApprovalPort",
10238
10238
  "kind": "interface",
10239
10239
  "package": "@nifrajs/coding-agent",
10240
- "signature": "export interface NativeApprovalPort {\n request(input: {\n readonly sessionId: string;\n readonly tool: NativeTool;\n readonly input: unknown;\n readonly signal: AbortSignal;\n }): boolean | PromiseLike<boolean>;\n}"
10240
+ "signature": "export interface NativeApprovalPort {\n request(input: {\n readonly sessionId: string;\n /** Stable, bounded identifier for this approval boundary. */\n readonly approvalId: string;\n readonly turnId: string;\n readonly callId: string;\n readonly action: string;\n readonly capability: string;\n readonly tool: NativeTool;\n readonly input: unknown;\n readonly signal: AbortSignal;\n }): boolean | PromiseLike<boolean>;\n}"
10241
10241
  },
10242
10242
  {
10243
10243
  "name": "NativeGatewayModelPortOptions",
@@ -10528,14 +10528,14 @@
10528
10528
  "name": "NifraBackend",
10529
10529
  "kind": "class",
10530
10530
  "package": "@nifrajs/coding-agent",
10531
- "signature": "export declare class NifraBackend implements AgentBackend {\n readonly info: AgentBackendInfo;\n private readonly options;\n private readonly sessions;\n constructor(options: NifraBackendOptions);\n createSession(input: CreateSessionInput): Promise<AgentSessionSnapshot>;\n send(input: SendMessageInput): AsyncIterable<AgentEvent>;\n cancel(sessionId: string, reason?: string): Promise<void>;\n snapshot(sessionId: string): Promise<AgentSessionSnapshot>;\n reload(sessionId: string): Promise<ReloadResult>;\n close(sessionId: string): Promise<void>;\n private run;\n private consumeModel;\n private finish;\n private emit;\n private update;\n private requireSession;\n private now;\n}",
10531
+ "signature": "export declare class NifraBackend implements AgentBackend {\n readonly info: AgentBackendInfo;\n private readonly options;\n private readonly sessions;\n private readonly pendingApprovals;\n constructor(options: NifraBackendOptions);\n createSession(input: CreateSessionInput): Promise<AgentSessionSnapshot>;\n send(input: SendMessageInput): AsyncIterable<AgentEvent>;\n cancel(sessionId: string, reason?: string): Promise<void>;\n snapshot(sessionId: string): Promise<AgentSessionSnapshot>;\n reload(sessionId: string): Promise<ReloadResult>;\n resolveApproval(sessionId: string, approvalId: string, approved: boolean, reason?: string): Promise<boolean | undefined>;\n close(sessionId: string): Promise<void>;\n private run;\n private consumeModel;\n private finish;\n private requestApproval;\n private settleApproval;\n private emit;\n private update;\n private requireSession;\n private now;\n}",
10532
10532
  "doc": "/**\n * Small provider port for a future Nifra-native backend.\n *\n * It deliberately knows only messages, tools, and the protocol. Provider SDKs, credentials, UI,\n * and framework packages stay outside this module. A model may return one response or stream\n * deltas followed by a final response.\n */"
10533
10533
  },
10534
10534
  {
10535
10535
  "name": "NifraBackendOptions",
10536
10536
  "kind": "interface",
10537
10537
  "package": "@nifrajs/coding-agent",
10538
- "signature": "export interface NifraBackendOptions {\n readonly model: NativeModelPort;\n readonly tools?: readonly NativeTool[];\n readonly approval?: NativeApprovalPort;\n readonly maxSteps?: number;\n readonly maxMessageChars?: number;\n readonly now?: () => number;\n}"
10538
+ "signature": "export interface NifraBackendOptions {\n readonly model: NativeModelPort;\n readonly tools?: readonly NativeTool[];\n readonly approval?: NativeApprovalPort;\n /** Maximum time a protocol-visible native approval may remain unresolved. */\n readonly approvalTimeoutMs?: number;\n readonly maxSteps?: number;\n readonly maxMessageChars?: number;\n readonly now?: () => number;\n}"
10539
10539
  },
10540
10540
  {
10541
10541
  "name": "NifraContextLike",
@@ -18148,14 +18148,14 @@
18148
18148
  "name": "VERSION",
18149
18149
  "kind": "const",
18150
18150
  "package": "@nifrajs/core",
18151
- "signature": "export declare const VERSION: \"3.2.0\";",
18151
+ "signature": "export declare const VERSION: \"3.3.0\";",
18152
18152
  "doc": "/**\n * Current package version. A hardcoded literal on purpose - core runs on the edge (no fs), so it can't\n * read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and\n * `check:publish` asserts it equals `@nifrajs/core`'s package version.\n */"
18153
18153
  },
18154
18154
  {
18155
18155
  "name": "VERSION",
18156
18156
  "kind": "const",
18157
18157
  "package": "nifra",
18158
- "signature": "export declare const VERSION: \"3.2.0\";",
18158
+ "signature": "export declare const VERSION: \"3.3.0\";",
18159
18159
  "doc": "/**\n * Current package version. A hardcoded literal on purpose - core runs on the edge (no fs), so it can't\n * read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and\n * `check:publish` asserts it equals `@nifrajs/core`'s package version.\n */"
18160
18160
  },
18161
18161
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nifrajs/cli",
3
- "version": "3.2.0",
3
+ "version": "3.3.0",
4
4
  "description": "The nifra CLI - zero-config dev/build/start for a nifra app (`nifra dev`, `nifra build`, `nifra start`).",
5
5
  "keywords": [
6
6
  "bun",
@@ -66,14 +66,14 @@
66
66
  "access": "public"
67
67
  },
68
68
  "dependencies": {
69
- "@nifrajs/client": "3.2.0",
70
- "@nifrajs/core": "3.2.0",
71
- "@nifrajs/mcp": "3.2.0",
72
- "@nifrajs/runner": "3.2.0",
73
- "@nifrajs/schema": "3.2.0",
74
- "@nifrajs/testing": "3.2.0",
75
- "@nifrajs/web": "3.2.0",
76
- "create-nifra": "3.2.0"
69
+ "@nifrajs/client": "3.3.0",
70
+ "@nifrajs/core": "3.3.0",
71
+ "@nifrajs/mcp": "3.3.0",
72
+ "@nifrajs/runner": "3.3.0",
73
+ "@nifrajs/schema": "3.3.0",
74
+ "@nifrajs/testing": "3.3.0",
75
+ "@nifrajs/web": "3.3.0",
76
+ "create-nifra": "3.3.0"
77
77
  },
78
78
  "repository": {
79
79
  "type": "git",
package/src/cli.ts CHANGED
@@ -216,7 +216,7 @@ set in the process environment is never overwritten by a file.
216
216
  ${renderCommandCatalogHelp()}`
217
217
 
218
218
  // Kept in lockstep with packages/cli/package.json by check:publish's version-consistency gate.
219
- const CLI_VERSION = "3.2.0"
219
+ const CLI_VERSION = "3.3.0"
220
220
 
221
221
  // A render adapter + nifra server are opaque to the CLI (it just forwards them); cast at the seam.
222
222
  const asAdapter = (v: unknown): RenderAdapter => v as RenderAdapter
package/src/mcp-http.ts CHANGED
@@ -29,7 +29,7 @@ export { docsTools } from "./mcp-docs-tools.ts"
29
29
  export type { TypeEntry } from "./types-search.ts"
30
30
 
31
31
  // Kept in lockstep with packages/cli/package.json by check:publish's version-consistency gate.
32
- const VERSION = "3.2.0"
32
+ const VERSION = "3.3.0"
33
33
  const SERVER_INFO = { name: "nifra-docs", version: VERSION }
34
34
  // Derive the GET/health tool list from the tools actually served, so the line can never drift from them.
35
35
  const docsHealth = (tools: McpTool[]): string =>