@warlock.js/core 5.30.0 → 5.31.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 (797) hide show
  1. package/CHANGELOG.md +142 -36
  2. package/README.md +28 -23
  3. package/bin/source-load-hook.mjs +63 -0
  4. package/bin/warlock.js +102 -42
  5. package/esm/cli/commands/add.command.mjs +4 -2
  6. package/esm/cli/commands/add.command.mjs.map +1 -1
  7. package/esm/cli/commands/agents-md/agents-md-command.action.mjs +69 -0
  8. package/esm/cli/commands/agents-md/agents-md-command.action.mjs.map +1 -0
  9. package/esm/cli/commands/agents-md.command.mjs +38 -0
  10. package/esm/cli/commands/agents-md.command.mjs.map +1 -0
  11. package/esm/cli/commands/board/board-command.action.mjs +279 -0
  12. package/esm/cli/commands/board/board-command.action.mjs.map +1 -0
  13. package/esm/cli/commands/board.command.mjs +78 -0
  14. package/esm/cli/commands/board.command.mjs.map +1 -0
  15. package/esm/cli/commands/build.command.mjs +6 -1
  16. package/esm/cli/commands/build.command.mjs.map +1 -1
  17. package/esm/cli/commands/check/check-command.action.mjs +57 -0
  18. package/esm/cli/commands/check/check-command.action.mjs.map +1 -0
  19. package/esm/cli/commands/check/child-typecheck.mjs +66 -0
  20. package/esm/cli/commands/check/child-typecheck.mjs.map +1 -0
  21. package/esm/cli/commands/check/format-problems.mjs +43 -0
  22. package/esm/cli/commands/check/format-problems.mjs.map +1 -0
  23. package/esm/cli/commands/check/typecheck-command.action.mjs +61 -0
  24. package/esm/cli/commands/check/typecheck-command.action.mjs.map +1 -0
  25. package/esm/cli/commands/check.command.mjs +50 -0
  26. package/esm/cli/commands/check.command.mjs.map +1 -0
  27. package/esm/cli/commands/dev-server.command.mjs +9 -1
  28. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  29. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +8 -3
  30. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -1
  31. package/esm/cli/commands/doctor/check.types.d.mts +76 -0
  32. package/esm/cli/commands/doctor/check.types.d.mts.map +1 -0
  33. package/esm/cli/commands/doctor/checks/config.check.mjs +1 -0
  34. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
  35. package/esm/cli/commands/doctor/checks/connectors.check.mjs +2 -0
  36. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
  37. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +1 -0
  38. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
  39. package/esm/cli/commands/doctor/checks/health.check.mjs +3 -0
  40. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
  41. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs +1 -0
  42. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs.map +1 -1
  43. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +1 -0
  44. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
  45. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +1 -0
  46. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
  47. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +4 -0
  48. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
  49. package/esm/cli/commands/doctor/checks/routes.check.mjs +3 -0
  50. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
  51. package/esm/cli/commands/doctor/doctor-command.action.mjs +14 -6
  52. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
  53. package/esm/cli/commands/doctor/format-report.mjs +30 -2
  54. package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
  55. package/esm/cli/commands/doctor.command.mjs +4 -0
  56. package/esm/cli/commands/doctor.command.mjs.map +1 -1
  57. package/esm/cli/commands/explain/explain-command.action.mjs +64 -0
  58. package/esm/cli/commands/explain/explain-command.action.mjs.map +1 -0
  59. package/esm/cli/commands/explain.command.mjs +23 -0
  60. package/esm/cli/commands/explain.command.mjs.map +1 -0
  61. package/esm/cli/commands/generate/generate.command.mjs +124 -124
  62. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  63. package/esm/cli/commands/generate/generators/endpoint.generator.mjs +311 -0
  64. package/esm/cli/commands/generate/generators/endpoint.generator.mjs.map +1 -0
  65. package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
  66. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
  67. package/esm/cli/commands/generate/generators/model.generator.mjs +1 -1
  68. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs +341 -0
  69. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs.map +1 -0
  70. package/esm/cli/commands/generate/templates/stubs.mjs +19 -6
  71. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  72. package/esm/cli/commands/generate/utils/endpoint-schema.mjs +137 -0
  73. package/esm/cli/commands/generate/utils/endpoint-schema.mjs.map +1 -0
  74. package/esm/cli/commands/generate/utils/name-parser.mjs +1 -1
  75. package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
  76. package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
  77. package/esm/cli/commands/generate/utils/writer.mjs +38 -13
  78. package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
  79. package/esm/cli/commands/inspect/inspect-command.action.mjs +72 -0
  80. package/esm/cli/commands/inspect/inspect-command.action.mjs.map +1 -0
  81. package/esm/cli/commands/inspect.command.mjs +39 -0
  82. package/esm/cli/commands/inspect.command.mjs.map +1 -0
  83. package/esm/cli/commands/mcp/mcp-command.action.mjs +103 -0
  84. package/esm/cli/commands/mcp/mcp-command.action.mjs.map +1 -0
  85. package/esm/cli/commands/mcp.command.mjs +76 -0
  86. package/esm/cli/commands/mcp.command.mjs.map +1 -0
  87. package/esm/cli/commands/openapi-generator.action.mjs.map +1 -1
  88. package/esm/cli/commands/openapi-generator.command.mjs.map +1 -1
  89. package/esm/cli/commands/postman-generator.action.mjs.map +1 -1
  90. package/esm/cli/commands/postman-generator.command.mjs.map +1 -1
  91. package/esm/cli/commands/routes/routes-diff.action.mjs +1 -1
  92. package/esm/cli/commands/test.command.mjs +131 -0
  93. package/esm/cli/commands/test.command.mjs.map +1 -0
  94. package/esm/cli/commands/trace/trace-command.action.mjs +145 -0
  95. package/esm/cli/commands/trace/trace-command.action.mjs.map +1 -0
  96. package/esm/cli/commands/trace.command.mjs +60 -0
  97. package/esm/cli/commands/trace.command.mjs.map +1 -0
  98. package/esm/cli/commands/typecheck.command.mjs +40 -0
  99. package/esm/cli/commands/typecheck.command.mjs.map +1 -0
  100. package/esm/cli/commands/upgrade.command.mjs +46 -0
  101. package/esm/cli/commands/upgrade.command.mjs.map +1 -0
  102. package/esm/cli/flush-and-exit.mjs +34 -0
  103. package/esm/cli/flush-and-exit.mjs.map +1 -0
  104. package/esm/cli/framework-cli-commands.mjs +23 -1
  105. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  106. package/esm/cli/parse-cli-args.mjs +1 -0
  107. package/esm/cli/parse-cli-args.mjs.map +1 -1
  108. package/esm/config/config-loader.d.mts.map +1 -1
  109. package/esm/config/config-loader.mjs +34 -13
  110. package/esm/config/config-loader.mjs.map +1 -1
  111. package/esm/config/config-schema.d.mts +67 -0
  112. package/esm/config/config-schema.d.mts.map +1 -0
  113. package/esm/config/config-schema.mjs +77 -0
  114. package/esm/config/config-schema.mjs.map +1 -0
  115. package/esm/config/index.d.mts +6 -0
  116. package/esm/config/index.mjs +1 -0
  117. package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
  118. package/esm/connectors/assert-no-reserved-connector-names.mjs +2 -1
  119. package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
  120. package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
  121. package/esm/connectors/assert-unique-connector-names.mjs +26 -2
  122. package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
  123. package/esm/connectors/http-connector.d.mts.map +1 -1
  124. package/esm/connectors/http-connector.mjs +3 -2
  125. package/esm/connectors/http-connector.mjs.map +1 -1
  126. package/esm/connectors/single-server-warnings.mjs.map +1 -1
  127. package/esm/connectors/socket-connector.d.mts.map +1 -1
  128. package/esm/connectors/socket-connector.mjs.map +1 -1
  129. package/esm/container/index.d.mts.map +1 -1
  130. package/esm/container/index.mjs.map +1 -1
  131. package/esm/database/migrate-action.mjs.map +1 -1
  132. package/esm/database/models/database-log/database-log.d.mts +0 -28
  133. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  134. package/esm/database/seeds/seeder.errors.d.mts +4 -0
  135. package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
  136. package/esm/database/seeds/seeder.errors.mjs +2 -0
  137. package/esm/database/seeds/seeder.errors.mjs.map +1 -1
  138. package/esm/dev-server/boot-precondition-error.mjs +1 -0
  139. package/esm/dev-server/boot-precondition-error.mjs.map +1 -1
  140. package/esm/dev-server/create-worker.mjs +15 -9
  141. package/esm/dev-server/create-worker.mjs.map +1 -1
  142. package/esm/dev-server/dev-agent-tooling.mjs +135 -0
  143. package/esm/dev-server/dev-agent-tooling.mjs.map +1 -0
  144. package/esm/dev-server/dev-logger.mjs.map +1 -1
  145. package/esm/dev-server/development-server.mjs +8 -0
  146. package/esm/dev-server/development-server.mjs.map +1 -1
  147. package/esm/dev-server/files-orchestrator.mjs +4 -5
  148. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  149. package/esm/dev-server/files-watcher.mjs +1 -1
  150. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +2 -3
  151. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  152. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs +33 -0
  153. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs.map +1 -0
  154. package/esm/dev-server/health-checker/default-health-checkers.mjs +31 -0
  155. package/esm/dev-server/health-checker/default-health-checkers.mjs.map +1 -0
  156. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +9 -3
  157. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  158. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +15 -4
  159. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  160. package/esm/dev-server/health-checker/oxlint-runner.mjs +302 -0
  161. package/esm/dev-server/health-checker/oxlint-runner.mjs.map +1 -0
  162. package/esm/dev-server/health-checker/workers/oxlint-health.worker.d.mts +1 -0
  163. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs +42 -0
  164. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs.map +1 -0
  165. package/esm/dev-server/loader/loader-port-acks.mjs +1 -1
  166. package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -1
  167. package/esm/dev-server/loader/register-loader.mjs +1 -1
  168. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  169. package/esm/dev-server/loader/resolve-hook.mjs +1 -1
  170. package/esm/dev-server/loader/transpile-cache.mjs +1 -1
  171. package/esm/dev-server/model-resource-typings.mjs.map +1 -1
  172. package/esm/dev-server/module-loader.mjs +1 -0
  173. package/esm/dev-server/module-loader.mjs.map +1 -1
  174. package/esm/dev-server/parse-imports.mjs +1 -1
  175. package/esm/dev-server/parse-imports.mjs.map +1 -1
  176. package/esm/dev-server/route-types-publisher.mjs +1 -1
  177. package/esm/dev-server/start-development-server.mjs.map +1 -1
  178. package/esm/dev-server/translation-keys-sources.mjs +1 -1
  179. package/esm/dev-server/translation-keys-sources.mjs.map +1 -1
  180. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  181. package/esm/dev-server/type-generator.mjs +3 -3
  182. package/esm/dev-server/type-generator.mjs.map +1 -1
  183. package/esm/dev-server/types.d.mts.map +1 -1
  184. package/esm/errors/container-key-missing-error.mjs +1 -0
  185. package/esm/errors/container-key-missing-error.mjs.map +1 -1
  186. package/esm/errors/error-codes.d.mts +653 -0
  187. package/esm/errors/error-codes.d.mts.map +1 -0
  188. package/esm/errors/error-codes.mjs +634 -0
  189. package/esm/errors/error-codes.mjs.map +1 -0
  190. package/esm/errors/esbuild-binary-missing-error.mjs +1 -0
  191. package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -1
  192. package/esm/errors/index.d.mts +3 -1
  193. package/esm/errors/index.mjs +3 -1
  194. package/esm/errors/unknown-locale-error.mjs +1 -0
  195. package/esm/errors/unknown-locale-error.mjs.map +1 -1
  196. package/esm/errors/warlock-error.d.mts +23 -0
  197. package/esm/errors/warlock-error.d.mts.map +1 -0
  198. package/esm/errors/warlock-error.mjs +22 -0
  199. package/esm/errors/warlock-error.mjs.map +1 -0
  200. package/esm/generations/add-command.action.mjs +19 -3
  201. package/esm/generations/add-command.action.mjs.map +1 -1
  202. package/esm/generations/features/access.feature.mjs +1 -1
  203. package/esm/generations/features/access.feature.mjs.map +1 -1
  204. package/esm/generations/features/bull-board.feature.mjs +1 -1
  205. package/esm/generations/features/bull-board.feature.mjs.map +1 -1
  206. package/esm/generations/features/mysql.feature.mjs.map +1 -1
  207. package/esm/generations/features/notifications.feature.mjs +5 -2
  208. package/esm/generations/features/notifications.feature.mjs.map +1 -1
  209. package/esm/generations/features/queue.feature.mjs +1 -1
  210. package/esm/generations/features/queue.feature.mjs.map +1 -1
  211. package/esm/generations/features/react-email.feature.mjs +1 -1
  212. package/esm/generations/features/react-email.feature.mjs.map +1 -1
  213. package/esm/generations/features/shadcn.feature.mjs +1 -1
  214. package/esm/generations/features/shadcn.feature.mjs.map +1 -1
  215. package/esm/generations/features/shared/link-ai-package-import.mjs +1 -1
  216. package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -1
  217. package/esm/generations/features/shared/merge-web-sitemap-config.mjs.map +1 -1
  218. package/esm/generations/features/shared/patch-tsconfig-include.mjs +1 -1
  219. package/esm/generations/features/shared/patch-tsconfig-include.mjs.map +1 -1
  220. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +1 -1
  221. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs.map +1 -1
  222. package/esm/generations/features/sitemap.feature.mjs +1 -1
  223. package/esm/generations/features/sitemap.feature.mjs.map +1 -1
  224. package/esm/generations/features/tailwind.feature.mjs +1 -1
  225. package/esm/generations/features/tailwind.feature.mjs.map +1 -1
  226. package/esm/generations/features/test.feature.mjs +11 -6
  227. package/esm/generations/features/test.feature.mjs.map +1 -1
  228. package/esm/generations/features/web.feature.mjs +1 -1
  229. package/esm/generations/features/web.feature.mjs.map +1 -1
  230. package/esm/generations/generation-fs.mjs +73 -0
  231. package/esm/generations/generation-fs.mjs.map +1 -0
  232. package/esm/generations/generation-run.mjs +185 -0
  233. package/esm/generations/generation-run.mjs.map +1 -0
  234. package/esm/generations/stubs.mjs +155 -13
  235. package/esm/generations/stubs.mjs.map +1 -1
  236. package/esm/http/bounded-stream-queue.d.mts +10 -0
  237. package/esm/http/bounded-stream-queue.d.mts.map +1 -0
  238. package/esm/http/bounded-stream-queue.mjs +97 -0
  239. package/esm/http/bounded-stream-queue.mjs.map +1 -0
  240. package/esm/http/build-rate-limit-options.d.mts +13 -0
  241. package/esm/http/build-rate-limit-options.d.mts.map +1 -1
  242. package/esm/http/build-rate-limit-options.mjs.map +1 -1
  243. package/esm/http/conditional-request.d.mts +86 -0
  244. package/esm/http/conditional-request.d.mts.map +1 -0
  245. package/esm/http/conditional-request.mjs +121 -0
  246. package/esm/http/conditional-request.mjs.map +1 -0
  247. package/esm/http/csp.d.mts +2 -0
  248. package/esm/http/csp.d.mts.map +1 -1
  249. package/esm/http/csp.mjs +1 -0
  250. package/esm/http/csp.mjs.map +1 -1
  251. package/esm/http/csrf-origin-policy.mjs.map +1 -1
  252. package/esm/http/database/RequestLog.d.mts +24 -84
  253. package/esm/http/database/RequestLog.d.mts.map +1 -1
  254. package/esm/http/errors/errors.d.mts +2 -0
  255. package/esm/http/errors/errors.d.mts.map +1 -1
  256. package/esm/http/errors/errors.mjs +1 -0
  257. package/esm/http/errors/errors.mjs.map +1 -1
  258. package/esm/http/escape-header-value.d.mts +18 -0
  259. package/esm/http/escape-header-value.d.mts.map +1 -0
  260. package/esm/http/escape-header-value.mjs +27 -0
  261. package/esm/http/escape-header-value.mjs.map +1 -0
  262. package/esm/http/flush-pending-cookies.mjs.map +1 -1
  263. package/esm/http/index.d.mts +5 -2
  264. package/esm/http/index.mjs +4 -1
  265. package/esm/http/lazy-static.mjs +194 -0
  266. package/esm/http/lazy-static.mjs.map +1 -0
  267. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  268. package/esm/http/plugins.d.mts.map +1 -1
  269. package/esm/http/plugins.mjs +7 -4
  270. package/esm/http/plugins.mjs.map +1 -1
  271. package/esm/http/rate-limit-cache-store.mjs +2 -1
  272. package/esm/http/rate-limit-cache-store.mjs.map +1 -1
  273. package/esm/http/request-log-snapshot.d.mts +12 -5
  274. package/esm/http/request-log-snapshot.d.mts.map +1 -1
  275. package/esm/http/request-log-snapshot.mjs +83 -4
  276. package/esm/http/request-log-snapshot.mjs.map +1 -1
  277. package/esm/http/request.d.mts +2 -2
  278. package/esm/http/request.d.mts.map +1 -1
  279. package/esm/http/request.mjs +5 -4
  280. package/esm/http/request.mjs.map +1 -1
  281. package/esm/http/response.d.mts +11 -1
  282. package/esm/http/response.d.mts.map +1 -1
  283. package/esm/http/response.mjs +164 -76
  284. package/esm/http/response.mjs.map +1 -1
  285. package/esm/http/safe-redirect.d.mts +51 -0
  286. package/esm/http/safe-redirect.d.mts.map +1 -0
  287. package/esm/http/safe-redirect.mjs +80 -0
  288. package/esm/http/safe-redirect.mjs.map +1 -0
  289. package/esm/http/serialized.d.mts.map +1 -1
  290. package/esm/http/server.d.mts +3 -1
  291. package/esm/http/server.d.mts.map +1 -1
  292. package/esm/http/server.mjs +14 -4
  293. package/esm/http/server.mjs.map +1 -1
  294. package/esm/http/stream-transport.mjs +4 -2
  295. package/esm/http/stream-transport.mjs.map +1 -1
  296. package/esm/http/types.d.mts +44 -11
  297. package/esm/http/types.d.mts.map +1 -1
  298. package/esm/http/uploads/generate-image-variant.mjs +1 -1
  299. package/esm/http/uploads/generate-image-variants.d.mts +10 -7
  300. package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
  301. package/esm/http/uploads/generate-image-variants.mjs +61 -24
  302. package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
  303. package/esm/http/uploads/image-variant-cache-entries.mjs +78 -0
  304. package/esm/http/uploads/image-variant-cache-entries.mjs.map +1 -0
  305. package/esm/http/uploads/image-variant-cache.mjs +72 -30
  306. package/esm/http/uploads/image-variant-cache.mjs.map +1 -1
  307. package/esm/http/uploads/image-variant-types.d.mts +2 -0
  308. package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
  309. package/esm/http/uploads/image-variants-config-error.d.mts +3 -1
  310. package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
  311. package/esm/http/uploads/image-variants-config-error.mjs +3 -2
  312. package/esm/http/uploads/image-variants-config-error.mjs.map +1 -1
  313. package/esm/http/uploads/load-variant-source.mjs +1 -1
  314. package/esm/http/uploads/load-variant-source.mjs.map +1 -1
  315. package/esm/http/uploads/purge-image-variants.d.mts +7 -2
  316. package/esm/http/uploads/purge-image-variants.d.mts.map +1 -1
  317. package/esm/http/uploads/purge-image-variants.mjs +16 -16
  318. package/esm/http/uploads/purge-image-variants.mjs.map +1 -1
  319. package/esm/http/uploads/remote-variant-source.mjs +115 -0
  320. package/esm/http/uploads/remote-variant-source.mjs.map +1 -0
  321. package/esm/http/uploads/resolve-image-variant.d.mts +3 -4
  322. package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -1
  323. package/esm/http/uploads/resolve-image-variant.mjs +10 -18
  324. package/esm/http/uploads/resolve-image-variant.mjs.map +1 -1
  325. package/esm/http/uploads/resolve-image-variants-config.mjs +5 -3
  326. package/esm/http/uploads/resolve-image-variants-config.mjs.map +1 -1
  327. package/esm/http/uploads/resolve-remote-image-variant.mjs +89 -0
  328. package/esm/http/uploads/resolve-remote-image-variant.mjs.map +1 -0
  329. package/esm/http/uploads/trim-image-variant-cache.mjs +193 -0
  330. package/esm/http/uploads/trim-image-variant-cache.mjs.map +1 -0
  331. package/esm/http/uploads/uploaded-file.controller.d.mts +5 -3
  332. package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
  333. package/esm/http/uploads/uploaded-file.controller.mjs +16 -8
  334. package/esm/http/uploads/uploaded-file.controller.mjs.map +1 -1
  335. package/esm/http/uploads/variant-cache-key.mjs +1 -1
  336. package/esm/http/uploads-types.d.mts +6 -2
  337. package/esm/http/uploads-types.d.mts.map +1 -1
  338. package/esm/index.d.mts +17 -6
  339. package/esm/index.mjs +14 -3
  340. package/esm/localization/parse-locale-dictionary.d.mts +2 -0
  341. package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
  342. package/esm/localization/parse-locale-dictionary.mjs +1 -0
  343. package/esm/localization/parse-locale-dictionary.mjs.map +1 -1
  344. package/esm/mail/config.d.mts +12 -1
  345. package/esm/mail/config.d.mts.map +1 -1
  346. package/esm/mail/config.mjs +16 -1
  347. package/esm/mail/config.mjs.map +1 -1
  348. package/esm/mail/index.d.mts +1 -1
  349. package/esm/mail/index.mjs +1 -1
  350. package/esm/net/index.d.mts +2 -0
  351. package/esm/net/index.mjs +3 -0
  352. package/esm/openapi/build-openapi-document.d.mts.map +1 -1
  353. package/esm/openapi/build-openapi-document.mjs +8 -5
  354. package/esm/openapi/build-openapi-document.mjs.map +1 -1
  355. package/esm/openapi/error-responses.mjs +28 -2
  356. package/esm/openapi/error-responses.mjs.map +1 -1
  357. package/esm/openapi/postman/build-request-body.mjs.map +1 -1
  358. package/esm/openapi/postman/build-request-url.mjs.map +1 -1
  359. package/esm/openapi/postman/build-saved-responses.mjs.map +1 -1
  360. package/esm/openapi/postman/example-from-schema.d.mts.map +1 -1
  361. package/esm/openapi/postman/example-from-schema.mjs.map +1 -1
  362. package/esm/openapi/postman/openapi-to-postman-collection.d.mts.map +1 -1
  363. package/esm/openapi/postman/openapi-to-postman-collection.mjs.map +1 -1
  364. package/esm/openapi/postman/schema-refs.mjs.map +1 -1
  365. package/esm/openapi/postman/uuid-v5.mjs.map +1 -1
  366. package/esm/openapi/request-schemas.mjs.map +1 -1
  367. package/esm/openapi/response-schemas.mjs.map +1 -1
  368. package/esm/openapi/schema-registry.d.mts +1 -0
  369. package/esm/openapi/schema-registry.mjs.map +1 -1
  370. package/esm/openapi/security.mjs.map +1 -1
  371. package/esm/openapi/types.d.mts +3 -2
  372. package/esm/openapi/types.d.mts.map +1 -1
  373. package/esm/production/assert-generated-imports.mjs +1 -0
  374. package/esm/production/assert-generated-imports.mjs.map +1 -1
  375. package/esm/production/production-builder.mjs +12 -4
  376. package/esm/production/production-builder.mjs.map +1 -1
  377. package/esm/production/resolve-build-config.mjs +1 -0
  378. package/esm/production/resolve-build-config.mjs.map +1 -1
  379. package/esm/production/route-registration-child.mjs.map +1 -1
  380. package/esm/production/route-registration-snapshot.mjs.map +1 -1
  381. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  382. package/esm/repositories/contracts/types.d.mts.map +1 -1
  383. package/esm/repositories/repository.manager.mjs.map +1 -1
  384. package/esm/resource/resource.d.mts.map +1 -1
  385. package/esm/resource/resource.mjs.map +1 -1
  386. package/esm/resource/types.d.mts.map +1 -1
  387. package/esm/restful/restful.d.mts +5 -5
  388. package/esm/restful/restful.d.mts.map +1 -1
  389. package/esm/restful/restful.mjs.map +1 -1
  390. package/esm/router/build-route-rate-limit.mjs.map +1 -1
  391. package/esm/router/dev-dispatch.mjs +31 -12
  392. package/esm/router/dev-dispatch.mjs.map +1 -1
  393. package/esm/router/index.d.mts +4 -2
  394. package/esm/router/index.mjs +2 -0
  395. package/esm/router/log-request-lifecycle.mjs.map +1 -1
  396. package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
  397. package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
  398. package/esm/router/resolve-route-rate-limit.mjs +47 -0
  399. package/esm/router/resolve-route-rate-limit.mjs.map +1 -0
  400. package/esm/router/resolve-route-validation.mjs +19 -0
  401. package/esm/router/resolve-route-validation.mjs.map +1 -0
  402. package/esm/router/route-guard-names.mjs +30 -0
  403. package/esm/router/route-guard-names.mjs.map +1 -0
  404. package/esm/router/route-name-taken-error.d.mts +14 -0
  405. package/esm/router/route-name-taken-error.d.mts.map +1 -0
  406. package/esm/router/route-name-taken-error.mjs +18 -0
  407. package/esm/router/route-name-taken-error.mjs.map +1 -0
  408. package/esm/router/router.d.mts +32 -13
  409. package/esm/router/router.d.mts.map +1 -1
  410. package/esm/router/router.mjs +71 -38
  411. package/esm/router/router.mjs.map +1 -1
  412. package/esm/router/types.d.mts +137 -17
  413. package/esm/router/types.d.mts.map +1 -1
  414. package/esm/router/unguarded-route-diagnostics.d.mts +40 -0
  415. package/esm/router/unguarded-route-diagnostics.d.mts.map +1 -0
  416. package/esm/router/unguarded-route-diagnostics.mjs +95 -0
  417. package/esm/router/unguarded-route-diagnostics.mjs.map +1 -0
  418. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  419. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  420. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  421. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  422. package/esm/storage/local-disk-roots.mjs +24 -0
  423. package/esm/storage/local-disk-roots.mjs.map +1 -0
  424. package/esm/storage/storage.d.mts +14 -0
  425. package/esm/storage/storage.d.mts.map +1 -1
  426. package/esm/storage/storage.mjs +22 -0
  427. package/esm/storage/storage.mjs.map +1 -1
  428. package/esm/storage/types.d.mts.map +1 -1
  429. package/esm/storage/utils/storage-not-initialized-error.d.mts +2 -0
  430. package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
  431. package/esm/storage/utils/storage-not-initialized-error.mjs +1 -0
  432. package/esm/storage/utils/storage-not-initialized-error.mjs.map +1 -1
  433. package/esm/tests/authenticated-test-client.d.mts +32 -0
  434. package/esm/tests/authenticated-test-client.d.mts.map +1 -0
  435. package/esm/tests/authenticated-test-client.mjs +40 -0
  436. package/esm/tests/authenticated-test-client.mjs.map +1 -0
  437. package/esm/tests/factories.d.mts +59 -0
  438. package/esm/tests/factories.d.mts.map +1 -0
  439. package/esm/tests/factories.mjs +105 -0
  440. package/esm/tests/factories.mjs.map +1 -0
  441. package/esm/tests/fakes/cache-fake.d.mts +29 -0
  442. package/esm/tests/fakes/cache-fake.d.mts.map +1 -0
  443. package/esm/tests/fakes/cache-fake.mjs +79 -0
  444. package/esm/tests/fakes/cache-fake.mjs.map +1 -0
  445. package/esm/tests/fakes/clock-fake.d.mts +32 -0
  446. package/esm/tests/fakes/clock-fake.d.mts.map +1 -0
  447. package/esm/tests/fakes/clock-fake.mjs +69 -0
  448. package/esm/tests/fakes/clock-fake.mjs.map +1 -0
  449. package/esm/tests/fakes/fake-assertion-error.d.mts +13 -0
  450. package/esm/tests/fakes/fake-assertion-error.d.mts.map +1 -0
  451. package/esm/tests/fakes/fake-assertion-error.mjs +20 -0
  452. package/esm/tests/fakes/fake-assertion-error.mjs.map +1 -0
  453. package/esm/tests/fakes/ids-fake.d.mts +22 -0
  454. package/esm/tests/fakes/ids-fake.d.mts.map +1 -0
  455. package/esm/tests/fakes/ids-fake.mjs +57 -0
  456. package/esm/tests/fakes/ids-fake.mjs.map +1 -0
  457. package/esm/tests/fakes/index.d.mts +8 -0
  458. package/esm/tests/fakes/index.mjs +10 -0
  459. package/esm/tests/fakes/mail-fake.d.mts +41 -0
  460. package/esm/tests/fakes/mail-fake.d.mts.map +1 -0
  461. package/esm/tests/fakes/mail-fake.mjs +111 -0
  462. package/esm/tests/fakes/mail-fake.mjs.map +1 -0
  463. package/esm/tests/fakes/queue-fake.d.mts +48 -0
  464. package/esm/tests/fakes/queue-fake.d.mts.map +1 -0
  465. package/esm/tests/fakes/queue-fake.mjs +134 -0
  466. package/esm/tests/fakes/queue-fake.mjs.map +1 -0
  467. package/esm/tests/fakes/storage-fake.d.mts +31 -0
  468. package/esm/tests/fakes/storage-fake.d.mts.map +1 -0
  469. package/esm/tests/fakes/storage-fake.mjs +122 -0
  470. package/esm/tests/fakes/storage-fake.mjs.map +1 -0
  471. package/esm/tests/fakes/test-fakes.d.mts +39 -0
  472. package/esm/tests/fakes/test-fakes.d.mts.map +1 -0
  473. package/esm/tests/fakes/test-fakes.mjs +90 -0
  474. package/esm/tests/fakes/test-fakes.mjs.map +1 -0
  475. package/esm/tests/index.d.mts +14 -2
  476. package/esm/tests/index.mjs +15 -2
  477. package/esm/tests/snapshot-response.d.mts +34 -0
  478. package/esm/tests/snapshot-response.d.mts.map +1 -0
  479. package/esm/tests/snapshot-response.mjs +42 -0
  480. package/esm/tests/snapshot-response.mjs.map +1 -0
  481. package/esm/tests/start-http-development-server.d.mts +22 -0
  482. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  483. package/esm/tests/start-http-development-server.mjs +36 -3
  484. package/esm/tests/start-http-development-server.mjs.map +1 -1
  485. package/esm/tests/test-helpers.d.mts +20 -1
  486. package/esm/tests/test-helpers.d.mts.map +1 -1
  487. package/esm/tests/test-helpers.mjs +40 -27
  488. package/esm/tests/test-helpers.mjs.map +1 -1
  489. package/esm/tests/test-http-server.d.mts +62 -0
  490. package/esm/tests/test-http-server.d.mts.map +1 -0
  491. package/esm/tests/test-http-server.mjs +119 -0
  492. package/esm/tests/test-http-server.mjs.map +1 -0
  493. package/esm/tests/vitest-setup.d.mts +11 -0
  494. package/esm/tests/vitest-setup.d.mts.map +1 -1
  495. package/esm/tests/vitest-setup.mjs +12 -4
  496. package/esm/tests/vitest-setup.mjs.map +1 -1
  497. package/esm/tooling/agents-md/agents-md-markers.d.mts +27 -0
  498. package/esm/tooling/agents-md/agents-md-markers.d.mts.map +1 -0
  499. package/esm/tooling/agents-md/agents-md-markers.mjs +59 -0
  500. package/esm/tooling/agents-md/agents-md-markers.mjs.map +1 -0
  501. package/esm/tooling/agents-md/agents-md-refresher.d.mts +36 -0
  502. package/esm/tooling/agents-md/agents-md-refresher.d.mts.map +1 -0
  503. package/esm/tooling/agents-md/agents-md-refresher.mjs +72 -0
  504. package/esm/tooling/agents-md/agents-md-refresher.mjs.map +1 -0
  505. package/esm/tooling/agents-md/index.mjs +7 -0
  506. package/esm/tooling/agents-md/installed-skills.d.mts +30 -0
  507. package/esm/tooling/agents-md/installed-skills.d.mts.map +1 -0
  508. package/esm/tooling/agents-md/installed-skills.mjs +74 -0
  509. package/esm/tooling/agents-md/installed-skills.mjs.map +1 -0
  510. package/esm/tooling/agents-md/render-agents-md.d.mts +33 -0
  511. package/esm/tooling/agents-md/render-agents-md.d.mts.map +1 -0
  512. package/esm/tooling/agents-md/render-agents-md.mjs +195 -0
  513. package/esm/tooling/agents-md/render-agents-md.mjs.map +1 -0
  514. package/esm/tooling/agents-md/write-agents-md.d.mts +33 -0
  515. package/esm/tooling/agents-md/write-agents-md.d.mts.map +1 -0
  516. package/esm/tooling/agents-md/write-agents-md.mjs +49 -0
  517. package/esm/tooling/agents-md/write-agents-md.mjs.map +1 -0
  518. package/esm/tooling/board/board-message.d.mts +31 -0
  519. package/esm/tooling/board/board-message.d.mts.map +1 -0
  520. package/esm/tooling/board/board-message.mjs +86 -0
  521. package/esm/tooling/board/board-message.mjs.map +1 -0
  522. package/esm/tooling/board/board.d.mts +109 -0
  523. package/esm/tooling/board/board.d.mts.map +1 -0
  524. package/esm/tooling/board/board.mjs +406 -0
  525. package/esm/tooling/board/board.mjs.map +1 -0
  526. package/esm/tooling/board/board.types.d.mts +72 -0
  527. package/esm/tooling/board/board.types.d.mts.map +1 -0
  528. package/esm/tooling/board/board.types.mjs +54 -0
  529. package/esm/tooling/board/board.types.mjs.map +1 -0
  530. package/esm/tooling/check/changed-files.d.mts +33 -0
  531. package/esm/tooling/check/changed-files.d.mts.map +1 -0
  532. package/esm/tooling/check/changed-files.mjs +73 -0
  533. package/esm/tooling/check/changed-files.mjs.map +1 -0
  534. package/esm/tooling/check/check-report.types.d.mts +62 -0
  535. package/esm/tooling/check/check-report.types.d.mts.map +1 -0
  536. package/esm/tooling/check/check-report.types.mjs +37 -0
  537. package/esm/tooling/check/check-report.types.mjs.map +1 -0
  538. package/esm/tooling/check/code-style-conventions.mjs +106 -0
  539. package/esm/tooling/check/code-style-conventions.mjs.map +1 -0
  540. package/esm/tooling/check/conventions-step.d.mts +34 -0
  541. package/esm/tooling/check/conventions-step.d.mts.map +1 -0
  542. package/esm/tooling/check/conventions-step.mjs +184 -0
  543. package/esm/tooling/check/conventions-step.mjs.map +1 -0
  544. package/esm/tooling/check/environment-step.d.mts +18 -0
  545. package/esm/tooling/check/environment-step.d.mts.map +1 -0
  546. package/esm/tooling/check/environment-step.mjs +78 -0
  547. package/esm/tooling/check/environment-step.mjs.map +1 -0
  548. package/esm/tooling/check/index.d.mts +8 -0
  549. package/esm/tooling/check/index.mjs +10 -0
  550. package/esm/tooling/check/lint-step.d.mts +19 -0
  551. package/esm/tooling/check/lint-step.d.mts.map +1 -0
  552. package/esm/tooling/check/lint-step.mjs +111 -0
  553. package/esm/tooling/check/lint-step.mjs.map +1 -0
  554. package/esm/tooling/check/request-input.mjs +132 -0
  555. package/esm/tooling/check/request-input.mjs.map +1 -0
  556. package/esm/tooling/check/run-check.d.mts +35 -0
  557. package/esm/tooling/check/run-check.d.mts.map +1 -0
  558. package/esm/tooling/check/run-check.mjs +192 -0
  559. package/esm/tooling/check/run-check.mjs.map +1 -0
  560. package/esm/tooling/check/run-tests.d.mts +48 -0
  561. package/esm/tooling/check/run-tests.d.mts.map +1 -0
  562. package/esm/tooling/check/run-tests.mjs +93 -0
  563. package/esm/tooling/check/run-tests.mjs.map +1 -0
  564. package/esm/tooling/check/security-conventions.mjs +648 -0
  565. package/esm/tooling/check/security-conventions.mjs.map +1 -0
  566. package/esm/tooling/check/source-ast.mjs +195 -0
  567. package/esm/tooling/check/source-ast.mjs.map +1 -0
  568. package/esm/tooling/check/source-files.mjs +27 -0
  569. package/esm/tooling/check/source-files.mjs.map +1 -0
  570. package/esm/tooling/check/tests-step.d.mts +34 -0
  571. package/esm/tooling/check/tests-step.d.mts.map +1 -0
  572. package/esm/tooling/check/tests-step.mjs +177 -0
  573. package/esm/tooling/check/tests-step.mjs.map +1 -0
  574. package/esm/tooling/dev-state/dev-server-state.d.mts +39 -0
  575. package/esm/tooling/dev-state/dev-server-state.d.mts.map +1 -0
  576. package/esm/tooling/dev-state/dev-server-state.mjs +67 -0
  577. package/esm/tooling/dev-state/dev-server-state.mjs.map +1 -0
  578. package/esm/tooling/devtools/devtools-client.d.mts +91 -0
  579. package/esm/tooling/devtools/devtools-client.d.mts.map +1 -0
  580. package/esm/tooling/devtools/devtools-client.mjs +155 -0
  581. package/esm/tooling/devtools/devtools-client.mjs.map +1 -0
  582. package/esm/tooling/generate/generation.d.mts +78 -0
  583. package/esm/tooling/generate/generation.d.mts.map +1 -0
  584. package/esm/tooling/generate/generation.mjs +123 -0
  585. package/esm/tooling/generate/generation.mjs.map +1 -0
  586. package/esm/tooling/generate/generator-spec.d.mts +57 -0
  587. package/esm/tooling/generate/generator-spec.d.mts.map +1 -0
  588. package/esm/tooling/generate/generator-spec.mjs +102 -0
  589. package/esm/tooling/generate/generator-spec.mjs.map +1 -0
  590. package/esm/tooling/generate/index.mjs +6 -0
  591. package/esm/tooling/generate/project-files.mjs +121 -0
  592. package/esm/tooling/generate/project-files.mjs.map +1 -0
  593. package/esm/tooling/generate/run-cli.d.mts +40 -0
  594. package/esm/tooling/generate/run-cli.d.mts.map +1 -0
  595. package/esm/tooling/generate/run-cli.mjs +93 -0
  596. package/esm/tooling/generate/run-cli.mjs.map +1 -0
  597. package/esm/tooling/generate/unified-diff.d.mts +37 -0
  598. package/esm/tooling/generate/unified-diff.d.mts.map +1 -0
  599. package/esm/tooling/generate/unified-diff.mjs +161 -0
  600. package/esm/tooling/generate/unified-diff.mjs.map +1 -0
  601. package/esm/tooling/index.d.mts +41 -0
  602. package/esm/tooling/index.mjs +45 -0
  603. package/esm/tooling/inspect/boot-for-inspect.d.mts +23 -0
  604. package/esm/tooling/inspect/boot-for-inspect.d.mts.map +1 -0
  605. package/esm/tooling/inspect/boot-for-inspect.mjs +63 -0
  606. package/esm/tooling/inspect/boot-for-inspect.mjs.map +1 -0
  607. package/esm/tooling/inspect/collect-config.mjs +77 -0
  608. package/esm/tooling/inspect/collect-config.mjs.map +1 -0
  609. package/esm/tooling/inspect/collect-models.d.mts +9 -0
  610. package/esm/tooling/inspect/collect-models.d.mts.map +1 -0
  611. package/esm/tooling/inspect/collect-models.mjs +154 -0
  612. package/esm/tooling/inspect/collect-models.mjs.map +1 -0
  613. package/esm/tooling/inspect/collect-packages.d.mts +10 -0
  614. package/esm/tooling/inspect/collect-packages.d.mts.map +1 -0
  615. package/esm/tooling/inspect/collect-packages.mjs +157 -0
  616. package/esm/tooling/inspect/collect-packages.mjs.map +1 -0
  617. package/esm/tooling/inspect/collect-pages.mjs +108 -0
  618. package/esm/tooling/inspect/collect-pages.mjs.map +1 -0
  619. package/esm/tooling/inspect/collect-routes.mjs +168 -0
  620. package/esm/tooling/inspect/collect-routes.mjs.map +1 -0
  621. package/esm/tooling/inspect/event-recorder.d.mts +37 -0
  622. package/esm/tooling/inspect/event-recorder.d.mts.map +1 -0
  623. package/esm/tooling/inspect/event-recorder.mjs +91 -0
  624. package/esm/tooling/inspect/event-recorder.mjs.map +1 -0
  625. package/esm/tooling/inspect/index.d.mts +7 -0
  626. package/esm/tooling/inspect/index.mjs +7 -0
  627. package/esm/tooling/inspect/inspect-app.d.mts +53 -0
  628. package/esm/tooling/inspect/inspect-app.d.mts.map +1 -0
  629. package/esm/tooling/inspect/inspect-app.mjs +92 -0
  630. package/esm/tooling/inspect/inspect-app.mjs.map +1 -0
  631. package/esm/tooling/inspect/inspect-report.schema.d.mts +15 -0
  632. package/esm/tooling/inspect/inspect-report.schema.d.mts.map +1 -0
  633. package/esm/tooling/inspect/inspect-report.schema.mjs +463 -0
  634. package/esm/tooling/inspect/inspect-report.schema.mjs.map +1 -0
  635. package/esm/tooling/inspect/inspect-report.types.d.mts +196 -0
  636. package/esm/tooling/inspect/inspect-report.types.d.mts.map +1 -0
  637. package/esm/tooling/inspect/inspect-report.types.mjs +33 -0
  638. package/esm/tooling/inspect/inspect-report.types.mjs.map +1 -0
  639. package/esm/tooling/mcp/create-mcp-context.d.mts +26 -0
  640. package/esm/tooling/mcp/create-mcp-context.d.mts.map +1 -0
  641. package/esm/tooling/mcp/create-mcp-context.mjs +75 -0
  642. package/esm/tooling/mcp/create-mcp-context.mjs.map +1 -0
  643. package/esm/tooling/mcp/db-schema.d.mts +49 -0
  644. package/esm/tooling/mcp/db-schema.d.mts.map +1 -0
  645. package/esm/tooling/mcp/db-schema.mjs +56 -0
  646. package/esm/tooling/mcp/db-schema.mjs.map +1 -0
  647. package/esm/tooling/mcp/docs-search.d.mts +72 -0
  648. package/esm/tooling/mcp/docs-search.d.mts.map +1 -0
  649. package/esm/tooling/mcp/docs-search.mjs +178 -0
  650. package/esm/tooling/mcp/docs-search.mjs.map +1 -0
  651. package/esm/tooling/mcp/index.mjs +9 -0
  652. package/esm/tooling/mcp/load-ai-tools.d.mts +62 -0
  653. package/esm/tooling/mcp/load-ai-tools.d.mts.map +1 -0
  654. package/esm/tooling/mcp/load-ai-tools.mjs +44 -0
  655. package/esm/tooling/mcp/load-ai-tools.mjs.map +1 -0
  656. package/esm/tooling/mcp/mcp-tools.d.mts +60 -0
  657. package/esm/tooling/mcp/mcp-tools.d.mts.map +1 -0
  658. package/esm/tooling/mcp/mcp-tools.mjs +513 -0
  659. package/esm/tooling/mcp/mcp-tools.mjs.map +1 -0
  660. package/esm/tooling/mcp/start-mcp-server.d.mts +56 -0
  661. package/esm/tooling/mcp/start-mcp-server.d.mts.map +1 -0
  662. package/esm/tooling/mcp/start-mcp-server.mjs +126 -0
  663. package/esm/tooling/mcp/start-mcp-server.mjs.map +1 -0
  664. package/esm/tooling/mcp/tool-input.d.mts +75 -0
  665. package/esm/tooling/mcp/tool-input.d.mts.map +1 -0
  666. package/esm/tooling/mcp/tool-input.mjs +72 -0
  667. package/esm/tooling/mcp/tool-input.mjs.map +1 -0
  668. package/esm/tooling/problem.d.mts +45 -0
  669. package/esm/tooling/problem.d.mts.map +1 -0
  670. package/esm/tooling/problem.mjs +28 -0
  671. package/esm/tooling/problem.mjs.map +1 -0
  672. package/esm/tooling/trace/trace-report.types.d.mts +71 -0
  673. package/esm/tooling/trace/trace-report.types.d.mts.map +1 -0
  674. package/esm/tooling/trace/trace-report.types.mjs +7 -0
  675. package/esm/tooling/trace/trace-report.types.mjs.map +1 -0
  676. package/esm/tooling/trace/trace-request.d.mts +83 -0
  677. package/esm/tooling/trace/trace-request.d.mts.map +1 -0
  678. package/esm/tooling/trace/trace-request.mjs +241 -0
  679. package/esm/tooling/trace/trace-request.mjs.map +1 -0
  680. package/esm/tooling/typecheck/index.d.mts +1 -0
  681. package/esm/tooling/typecheck/index.mjs +3 -0
  682. package/esm/tooling/typecheck/run-typecheck.d.mts +59 -0
  683. package/esm/tooling/typecheck/run-typecheck.d.mts.map +1 -0
  684. package/esm/tooling/typecheck/run-typecheck.mjs +153 -0
  685. package/esm/tooling/typecheck/run-typecheck.mjs.map +1 -0
  686. package/esm/upgrade/codemods/head-viewport.mjs +46 -0
  687. package/esm/upgrade/codemods/head-viewport.mjs.map +1 -0
  688. package/esm/upgrade/codemods/helpers.mjs +81 -0
  689. package/esm/upgrade/codemods/helpers.mjs.map +1 -0
  690. package/esm/upgrade/codemods/index.mjs +34 -0
  691. package/esm/upgrade/codemods/index.mjs.map +1 -0
  692. package/esm/upgrade/codemods/logger-sync-calls.mjs +57 -0
  693. package/esm/upgrade/codemods/logger-sync-calls.mjs.map +1 -0
  694. package/esm/upgrade/codemods/package-json.mjs +122 -0
  695. package/esm/upgrade/codemods/package-json.mjs.map +1 -0
  696. package/esm/upgrade/codemods/request-log-snapshot.mjs +82 -0
  697. package/esm/upgrade/codemods/request-log-snapshot.mjs.map +1 -0
  698. package/esm/upgrade/codemods/review-sites.mjs +262 -0
  699. package/esm/upgrade/codemods/review-sites.mjs.map +1 -0
  700. package/esm/upgrade/diff.mjs +119 -0
  701. package/esm/upgrade/diff.mjs.map +1 -0
  702. package/esm/upgrade/format-upgrade-report.mjs +32 -0
  703. package/esm/upgrade/format-upgrade-report.mjs.map +1 -0
  704. package/esm/upgrade/load-ts-morph.mjs +48 -0
  705. package/esm/upgrade/load-ts-morph.mjs.map +1 -0
  706. package/esm/upgrade/notes.mjs +16 -0
  707. package/esm/upgrade/notes.mjs.map +1 -0
  708. package/esm/upgrade/run-upgrade.mjs +246 -0
  709. package/esm/upgrade/run-upgrade.mjs.map +1 -0
  710. package/esm/upgrade/upgrade-command.action.mjs +37 -0
  711. package/esm/upgrade/upgrade-command.action.mjs.map +1 -0
  712. package/esm/upgrade/version.mjs +39 -0
  713. package/esm/upgrade/version.mjs.map +1 -0
  714. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  715. package/esm/utils/clock.d.mts +33 -0
  716. package/esm/utils/clock.d.mts.map +1 -0
  717. package/esm/utils/clock.mjs +27 -0
  718. package/esm/utils/clock.mjs.map +1 -0
  719. package/esm/utils/framework-vesion.mjs +1 -1
  720. package/esm/utils/framework-vesion.mjs.map +1 -1
  721. package/esm/utils/ids.d.mts +32 -0
  722. package/esm/utils/ids.d.mts.map +1 -0
  723. package/esm/utils/ids.mjs +33 -0
  724. package/esm/utils/ids.mjs.map +1 -0
  725. package/esm/utils/index.d.mts +3 -0
  726. package/esm/utils/index.mjs +3 -0
  727. package/esm/utils/runtime.d.mts +59 -0
  728. package/esm/utils/runtime.d.mts.map +1 -0
  729. package/esm/utils/runtime.mjs +85 -0
  730. package/esm/utils/runtime.mjs.map +1 -0
  731. package/esm/validation/index.d.mts +1 -1
  732. package/esm/validation/types.d.mts +57 -2
  733. package/esm/validation/types.d.mts.map +1 -1
  734. package/esm/validation/validateAll.mjs +19 -2
  735. package/esm/validation/validateAll.mjs.map +1 -1
  736. package/esm/validation/validation-failure-status.mjs +15 -0
  737. package/esm/validation/validation-failure-status.mjs.map +1 -0
  738. package/esm/validation/validators/file-validator.d.mts +0 -16
  739. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  740. package/esm/warlock-config/bundle-config.mjs +1 -1
  741. package/esm/warlock-config/types.d.mts +27 -3
  742. package/esm/warlock-config/types.d.mts.map +1 -1
  743. package/llms-full.txt +3166 -736
  744. package/llms.txt +16 -6
  745. package/package.json +43 -13
  746. package/schemas/inspect-report.schema.json +554 -0
  747. package/skills/README.md +9 -0
  748. package/skills/add-connector/SKILL.md +26 -38
  749. package/skills/benchmark-code/SKILL.md +30 -24
  750. package/skills/build-restful/SKILL.md +14 -14
  751. package/skills/build-url/SKILL.md +18 -18
  752. package/skills/configure-app/SKILL.md +107 -14
  753. package/skills/create-controller/SKILL.md +25 -12
  754. package/skills/create-module/SKILL.md +3 -3
  755. package/skills/define-resource/SKILL.md +32 -29
  756. package/skills/encrypt-data/SKILL.md +21 -19
  757. package/skills/generate-openapi/SKILL.md +50 -24
  758. package/skills/hash-password/SKILL.md +2 -2
  759. package/skills/health-checks/SKILL.md +24 -7
  760. package/skills/index.md +9 -4
  761. package/skills/lower-stage3-decorators/SKILL.md +4 -4
  762. package/skills/make-endpoint/SKILL.md +110 -0
  763. package/skills/model-factories/SKILL.md +92 -0
  764. package/skills/process-image/SKILL.md +32 -30
  765. package/skills/register-route/SKILL.md +109 -10
  766. package/skills/request-memo/SKILL.md +1 -1
  767. package/skills/request-tracing/SKILL.md +4 -1
  768. package/skills/resolve-path/SKILL.md +45 -44
  769. package/skills/retry-operation/SKILL.md +20 -11
  770. package/skills/run-app/SKILL.md +106 -22
  771. package/skills/send-response/SKILL.md +179 -14
  772. package/skills/store-file/SKILL.md +93 -53
  773. package/skills/test-fakes/SKILL.md +123 -0
  774. package/skills/test-http/SKILL.md +125 -21
  775. package/skills/test-service/SKILL.md +41 -1
  776. package/skills/update-packages/SKILL.md +29 -18
  777. package/skills/upgrade-from-5-29/SKILL.md +413 -0
  778. package/skills/upload-file/SKILL.md +31 -33
  779. package/skills/use-app-context/SKILL.md +38 -31
  780. package/skills/use-middleware/SKILL.md +45 -25
  781. package/skills/use-model-transformers/SKILL.md +37 -28
  782. package/skills/use-repository/SKILL.md +2 -2
  783. package/skills/validate-input/SKILL.md +72 -28
  784. package/skills/warlock-agents-md/SKILL.md +96 -0
  785. package/skills/warlock-board/SKILL.md +123 -0
  786. package/skills/warlock-check/SKILL.md +132 -0
  787. package/skills/warlock-conventions/SKILL.md +115 -0
  788. package/skills/warlock-doctor/SKILL.md +55 -22
  789. package/skills/warlock-inspect/SKILL.md +134 -0
  790. package/skills/warlock-mcp/SKILL.md +120 -0
  791. package/skills/warlock-routes/SKILL.md +18 -11
  792. package/skills/warlock-trace/SKILL.md +81 -0
  793. package/skills/wire-socket/SKILL.md +8 -8
  794. package/skills/write-seeder/SKILL.md +46 -32
  795. package/skills/write-use-case/SKILL.md +40 -27
  796. package/esm/http/uploads/matches-if-none-match.mjs +0 -13
  797. package/esm/http/uploads/matches-if-none-match.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md-markers.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/agents-md/agents-md-markers.ts"],"mappings":";;cAGa,cAAA;;cAGA,eAAA;;cAGA,aAAA;AAHb;;;;AAA4B;AAG5B;;;;AAA0B;AAoC1B;;;;AAAoF;;AAvCpF,iBAuCgB,sBAAA,CAAuB,QAAA,sBAA8B,OAAe"}
