@nifrajs/cli 2.14.1 → 3.2.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 (203) hide show
  1. package/README.md +10 -0
  2. package/dist/assure-hydration.d.ts.map +1 -1
  3. package/dist/assure-hydration.js +6 -1
  4. package/dist/assure-hydration.js.map +1 -1
  5. package/dist/assure.d.ts.map +1 -1
  6. package/dist/assure.js +3 -2
  7. package/dist/assure.js.map +1 -1
  8. package/dist/check-diagnostics.d.ts +165 -0
  9. package/dist/check-diagnostics.d.ts.map +1 -0
  10. package/dist/check-diagnostics.js +1009 -0
  11. package/dist/check-diagnostics.js.map +1 -0
  12. package/dist/check-scan.d.ts +245 -0
  13. package/dist/check-scan.d.ts.map +1 -0
  14. package/dist/check-scan.js +1599 -0
  15. package/dist/check-scan.js.map +1 -0
  16. package/dist/check.d.ts +4 -324
  17. package/dist/check.d.ts.map +1 -1
  18. package/dist/check.js +8 -2346
  19. package/dist/check.js.map +1 -1
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +285 -10
  22. package/dist/cli.js.map +1 -1
  23. package/dist/command-catalog.d.ts +27 -1
  24. package/dist/command-catalog.d.ts.map +1 -1
  25. package/dist/command-catalog.js +142 -2
  26. package/dist/command-catalog.js.map +1 -1
  27. package/dist/doctor.d.ts +42 -0
  28. package/dist/doctor.d.ts.map +1 -1
  29. package/dist/doctor.js +64 -7
  30. package/dist/doctor.js.map +1 -1
  31. package/dist/env-file.d.ts +17 -0
  32. package/dist/env-file.d.ts.map +1 -0
  33. package/dist/env-file.js +113 -0
  34. package/dist/env-file.js.map +1 -0
  35. package/dist/fix-recipes.d.ts.map +1 -1
  36. package/dist/fix-recipes.js +91 -15
  37. package/dist/fix-recipes.js.map +1 -1
  38. package/dist/frontend-guidance.d.ts +57 -0
  39. package/dist/frontend-guidance.d.ts.map +1 -0
  40. package/dist/frontend-guidance.js +195 -0
  41. package/dist/frontend-guidance.js.map +1 -0
  42. package/dist/internal/reserved-segment-codemod.d.ts +36 -0
  43. package/dist/internal/reserved-segment-codemod.d.ts.map +1 -0
  44. package/dist/internal/reserved-segment-codemod.js +134 -0
  45. package/dist/internal/reserved-segment-codemod.js.map +1 -0
  46. package/dist/internal/typescript-import.d.ts +1 -1
  47. package/dist/internal/typescript-import.d.ts.map +1 -1
  48. package/dist/internal/typescript-import.js +62 -11
  49. package/dist/internal/typescript-import.js.map +1 -1
  50. package/dist/introspect.d.ts +26 -1
  51. package/dist/introspect.d.ts.map +1 -1
  52. package/dist/introspect.js +74 -24
  53. package/dist/introspect.js.map +1 -1
  54. package/dist/levels-tool.d.ts.map +1 -1
  55. package/dist/levels-tool.js +6 -0
  56. package/dist/levels-tool.js.map +1 -1
  57. package/dist/load.d.ts.map +1 -1
  58. package/dist/load.js +4 -1
  59. package/dist/load.js.map +1 -1
  60. package/dist/mcp-context.d.ts +48 -0
  61. package/dist/mcp-context.d.ts.map +1 -0
  62. package/dist/mcp-context.js +215 -0
  63. package/dist/mcp-context.js.map +1 -0
  64. package/dist/mcp-docs-tools.d.ts.map +1 -1
  65. package/dist/mcp-docs-tools.js +31 -0
  66. package/dist/mcp-docs-tools.js.map +1 -1
  67. package/dist/mcp-exec.d.ts +74 -0
  68. package/dist/mcp-exec.d.ts.map +1 -0
  69. package/dist/mcp-exec.js +844 -0
  70. package/dist/mcp-exec.js.map +1 -0
  71. package/dist/mcp-http.js +1 -1
  72. package/dist/mcp-http.js.map +1 -1
  73. package/dist/mcp-io.d.ts +26 -0
  74. package/dist/mcp-io.d.ts.map +1 -0
  75. package/dist/mcp-io.js +100 -0
  76. package/dist/mcp-io.js.map +1 -0
  77. package/dist/mcp-reflect.d.ts +16 -0
  78. package/dist/mcp-reflect.d.ts.map +1 -0
  79. package/dist/mcp-reflect.js +101 -0
  80. package/dist/mcp-reflect.js.map +1 -0
  81. package/dist/mcp-root.d.ts +7 -0
  82. package/dist/mcp-root.d.ts.map +1 -1
  83. package/dist/mcp-root.js +51 -3
  84. package/dist/mcp-root.js.map +1 -1
  85. package/dist/mcp.d.ts +10 -84
  86. package/dist/mcp.d.ts.map +1 -1
  87. package/dist/mcp.js +13 -1170
  88. package/dist/mcp.js.map +1 -1
  89. package/dist/openapi-tool.d.ts +5 -10
  90. package/dist/openapi-tool.d.ts.map +1 -1
  91. package/dist/openapi-tool.js +21 -2
  92. package/dist/openapi-tool.js.map +1 -1
  93. package/dist/openapi-types.d.ts +21 -0
  94. package/dist/openapi-types.d.ts.map +1 -0
  95. package/dist/openapi-types.js +214 -0
  96. package/dist/openapi-types.js.map +1 -0
  97. package/dist/port.d.ts.map +1 -1
  98. package/dist/port.js +2 -1
  99. package/dist/port.js.map +1 -1
  100. package/dist/project-facts.d.ts +2 -1
  101. package/dist/project-facts.d.ts.map +1 -1
  102. package/dist/project-facts.js.map +1 -1
  103. package/dist/recipes/3.0.0.d.ts +10 -0
  104. package/dist/recipes/3.0.0.d.ts.map +1 -0
  105. package/dist/recipes/3.0.0.js +23 -0
  106. package/dist/recipes/3.0.0.js.map +1 -0
  107. package/dist/recipes/index.d.ts.map +1 -1
  108. package/dist/recipes/index.js +2 -0
  109. package/dist/recipes/index.js.map +1 -1
  110. package/dist/release-verification.d.ts +4 -1
  111. package/dist/release-verification.d.ts.map +1 -1
  112. package/dist/release-verification.js +6 -123
  113. package/dist/release-verification.js.map +1 -1
  114. package/dist/rules/codes.d.ts +4 -0
  115. package/dist/rules/codes.d.ts.map +1 -1
  116. package/dist/rules/codes.js +4 -0
  117. package/dist/rules/codes.js.map +1 -1
  118. package/dist/rules/islands.d.ts +4 -0
  119. package/dist/rules/islands.d.ts.map +1 -0
  120. package/dist/rules/islands.js +155 -0
  121. package/dist/rules/islands.js.map +1 -0
  122. package/dist/rules/nano.d.ts +6 -0
  123. package/dist/rules/nano.d.ts.map +1 -0
  124. package/dist/rules/nano.js +264 -0
  125. package/dist/rules/nano.js.map +1 -0
  126. package/dist/rules/routes.d.ts.map +1 -1
  127. package/dist/rules/routes.js +17 -30
  128. package/dist/rules/routes.js.map +1 -1
  129. package/dist/rules/security.d.ts.map +1 -1
  130. package/dist/rules/security.js +38 -4
  131. package/dist/rules/security.js.map +1 -1
  132. package/dist/scaffold.d.ts +12 -6
  133. package/dist/scaffold.d.ts.map +1 -1
  134. package/dist/scaffold.js +149 -10
  135. package/dist/scaffold.js.map +1 -1
  136. package/dist/search-terms.d.ts.map +1 -1
  137. package/dist/search-terms.js +5 -3
  138. package/dist/search-terms.js.map +1 -1
  139. package/dist/stylex-migrate.d.ts +38 -0
  140. package/dist/stylex-migrate.d.ts.map +1 -0
  141. package/dist/stylex-migrate.js +1052 -0
  142. package/dist/stylex-migrate.js.map +1 -0
  143. package/dist/sync-manifest.d.ts.map +1 -1
  144. package/dist/sync-manifest.js +2 -1
  145. package/dist/sync-manifest.js.map +1 -1
  146. package/dist/verification-plan.d.ts +24 -0
  147. package/dist/verification-plan.d.ts.map +1 -0
  148. package/dist/verification-plan.js +116 -0
  149. package/dist/verification-plan.js.map +1 -0
  150. package/dist/work-graph.d.ts.map +1 -1
  151. package/dist/work-graph.js +6 -3
  152. package/dist/work-graph.js.map +1 -1
  153. package/dist/workspace-link.d.ts +37 -0
  154. package/dist/workspace-link.d.ts.map +1 -0
  155. package/dist/workspace-link.js +72 -0
  156. package/dist/workspace-link.js.map +1 -0
  157. package/docs/examples.json +37 -1
  158. package/docs/llms-full.txt +1598 -44
  159. package/docs/types.json +5157 -172
  160. package/package.json +9 -9
  161. package/src/assure-hydration.ts +6 -1
  162. package/src/assure.ts +4 -2
  163. package/src/check-diagnostics.ts +1219 -0
  164. package/src/check-scan.ts +1825 -0
  165. package/src/check.ts +47 -2731
  166. package/src/cli.ts +291 -10
  167. package/src/command-catalog.ts +177 -2
  168. package/src/doctor.ts +99 -8
  169. package/src/env-file.ts +121 -0
  170. package/src/fix-recipes.ts +101 -15
  171. package/src/frontend-guidance.ts +259 -0
  172. package/src/internal/reserved-segment-codemod.ts +150 -0
  173. package/src/internal/typescript-import.ts +61 -11
  174. package/src/introspect.ts +82 -21
  175. package/src/levels-tool.ts +6 -0
  176. package/src/load.ts +4 -1
  177. package/src/mcp-context.ts +266 -0
  178. package/src/mcp-docs-tools.ts +37 -0
  179. package/src/mcp-exec.ts +1040 -0
  180. package/src/mcp-http.ts +1 -1
  181. package/src/mcp-io.ts +118 -0
  182. package/src/mcp-reflect.ts +140 -0
  183. package/src/mcp-root.ts +62 -4
  184. package/src/mcp.ts +61 -1436
  185. package/src/openapi-tool.ts +32 -2
  186. package/src/openapi-types.ts +261 -0
  187. package/src/port.ts +2 -1
  188. package/src/project-facts.ts +2 -4
  189. package/src/recipes/3.0.0.ts +24 -0
  190. package/src/recipes/index.ts +2 -0
  191. package/src/release-verification.ts +22 -147
  192. package/src/rules/codes.ts +4 -0
  193. package/src/rules/islands.ts +171 -0
  194. package/src/rules/nano.ts +295 -0
  195. package/src/rules/routes.ts +17 -30
  196. package/src/rules/security.ts +40 -4
  197. package/src/scaffold.ts +169 -9
  198. package/src/search-terms.ts +7 -3
  199. package/src/stylex-migrate.ts +1139 -0
  200. package/src/sync-manifest.ts +2 -1
  201. package/src/verification-plan.ts +242 -0
  202. package/src/work-graph.ts +6 -3
  203. package/src/workspace-link.ts +80 -0
