@nifrajs/cli 3.3.0 → 4.0.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 (425) hide show
  1. package/README.md +42 -3
  2. package/dist/app-files.d.ts +11 -0
  3. package/dist/app-files.d.ts.map +1 -0
  4. package/dist/app-files.js +34 -0
  5. package/dist/app-files.js.map +1 -0
  6. package/dist/assure-hydration.d.ts +7 -1
  7. package/dist/assure-hydration.d.ts.map +1 -1
  8. package/dist/assure-hydration.js +128 -43
  9. package/dist/assure-hydration.js.map +1 -1
  10. package/dist/assure.d.ts.map +1 -1
  11. package/dist/assure.js +16 -2
  12. package/dist/assure.js.map +1 -1
  13. package/dist/capabilities-tool.d.ts +5 -1
  14. package/dist/capabilities-tool.d.ts.map +1 -1
  15. package/dist/capabilities-tool.js +32 -10
  16. package/dist/capabilities-tool.js.map +1 -1
  17. package/dist/cdn-check.d.ts +41 -0
  18. package/dist/cdn-check.d.ts.map +1 -0
  19. package/dist/cdn-check.js +207 -0
  20. package/dist/cdn-check.js.map +1 -0
  21. package/dist/check-diagnostics.d.ts +7 -15
  22. package/dist/check-diagnostics.d.ts.map +1 -1
  23. package/dist/check-diagnostics.js +162 -713
  24. package/dist/check-diagnostics.js.map +1 -1
  25. package/dist/check-scan.d.ts +58 -7
  26. package/dist/check-scan.d.ts.map +1 -1
  27. package/dist/check-scan.js +323 -62
  28. package/dist/check-scan.js.map +1 -1
  29. package/dist/check.d.ts +1 -0
  30. package/dist/check.d.ts.map +1 -1
  31. package/dist/check.js +145 -54
  32. package/dist/check.js.map +1 -1
  33. package/dist/cli.d.ts +42 -16
  34. package/dist/cli.d.ts.map +1 -1
  35. package/dist/cli.js +306 -87
  36. package/dist/cli.js.map +1 -1
  37. package/dist/command-catalog.d.ts +60 -5
  38. package/dist/command-catalog.d.ts.map +1 -1
  39. package/dist/command-catalog.js +298 -33
  40. package/dist/command-catalog.js.map +1 -1
  41. package/dist/config-target.d.ts +8 -0
  42. package/dist/config-target.d.ts.map +1 -0
  43. package/dist/config-target.js +45 -0
  44. package/dist/config-target.js.map +1 -0
  45. package/dist/contracts.d.ts +3 -2
  46. package/dist/contracts.d.ts.map +1 -1
  47. package/dist/contracts.js +56 -16
  48. package/dist/contracts.js.map +1 -1
  49. package/dist/db-audit.d.ts +37 -0
  50. package/dist/db-audit.d.ts.map +1 -0
  51. package/dist/db-audit.js +99 -0
  52. package/dist/db-audit.js.map +1 -0
  53. package/dist/db-child.d.ts +64 -0
  54. package/dist/db-child.d.ts.map +1 -0
  55. package/dist/db-child.js +213 -0
  56. package/dist/db-child.js.map +1 -0
  57. package/dist/db-config.d.ts +60 -0
  58. package/dist/db-config.d.ts.map +1 -0
  59. package/dist/db-config.js +176 -0
  60. package/dist/db-config.js.map +1 -0
  61. package/dist/db-tool.d.ts +84 -0
  62. package/dist/db-tool.d.ts.map +1 -0
  63. package/dist/db-tool.js +537 -0
  64. package/dist/db-tool.js.map +1 -0
  65. package/dist/dev-bun-config.d.ts +20 -13
  66. package/dist/dev-bun-config.d.ts.map +1 -1
  67. package/dist/dev-bun-config.js +98 -41
  68. package/dist/dev-bun-config.js.map +1 -1
  69. package/dist/dev-feed-tool.d.ts +106 -0
  70. package/dist/dev-feed-tool.d.ts.map +1 -0
  71. package/dist/dev-feed-tool.js +713 -0
  72. package/dist/dev-feed-tool.js.map +1 -0
  73. package/dist/dev-server-client.d.ts +67 -0
  74. package/dist/dev-server-client.d.ts.map +1 -0
  75. package/dist/dev-server-client.js +195 -0
  76. package/dist/dev-server-client.js.map +1 -0
  77. package/dist/diagnostics.d.ts +86 -0
  78. package/dist/diagnostics.d.ts.map +1 -1
  79. package/dist/diagnostics.js +85 -0
  80. package/dist/diagnostics.js.map +1 -1
  81. package/dist/diff-tool.d.ts +3 -3
  82. package/dist/diff-tool.d.ts.map +1 -1
  83. package/dist/diff-tool.js +6 -5
  84. package/dist/diff-tool.js.map +1 -1
  85. package/dist/docs-search.d.ts.map +1 -1
  86. package/dist/docs-search.js +12 -4
  87. package/dist/docs-search.js.map +1 -1
  88. package/dist/doctor.d.ts +17 -0
  89. package/dist/doctor.d.ts.map +1 -1
  90. package/dist/doctor.js +76 -15
  91. package/dist/doctor.js.map +1 -1
  92. package/dist/env-file.d.ts +15 -0
  93. package/dist/env-file.d.ts.map +1 -1
  94. package/dist/env-file.js +73 -1
  95. package/dist/env-file.js.map +1 -1
  96. package/dist/fix-recipes.d.ts.map +1 -1
  97. package/dist/fix-recipes.js +41 -21
  98. package/dist/fix-recipes.js.map +1 -1
  99. package/dist/frontend-guidance.js +5 -5
  100. package/dist/frontend-guidance.js.map +1 -1
  101. package/dist/i18n-check.d.ts +16 -0
  102. package/dist/i18n-check.d.ts.map +1 -0
  103. package/dist/i18n-check.js +154 -0
  104. package/dist/i18n-check.js.map +1 -0
  105. package/dist/init-agents.d.ts +49 -13
  106. package/dist/init-agents.d.ts.map +1 -1
  107. package/dist/init-agents.js +239 -34
  108. package/dist/init-agents.js.map +1 -1
  109. package/dist/internal/code-unit-order.d.ts +4 -0
  110. package/dist/internal/code-unit-order.d.ts.map +1 -0
  111. package/dist/internal/code-unit-order.js +6 -0
  112. package/dist/internal/code-unit-order.js.map +1 -0
  113. package/dist/internal/script-kind.d.ts +7 -0
  114. package/dist/internal/script-kind.d.ts.map +1 -0
  115. package/dist/internal/script-kind.js +12 -0
  116. package/dist/internal/script-kind.js.map +1 -0
  117. package/dist/internal/source-facts.d.ts +5 -0
  118. package/dist/internal/source-facts.d.ts.map +1 -1
  119. package/dist/internal/source-facts.js +61 -5
  120. package/dist/internal/source-facts.js.map +1 -1
  121. package/dist/internal/typescript-import.d.ts +49 -24
  122. package/dist/internal/typescript-import.d.ts.map +1 -1
  123. package/dist/internal/typescript-import.js +507 -67
  124. package/dist/internal/typescript-import.js.map +1 -1
  125. package/dist/introspect.d.ts +6 -4
  126. package/dist/introspect.d.ts.map +1 -1
  127. package/dist/introspect.js +93 -74
  128. package/dist/introspect.js.map +1 -1
  129. package/dist/learn.js +3 -3
  130. package/dist/learn.js.map +1 -1
  131. package/dist/levels-tool.d.ts +10 -0
  132. package/dist/levels-tool.d.ts.map +1 -1
  133. package/dist/levels-tool.js +33 -3
  134. package/dist/levels-tool.js.map +1 -1
  135. package/dist/load.d.ts +71 -16
  136. package/dist/load.d.ts.map +1 -1
  137. package/dist/load.js +78 -18
  138. package/dist/load.js.map +1 -1
  139. package/dist/manifest-tool.d.ts.map +1 -1
  140. package/dist/manifest-tool.js +3 -2
  141. package/dist/manifest-tool.js.map +1 -1
  142. package/dist/mcp-app-tool.d.ts.map +1 -1
  143. package/dist/mcp-app-tool.js +2 -0
  144. package/dist/mcp-app-tool.js.map +1 -1
  145. package/dist/mcp-context.d.ts.map +1 -1
  146. package/dist/mcp-context.js +5 -6
  147. package/dist/mcp-context.js.map +1 -1
  148. package/dist/mcp-delegate.d.ts +57 -0
  149. package/dist/mcp-delegate.d.ts.map +1 -0
  150. package/dist/mcp-delegate.js +130 -0
  151. package/dist/mcp-delegate.js.map +1 -0
  152. package/dist/mcp-docs-tools.d.ts.map +1 -1
  153. package/dist/mcp-docs-tools.js +23 -5
  154. package/dist/mcp-docs-tools.js.map +1 -1
  155. package/dist/mcp-exec.d.ts +3 -0
  156. package/dist/mcp-exec.d.ts.map +1 -1
  157. package/dist/mcp-exec.js +263 -131
  158. package/dist/mcp-exec.js.map +1 -1
  159. package/dist/mcp-http.d.ts.map +1 -1
  160. package/dist/mcp-http.js +20 -5
  161. package/dist/mcp-http.js.map +1 -1
  162. package/dist/mcp-io.d.ts +26 -0
  163. package/dist/mcp-io.d.ts.map +1 -1
  164. package/dist/mcp-io.js +113 -0
  165. package/dist/mcp-io.js.map +1 -1
  166. package/dist/mcp-isolate.d.ts +48 -0
  167. package/dist/mcp-isolate.d.ts.map +1 -0
  168. package/dist/mcp-isolate.js +222 -0
  169. package/dist/mcp-isolate.js.map +1 -0
  170. package/dist/mcp-path.d.ts +10 -0
  171. package/dist/mcp-path.d.ts.map +1 -0
  172. package/dist/mcp-path.js +51 -0
  173. package/dist/mcp-path.js.map +1 -0
  174. package/dist/mcp-project-child.d.ts +74 -0
  175. package/dist/mcp-project-child.d.ts.map +1 -0
  176. package/dist/mcp-project-child.js +130 -0
  177. package/dist/mcp-project-child.js.map +1 -0
  178. package/dist/mcp-reflect.d.ts.map +1 -1
  179. package/dist/mcp-reflect.js +2 -2
  180. package/dist/mcp-reflect.js.map +1 -1
  181. package/dist/mcp-render.d.ts.map +1 -1
  182. package/dist/mcp-render.js +64 -45
  183. package/dist/mcp-render.js.map +1 -1
  184. package/dist/mcp-root.d.ts +37 -9
  185. package/dist/mcp-root.d.ts.map +1 -1
  186. package/dist/mcp-root.js +124 -25
  187. package/dist/mcp-root.js.map +1 -1
  188. package/dist/mcp-run.d.ts +18 -1
  189. package/dist/mcp-run.d.ts.map +1 -1
  190. package/dist/mcp-run.js +159 -55
  191. package/dist/mcp-run.js.map +1 -1
  192. package/dist/mcp-ws.js +4 -1
  193. package/dist/mcp-ws.js.map +1 -1
  194. package/dist/mcp.d.ts +18 -5
  195. package/dist/mcp.d.ts.map +1 -1
  196. package/dist/mcp.js +165 -82
  197. package/dist/mcp.js.map +1 -1
  198. package/dist/migrate-layout.d.ts +44 -0
  199. package/dist/migrate-layout.d.ts.map +1 -0
  200. package/dist/migrate-layout.js +982 -0
  201. package/dist/migrate-layout.js.map +1 -0
  202. package/dist/openapi-tool.d.ts +2 -2
  203. package/dist/openapi-tool.d.ts.map +1 -1
  204. package/dist/openapi-tool.js.map +1 -1
  205. package/dist/openapi-types.d.ts +2 -1
  206. package/dist/openapi-types.d.ts.map +1 -1
  207. package/dist/openapi-types.js +240 -12
  208. package/dist/openapi-types.js.map +1 -1
  209. package/dist/pipeline-report.d.ts +3 -2
  210. package/dist/pipeline-report.d.ts.map +1 -1
  211. package/dist/pipeline-report.js +19 -16
  212. package/dist/pipeline-report.js.map +1 -1
  213. package/dist/port.d.ts +5 -4
  214. package/dist/port.d.ts.map +1 -1
  215. package/dist/port.js +46 -29
  216. package/dist/port.js.map +1 -1
  217. package/dist/project-facts.d.ts +28 -4
  218. package/dist/project-facts.d.ts.map +1 -1
  219. package/dist/project-facts.js +12 -2
  220. package/dist/project-facts.js.map +1 -1
  221. package/dist/recipes/4.0.0.d.ts +9 -0
  222. package/dist/recipes/4.0.0.d.ts.map +1 -0
  223. package/dist/recipes/4.0.0.js +34 -0
  224. package/dist/recipes/4.0.0.js.map +1 -0
  225. package/dist/recipes/index.d.ts.map +1 -1
  226. package/dist/recipes/index.js +2 -0
  227. package/dist/recipes/index.js.map +1 -1
  228. package/dist/release-verification.d.ts +11 -1
  229. package/dist/release-verification.d.ts.map +1 -1
  230. package/dist/release-verification.js +47 -4
  231. package/dist/release-verification.js.map +1 -1
  232. package/dist/review.d.ts +21 -0
  233. package/dist/review.d.ts.map +1 -0
  234. package/dist/review.js +823 -0
  235. package/dist/review.js.map +1 -0
  236. package/dist/route-types.d.ts +28 -0
  237. package/dist/route-types.d.ts.map +1 -0
  238. package/dist/route-types.js +106 -0
  239. package/dist/route-types.js.map +1 -0
  240. package/dist/rules/codes.d.ts +9 -0
  241. package/dist/rules/codes.d.ts.map +1 -1
  242. package/dist/rules/codes.js +9 -0
  243. package/dist/rules/codes.js.map +1 -1
  244. package/dist/rules/data-guard.d.ts +12 -0
  245. package/dist/rules/data-guard.d.ts.map +1 -0
  246. package/dist/rules/data-guard.js +213 -0
  247. package/dist/rules/data-guard.js.map +1 -0
  248. package/dist/rules/index.d.ts +3 -0
  249. package/dist/rules/index.d.ts.map +1 -1
  250. package/dist/rules/index.js +17 -5
  251. package/dist/rules/index.js.map +1 -1
  252. package/dist/rules/islands.d.ts.map +1 -1
  253. package/dist/rules/islands.js +7 -4
  254. package/dist/rules/islands.js.map +1 -1
  255. package/dist/rules/legacy.d.ts +3 -1
  256. package/dist/rules/legacy.d.ts.map +1 -1
  257. package/dist/rules/legacy.js +829 -34
  258. package/dist/rules/legacy.js.map +1 -1
  259. package/dist/rules/nano.d.ts.map +1 -1
  260. package/dist/rules/nano.js +15 -6
  261. package/dist/rules/nano.js.map +1 -1
  262. package/dist/rules/pages.d.ts +15 -0
  263. package/dist/rules/pages.d.ts.map +1 -0
  264. package/dist/rules/pages.js +88 -0
  265. package/dist/rules/pages.js.map +1 -0
  266. package/dist/rules/routes.d.ts +11 -0
  267. package/dist/rules/routes.d.ts.map +1 -1
  268. package/dist/rules/routes.js +180 -2
  269. package/dist/rules/routes.js.map +1 -1
  270. package/dist/rules/secrets.d.ts +10 -0
  271. package/dist/rules/secrets.d.ts.map +1 -0
  272. package/dist/rules/secrets.js +169 -0
  273. package/dist/rules/secrets.js.map +1 -0
  274. package/dist/rules/security.d.ts +7 -0
  275. package/dist/rules/security.d.ts.map +1 -1
  276. package/dist/rules/security.js +171 -65
  277. package/dist/rules/security.js.map +1 -1
  278. package/dist/rules/typescript.d.ts +16 -0
  279. package/dist/rules/typescript.d.ts.map +1 -0
  280. package/dist/rules/typescript.js +59 -0
  281. package/dist/rules/typescript.js.map +1 -0
  282. package/dist/rules/zones.d.ts +17 -0
  283. package/dist/rules/zones.d.ts.map +1 -0
  284. package/dist/rules/zones.js +174 -0
  285. package/dist/rules/zones.js.map +1 -0
  286. package/dist/scaffold.d.ts +25 -12
  287. package/dist/scaffold.d.ts.map +1 -1
  288. package/dist/scaffold.js +154 -90
  289. package/dist/scaffold.js.map +1 -1
  290. package/dist/sdk.d.ts +17 -3
  291. package/dist/sdk.d.ts.map +1 -1
  292. package/dist/sdk.js +941 -153
  293. package/dist/sdk.js.map +1 -1
  294. package/dist/search-terms.d.ts +2 -0
  295. package/dist/search-terms.d.ts.map +1 -1
  296. package/dist/search-terms.js +23 -8
  297. package/dist/search-terms.js.map +1 -1
  298. package/dist/smoke.d.ts +79 -0
  299. package/dist/smoke.d.ts.map +1 -0
  300. package/dist/smoke.js +494 -0
  301. package/dist/smoke.js.map +1 -0
  302. package/dist/sync-manifest.d.ts.map +1 -1
  303. package/dist/sync-manifest.js +2 -1
  304. package/dist/sync-manifest.js.map +1 -1
  305. package/dist/sync-routes.d.ts +4 -3
  306. package/dist/sync-routes.d.ts.map +1 -1
  307. package/dist/sync-routes.js +4 -3
  308. package/dist/sync-routes.js.map +1 -1
  309. package/dist/test-tool.d.ts.map +1 -1
  310. package/dist/test-tool.js +30 -11
  311. package/dist/test-tool.js.map +1 -1
  312. package/dist/types-search.d.ts.map +1 -1
  313. package/dist/types-search.js +11 -5
  314. package/dist/types-search.js.map +1 -1
  315. package/dist/upgrade.d.ts +36 -6
  316. package/dist/upgrade.d.ts.map +1 -1
  317. package/dist/upgrade.js +167 -29
  318. package/dist/upgrade.js.map +1 -1
  319. package/dist/verification-plan.d.ts.map +1 -1
  320. package/dist/verification-plan.js +8 -0
  321. package/dist/verification-plan.js.map +1 -1
  322. package/dist/verification.d.ts.map +1 -1
  323. package/dist/verification.js +45 -12
  324. package/dist/verification.js.map +1 -1
  325. package/dist/web-app-options.d.ts +19 -0
  326. package/dist/web-app-options.d.ts.map +1 -0
  327. package/dist/web-app-options.js +49 -0
  328. package/dist/web-app-options.js.map +1 -0
  329. package/dist/work-graph.d.ts +3 -0
  330. package/dist/work-graph.d.ts.map +1 -1
  331. package/dist/work-graph.js +33 -16
  332. package/dist/work-graph.js.map +1 -1
  333. package/docs/examples.json +185 -29
  334. package/docs/llms-full.txt +4123 -548
  335. package/docs/types.json +14391 -10060
  336. package/package.json +19 -11
  337. package/src/app-files.ts +40 -0
  338. package/src/assure-hydration.ts +139 -46
  339. package/src/assure.ts +17 -2
  340. package/src/capabilities-tool.ts +35 -9
  341. package/src/cdn-check.ts +268 -0
  342. package/src/check-diagnostics.ts +199 -797
  343. package/src/check-scan.ts +394 -63
  344. package/src/check.ts +146 -58
  345. package/src/cli.ts +347 -92
  346. package/src/command-catalog.ts +407 -45
  347. package/src/config-target.ts +47 -0
  348. package/src/contracts.ts +66 -15
  349. package/src/db-audit.ts +128 -0
  350. package/src/db-child.ts +285 -0
  351. package/src/db-config.ts +224 -0
  352. package/src/db-tool.ts +690 -0
  353. package/src/dev-bun-config.ts +116 -40
  354. package/src/dev-feed-tool.ts +912 -0
  355. package/src/dev-server-client.ts +267 -0
  356. package/src/diagnostics.ts +179 -0
  357. package/src/diff-tool.ts +6 -5
  358. package/src/docs-search.ts +10 -3
  359. package/src/doctor.ts +98 -15
  360. package/src/env-file.ts +78 -1
  361. package/src/fix-recipes.ts +44 -31
  362. package/src/frontend-guidance.ts +5 -5
  363. package/src/i18n-check.ts +179 -0
  364. package/src/init-agents.ts +301 -38
  365. package/src/internal/code-unit-order.ts +5 -0
  366. package/src/internal/script-kind.ts +11 -0
  367. package/src/internal/source-facts.ts +96 -22
  368. package/src/internal/typescript-import.ts +663 -68
  369. package/src/introspect.ts +93 -82
  370. package/src/learn.ts +3 -3
  371. package/src/levels-tool.ts +47 -2
  372. package/src/load.ts +144 -32
  373. package/src/manifest-tool.ts +3 -2
  374. package/src/mcp-app-tool.ts +2 -0
  375. package/src/mcp-context.ts +5 -7
  376. package/src/mcp-delegate.ts +162 -0
  377. package/src/mcp-docs-tools.ts +23 -5
  378. package/src/mcp-exec.ts +301 -161
  379. package/src/mcp-http.ts +22 -5
  380. package/src/mcp-io.ts +130 -0
  381. package/src/mcp-isolate.ts +287 -0
  382. package/src/mcp-path.ts +50 -0
  383. package/src/mcp-project-child.ts +182 -0
  384. package/src/mcp-reflect.ts +3 -2
  385. package/src/mcp-render.ts +72 -42
  386. package/src/mcp-root.ts +130 -24
  387. package/src/mcp-run.ts +190 -56
  388. package/src/mcp-ws.ts +4 -1
  389. package/src/mcp.ts +193 -91
  390. package/src/migrate-layout.ts +1121 -0
  391. package/src/openapi-tool.ts +7 -3
  392. package/src/openapi-types.ts +315 -13
  393. package/src/pipeline-report.ts +22 -18
  394. package/src/port.ts +53 -30
  395. package/src/project-facts.ts +42 -8
  396. package/src/recipes/4.0.0.ts +35 -0
  397. package/src/recipes/index.ts +2 -0
  398. package/src/release-verification.ts +74 -5
  399. package/src/review.ts +988 -0
  400. package/src/route-types.ts +133 -0
  401. package/src/rules/codes.ts +9 -0
  402. package/src/rules/data-guard.ts +230 -0
  403. package/src/rules/index.ts +18 -5
  404. package/src/rules/islands.ts +12 -4
  405. package/src/rules/legacy.ts +947 -35
  406. package/src/rules/nano.ts +18 -6
  407. package/src/rules/pages.ts +99 -0
  408. package/src/rules/routes.ts +181 -2
  409. package/src/rules/secrets.ts +174 -0
  410. package/src/rules/security.ts +198 -70
  411. package/src/rules/typescript.ts +77 -0
  412. package/src/rules/zones.ts +195 -0
  413. package/src/scaffold.ts +175 -98
  414. package/src/sdk.ts +1215 -158
  415. package/src/search-terms.ts +24 -7
  416. package/src/smoke.ts +607 -0
  417. package/src/sync-manifest.ts +2 -1
  418. package/src/sync-routes.ts +4 -3
  419. package/src/test-tool.ts +32 -11
  420. package/src/types-search.ts +11 -4
  421. package/src/upgrade.ts +205 -25
  422. package/src/verification-plan.ts +27 -0
  423. package/src/verification.ts +50 -12
  424. package/src/web-app-options.ts +57 -0
  425. package/src/work-graph.ts +40 -16