@@ -0,0 +1,59 @@
1
+ import { WarlockError } from "../../errors/warlock-error.mjs";
2
+
3
+ //#region ../../packages/core/src/tooling/agents-md/agents-md-markers.ts
4
+ /** The file `warlock agents-md --write` and `warlock dev` maintain, at the project root. */
5
+ const AGENTS_MD_FILE = "AGENTS.md";
6
+ /** Opens the generated section. Everything outside the two markers is hand-written. */
7
+ const AGENTS_MD_START = "<!-- warlock:generated:start -->";
8
+ /** Closes the generated section. */
9
+ const AGENTS_MD_END = "<!-- warlock:generated:end -->";
10
+ /** Every index at which `needle` occurs in `text`. */
11
+ function occurrences(text, needle) {
12
+ const found = [];
13
+ let index = text.indexOf(needle);
14
+ while (index !== -1) {
15
+ found.push(index);
16
+ index = text.indexOf(needle, index + needle.length);
17
+ }
18
+ return found;
19
+ }
20
+ /** The line break the file already uses, so an inserted section matches it. */
21
+ function lineBreakOf(text) {
22
+ return text.includes("\r\n") ? "\r\n" : "\n";
23
+ }
24
+ /**
25
+ * Put `section` between the generated-section markers of `existing`.
26
+ *
27
+ * - `existing` undefined (no file): the markers and the section, alone.
28
+ * - no markers: the existing text unchanged, then a blank line, then the
29
+ * markers and the section at the end.
30
+ * - one start marker followed by one end marker: only the bytes between them
31
+ * are replaced; the markers and everything outside them stay byte-for-byte.
32
+ *
33
+ * Throws `WL7501` when the markers are malformed (one without the other, a
34
+ * duplicate, or the end before the start) — rather than guess which part is
35
+ * hand-written.
36
+ *
37
+ * @param existing The current file content, or `undefined` when the file does not exist.
38
+ * @param section The generated markdown, without markers.
39
+ */
40
+ function upsertGeneratedSection(existing, section) {
41
+ const eol = existing === void 0 ? "\n" : lineBreakOf(existing);
42
+ const block = `${AGENTS_MD_START}${eol}${section.replace(/\r?\n/g, eol).replace(/(?:\r?\n)+$/, "")}${eol}${AGENTS_MD_END}`;
43
+ if (existing === void 0) return `${block}${eol}`;
44
+ const starts = occurrences(existing, AGENTS_MD_START);
45
+ const ends = occurrences(existing, AGENTS_MD_END);
46
+ if (starts.length === 0 && ends.length === 0) {
47
+ if (existing.length === 0) return `${block}${eol}`;
48
+ return `${existing}${existing.endsWith(eol) ? eol : `${eol}${eol}`}${block}${eol}`;
49
+ }
50
+ const [start] = starts;
51
+ const [end] = ends;
52
+ if (starts.length !== 1 || ends.length !== 1 || start === void 0 || end === void 0) throw new WarlockError("WL7501", `AGENTS.md has ${starts.length} "${AGENTS_MD_START}" and ${ends.length} "${AGENTS_MD_END}" marker(s); expected exactly one of each. Fix the markers by hand — nothing was written.`);
53
+ if (end < start) throw new WarlockError("WL7501", `AGENTS.md has "${AGENTS_MD_END}" before "${AGENTS_MD_START}". Fix the markers by hand — nothing was written.`);
54
+ return `${existing.slice(0, start)}${block}${existing.slice(end + 30)}`;
55
+ }
56
+
57
+ //#endregion
58
+ export { AGENTS_MD_END, AGENTS_MD_FILE, AGENTS_MD_START, upsertGeneratedSection };
59
+ //# sourceMappingURL=agents-md-markers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md-markers.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/agents-md/agents-md-markers.ts"],"sourcesContent":["import { WarlockError } from \"../../errors/warlock-error\";\n\n/** The file `warlock agents-md --write` and `warlock dev` maintain, at the project root. */\nexport const AGENTS_MD_FILE = \"AGENTS.md\";\n\n/** Opens the generated section. Everything outside the two markers is hand-written. */\nexport const AGENTS_MD_START = \"<!-- warlock:generated:start -->\";\n\n/** Closes the generated section. */\nexport const AGENTS_MD_END = \"<!-- warlock:generated:end -->\";\n\n/** Every index at which `needle` occurs in `text`. */\nfunction occurrences(text: string, needle: string): number[] {\n const found: number[] = [];\n let index = text.indexOf(needle);\n\n while (index !== -1) {\n found.push(index);\n index = text.indexOf(needle, index + needle.length);\n }\n\n return found;\n}\n\n/** The line break the file already uses, so an inserted section matches it. */\nfunction lineBreakOf(text: string): string {\n return text.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n}\n\n/**\n * Put `section` between the generated-section markers of `existing`.\n *\n * - `existing` undefined (no file): the markers and the section, alone.\n * - no markers: the existing text unchanged, then a blank line, then the\n * markers and the section at the end.\n * - one start marker followed by one end marker: only the bytes between them\n * are replaced; the markers and everything outside them stay byte-for-byte.\n *\n * Throws `WL7501` when the markers are malformed (one without the other, a\n * duplicate, or the end before the start) — rather than guess which part is\n * hand-written.\n *\n * @param existing The current file content, or `undefined` when the file does not exist.\n * @param section The generated markdown, without markers.\n */\nexport function upsertGeneratedSection(existing: string | undefined, section: string): string {\n const eol = existing === undefined ? \"\\n\" : lineBreakOf(existing);\n const body = section.replace(/\\r?\\n/g, eol).replace(/(?:\\r?\\n)+$/, \"\");\n const block = `${AGENTS_MD_START}${eol}${body}${eol}${AGENTS_MD_END}`;\n\n if (existing === undefined) return `${block}${eol}`;\n\n const starts = occurrences(existing, AGENTS_MD_START);\n const ends = occurrences(existing, AGENTS_MD_END);\n\n if (starts.length === 0 && ends.length === 0) {\n if (existing.length === 0) return `${block}${eol}`;\n\n const separator = existing.endsWith(eol) ? eol : `${eol}${eol}`;\n\n return `${existing}${separator}${block}${eol}`;\n }\n\n const [start] = starts;\n const [end] = ends;\n\n if (starts.length !== 1 || ends.length !== 1 || start === undefined || end === undefined) {\n throw new WarlockError(\n \"WL7501\",\n `AGENTS.md has ${starts.length} \"${AGENTS_MD_START}\" and ${ends.length} \"${AGENTS_MD_END}\" marker(s); expected exactly one of each. Fix the markers by hand — nothing was written.`,\n );\n }\n\n if (end < start) {\n throw new WarlockError(\n \"WL7501\",\n `AGENTS.md has \"${AGENTS_MD_END}\" before \"${AGENTS_MD_START}\". Fix the markers by hand — nothing was written.`,\n );\n }\n\n return `${existing.slice(0, start)}${block}${existing.slice(end + AGENTS_MD_END.length)}`;\n}\n"],"mappings":";;;;AAGA,MAAa,iBAAiB;;AAG9B,MAAa,kBAAkB;;AAG/B,MAAa,gBAAgB;;AAG7B,SAAS,YAAY,MAAc,QAA0B;CAC3D,MAAM,QAAkB,CAAC;CACzB,IAAI,QAAQ,KAAK,QAAQ,MAAM;CAE/B,OAAO,UAAU,IAAI;EACnB,MAAM,KAAK,KAAK;EAChB,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,OAAO,MAAM;CACpD;CAEA,OAAO;AACT;;AAGA,SAAS,YAAY,MAAsB;CACzC,OAAO,KAAK,SAAS,MAAM,IAAI,SAAS;AAC1C;;;;;;;;;;;;;;;;;AAkBA,SAAgB,uBAAuB,UAA8B,SAAyB;CAC5F,MAAM,MAAM,aAAa,SAAY,OAAO,YAAY,QAAQ;CAEhE,MAAM,QAAQ,GAAG,kBAAkB,MADtB,QAAQ,QAAQ,UAAU,GAAG,CAAC,CAAC,QAAQ,eAAe,EACvB,IAAI,MAAM;CAEtD,IAAI,aAAa,QAAW,OAAO,GAAG,QAAQ;CAE9C,MAAM,SAAS,YAAY,UAAU,eAAe;CACpD,MAAM,OAAO,YAAY,UAAU,aAAa;CAEhD,IAAI,OAAO,WAAW,KAAK,KAAK,WAAW,GAAG;EAC5C,IAAI,SAAS,WAAW,GAAG,OAAO,GAAG,QAAQ;EAI7C,OAAO,GAAG,WAFQ,SAAS,SAAS,GAAG,IAAI,MAAM,GAAG,MAAM,QAEzB,QAAQ;CAC3C;CAEA,MAAM,CAAC,SAAS;CAChB,MAAM,CAAC,OAAO;CAEd,IAAI,OAAO,WAAW,KAAK,KAAK,WAAW,KAAK,UAAU,UAAa,QAAQ,QAC7E,MAAM,IAAI,aACR,UACA,iBAAiB,OAAO,OAAO,IAAI,gBAAgB,QAAQ,KAAK,OAAO,IAAI,cAAc,0FAC3F;CAGF,IAAI,MAAM,OACR,MAAM,IAAI,aACR,UACA,kBAAkB,cAAc,YAAY,gBAAgB,kDAC9D;CAGF,OAAO,GAAG,SAAS,MAAM,GAAG,KAAK,IAAI,QAAQ,SAAS,MAAM,MAAM,EAAoB;AACxF"}
@@ -0,0 +1,36 @@
1
+ import { InspectReport } from "../inspect/inspect-report.types.mjs";
2
+ import { WriteAgentsMdResult } from "./write-agents-md.mjs";
3
+
4
+ //#region ../../packages/core/src/tooling/agents-md/agents-md-refresher.d.ts
5
+ /** Options of {@link createAgentsMdRefresher}. */
6
+ type AgentsMdRefresherOptions = {
7
+ /** Project root. Default: `process.cwd()`. */cwd?: string; /** Produce a fresh report (the dev server calls `inspectApp()` in-process). */
8
+ collect: () => Promise<InspectReport>; /** Quiet period after the last `schedule()` before a refresh runs. Default: 1000 ms. */
9
+ debounceMs?: number; /** Create AGENTS.md when it is missing. Default: `true`. */
10
+ create?: boolean; /** Called with each refresh's result. */
11
+ onWrite?: (result: WriteAgentsMdResult) => void; /** Called when a refresh fails; the error never escapes the timer. */
12
+ onError?: (error: unknown) => void;
13
+ };
14
+ /** A debounced AGENTS.md refresher. */
15
+ type AgentsMdRefresher = {
16
+ /** Ask for a refresh; calls within `debounceMs` of each other collapse into one. */schedule(): void; /** Run a pending (or, with none pending, a fresh) refresh now and wait for it. */
17
+ flush(): Promise<void>; /** Cancel a pending refresh; later `schedule()` calls do nothing. */
18
+ dispose(): void;
19
+ };
20
+ /**
21
+ * Keep AGENTS.md's generated section current while `warlock dev` runs: the
22
+ * server calls `schedule()` on boot and after each reload that changed
23
+ * routes or modules, and one refresh runs once the burst settles. Refreshes
24
+ * never overlap; a request made during one runs after it.
25
+ *
26
+ * @example
27
+ * const refresher = createAgentsMdRefresher({
28
+ * collect: () => inspectApp({ sections: ["routes", "models", "packages"] }),
29
+ * onError: (error) => devLogWarn(`AGENTS.md not refreshed: ${String(error)}`),
30
+ * });
31
+ * refresher.schedule();
32
+ */
33
+ declare function createAgentsMdRefresher(options: AgentsMdRefresherOptions): AgentsMdRefresher;
34
+ //#endregion
35
+ export { AgentsMdRefresher, AgentsMdRefresherOptions, createAgentsMdRefresher };
36
+ //# sourceMappingURL=agents-md-refresher.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md-refresher.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/agents-md/agents-md-refresher.ts"],"mappings":";;;;;KAIY,wBAAA;EAAA,8CAEV,GAAA;EAEA,OAAA,QAAe,OAAA,CAAQ,aAAA,GAAR;EAEf,UAAA,WAIsC;EAFtC,MAAA,YANA;EAQA,OAAA,IAAW,MAAA,EAAQ,mBAAA,WANJ;EAQf,OAAA,IAAW,KAAA;AAAA;;KAID,iBAAA;EANS,oFAQnB,QAAA,UANA;EAQA,KAAA,IAAS,OAAO,QARS;EAUzB,OAAA;AAAA;;;;;;;;;AAAO;AAgBT;;;;iBAAgB,uBAAA,CAAwB,OAAA,EAAS,wBAAA,GAA2B,iBAAiB"}
@@ -0,0 +1,72 @@
1
+ import { writeAgentsMd } from "./write-agents-md.mjs";
2
+
3
+ //#region ../../packages/core/src/tooling/agents-md/agents-md-refresher.ts
4
+ /**
5
+ * Keep AGENTS.md's generated section current while `warlock dev` runs: the
6
+ * server calls `schedule()` on boot and after each reload that changed
7
+ * routes or modules, and one refresh runs once the burst settles. Refreshes
8
+ * never overlap; a request made during one runs after it.
9
+ *
10
+ * @example
11
+ * const refresher = createAgentsMdRefresher({
12
+ * collect: () => inspectApp({ sections: ["routes", "models", "packages"] }),
13
+ * onError: (error) => devLogWarn(`AGENTS.md not refreshed: ${String(error)}`),
14
+ * });
15
+ * refresher.schedule();
16
+ */
17
+ function createAgentsMdRefresher(options) {
18
+ const debounceMs = options.debounceMs ?? 1e3;
19
+ let timer;
20
+ let running = Promise.resolve();
21
+ let disposed = false;
22
+ const refresh = async () => {
23
+ try {
24
+ const report = await options.collect();
25
+ const result = writeAgentsMd({
26
+ cwd: options.cwd,
27
+ report,
28
+ create: options.create
29
+ });
30
+ options.onWrite?.(result);
31
+ } catch (error) {
32
+ options.onError?.(error);
33
+ }
34
+ };
35
+ const run = () => {
36
+ running = running.then(refresh);
37
+ return running;
38
+ };
39
+ return {
40
+ schedule() {
41
+ if (disposed) return;
42
+ if (timer !== void 0) clearTimeout(timer);
43
+ timer = setTimeout(() => {
44
+ timer = void 0;
45
+ run();
46
+ }, debounceMs);
47
+ timer.unref?.();
48
+ },
49
+ async flush() {
50
+ if (timer !== void 0) {
51
+ clearTimeout(timer);
52
+ timer = void 0;
53
+ }
54
+ if (disposed) {
55
+ await running;
56
+ return;
57
+ }
58
+ await run();
59
+ },
60
+ dispose() {
61
+ disposed = true;
62
+ if (timer !== void 0) {
63
+ clearTimeout(timer);
64
+ timer = void 0;
65
+ }
66
+ }
67
+ };
68
+ }
69
+
70
+ //#endregion
71
+ export { createAgentsMdRefresher };
72
+ //# sourceMappingURL=agents-md-refresher.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md-refresher.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/agents-md/agents-md-refresher.ts"],"sourcesContent":["import type { InspectReport } from \"../inspect/inspect-report.types\";\nimport { writeAgentsMd, type WriteAgentsMdResult } from \"./write-agents-md\";\n\n/** Options of {@link createAgentsMdRefresher}. */\nexport type AgentsMdRefresherOptions = {\n /** Project root. Default: `process.cwd()`. */\n cwd?: string;\n /** Produce a fresh report (the dev server calls `inspectApp()` in-process). */\n collect: () => Promise<InspectReport>;\n /** Quiet period after the last `schedule()` before a refresh runs. Default: 1000 ms. */\n debounceMs?: number;\n /** Create AGENTS.md when it is missing. Default: `true`. */\n create?: boolean;\n /** Called with each refresh's result. */\n onWrite?: (result: WriteAgentsMdResult) => void;\n /** Called when a refresh fails; the error never escapes the timer. */\n onError?: (error: unknown) => void;\n};\n\n/** A debounced AGENTS.md refresher. */\nexport type AgentsMdRefresher = {\n /** Ask for a refresh; calls within `debounceMs` of each other collapse into one. */\n schedule(): void;\n /** Run a pending (or, with none pending, a fresh) refresh now and wait for it. */\n flush(): Promise<void>;\n /** Cancel a pending refresh; later `schedule()` calls do nothing. */\n dispose(): void;\n};\n\n/**\n * Keep AGENTS.md's generated section current while `warlock dev` runs: the\n * server calls `schedule()` on boot and after each reload that changed\n * routes or modules, and one refresh runs once the burst settles. Refreshes\n * never overlap; a request made during one runs after it.\n *\n * @example\n * const refresher = createAgentsMdRefresher({\n * collect: () => inspectApp({ sections: [\"routes\", \"models\", \"packages\"] }),\n * onError: (error) => devLogWarn(`AGENTS.md not refreshed: ${String(error)}`),\n * });\n * refresher.schedule();\n */\nexport function createAgentsMdRefresher(options: AgentsMdRefresherOptions): AgentsMdRefresher {\n const debounceMs = options.debounceMs ?? 1000;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let running: Promise<void> = Promise.resolve();\n let disposed = false;\n\n const refresh = async (): Promise<void> => {\n try {\n const report = await options.collect();\n const result = writeAgentsMd({ cwd: options.cwd, report, create: options.create });\n\n options.onWrite?.(result);\n } catch (error) {\n options.onError?.(error);\n }\n };\n\n const run = (): Promise<void> => {\n running = running.then(refresh);\n return running;\n };\n\n return {\n schedule() {\n if (disposed) return;\n if (timer !== undefined) clearTimeout(timer);\n\n timer = setTimeout(() => {\n timer = undefined;\n void run();\n }, debounceMs);\n timer.unref?.();\n },\n async flush() {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n\n if (disposed) {\n await running;\n return;\n }\n\n await run();\n },\n dispose() {\n disposed = true;\n\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA0CA,SAAgB,wBAAwB,SAAsD;CAC5F,MAAM,aAAa,QAAQ,cAAc;CACzC,IAAI;CACJ,IAAI,UAAyB,QAAQ,QAAQ;CAC7C,IAAI,WAAW;CAEf,MAAM,UAAU,YAA2B;EACzC,IAAI;GACF,MAAM,SAAS,MAAM,QAAQ,QAAQ;GACrC,MAAM,SAAS,cAAc;IAAE,KAAK,QAAQ;IAAK;IAAQ,QAAQ,QAAQ;GAAO,CAAC;GAEjF,QAAQ,UAAU,MAAM;EAC1B,SAAS,OAAO;GACd,QAAQ,UAAU,KAAK;EACzB;CACF;CAEA,MAAM,YAA2B;EAC/B,UAAU,QAAQ,KAAK,OAAO;EAC9B,OAAO;CACT;CAEA,OAAO;EACL,WAAW;GACT,IAAI,UAAU;GACd,IAAI,UAAU,QAAW,aAAa,KAAK;GAE3C,QAAQ,iBAAiB;IACvB,QAAQ;IACR,AAAK,IAAI;GACX,GAAG,UAAU;GACb,MAAM,QAAQ;EAChB;EACA,MAAM,QAAQ;GACZ,IAAI,UAAU,QAAW;IACvB,aAAa,KAAK;IAClB,QAAQ;GACV;GAEA,IAAI,UAAU;IACZ,MAAM;IACN;GACF;GAEA,MAAM,IAAI;EACZ;EACA,UAAU;GACR,WAAW;GAEX,IAAI,UAAU,QAAW;IACvB,aAAa,KAAK;IAClB,QAAQ;GACV;EACF;CACF;AACF"}
@@ -0,0 +1,7 @@
1
+ import { AGENTS_MD_END, AGENTS_MD_FILE, AGENTS_MD_START, upsertGeneratedSection } from "./agents-md-markers.mjs";
2
+ import { listInstalledSkills, parseSkillFrontMatter, shortSkillLine } from "./installed-skills.mjs";
3
+ import { listAppModules, renderAgentsMdSection } from "./render-agents-md.mjs";
4
+ import { writeAgentsMd } from "./write-agents-md.mjs";
5
+ import { createAgentsMdRefresher } from "./agents-md-refresher.mjs";
6
+
7
+ export { AGENTS_MD_END, AGENTS_MD_FILE, AGENTS_MD_START, createAgentsMdRefresher, listAppModules, listInstalledSkills, parseSkillFrontMatter, renderAgentsMdSection, shortSkillLine, upsertGeneratedSection, writeAgentsMd };
@@ -0,0 +1,30 @@
1
+ //#region ../../packages/core/src/tooling/agents-md/installed-skills.d.ts
2
+ /** One `SKILL.md` an installed `@warlock.js/*` package ships. */
3
+ type InstalledSkill = {
4
+ /** The package, e.g. `@warlock.js/core`. */package: string; /** The skill folder name, e.g. `warlock-inspect`. */
5
+ slug: string; /** The `name` from the front matter (the slug when absent). */
6
+ name: string; /** The full `description` from the front matter (empty when absent). */
7
+ description: string; /** Project-relative POSIX path of the `SKILL.md`. */
8
+ file: string;
9
+ };
10
+ /** The `name` and `description` of a `SKILL.md`'s front matter. */
11
+ declare function parseSkillFrontMatter(content: string): {
12
+ name?: string;
13
+ description?: string;
14
+ };
15
+ /**
16
+ * The first sentence of a skill description, capped at `max` characters —
17
+ * the one line an agent reads to decide whether to open the skill.
18
+ */
19
+ declare function shortSkillLine(description: string, max?: number): string;
20
+ /**
21
+ * Every skill the installed `@warlock.js/*` packages ship, read from
22
+ * `<cwd>/node_modules/@warlock.js/<package>/skills/<slug>/SKILL.md`.
23
+ * Sorted by package, then slug. Reads only the local install: no network.
24
+ *
25
+ * @param cwd The project root.
26
+ */
27
+ declare function listInstalledSkills(cwd: string): InstalledSkill[];
28
+ //#endregion
29
+ export { InstalledSkill, listInstalledSkills, parseSkillFrontMatter, shortSkillLine };
30
+ //# sourceMappingURL=installed-skills.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installed-skills.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/agents-md/installed-skills.ts"],"mappings":";;KAIY,cAAA;EAAc,4CAExB,OAAA,UAFwB;EAIxB,IAAA;EAEA,IAAA,UAEA;EAAA,WAAA,UAEI;EAAJ,IAAA;AAAA;;iBAiCc,qBAAA,CAAsB,OAAA;EAAoB,IAAA;EAAe,WAAA;AAAA;;;AAAW;AAepF;iBAAgB,cAAA,CAAe,WAAA,UAAqB,GAAS;;;AAAA;AAc7D;;;;iBAAgB,mBAAA,CAAoB,GAAA,WAAc,cAAc"}
@@ -0,0 +1,74 @@
1
+ import path from "node:path";
2
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
3
+
4
+ //#region ../../packages/core/src/tooling/agents-md/installed-skills.ts
5
+ function directories(directory) {
6
+ try {
7
+ return readdirSync(directory, { withFileTypes: true }).filter((entry) => entry.isDirectory() || entry.isSymbolicLink()).map((entry) => entry.name).sort();
8
+ } catch {
9
+ return [];
10
+ }
11
+ }
12
+ /** Read a front-matter scalar, unquoting YAML single/double-quoted values. */
13
+ function frontMatterValue(frontMatter, key) {
14
+ const raw = new RegExp(`^${key}:[ \\t]*(.*)$`, "m").exec(frontMatter)?.[1]?.trim();
15
+ if (raw === void 0 || raw.length === 0) return void 0;
16
+ if (raw.startsWith("'") && raw.endsWith("'") && raw.length >= 2) return raw.slice(1, -1).replace(/''/g, "'");
17
+ if (raw.startsWith("\"") && raw.endsWith("\"") && raw.length >= 2) return raw.slice(1, -1).replace(/\\"/g, "\"");
18
+ return raw;
19
+ }
20
+ /** The `name` and `description` of a `SKILL.md`'s front matter. */
21
+ function parseSkillFrontMatter(content) {
22
+ const match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(content);
23
+ if (!match?.[1]) return {};
24
+ return {
25
+ name: frontMatterValue(match[1], "name"),
26
+ description: frontMatterValue(match[1], "description")
27
+ };
28
+ }
29
+ /**
30
+ * The first sentence of a skill description, capped at `max` characters —
31
+ * the one line an agent reads to decide whether to open the skill.
32
+ */
33
+ function shortSkillLine(description, max = 120) {
34
+ const compact = description.replace(/\s+/g, " ").trim();
35
+ const sentence = /^(.+?[.!?])(?:\s|$)/.exec(compact)?.[1] ?? compact;
36
+ return sentence.length > max ? `${sentence.slice(0, max - 1).trimEnd()}…` : sentence;
37
+ }
38
+ /**
39
+ * Every skill the installed `@warlock.js/*` packages ship, read from
40
+ * `<cwd>/node_modules/@warlock.js/<package>/skills/<slug>/SKILL.md`.
41
+ * Sorted by package, then slug. Reads only the local install: no network.
42
+ *
43
+ * @param cwd The project root.
44
+ */
45
+ function listInstalledSkills(cwd) {
46
+ const scope = path.join(cwd, "node_modules", "@warlock.js");
47
+ const skills = [];
48
+ for (const packageFolder of directories(scope)) {
49
+ const skillsRoot = path.join(scope, packageFolder, "skills");
50
+ for (const slug of directories(skillsRoot)) {
51
+ const file = path.join(skillsRoot, slug, "SKILL.md");
52
+ if (!existsSync(file)) continue;
53
+ let content;
54
+ try {
55
+ content = readFileSync(file, "utf8");
56
+ } catch {
57
+ continue;
58
+ }
59
+ const front = parseSkillFrontMatter(content);
60
+ skills.push({
61
+ package: `@warlock.js/${packageFolder}`,
62
+ slug,
63
+ name: front.name ?? slug,
64
+ description: front.description ?? "",
65
+ file: path.relative(cwd, file).split(path.sep).join("/")
66
+ });
67
+ }
68
+ }
69
+ return skills;
70
+ }
71
+
72
+ //#endregion
73
+ export { listInstalledSkills, parseSkillFrontMatter, shortSkillLine };
74
+ //# sourceMappingURL=installed-skills.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installed-skills.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/agents-md/installed-skills.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/** One `SKILL.md` an installed `@warlock.js/*` package ships. */\nexport type InstalledSkill = {\n /** The package, e.g. `@warlock.js/core`. */\n package: string;\n /** The skill folder name, e.g. `warlock-inspect`. */\n slug: string;\n /** The `name` from the front matter (the slug when absent). */\n name: string;\n /** The full `description` from the front matter (empty when absent). */\n description: string;\n /** Project-relative POSIX path of the `SKILL.md`. */\n file: string;\n};\n\nfunction directories(directory: string): string[] {\n try {\n return readdirSync(directory, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() || entry.isSymbolicLink())\n .map((entry) => entry.name)\n .sort();\n } catch {\n return [];\n }\n}\n\n/** Read a front-matter scalar, unquoting YAML single/double-quoted values. */\nfunction frontMatterValue(frontMatter: string, key: string): string | undefined {\n const match = new RegExp(`^${key}:[ \\\\t]*(.*)$`, \"m\").exec(frontMatter);\n const raw = match?.[1]?.trim();\n\n if (raw === undefined || raw.length === 0) return undefined;\n\n if (raw.startsWith(\"'\") && raw.endsWith(\"'\") && raw.length >= 2) {\n return raw.slice(1, -1).replace(/''/g, \"'\");\n }\n\n if (raw.startsWith('\"') && raw.endsWith('\"') && raw.length >= 2) {\n return raw.slice(1, -1).replace(/\\\\\"/g, '\"');\n }\n\n return raw;\n}\n\n/** The `name` and `description` of a `SKILL.md`'s front matter. */\nexport function parseSkillFrontMatter(content: string): { name?: string; description?: string } {\n const match = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/.exec(content);\n\n if (!match?.[1]) return {};\n\n return {\n name: frontMatterValue(match[1], \"name\"),\n description: frontMatterValue(match[1], \"description\"),\n };\n}\n\n/**\n * The first sentence of a skill description, capped at `max` characters —\n * the one line an agent reads to decide whether to open the skill.\n */\nexport function shortSkillLine(description: string, max = 120): string {\n const compact = description.replace(/\\s+/g, \" \").trim();\n const sentence = /^(.+?[.!?])(?:\\s|$)/.exec(compact)?.[1] ?? compact;\n\n return sentence.length > max ? `${sentence.slice(0, max - 1).trimEnd()}…` : sentence;\n}\n\n/**\n * Every skill the installed `@warlock.js/*` packages ship, read from\n * `<cwd>/node_modules/@warlock.js/<package>/skills/<slug>/SKILL.md`.\n * Sorted by package, then slug. Reads only the local install: no network.\n *\n * @param cwd The project root.\n */\nexport function listInstalledSkills(cwd: string): InstalledSkill[] {\n const scope = path.join(cwd, \"node_modules\", \"@warlock.js\");\n const skills: InstalledSkill[] = [];\n\n for (const packageFolder of directories(scope)) {\n const skillsRoot = path.join(scope, packageFolder, \"skills\");\n\n for (const slug of directories(skillsRoot)) {\n const file = path.join(skillsRoot, slug, \"SKILL.md\");\n\n if (!existsSync(file)) continue;\n\n let content: string;\n\n try {\n content = readFileSync(file, \"utf8\");\n } catch {\n continue;\n }\n\n const front = parseSkillFrontMatter(content);\n\n skills.push({\n package: `@warlock.js/${packageFolder}`,\n slug,\n name: front.name ?? slug,\n description: front.description ?? \"\",\n file: path.relative(cwd, file).split(path.sep).join(\"/\"),\n });\n }\n }\n\n return skills;\n}\n"],"mappings":";;;;AAiBA,SAAS,YAAY,WAA6B;CAChD,IAAI;EACF,OAAO,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC,CAAC,CACnD,QAAQ,UAAU,MAAM,YAAY,KAAK,MAAM,eAAe,CAAC,CAAC,CAChE,KAAK,UAAU,MAAM,IAAI,CAAC,CAC1B,KAAK;CACV,QAAQ;EACN,OAAO,CAAC;CACV;AACF;;AAGA,SAAS,iBAAiB,aAAqB,KAAiC;CAE9E,MAAM,MADQ,IAAI,OAAO,IAAI,IAAI,gBAAgB,GAAG,CAAC,CAAC,KAAK,WAC3C,CAAC,GAAG,EAAE,EAAE,KAAK;CAE7B,IAAI,QAAQ,UAAa,IAAI,WAAW,GAAG,OAAO;CAElD,IAAI,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,UAAU,GAC5D,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,OAAO,GAAG;CAG5C,IAAI,IAAI,WAAW,IAAG,KAAK,IAAI,SAAS,IAAG,KAAK,IAAI,UAAU,GAC5D,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,QAAQ,IAAG;CAG7C,OAAO;AACT;;AAGA,SAAgB,sBAAsB,SAA0D;CAC9F,MAAM,QAAQ,8BAA8B,KAAK,OAAO;CAExD,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC;CAEzB,OAAO;EACL,MAAM,iBAAiB,MAAM,IAAI,MAAM;EACvC,aAAa,iBAAiB,MAAM,IAAI,aAAa;CACvD;AACF;;;;;AAMA,SAAgB,eAAe,aAAqB,MAAM,KAAa;CACrE,MAAM,UAAU,YAAY,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;CACtD,MAAM,WAAW,sBAAsB,KAAK,OAAO,CAAC,GAAG,MAAM;CAE7D,OAAO,SAAS,SAAS,MAAM,GAAG,SAAS,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK;AAC9E;;;;;;;;AASA,SAAgB,oBAAoB,KAA+B;CACjE,MAAM,QAAQ,KAAK,KAAK,KAAK,gBAAgB,aAAa;CAC1D,MAAM,SAA2B,CAAC;CAElC,KAAK,MAAM,iBAAiB,YAAY,KAAK,GAAG;EAC9C,MAAM,aAAa,KAAK,KAAK,OAAO,eAAe,QAAQ;EAE3D,KAAK,MAAM,QAAQ,YAAY,UAAU,GAAG;GAC1C,MAAM,OAAO,KAAK,KAAK,YAAY,MAAM,UAAU;GAEnD,IAAI,CAAC,WAAW,IAAI,GAAG;GAEvB,IAAI;GAEJ,IAAI;IACF,UAAU,aAAa,MAAM,MAAM;GACrC,QAAQ;IACN;GACF;GAEA,MAAM,QAAQ,sBAAsB,OAAO;GAE3C,OAAO,KAAK;IACV,SAAS,eAAe;IACxB;IACA,MAAM,MAAM,QAAQ;IACpB,aAAa,MAAM,eAAe;IAClC,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;GACzD,CAAC;EACH;CACF;CAEA,OAAO;AACT"}
@@ -0,0 +1,33 @@
1
+ import { InspectReport } from "../inspect/inspect-report.types.mjs";
2
+ import { InstalledSkill } from "./installed-skills.mjs";
3
+
4
+ //#region ../../packages/core/src/tooling/agents-md/render-agents-md.d.ts
5
+ /** Options of {@link renderAgentsMdSection}. */
6
+ type RenderAgentsMdOptions = {
7
+ /** Installed skills to list (see `listInstalledSkills`). Default: none listed. */skills?: readonly InstalledSkill[]; /** Module folder names under `src/app` (see `listAppModules`); merged with the ones routes and models name. */
8
+ modules?: readonly string[]; /** How many routes the compact list shows before pointing at `warlock inspect`. Default: 60. */
9
+ maxRoutes?: number;
10
+ };
11
+ /**
12
+ * The module folders under `<cwd>/src/app`, sorted. Empty when there is none.
13
+ *
14
+ * @param cwd The project root.
15
+ */
16
+ declare function listAppModules(cwd: string): string[];
17
+ /**
18
+ * Render the app-specific AGENTS.md section from an inspect report: the app
19
+ * and its Warlock packages, modules, a routes summary (unguarded writes
20
+ * flagged), models, the conventions `warlock check` enforces, the installed
21
+ * skills and the verify commands.
22
+ *
23
+ * Deterministic: no timestamps and stable ordering, so regenerating an
24
+ * unchanged app yields the same bytes and `writeAgentsMd` writes nothing.
25
+ * Returned without the markers.
26
+ *
27
+ * @param report An `inspectApp()` report (routes, models and packages are read when present).
28
+ * @param options Skills and module folders to include.
29
+ */
30
+ declare function renderAgentsMdSection(report: InspectReport, options?: RenderAgentsMdOptions): string;
31
+ //#endregion
32
+ export { RenderAgentsMdOptions, listAppModules, renderAgentsMdSection };
33
+ //# sourceMappingURL=render-agents-md.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-agents-md.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/agents-md/render-agents-md.ts"],"mappings":";;;;;KAMY,qBAAA;EAAA,kFAEV,MAAA,YAAkB,cAAc;EAEhC,OAAA,sBAFA;EAIA,SAAA;AAAA;;;AAAS;AAcX;;iBAAgB,cAAA,CAAe,GAAW;;AAAA;AAqO1C;;;;;;;;;AAEqC;;iBAFrB,qBAAA,CACd,MAAA,EAAQ,aAAA,EACR,OAAA,GAAS,qBAA0B"}
@@ -0,0 +1,195 @@
1
+ import { shortSkillLine } from "./installed-skills.mjs";
2
+ import path from "node:path";
3
+ import { readdirSync } from "node:fs";
4
+
5
+ //#region ../../packages/core/src/tooling/agents-md/render-agents-md.ts
6
+ /** Methods that change state; one of these without an auth guard is flagged. */
7
+ const MUTATING_METHODS = new Set([
8
+ "POST",
9
+ "PUT",
10
+ "PATCH",
11
+ "DELETE"
12
+ ]);
13
+ /** Fixed method order for the per-method counts. */
14
+ const METHOD_ORDER = [
15
+ "GET",
16
+ "POST",
17
+ "PUT",
18
+ "PATCH",
19
+ "DELETE",
20
+ "HEAD",
21
+ "OPTIONS"
22
+ ];
23
+ /**
24
+ * The module folders under `<cwd>/src/app`, sorted. Empty when there is none.
25
+ *
26
+ * @param cwd The project root.
27
+ */
28
+ function listAppModules(cwd) {
29
+ try {
30
+ return readdirSync(path.join(cwd, "src", "app"), { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort();
31
+ } catch {
32
+ return [];
33
+ }
34
+ }
35
+ /** The module a project-relative source path belongs to (`src/app/<module>/…`). */
36
+ function moduleOf(file) {
37
+ return file ? /^src\/app\/([^/]+)\//.exec(file.split("\\").join("/"))?.[1] : void 0;
38
+ }
39
+ function compare(first, second) {
40
+ return first < second ? -1 : first > second ? 1 : 0;
41
+ }
42
+ function isUnguardedWrite(route) {
43
+ return MUTATING_METHODS.has(route.method.toUpperCase()) && !route.auth.required && !route.isPage;
44
+ }
45
+ function routeLine(route) {
46
+ const guard = route.auth.required ? " [auth]" : "";
47
+ const name = route.name ? ` ${route.name}` : "";
48
+ return `- \`${route.method} ${route.path}\`${guard}${name}`;
49
+ }
50
+ function sortRoutes(routes) {
51
+ return [...routes].sort((first, second) => compare(first.path, second.path) || METHOD_ORDER.indexOf(first.method) - METHOD_ORDER.indexOf(second.method) || compare(first.method, second.method));
52
+ }
53
+ function appSection(report) {
54
+ const lines = [`## ${report.app.name ?? "This app"}${report.app.version ? ` ${report.app.version}` : ""} — generated facts`, ""];
55
+ const packages = [...report.packages ?? []].sort((first, second) => compare(first.name, second.name));
56
+ if (packages.length > 0) lines.push(`Warlock packages: ${packages.map((entry) => `\`${entry.name}@${entry.version}\``).join(", ")}.`, "");
57
+ return lines;
58
+ }
59
+ function modulesSection(report, extra) {
60
+ const routeCounts = /* @__PURE__ */ new Map();
61
+ const modelCounts = /* @__PURE__ */ new Map();
62
+ for (const route of report.routes ?? []) {
63
+ const module = moduleOf(route.sourceFile);
64
+ if (module) routeCounts.set(module, (routeCounts.get(module) ?? 0) + 1);
65
+ }
66
+ for (const model of report.models ?? []) {
67
+ const module = moduleOf(model.sourceFile);
68
+ if (module) modelCounts.set(module, (modelCounts.get(module) ?? 0) + 1);
69
+ }
70
+ const modules = [...new Set([
71
+ ...extra,
72
+ ...routeCounts.keys(),
73
+ ...modelCounts.keys()
74
+ ])].sort();
75
+ if (modules.length === 0) return [];
76
+ return [
77
+ "### Modules",
78
+ "",
79
+ "Each lives in `src/app/<module>/`.",
80
+ "",
81
+ "| Module | Routes | Models |",
82
+ "| ------ | ------ | ------ |",
83
+ ...modules.map((module) => `| \`${module}\` | ${routeCounts.get(module) ?? 0} | ${modelCounts.get(module) ?? 0} |`),
84
+ ""
85
+ ];
86
+ }
87
+ function routesSection(report, maxRoutes) {
88
+ const routes = sortRoutes(report.routes ?? []);
89
+ if (routes.length === 0) return [];
90
+ const counts = /* @__PURE__ */ new Map();
91
+ for (const route of routes) counts.set(route.method, (counts.get(route.method) ?? 0) + 1);
92
+ const methods = [...counts.keys()].sort((first, second) => (METHOD_ORDER.indexOf(first) + 1 || 99) - (METHOD_ORDER.indexOf(second) + 1 || 99) || compare(first, second));
93
+ const unguarded = routes.filter(isUnguardedWrite);
94
+ const lines = [
95
+ "### Routes",
96
+ "",
97
+ `${routes.length} route(s): ${methods.map((method) => `${counts.get(method) ?? 0} ${method}`).join(", ")}.`,
98
+ ""
99
+ ];
100
+ if (unguarded.length > 0) lines.push(`Mutating routes without an auth guard (confirm each is meant to be public): ${unguarded.map((route) => `\`${route.method} ${route.path}\``).join(", ")}.`, "");
101
+ lines.push(...routes.slice(0, maxRoutes).map(routeLine));
102
+ if (routes.length > maxRoutes) lines.push(`- +${routes.length - maxRoutes} more — run \`npx warlock inspect --json --section routes\``);
103
+ lines.push("");
104
+ return lines;
105
+ }
106
+ function modelsSection(report) {
107
+ const models = [...report.models ?? []].sort((first, second) => compare(first.name, second.name));
108
+ if (models.length === 0) return [];
109
+ return [
110
+ "### Models",
111
+ "",
112
+ ...models.map((model) => {
113
+ const module = moduleOf(model.sourceFile);
114
+ const table = model.table ? ` → \`${model.table}\`` : "";
115
+ return `- \`${model.name}\`${table}${module ? ` (module \`${module}\`)` : ""}`;
116
+ }),
117
+ ""
118
+ ];
119
+ }
120
+ /** The rules `warlock check` enforces (WL9001–WL9012) and the layout every skill assumes. */
121
+ const CONVENTIONS = [
122
+ "- Features live in `src/app/<module>/`; flow is one-way: `routes.ts` → controllers → services → repositories → models. Resources only map output.",
123
+ "- Never import auto-loaded files: `src/app/main.ts`, `src/app/<module>/routes.ts`, `main.ts`, `worker.ts`, `events/*.ts` (`WL9001`).",
124
+ "- No `.js` extensions in import paths (`WL9002`).",
125
+ "- Cross-module imports use the `app/<module>/...` alias, not `../../` (`WL9003`); relative paths stay inside a module.",
126
+ "- Cascade uses standard decorators: never set `\"experimentalDecorators\": true` (`WL9004`).",
127
+ "- Controllers are thin and read input with `request.validated()`, never `request.all()` (`WL9005`); schemas live in `schema/<action>.schema.ts` and export the value and its `Infer` type. One controller per file (`WL9011`).",
128
+ "- Every POST/PUT/PATCH/DELETE route is inside `guarded()` (or has auth middleware) or says `public: true` (`WL9006`).",
129
+ "- Redirect targets from request input go through `safeRedirect()` / `safeRedirectTarget()` (`WL9007`); logs never carry raw emails, credentials or request bodies (`WL9008`); regexes run on request input have bounded quantifiers (`WL9009`).",
130
+ "- Import each API from its home package: `v` from `@warlock.js/seal`, `Model` from `@warlock.js/cascade`, `router` from `@warlock.js/core`."
131
+ ];
132
+ function skillsSection(skills) {
133
+ if (skills.length === 0) return [];
134
+ const byPackage = /* @__PURE__ */ new Map();
135
+ for (const skill of skills) byPackage.set(skill.package, [...byPackage.get(skill.package) ?? [], skill]);
136
+ const lines = [
137
+ "### Skills",
138
+ "",
139
+ "Installed with the packages, at `node_modules/<package>/skills/<slug>/SKILL.md`. Read the matching one before changing that area.",
140
+ ""
141
+ ];
142
+ for (const packageName of [...byPackage.keys()].sort()) {
143
+ lines.push(`**${packageName}**`, "");
144
+ const entries = [...byPackage.get(packageName) ?? []].sort((first, second) => compare(first.slug, second.slug));
145
+ for (const skill of entries) {
146
+ const line = shortSkillLine(skill.description);
147
+ lines.push(`- \`${skill.slug}\`${line ? ` — ${line}` : ""}`);
148
+ }
149
+ lines.push("");
150
+ }
151
+ return lines;
152
+ }
153
+ const VERIFY = [
154
+ "### Verify a change",
155
+ "",
156
+ "- `npx warlock check --changed --json` — typecheck, lint, affected tests and conventions; exit 1 = your code, 2 = this machine.",
157
+ "- `npx warlock inspect --json` — routes, models, config keys, events, pages, jobs from the booted app.",
158
+ "- `npx warlock explain <code>` — what a `WLxxxx` code means and how to fix it.",
159
+ "- `npx warlock trace <method> <url> --json` — send a request to the running `warlock dev` and print its devtools timeline.",
160
+ "- `npx warlock mcp` — the same facts and actions as an MCP server.",
161
+ ""
162
+ ];
163
+ /**
164
+ * Render the app-specific AGENTS.md section from an inspect report: the app
165
+ * and its Warlock packages, modules, a routes summary (unguarded writes
166
+ * flagged), models, the conventions `warlock check` enforces, the installed
167
+ * skills and the verify commands.
168
+ *
169
+ * Deterministic: no timestamps and stable ordering, so regenerating an
170
+ * unchanged app yields the same bytes and `writeAgentsMd` writes nothing.
171
+ * Returned without the markers.
172
+ *
173
+ * @param report An `inspectApp()` report (routes, models and packages are read when present).
174
+ * @param options Skills and module folders to include.
175
+ */
176
+ function renderAgentsMdSection(report, options = {}) {
177
+ return `${[
178
+ "<!-- Generated by `warlock agents-md` and refreshed by `warlock dev`. Write your own notes outside the warlock:generated markers; everything between them is replaced. -->",
179
+ "",
180
+ ...appSection(report),
181
+ ...modulesSection(report, options.modules ?? []),
182
+ ...routesSection(report, options.maxRoutes ?? 60),
183
+ ...modelsSection(report),
184
+ "### Conventions in force",
185
+ "",
186
+ ...CONVENTIONS,
187
+ "",
188
+ ...skillsSection(options.skills ?? []),
189
+ ...VERIFY
190
+ ].join("\n").replace(/\n+$/, "")}\n`;
191
+ }
192
+
193
+ //#endregion
194
+ export { listAppModules, renderAgentsMdSection };
195
+ //# sourceMappingURL=render-agents-md.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-agents-md.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/agents-md/render-agents-md.ts"],"sourcesContent":["import { readdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { InspectReport, InspectRoute } from \"../inspect/inspect-report.types\";\nimport { type InstalledSkill, shortSkillLine } from \"./installed-skills\";\n\n/** Options of {@link renderAgentsMdSection}. */\nexport type RenderAgentsMdOptions = {\n /** Installed skills to list (see `listInstalledSkills`). Default: none listed. */\n skills?: readonly InstalledSkill[];\n /** Module folder names under `src/app` (see `listAppModules`); merged with the ones routes and models name. */\n modules?: readonly string[];\n /** How many routes the compact list shows before pointing at `warlock inspect`. Default: 60. */\n maxRoutes?: number;\n};\n\n/** Methods that change state; one of these without an auth guard is flagged. */\nconst MUTATING_METHODS = new Set([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"]);\n\n/** Fixed method order for the per-method counts. */\nconst METHOD_ORDER = [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"HEAD\", \"OPTIONS\"];\n\n/**\n * The module folders under `<cwd>/src/app`, sorted. Empty when there is none.\n *\n * @param cwd The project root.\n */\nexport function listAppModules(cwd: string): string[] {\n try {\n return readdirSync(path.join(cwd, \"src\", \"app\"), { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort();\n } catch {\n return [];\n }\n}\n\n/** The module a project-relative source path belongs to (`src/app/<module>/…`). */\nfunction moduleOf(file: string | null): string | undefined {\n return file ? /^src\\/app\\/([^/]+)\\//.exec(file.split(\"\\\\\").join(\"/\"))?.[1] : undefined;\n}\n\nfunction compare(first: string, second: string): number {\n return first < second ? -1 : first > second ? 1 : 0;\n}\n\nfunction isUnguardedWrite(route: InspectRoute): boolean {\n return MUTATING_METHODS.has(route.method.toUpperCase()) && !route.auth.required && !route.isPage;\n}\n\nfunction routeLine(route: InspectRoute): string {\n const guard = route.auth.required ? \" [auth]\" : \"\";\n const name = route.name ? ` ${route.name}` : \"\";\n\n return `- \\`${route.method} ${route.path}\\`${guard}${name}`;\n}\n\nfunction sortRoutes(routes: readonly InspectRoute[]): InspectRoute[] {\n return [...routes].sort(\n (first, second) =>\n compare(first.path, second.path) ||\n METHOD_ORDER.indexOf(first.method) - METHOD_ORDER.indexOf(second.method) ||\n compare(first.method, second.method),\n );\n}\n\nfunction appSection(report: InspectReport): string[] {\n const name = report.app.name ?? \"This app\";\n const version = report.app.version ? ` ${report.app.version}` : \"\";\n const lines = [`## ${name}${version} — generated facts`, \"\"];\n const packages = [...(report.packages ?? [])].sort((first, second) =>\n compare(first.name, second.name),\n );\n\n if (packages.length > 0) {\n lines.push(\n `Warlock packages: ${packages.map((entry) => `\\`${entry.name}@${entry.version}\\``).join(\", \")}.`,\n \"\",\n );\n }\n\n return lines;\n}\n\nfunction modulesSection(report: InspectReport, extra: readonly string[]): string[] {\n const routeCounts = new Map<string, number>();\n const modelCounts = new Map<string, number>();\n\n for (const route of report.routes ?? []) {\n const module = moduleOf(route.sourceFile);\n if (module) routeCounts.set(module, (routeCounts.get(module) ?? 0) + 1);\n }\n\n for (const model of report.models ?? []) {\n const module = moduleOf(model.sourceFile);\n if (module) modelCounts.set(module, (modelCounts.get(module) ?? 0) + 1);\n }\n\n const modules = [...new Set([...extra, ...routeCounts.keys(), ...modelCounts.keys()])].sort();\n\n if (modules.length === 0) return [];\n\n return [\n \"### Modules\",\n \"\",\n \"Each lives in `src/app/<module>/`.\",\n \"\",\n \"| Module | Routes | Models |\",\n \"| ------ | ------ | ------ |\",\n ...modules.map(\n (module) =>\n `| \\`${module}\\` | ${routeCounts.get(module) ?? 0} | ${modelCounts.get(module) ?? 0} |`,\n ),\n \"\",\n ];\n}\n\nfunction routesSection(report: InspectReport, maxRoutes: number): string[] {\n const routes = sortRoutes(report.routes ?? []);\n\n if (routes.length === 0) return [];\n\n const counts = new Map<string, number>();\n\n for (const route of routes) {\n counts.set(route.method, (counts.get(route.method) ?? 0) + 1);\n }\n\n const methods = [...counts.keys()].sort(\n (first, second) =>\n (METHOD_ORDER.indexOf(first) + 1 || 99) - (METHOD_ORDER.indexOf(second) + 1 || 99) ||\n compare(first, second),\n );\n const unguarded = routes.filter(isUnguardedWrite);\n const lines = [\n \"### Routes\",\n \"\",\n `${routes.length} route(s): ${methods.map((method) => `${counts.get(method) ?? 0} ${method}`).join(\", \")}.`,\n \"\",\n ];\n\n if (unguarded.length > 0) {\n lines.push(\n `Mutating routes without an auth guard (confirm each is meant to be public): ${unguarded\n .map((route) => `\\`${route.method} ${route.path}\\``)\n .join(\", \")}.`,\n \"\",\n );\n }\n\n lines.push(...routes.slice(0, maxRoutes).map(routeLine));\n\n if (routes.length > maxRoutes) {\n lines.push(\n `- +${routes.length - maxRoutes} more — run \\`npx warlock inspect --json --section routes\\``,\n );\n }\n\n lines.push(\"\");\n\n return lines;\n}\n\nfunction modelsSection(report: InspectReport): string[] {\n const models = [...(report.models ?? [])].sort((first, second) =>\n compare(first.name, second.name),\n );\n\n if (models.length === 0) return [];\n\n return [\n \"### Models\",\n \"\",\n ...models.map((model) => {\n const module = moduleOf(model.sourceFile);\n const table = model.table ? ` → \\`${model.table}\\`` : \"\";\n\n return `- \\`${model.name}\\`${table}${module ? ` (module \\`${module}\\`)` : \"\"}`;\n }),\n \"\",\n ];\n}\n\n/** The rules `warlock check` enforces (WL9001–WL9012) and the layout every skill assumes. */\nconst CONVENTIONS = [\n \"- Features live in `src/app/<module>/`; flow is one-way: `routes.ts` → controllers → services → repositories → models. Resources only map output.\",\n \"- Never import auto-loaded files: `src/app/main.ts`, `src/app/<module>/routes.ts`, `main.ts`, `worker.ts`, `events/*.ts` (`WL9001`).\",\n \"- No `.js` extensions in import paths (`WL9002`).\",\n \"- Cross-module imports use the `app/<module>/...` alias, not `../../` (`WL9003`); relative paths stay inside a module.\",\n '- Cascade uses standard decorators: never set `\"experimentalDecorators\": true` (`WL9004`).',\n \"- Controllers are thin and read input with `request.validated()`, never `request.all()` (`WL9005`); schemas live in `schema/<action>.schema.ts` and export the value and its `Infer` type. One controller per file (`WL9011`).\",\n \"- Every POST/PUT/PATCH/DELETE route is inside `guarded()` (or has auth middleware) or says `public: true` (`WL9006`).\",\n \"- Redirect targets from request input go through `safeRedirect()` / `safeRedirectTarget()` (`WL9007`); logs never carry raw emails, credentials or request bodies (`WL9008`); regexes run on request input have bounded quantifiers (`WL9009`).\",\n \"- Import each API from its home package: `v` from `@warlock.js/seal`, `Model` from `@warlock.js/cascade`, `router` from `@warlock.js/core`.\",\n];\n\nfunction skillsSection(skills: readonly InstalledSkill[]): string[] {\n if (skills.length === 0) return [];\n\n const byPackage = new Map<string, InstalledSkill[]>();\n\n for (const skill of skills) {\n byPackage.set(skill.package, [...(byPackage.get(skill.package) ?? []), skill]);\n }\n\n const lines = [\n \"### Skills\",\n \"\",\n \"Installed with the packages, at `node_modules/<package>/skills/<slug>/SKILL.md`. Read the matching one before changing that area.\",\n \"\",\n ];\n\n for (const packageName of [...byPackage.keys()].sort()) {\n lines.push(`**${packageName}**`, \"\");\n\n const entries = [...(byPackage.get(packageName) ?? [])].sort((first, second) =>\n compare(first.slug, second.slug),\n );\n\n for (const skill of entries) {\n const line = shortSkillLine(skill.description);\n\n lines.push(`- \\`${skill.slug}\\`${line ? ` — ${line}` : \"\"}`);\n }\n\n lines.push(\"\");\n }\n\n return lines;\n}\n\nconst VERIFY = [\n \"### Verify a change\",\n \"\",\n \"- `npx warlock check --changed --json` — typecheck, lint, affected tests and conventions; exit 1 = your code, 2 = this machine.\",\n \"- `npx warlock inspect --json` — routes, models, config keys, events, pages, jobs from the booted app.\",\n \"- `npx warlock explain <code>` — what a `WLxxxx` code means and how to fix it.\",\n \"- `npx warlock trace <method> <url> --json` — send a request to the running `warlock dev` and print its devtools timeline.\",\n \"- `npx warlock mcp` — the same facts and actions as an MCP server.\",\n \"\",\n];\n\n/**\n * Render the app-specific AGENTS.md section from an inspect report: the app\n * and its Warlock packages, modules, a routes summary (unguarded writes\n * flagged), models, the conventions `warlock check` enforces, the installed\n * skills and the verify commands.\n *\n * Deterministic: no timestamps and stable ordering, so regenerating an\n * unchanged app yields the same bytes and `writeAgentsMd` writes nothing.\n * Returned without the markers.\n *\n * @param report An `inspectApp()` report (routes, models and packages are read when present).\n * @param options Skills and module folders to include.\n */\nexport function renderAgentsMdSection(\n report: InspectReport,\n options: RenderAgentsMdOptions = {},\n): string {\n const lines = [\n \"<!-- Generated by `warlock agents-md` and refreshed by `warlock dev`. Write your own notes outside the warlock:generated markers; everything between them is replaced. -->\",\n \"\",\n ...appSection(report),\n ...modulesSection(report, options.modules ?? []),\n ...routesSection(report, options.maxRoutes ?? 60),\n ...modelsSection(report),\n \"### Conventions in force\",\n \"\",\n ...CONVENTIONS,\n \"\",\n ...skillsSection(options.skills ?? []),\n ...VERIFY,\n ];\n\n return `${lines.join(\"\\n\").replace(/\\n+$/, \"\")}\\n`;\n}\n"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { InspectReport } from "../inspect/inspect-report.types.mjs";
2
+ import { InstalledSkill } from "./installed-skills.mjs";
3
+
4
+ //#region ../../packages/core/src/tooling/agents-md/write-agents-md.d.ts
5
+ /** What {@link writeAgentsMd} did. */
6
+ type AgentsMdWriteStatus = "created" | "updated" | "unchanged" | "skipped";
7
+ /** Options of {@link writeAgentsMd}. */
8
+ type WriteAgentsMdOptions = {
9
+ /** Project root. Default: `process.cwd()`. */cwd?: string; /** The inspect report to render. */
10
+ report: InspectReport; /** Create AGENTS.md when it does not exist. Default: `true`; `false` reports `skipped`. */
11
+ create?: boolean; /** Skills to list. Default: `listInstalledSkills(cwd)`. */
12
+ skills?: readonly InstalledSkill[]; /** Module folders. Default: `listAppModules(cwd)`. */
13
+ modules?: readonly string[];
14
+ };
15
+ /** The result of {@link writeAgentsMd}. */
16
+ type WriteAgentsMdResult = {
17
+ /** Absolute path of AGENTS.md. */file: string;
18
+ status: AgentsMdWriteStatus; /** The generated section, without markers. */
19
+ section: string;
20
+ };
21
+ /**
22
+ * Render the generated section and put it between the markers of
23
+ * `<cwd>/AGENTS.md`, preserving every byte outside them. Writes only when the
24
+ * content changed (atomically: temp file + rename). Throws `WL7501` on
25
+ * malformed markers, before writing anything.
26
+ *
27
+ * @example
28
+ * const { status } = writeAgentsMd({ report: await inspectApp() });
29
+ */
30
+ declare function writeAgentsMd(options: WriteAgentsMdOptions): WriteAgentsMdResult;
31
+ //#endregion
32
+ export { AgentsMdWriteStatus, WriteAgentsMdOptions, WriteAgentsMdResult, writeAgentsMd };
33
+ //# sourceMappingURL=write-agents-md.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-agents-md.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/agents-md/write-agents-md.ts"],"mappings":";;;;;KAQY,mBAAA;AAAZ;AAAA,KAGY,oBAAA;gDAEV,GAAA,WAL6B;EAO7B,MAAA,EAAQ,aAAA,EAJsB;EAM9B,MAAA,YAEgC;EAAhC,MAAA,YAAkB,cAAc,IAJhC;EAMA,OAAA;AAAA;;KAIU,mBAAA;EAJV,kCAMA,IAAA;EACA,MAAA,EAAQ,mBAAmB,EAHjB;EAKV,OAAA;AAAA;;;;;;;AAAO;AAYT;;iBAAgB,aAAA,CAAc,OAAA,EAAS,oBAAA,GAAuB,mBAAmB"}