@@ -1,4 +1,16 @@
1
1
  [
2
+ {
3
+ "name": "AGENT_APP",
4
+ "topic": "Nifra - Coding agents",
5
+ "slug": "agents",
6
+ "code": "import { AgentAppClient, HttpAgentTransport } from \"@nifrajs/agent-app\"\n\ndeclare function currentToken(): string\ndeclare function render(view: unknown): void\n\nconst client = new AgentAppClient(new HttpAgentTransport({\n endpoint: \"http://127.0.0.1:8787\",\n authorize: () => currentToken(), // minted per request; never stored by the transport\n}))\n\nconst session = await client.createSession()\nfor await (const view of client.send(\"summarize the diff\")) {\n render(view) // content-free status, counts, coordinates, and error codes\n}"
7
+ },
8
+ {
9
+ "name": "PROTOCOLS",
10
+ "topic": "Nifra - Coding agents",
11
+ "slug": "agents",
12
+ "code": "import { server } from \"@nifrajs/core\"\nimport { mountA2A } from \"@nifrajs/a2a\"\nimport { mountAgUI } from \"@nifrajs/ag-ui\"\nimport type { AgentPorts } from \"@nifrajs/agent\"\nimport { agent } from \"./agent\"\n\ndeclare const myModelPort: AgentPorts[\"model\"]\ndeclare const myStateStore: NonNullable<AgentPorts[\"state\"]>\n\nconst app = server()\nconst ports = () => ({\n model: myModelPort,\n capabilities: [\"search.read\"],\n state: myStateStore, // scope this to the request subject\n})\n\nmountA2A(app, {\n agent,\n card: { url: \"https://api.example.com/a2a\", version: \"1.0.0\" },\n ports,\n})\nmountAgUI(app, { agent, ports })\n\n// A2A: GET the card, POST JSON-RPC, optional SSE streaming.\n// AG-UI: POST RunAgentInput, receive the event stream over SSE."
13
+ },
2
14
  {
3
15
  "name": "TELEMETRY",
4
16
  "topic": "Nifra - Coding agents",
@@ -101,6 +113,12 @@
101
113
  "slug": "causality",
102
114
  "code": "import { createMemoryCausalityStore, startCausality } from \"@nifrajs/core/causality\"\n\nconst recorder = createMemoryCausalityStore()\nconst requestId = crypto.randomUUID()\n\n// One root node at the ingress boundary. executionId is the graph's identity:\n// generate it once, then propagate it.\nconst step = startCausality(\"request\", requestId, { executionId: crypto.randomUUID() })\n\n// step.context propagates; step.record is what a durable adapter appends.\nawait recorder.record(step.record)"
103
115
  },
116
+ {
117
+ "name": "STYLEX_CONFIG",
118
+ "topic": "Nifra - CLI",
119
+ "slug": "cli",
120
+ "code": "// nifra.config.ts - Bun's client and SSR build transforms.\nimport { stylexBunPlugin } from \"@nifrajs/web/plugins/stylex\"\n\nexport const clientPlugins = [stylexBunPlugin(\"dom\")]\nexport const serverPlugins = [stylexBunPlugin(\"ssr\")]"
121
+ },
104
122
  {
105
123
  "name": "DUAL_API",
106
124
  "topic": "Nifra - Framework contract",
@@ -263,12 +281,30 @@
263
281
  "slug": "index",
264
282
  "code": "import { server } from \"@nifrajs/core/server\"\n\nserver()\n .get(\"/\", () => ({ hello: \"world\" }))\n .get(\"/users/:id\", (c) => ({ id: c.params.id }))\n .listen(3000)"
265
283
  },
284
+ {
285
+ "name": "BUS_PATTERN",
286
+ "topic": "Nifra - Islands: the AI-safe interactivity lane",
287
+ "slug": "islands",
288
+ "code": "import { createIslandBus } from \"@nifrajs/web/islands\"\n\n// One typed channel, created once and closed over by every enhancer that needs it.\ntype CartEvents = { \"cart:add\": { sku: string }; \"cart:count\": number }\nconst bus = createIslandBus<CartEvents>()\n\nconst off = bus.on(\"cart:count\", (n) => console.log(\"cart now has\", n, \"items\"))\nbus.emit(\"cart:add\", { sku: \"ABC-1\" })\noff() // unsubscribe - also usable directly as an island's cleanup"
289
+ },
266
290
  {
267
291
  "name": "HONO",
268
292
  "topic": "Nifra - Migrate route by route",
269
293
  "slug": "migrate-route-by-route",
270
294
  "code": "import { Hono } from \"hono\"\nimport { server } from \"@nifrajs/core/server\"\nimport { t } from \"@nifrajs/schema\"\n\nconst legacy = new Hono()\nlegacy.get(\"/users\", (c) => c.json({ source: \"hono\", users: [] }))\nlegacy.post(\"/users\", async (c) => c.json(await c.req.json()))\n\nexport const app = server()\n // The wildcard is a literal mount prefix, not a typed Nifra route.\n .mountFetch(\"/legacy/*\", legacy.fetch, { stripPrefix: true })\n // Typed routes take precedence, so move one route out of Hono at a time.\n .get(\"/legacy/users/:id\", (c) => ({ id: c.params.id, source: \"nifra\" }))\n .post(\n \"/users\",\n { body: t.object({ name: t.string() }) },\n (c) => ({ id: crypto.randomUUID(), name: c.body.name }),\n )"
271
295
  },
296
+ {
297
+ "name": "CORE",
298
+ "topic": "Nifra - nano: explicit reactivity for small apps",
299
+ "slug": "nano",
300
+ "code": "import { signal, computed } from \"@nifrajs/web/nano\"\n\n// State is a signal: reads are .get(), writes are .set(...). Every edge is a call you can see.\nconst count = signal(0)\n\n// Derived state declares its dependencies EXPLICITLY - the array is the whole contract. It\n// recomputes when (and only when) a listed source changes. Object.is-deduped, like signal.\nconst doubled = computed(() => count.get() * 2, [count])\n\nconst off = doubled.subscribe((v) => console.log(\"doubled is now\", v))\ncount.set(5) // logs: doubled is now 10\noff() // unsubscribe"
301
+ },
302
+ {
303
+ "name": "RESOURCE",
304
+ "topic": "Nifra - nano: explicit reactivity for small apps",
305
+ "slug": "nano",
306
+ "code": "import { signal, resource } from \"@nifrajs/web/nano\"\n\nconst userId = signal(1)\n\n// resource(fetcher, [deps]) is an async cell: it fetches immediately and again whenever a declared\n// dep changes. The fetcher gets an AbortSignal; a superseded fetch is aborted and its late result\n// dropped, so the newest request always wins - no stale-response flicker to hand-guard.\nconst user = resource(async (sig) => {\n const res = await fetch(`/api/users/${userId.get()}`, { signal: sig })\n return (await res.json()) as { name: string }\n}, [userId])\n\n// The value is an explicit union - status is \"pending\" | \"error\" | \"ready\", never a secret undefined.\nconst off = user.subscribe((s) => {\n if (s.status === \"ready\") console.log(\"got\", s.value.name)\n})\nuserId.set(2) // refetches; the deps array is what NF-C023 checks against the fetcher's .get() reads\n// ...on teardown: off()"
307
+ },
272
308
  {
273
309
  "name": "CACHING",
274
310
  "topic": "Nifra - Plugins & middleware",
@@ -309,7 +345,7 @@
309
345
  "name": "PORTABLE_HOOK",
310
346
  "topic": "Nifra - Plugins & middleware",
311
347
  "slug": "plugins",
312
- "code": "import type { Middleware } from \"@nifrajs/core/server\"\n\n// ONE implementation, fast on every runtime: on Bun/Deno it mutates the\n// response's own Headers in place; on Node it writes the outcome record on the\n// direct socket writer - no Web Request/Response is ever built for it.\nexport function serverName(value: string): Middleware {\n return {\n onResponseHeaders(headers, req, status) {\n if (status < 500) headers.set(\"server\", value)\n },\n }\n}"
348
+ "code": "import { responseObserver } from \"@nifrajs/core/response-observer\"\nimport { server } from \"@nifrajs/core/server\"\nimport type { Middleware } from \"@nifrajs/core/server\"\n\n// ONE implementation, fast on every runtime: on Bun/Deno it mutates the\n// response's own Headers in place; on Node it writes the outcome record on the\n// direct socket writer - no Web Request/Response is ever built for it.\nexport function serverName(value: string): Middleware {\n return {\n onResponseHeaders(headers, req, status) {\n if (status < 500) headers.set(\"server\", value)\n },\n }\n}\n\nconst app = server().use(responseObserver()).use(serverName(\"nifra\"))"
313
349
  },
314
350
  {
315
351
  "name": "RELIABILITY",