@@ -1 +1 @@
1
- {"version":3,"file":"env-file.js","sourceRoot":"","sources":["../src/env-file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env-file.js","sourceRoot":"","sources":["../src/env-file.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fix-recipes.d.ts","sourceRoot":"","sources":["../src/fix-recipes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAIlD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAA;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAID,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAGzD;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE9D;AAED,wBAAgB,cAAc,IAAI,SAAS,SAAS,EAAE,CAErD;AAgLD,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAM5B"}
1
+ {"version":3,"file":"fix-recipes.d.ts","sourceRoot":"","sources":["../src/fix-recipes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAIlD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAA;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAID,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAGzD;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE9D;AAED,wBAAgB,cAAc,IAAI,SAAS,SAAS,EAAE,CAErD;AA6LD,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAM5B"}
@@ -19,30 +19,30 @@ registerFixRecipe({
19
19
  description: "Replace a direct secret comparison with a length check and timing-safe comparison.",
20
20
  verify: "nifra check --lints-only",
21
21
  async apply(root, diagnostic) {
22
- if (diagnostic.file === undefined || diagnostic.line === undefined)
22
+ if (diagnostic.file === undefined)
23
23
  return [];
24
24
  const path = await resolveInsideProject(root, diagnostic.file);
25
25
  if (path === undefined)
26
26
  return [];
27
- const lines = (await readFile(path, "utf8")).split("\n");
28
- const index = diagnostic.line - 1;
29
- const original = lines[index];
30
- if (original === undefined || original.includes("@nifra-gate-reviewed"))
31
- return [];
32
- const comparison = /\b([A-Za-z_$][\w$]*)\s*(===|!==|==|!=)\s*([A-Za-z_$][\w$]*)/.exec(original);
33
- if (comparison === null)
34
- return [];
35
- const left = comparison[1];
36
- const operator = comparison[2];
37
- const right = comparison[3];
38
- const expression = `nifraTimingSafeEqual(${left}, ${right})`;
39
- const replacement = operator === "!==" || operator === "!=" ? `!${expression}` : expression;
40
- lines[index] = original.replace(comparison[0], replacement);
41
- if (!lines.some((line) => line.includes("function nifraTimingSafeEqual"))) {
42
- lines.unshift('import { timingSafeEqual } from "node:crypto"', "", "function nifraTimingSafeEqual(left: string, right: string): boolean {", " const leftBytes = Buffer.from(left)", " const rightBytes = Buffer.from(right)", " return leftBytes.length === rightBytes.length && timingSafeEqual(leftBytes, rightBytes)", "}", "");
27
+ const { loadProjectTypeScript } = await import("./internal/typescript-import.js");
28
+ const loaded = await loadProjectTypeScript(root);
29
+ if (loaded.unsupported !== undefined)
30
+ throw loaded.unsupported;
31
+ if (loaded.compiler === undefined)
32
+ throw new Error("[nifra] the timing-safe fix finds each comparison in the syntax tree, so it needs TypeScript - run `bun add -d typescript`, then rerun the fix");
33
+ try {
34
+ const { rewriteSecretComparisons } = await import("./rules/security.js");
35
+ const source = await readFile(path, "utf8");
36
+ // Every site in the file at once, so the rest of that file's diagnostics find nothing left.
37
+ const rewritten = rewriteSecretComparisons(loaded.compiler, diagnostic.file, source);
38
+ if (rewritten === source)
39
+ return [];
40
+ await writeFile(path, rewritten, "utf8");
41
+ return [diagnostic.file];
42
+ }
43
+ finally {
44
+ await loaded.session?.close();
43
45
  }
44
- await writeFile(path, lines.join("\n"), "utf8");
45
- return [diagnostic.file];
46
46
  },
47
47
  });
48
48
  registerFixRecipe({
@@ -83,7 +83,7 @@ registerFixRecipe({
83
83
  // --code NF-C010` a silent no-op on the only findings that produce it.
84
84
  if (!linked.ok)
85
85
  throw new Error(`[nifra] cannot rebuild ${packageName}: ${linked.reason}`);
86
- const proc = Bun.spawn(["bun", "run", linked.buildScript], {
86
+ const proc = Bun.spawn([process.execPath, "run", linked.buildScript], {
87
87
  cwd: linked.dir,
88
88
  stdout: "ignore",
89
89
  stderr: "pipe",
@@ -96,6 +96,26 @@ registerFixRecipe({
96
96
  return [diagnostic.evidence?.[1] ?? packageName];
97
97
  },
98
98
  });
99
+ registerFixRecipe({
100
+ id: "imports.moved-export",
101
+ description: "Import a name that moved to a subpath from the module that now exports it.",
102
+ verify: "nifra check --lints-only",
103
+ async apply(root, diagnostic) {
104
+ if (diagnostic.file === undefined)
105
+ return [];
106
+ const path = await resolveInsideProject(root, diagnostic.file);
107
+ if (path === undefined)
108
+ return [];
109
+ const { rewriteMovedExports } = await import("./check-scan.js");
110
+ const source = await readFile(path, "utf8");
111
+ // Rewrites every site in the file at once, so the rest of that file's diagnostics find nothing left.
112
+ const rewritten = rewriteMovedExports(source);
113
+ if (rewritten === source)
114
+ return [];
115
+ await writeFile(path, rewritten, "utf8");
116
+ return [diagnostic.file];
117
+ },
118
+ });
99
119
  /**
100
120
  * How many typecheck passes the reserved-segment codemod will run. A nested collision
101
121
  * (`/api/delete/then`) only reveals its second site once the first is rewritten, so one pass is not
@@ -117,7 +137,7 @@ registerFixRecipe({
117
137
  const changed = new Set();
118
138
  const skipped = [];
119
139
  for (let pass = 0; pass < RESERVED_SEGMENT_PASSES; pass += 1) {
120
- const proc = Bun.spawn(["bun", tscBin, "--noEmit", "--pretty", "false", "-p", tsconfig], {
140
+ const proc = Bun.spawn([process.execPath, tscBin, "--noEmit", "--pretty", "false", "-p", tsconfig], {
121
141
  cwd: root,
122
142
  stdout: "pipe",
123
143
  stderr: "pipe",
@@ -1 +1 @@
1
- {"version":3,"file":"fix-recipes.js","sourceRoot":"","sources":["../src/fix-recipes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fix-recipes.js","sourceRoot":"","sources":["../src/fix-recipes.ts"],"names":[],"mappings":"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"}
@@ -27,10 +27,10 @@ export const FRONTEND_GUIDANCE = [
27
27
  id: "server-import",
28
28
  adapters: ["all"],
29
29
  symptom: "A client component crashes at build or runtime with a missing Node built-in, a leaked secret, or 'module not found in the browser'.",
30
- cause: "A server-only module (the DB, a secret, `node:*`, the backend file) is imported at the top level of a component, so the bundler tries to ship it to the browser.",
31
- fix: "Move the access into a server-only `loader`/`action` and read the result in the component. Reach the backend through the typed `api` argument, never a top-level server-only import.",
30
+ cause: "Browser code (a page, `frontend/` or `shared/`) imports backend code - `backend/`, a route's `.backend.ts` half, the DB, a secret, `node:*` - so the browser build refuses it.",
31
+ fix: "Move the access into the route's `.backend.ts` half (`loader`/`action` with `loaderOutput`/`actionOutput`) and read the result as `data` in the page. Reach the backend through the typed `api` argument; put code both sides need in `shared/`.",
32
32
  verify: "nifra_check - its transitive server-import scan flags the exact import chain into a client module.",
33
- seeAlso: "loader action server-only import boundary",
33
+ seeAlso: "project structure route backend half import rules",
34
34
  },
35
35
  {
36
36
  id: "hydration-mismatch",
@@ -55,9 +55,9 @@ export const FRONTEND_GUIDANCE = [
55
55
  adapters: ["all"],
56
56
  symptom: "Loader data is typed `any` in the page, or a hand-written interface silently drifts from what the loader actually returns.",
57
57
  cause: "The component types its props by hand instead of inferring them from the loader, so a change to the loader is not a type error at the use site.",
58
- fix: "Type the page from the loader: `props: { data: LoaderData<typeof loader> }`. Call the backend through the typed `api` so the request/response shape is inferred, not restated.",
58
+ fix: 'Type the page from its generated route types: `import type { Route } from "./+types/<name>"` and `props: Route.ComponentProps`. Its `data` is the `loaderOutput` schema\'s type - what actually reaches the browser - while `LoaderData<typeof loader>` also types fields the schema strips. Call the backend through the typed `api` (`Route.LoaderArgs`) so the request/response shape is inferred, not restated.',
59
59
  verify: "nifra_context prints the exact loader shape and typed call form; nifra_check fails on drift.",
60
- seeAlso: "LoaderData typed client loader inference",
60
+ seeAlso: "route types Route.ComponentProps loaderOutput typed client",
61
61
  },
62
62
  {
63
63
  id: "list-key",
@@ -1 +1 @@
1
- {"version":3,"file":"frontend-guidance.js","sourceRoot":"","sources":["../src/frontend-guidance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frontend-guidance.js","sourceRoot":"","sources":["../src/frontend-guidance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { CatalogCheckResult } from "@nifrajs/i18n/check";
2
+ export declare const DEFAULT_ENTRIES: readonly ["shared/i18n.ts", "i18n.ts", "lib/i18n.ts", "src/i18n.ts", "src/lib/i18n.ts", "app/i18n.ts"];
3
+ export interface I18nCheckOutput {
4
+ /** The entry module, relative to the project directory. */
5
+ readonly entry: string;
6
+ readonly result: CatalogCheckResult;
7
+ }
8
+ /** Import the entry, load every catalog it names, and check them. */
9
+ export declare function runI18nCheck(cwd: string, options?: {
10
+ readonly entry?: string | undefined;
11
+ }): Promise<I18nCheckOutput>;
12
+ /** The human report: a coverage table, then findings, grouped where they are key lists. */
13
+ export declare function renderI18nCheck(out: I18nCheckOutput): readonly string[];
14
+ /** Errors fail the run; with `strict`, warnings do too. Info never does. */
15
+ export declare function i18nCheckPassed(out: I18nCheckOutput, strict: boolean): boolean;
16
+ //# sourceMappingURL=i18n-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-check.d.ts","sourceRoot":"","sources":["../src/i18n-check.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAuB,kBAAkB,EAAkB,MAAM,qBAAqB,CAAA;AAElG,eAAO,MAAM,eAAe,wGAOlB,CAAA;AAEV,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;CACpC;AAiCD,qEAAqE;AACrE,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAO,GACpD,OAAO,CAAC,eAAe,CAAC,CAmC1B;AA2BD,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,SAAS,MAAM,EAAE,CA6CvE;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAI9E"}
@@ -0,0 +1,154 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ /**
10
+ * `nifra i18n check [entry]` - runs `checkCatalogs()` from `@nifrajs/i18n/check` over an app's locale
11
+ * registry and catalogs. Unlike `nifra check`, this IMPORTS app code: the entry module, which exports
12
+ * `locales` (from `defineLocales`) and `catalogs` (by locale key: a catalog, or a function returning
13
+ * one or a promise of one, such as `() => import("./messages/fr.json")`), plus an optional `ignore`.
14
+ * The default entry is the first of {@link DEFAULT_ENTRIES} that exists.
15
+ */
16
+ import { existsSync } from "node:fs";
17
+ import { relative, resolve } from "node:path";
18
+ import { pathToFileURL } from "node:url";
19
+ export const DEFAULT_ENTRIES = [
20
+ "shared/i18n.ts",
21
+ "i18n.ts",
22
+ "lib/i18n.ts",
23
+ "src/i18n.ts",
24
+ "src/lib/i18n.ts",
25
+ "app/i18n.ts",
26
+ ];
27
+ const isObject = (value) => value !== null && typeof value === "object";
28
+ /** A loaded module's default export when the value is a module namespace (`import("./fr.json")`). */
29
+ const unwrapModule = (value) => isObject(value) && Object.prototype.toString.call(value) === "[object Module]"
30
+ ? value.default
31
+ : value;
32
+ const isRegistry = (value) => isObject(value) &&
33
+ typeof value.default === "string" &&
34
+ Array.isArray(value.all) &&
35
+ typeof value.get === "function" &&
36
+ typeof value.chain === "function";
37
+ function resolveEntry(cwd, entry) {
38
+ if (entry !== undefined) {
39
+ const path = resolve(cwd, entry);
40
+ if (!existsSync(path))
41
+ throw new Error(`i18n check: ${entry} does not exist`);
42
+ return path;
43
+ }
44
+ for (const candidate of DEFAULT_ENTRIES) {
45
+ const path = resolve(cwd, candidate);
46
+ if (existsSync(path))
47
+ return path;
48
+ }
49
+ throw new Error(`i18n check: no entry module found (looked for ${DEFAULT_ENTRIES.join(", ")}). Pass one: nifra i18n check <entry>, a module exporting \`locales\` and \`catalogs\`.`);
50
+ }
51
+ /** Import the entry, load every catalog it names, and check them. */
52
+ export async function runI18nCheck(cwd, options = {}) {
53
+ const path = resolveEntry(cwd, options.entry);
54
+ const mod = (await import(__rewriteRelativeImportExtension(pathToFileURL(path).href)));
55
+ const source = isObject(mod.default) && mod.locales === undefined ? mod.default : mod;
56
+ const { locales, catalogs, ignore } = source;
57
+ const entry = relative(cwd, path).replaceAll("\\", "/") || path;
58
+ if (!isRegistry(locales)) {
59
+ throw new Error(`i18n check: ${entry} must export \`locales\`, the registry defineLocales() returns`);
60
+ }
61
+ if (!isObject(catalogs)) {
62
+ throw new Error(`i18n check: ${entry} must export \`catalogs\`, an object of catalogs by locale key`);
63
+ }
64
+ if (ignore !== undefined && !isObject(ignore)) {
65
+ throw new Error(`i18n check: \`ignore\` in ${entry} must be an object of key patterns by check`);
66
+ }
67
+ const loaded = {};
68
+ for (const key of Object.keys(catalogs)) {
69
+ let value = catalogs[key];
70
+ if (typeof value === "function")
71
+ value = value();
72
+ loaded[key] = unwrapModule(await value);
73
+ }
74
+ // Loaded on use: the command catalog imports this module on every CLI start.
75
+ const { checkCatalogs } = await import("@nifrajs/i18n/check");
76
+ return {
77
+ entry,
78
+ result: checkCatalogs({
79
+ locales,
80
+ catalogs: loaded,
81
+ ignore: ignore,
82
+ }),
83
+ };
84
+ }
85
+ const MARK = { error: "✖", warning: "⚠", info: "•" };
86
+ // Per-key findings that are lists rather than problems one by one: grouped per locale in the text.
87
+ const GROUPED = new Set(["missing-key", "unused-key", "untranslated"]);
88
+ const SHOWN_KEYS = 6;
89
+ // Catalog keys and text reach the terminal: control and bidi-override characters print as escapes, so
90
+ // a key can neither drive the terminal nor reorder what the line appears to say.
91
+ const unprintable = (code) => code <= 0x1f ||
92
+ (code >= 0x7f && code <= 0x9f) ||
93
+ code === 0x200e ||
94
+ code === 0x200f ||
95
+ (code >= 0x202a && code <= 0x202e) ||
96
+ (code >= 0x2066 && code <= 0x2069);
97
+ const printable = (line) => {
98
+ let out = "";
99
+ for (const char of line) {
100
+ const code = char.codePointAt(0) ?? 0;
101
+ out += unprintable(code) ? `\\u${code.toString(16).padStart(4, "0")}` : char;
102
+ }
103
+ return out;
104
+ };
105
+ const percent = (share) => `${(share * 100).toFixed(share === 1 ? 0 : 1)}%`;
106
+ /** The human report: a coverage table, then findings, grouped where they are key lists. */
107
+ export function renderI18nCheck(out) {
108
+ const { result } = out;
109
+ const lines = [`nifra i18n check - ${out.entry}`, ""];
110
+ const width = Math.max(6, ...result.coverage.map((row) => row.locale.length));
111
+ for (const row of result.coverage) {
112
+ const label = row.default ? "default" : row.draft ? "draft" : "";
113
+ const counts = row.default
114
+ ? `${row.total} messages`
115
+ : `${row.translated}/${row.total} (${percent(row.coverage)})${row.own === row.translated ? "" : `, ${row.own} own`}`;
116
+ lines.push(` ${row.locale.padEnd(width)} ${label.padEnd(7)} ${counts}`);
117
+ }
118
+ if (result.coverage.length > 0)
119
+ lines.push("");
120
+ const groups = new Map();
121
+ for (const finding of result.findings) {
122
+ if (!GROUPED.has(finding.code) || finding.key === undefined) {
123
+ lines.push(`${MARK[finding.severity]} ${finding.locale} ${finding.code}: ${finding.message}`);
124
+ continue;
125
+ }
126
+ const id = `${finding.severity}\u0000${finding.locale}\u0000${finding.code}`;
127
+ const group = groups.get(id);
128
+ if (group === undefined)
129
+ groups.set(id, [finding]);
130
+ else
131
+ group.push(finding);
132
+ }
133
+ for (const group of groups.values()) {
134
+ const first = group[0];
135
+ const keys = group.map((finding) => finding.key);
136
+ const shown = keys.slice(0, SHOWN_KEYS).join(", ");
137
+ const more = keys.length > SHOWN_KEYS ? `, +${keys.length - SHOWN_KEYS} more` : "";
138
+ lines.push(`${MARK[first.severity]} ${first.locale} ${first.code} (${keys.length}): ${shown}${more}`);
139
+ }
140
+ const count = (severity) => result.findings.filter((finding) => finding.severity === severity).length;
141
+ const errors = count("error");
142
+ const warnings = count("warning");
143
+ if (result.findings.length > 0)
144
+ lines.push("");
145
+ lines.push(errors === 0 && warnings === 0
146
+ ? "✓ catalogs are complete and consistent"
147
+ : `${errors} error${errors === 1 ? "" : "s"}, ${warnings} warning${warnings === 1 ? "" : "s"}${errors === 0 ? " - pass --strict to fail on warnings" : ""}`);
148
+ return lines.map(printable);
149
+ }
150
+ /** Errors fail the run; with `strict`, warnings do too. Info never does. */
151
+ export function i18nCheckPassed(out, strict) {
152
+ return out.result.findings.every((finding) => finding.severity === "info" || (finding.severity === "warning" && !strict));
153
+ }
154
+ //# sourceMappingURL=i18n-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-check.js","sourceRoot":"","sources":["../src/i18n-check.ts"],"names":[],"mappings":"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"}
@@ -1,46 +1,81 @@
1
1
  /**
2
- * `nifra init-agents` - retrofit an EXISTING app with the agent-discovery files a freshly scaffolded
3
- * app ships, so an already-built project adopts the nifra MCP in one command:
2
+ * `nifra init-agents` - retrofit an EXISTING app with the agent files a freshly scaffolded app ships, so
3
+ * an already-built project adopts them in one command:
4
4
  *
5
- * .mcp.json - Claude Code's project MCP registry (launches `bunx @nifrajs/cli mcp`)
6
- * .cursor/mcp.json - Cursor's MCP registry (same server config)
7
- * CLAUDE.md - Claude's MCP-first preamble + `@AGENTS.md` import
8
- * AGENTS.md - a `## MCP server` section appended (or a minimal file if none exists)
5
+ * .mcp.json, .cursor/mcp.json - the nifra MCP server for Claude Code and Cursor
6
+ * CLAUDE.md, GEMINI.md, .cursor/rules/nifra.mdc, .github/copilot-instructions.md
7
+ * - each agent's pointer to AGENTS.md, the single source of guidance
8
+ * AGENTS.md - the `## MCP server` section, and for an app with `routes/` the
9
+ * `## Project structure` section, appended when missing (or a minimal
10
+ * file if none exists)
9
11
  *
10
12
  * The generators are imported from `create-nifra/agent-files` - the SAME source of truth `create-nifra`
11
13
  * uses at scaffold time - so a retrofitted app and a freshly scaffolded one get byte-identical configs.
12
14
  *
13
15
  * Safety: this writes into the user's existing tree, so it NEVER silently clobbers a file they may have
14
16
  * customized. By default an existing `.mcp.json` / `CLAUDE.md` / `.cursor/mcp.json` is SKIPPED with a
15
- * notice; `--force` overwrites. `AGENTS.md` is special-cased - if it already has the MCP section it's
16
- * left alone, otherwise the section is APPENDED (never overwriting the user's conventions), and `--force`
17
- * is not needed for that append since it's additive. Every write path is resolved + confined under the
17
+ * notice; `--force` overwrites. `AGENTS.md` is special-cased - a section it already has is left alone,
18
+ * a missing one is APPENDED (never overwriting the user's conventions), and `--force` is not needed for
19
+ * that append since it's additive. Every write path is resolved + confined under the
18
20
  * cwd (no `..` traversal escaping the project root).
21
+ *
22
+ * `--sync-mcp` is the upgrade path: the launch command pins an exact `@nifrajs/cli` version, so after
23
+ * the app upgrades nifra every existing file still launches the old CLI. It rewrites that version and
24
+ * nothing else - the pin in both MCP registries and the launch command in CLAUDE.md and AGENTS.md's
25
+ * MCP section - to the nifra the project installs, leaving every other byte of every file as it was.
26
+ *
27
+ * At a workspace root that is not itself a nifra project but has exactly one nifra member, both runs
28
+ * also name that member in the registries' launch args (`mcp app`), so the server keeps its root when
29
+ * a second nifra member arrives.
19
30
  */
20
31
  /** What happened to one file during the retrofit, for the printed report + the `--json` shape. */
21
32
  export interface InitAgentsFileResult {
22
33
  /** Project-root-relative POSIX path. */
23
34
  readonly path: string;
24
- /** `wrote` - created or (with --force) overwrote; `appended` - added the MCP section to an existing
25
- * AGENTS.md; `skipped` - already present and not forced; `present` - MCP section already there. */
26
- readonly action: "wrote" | "appended" | "skipped" | "present";
35
+ /** `wrote` - created or (with --force) overwrote; `appended` - added missing sections to an existing
36
+ * AGENTS.md; `skipped` - already present and not forced (or, under --sync-mcp, absent or unpinned);
37
+ * `present` - every section already there (or, under --sync-mcp, already pinned to the target);
38
+ * `synced` - --sync-mcp rewrote a stale pinned version or named the workspace member. */
39
+ readonly action: "wrote" | "appended" | "skipped" | "present" | "synced";
27
40
  /** Why it was skipped/left, for the notice (e.g. "exists - pass --force to overwrite"). */
28
41
  readonly note?: string;
29
42
  }
30
43
  export interface InitAgentsResult {
31
44
  readonly cwd: string;
32
45
  readonly files: readonly InitAgentsFileResult[];
46
+ /** Under --sync-mcp: the `@nifrajs/cli` version every pin was brought to. */
47
+ readonly syncedTo?: string;
33
48
  }
34
49
  export interface InitAgentsOptions {
35
50
  /** Overwrite an existing `.mcp.json` / `CLAUDE.md` / `.cursor/mcp.json` instead of skipping it. */
36
51
  readonly force?: boolean;
52
+ /** Rewrite only the pinned `@nifrajs/cli` version (and, at a workspace root, the member the launch
53
+ * names) in the existing files; create and append nothing. */
54
+ readonly syncMcp?: boolean;
37
55
  }
38
56
  /** Confine a project-relative path under `cwd` and return the absolute path. Rejects a spec that escapes
39
57
  * the root (defense-in-depth - these specs are constants, but the cwd-confinement invariant is enforced
40
58
  * at the seam, not assumed). Exported so the invariant is directly testable. */
41
59
  export declare function safeJoin(cwd: string, rel: string): string;
42
60
  /**
43
- * Retrofit `cwd` with the four agent-discovery files. Pure enough to unit-test (no argv, no process.exit,
61
+ * The version --sync-mcp pins to: the nifra the project installs, so the server an agent launches
62
+ * describes the surface the code builds with. The running CLI's own version when nothing is
63
+ * installed. Not simply the running CLI's version: the command that fixes a drifted server is run
64
+ * by that drifted CLI, and it must not re-pin to itself.
65
+ */
66
+ export declare function mcpPinTarget(cwd: string): Promise<string>;
67
+ /** One file whose launch command pins a version other than {@link mcpPinTarget}. */
68
+ export interface StaleMcpPin {
69
+ readonly path: string;
70
+ readonly pinned: readonly string[];
71
+ }
72
+ /** Read-only: every agent file whose pinned `@nifrajs/cli` is not the one the project installs. */
73
+ export declare function collectStaleMcpPins(cwd: string): Promise<{
74
+ readonly target: string;
75
+ readonly files: readonly StaleMcpPin[];
76
+ }>;
77
+ /**
78
+ * Retrofit `cwd` with the agent files. Pure enough to unit-test (no argv, no process.exit,
44
79
  * no console) - the CLI wrapper handles printing + the exit code.
45
80
  */
46
81
  export declare function initAgents(cwd: string, opts?: InitAgentsOptions): Promise<InitAgentsResult>;
@@ -54,5 +89,6 @@ export declare function renderInitAgents(result: InitAgentsResult): string;
54
89
  export declare function runInitAgents(cwd: string, opts?: {
55
90
  readonly json?: boolean;
56
91
  readonly force?: boolean;
92
+ readonly syncMcp?: boolean;
57
93
  }): Promise<boolean>;
58
94
  //# sourceMappingURL=init-agents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-agents.d.ts","sourceRoot":"","sources":["../src/init-agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAeH,kGAAkG;AAClG,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;uGACmG;IACnG,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAA;IAC7D,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,oBAAoB,EAAE,CAAA;CAChD;AAED,MAAM,WAAW,iBAAiB;IAChC,mGAAmG;IACnG,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB;AAED;;gFAEgF;AAChF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOzD;AAkHD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAS3B;AASD,mDAAmD;AACnD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAUjE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/D,OAAO,CAAC,OAAO,CAAC,CAQlB"}
1
+ {"version":3,"file":"init-agents.d.ts","sourceRoot":"","sources":["../src/init-agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAoBH,kGAAkG;AAClG,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;;;6FAGyF;IACzF,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;IACxE,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,oBAAoB,EAAE,CAAA;IAC/C,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,mGAAmG;IACnG,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB;kEAC8D;IAC9D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED;;gFAEgF;AAChF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOzD;AAqQD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ/D;AAED,oFAAoF;AACpF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAED,mGAAmG;AACnG,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAA;CAAE,CAAC,CAQ9E;AA0BD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAiC3B;AAUD,mDAAmD;AACnD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAgBjE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3F,OAAO,CAAC,OAAO,CAAC,CAWlB"}