@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,57 @@
1
+ //#region ../../packages/core/src/tooling/generate/generator-spec.d.ts
2
+ /**
3
+ * What a generation request names, and the `warlock` argv it becomes.
4
+ *
5
+ * Validated strictly because the request usually comes from an agent over MCP:
6
+ * only the generators and flags `warlock generate.*` / `warlock add` declare
7
+ * are accepted, and no value can be read as another flag.
8
+ */
9
+ /** The `warlock generate.<name>` scaffolders. */
10
+ declare const MAKE_GENERATORS: readonly ["module", "controller", "service", "use-case", "model", "repository", "resource", "migration"];
11
+ /** One `warlock generate.<name>` scaffolder. */
12
+ type MakeGenerator = (typeof MAKE_GENERATORS)[number];
13
+ /**
14
+ * The flags each generator declares (see `cli/commands/generate/generate.command.ts`),
15
+ * minus `--dry-run`: the sandbox generates for real into a throwaway copy.
16
+ */
17
+ declare const MAKE_GENERATOR_FLAGS: Readonly<Record<MakeGenerator, readonly string[]>>;
18
+ /**
19
+ * A generation request.
20
+ *
21
+ * - `make`: `warlock generate.<generator> <name> [--flag…]`; `name` is what the
22
+ * command takes (`users`, `users/create-user`, a model path for `migration`).
23
+ * - `add`: `warlock add <features…>`.
24
+ */
25
+ type GeneratorSpec = {
26
+ type: "make";
27
+ generator: MakeGenerator;
28
+ name: string; /** `true` → `--flag`, `false` → `--flag=false`, a string → `--flag=value`. */
29
+ flags?: Record<string, string | boolean>;
30
+ } | {
31
+ type: "add";
32
+ features: string[];
33
+ };
34
+ /** Options of {@link buildGeneratorArgs}. */
35
+ type GeneratorArgsOptions = {
36
+ /**
37
+ * For `add`: install the packages (`false` adds `--no-install`, which still
38
+ * records them in package.json). Default `false`.
39
+ */
40
+ install?: boolean;
41
+ };
42
+ /** Whether a string names a `warlock generate.*` scaffolder. */
43
+ declare function isMakeGenerator(value: string): value is MakeGenerator;
44
+ /**
45
+ * The `warlock` arguments (without the `warlock` itself) that run a spec.
46
+ * Throws on an unknown generator, flag or feature, or an unsafe name or value.
47
+ *
48
+ * @example
49
+ * buildGeneratorArgs({ type: "make", generator: "controller", name: "users/list-users", flags: { "with-validation": true } });
50
+ * // ["generate.controller", "users/list-users", "--with-validation"]
51
+ * buildGeneratorArgs({ type: "add", features: ["devtools"] });
52
+ * // ["add", "devtools", "--no-install"]
53
+ */
54
+ declare function buildGeneratorArgs(spec: GeneratorSpec, options?: GeneratorArgsOptions): string[];
55
+ //#endregion
56
+ export { GeneratorArgsOptions, GeneratorSpec, MAKE_GENERATORS, MAKE_GENERATOR_FLAGS, MakeGenerator, buildGeneratorArgs, isMakeGenerator };
57
+ //# sourceMappingURL=generator-spec.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator-spec.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/generate/generator-spec.ts"],"mappings":";;AASA;;;;AASU;AAGV;;cAZa,eAAA;;KAYD,aAAA,WAAwB,eAAe;AAMnD;;;;AAAA,cAAa,oBAAA,EAAsB,QAAA,CAAS,MAAA,CAAO,aAAA;;;;;;;;KAkBvC,aAAA;EAEN,IAAA;EACA,SAAA,EAAW,aAAA;EACX,IAAA,UAEc;EAAd,KAAA,GAAQ,MAAM;AAAA;EAGd,IAAA;EACA,QAAA;AAAA;;KAIM,oBAAA;EAJN;;AAAQ;AAId;EAKE,OAAO;AAAA;;iBAQO,eAAA,CAAgB,KAAA,WAAgB,KAAA,IAAS,aAAa;AAAtE;;;;;;;;AAAsE;AA+CtE;AA/CA,iBA+CgB,kBAAA,CACd,IAAA,EAAM,aAAA,EACN,OAAA,GAAS,oBAAyB"}
@@ -0,0 +1,102 @@
1
+ //#region ../../packages/core/src/tooling/generate/generator-spec.ts
2
+ /**
3
+ * What a generation request names, and the `warlock` argv it becomes.
4
+ *
5
+ * Validated strictly because the request usually comes from an agent over MCP:
6
+ * only the generators and flags `warlock generate.*` / `warlock add` declare
7
+ * are accepted, and no value can be read as another flag.
8
+ */
9
+ /** The `warlock generate.<name>` scaffolders. */
10
+ const MAKE_GENERATORS = [
11
+ "module",
12
+ "controller",
13
+ "service",
14
+ "use-case",
15
+ "model",
16
+ "repository",
17
+ "resource",
18
+ "migration"
19
+ ];
20
+ /**
21
+ * The flags each generator declares (see `cli/commands/generate/generate.command.ts`),
22
+ * minus `--dry-run`: the sandbox generates for real into a throwaway copy.
23
+ */
24
+ const MAKE_GENERATOR_FLAGS = {
25
+ module: [
26
+ "minimal",
27
+ "force",
28
+ "overwrite"
29
+ ],
30
+ controller: ["with-validation", "force"],
31
+ service: ["force"],
32
+ "use-case": ["force"],
33
+ model: [
34
+ "with-resource",
35
+ "table",
36
+ "force",
37
+ "overwrite",
38
+ "timestamps",
39
+ "no-timestamps"
40
+ ],
41
+ repository: ["force"],
42
+ resource: ["force"],
43
+ migration: [
44
+ "force",
45
+ "add",
46
+ "drop",
47
+ "rename",
48
+ "timestamps",
49
+ "no-timestamps"
50
+ ]
51
+ };
52
+ const FLAG_NAME = /^[a-z][a-z0-9-]*$/;
53
+ const FEATURE_NAME = /^[a-z0-9][a-z0-9-]*$/i;
54
+ const COMPONENT_NAME = /^[A-Za-z0-9][A-Za-z0-9._/-]*$/;
55
+ /** Whether a string names a `warlock generate.*` scaffolder. */
56
+ function isMakeGenerator(value) {
57
+ return MAKE_GENERATORS.includes(value);
58
+ }
59
+ function assertComponentName(name) {
60
+ const segments = name.split("/");
61
+ if (!COMPONENT_NAME.test(name) || segments.some((segment) => segment === "" || segment === "." || segment === "..")) throw new Error(`Invalid name ${JSON.stringify(name)}: use letters, digits, ".", "_", "-" and "/" between segments (for example users/create-user).`);
62
+ }
63
+ function flagArgument(generator, name, value) {
64
+ const known = MAKE_GENERATOR_FLAGS[generator];
65
+ if (!FLAG_NAME.test(name) || !known.includes(name)) throw new Error(`Unknown flag --${name} for generate.${generator}. Known flags: ${known.map((flag) => `--${flag}`).join(", ") || "none"}.`);
66
+ if (typeof value === "boolean") return value ? `--${name}` : `--${name}=false`;
67
+ if (value.length === 0 || value.startsWith("-") || /[\0\r\n]/.test(value)) throw new Error(`Invalid value for --${name}: it may not be empty, start with "-" or contain a line break.`);
68
+ return `--${name}=${value}`;
69
+ }
70
+ /**
71
+ * The `warlock` arguments (without the `warlock` itself) that run a spec.
72
+ * Throws on an unknown generator, flag or feature, or an unsafe name or value.
73
+ *
74
+ * @example
75
+ * buildGeneratorArgs({ type: "make", generator: "controller", name: "users/list-users", flags: { "with-validation": true } });
76
+ * // ["generate.controller", "users/list-users", "--with-validation"]
77
+ * buildGeneratorArgs({ type: "add", features: ["devtools"] });
78
+ * // ["add", "devtools", "--no-install"]
79
+ */
80
+ function buildGeneratorArgs(spec, options = {}) {
81
+ if (spec.type === "add") {
82
+ if (spec.features.length === 0) throw new Error("Name at least one feature to add (warlock add --list shows them).");
83
+ for (const feature of spec.features) if (!FEATURE_NAME.test(feature)) throw new Error(`Invalid feature name ${JSON.stringify(feature)}.`);
84
+ return [
85
+ "add",
86
+ ...spec.features,
87
+ ...options.install === true ? [] : ["--no-install"]
88
+ ];
89
+ }
90
+ if (!isMakeGenerator(spec.generator)) throw new Error(`Unknown generator ${JSON.stringify(spec.generator)}. Generators: ${MAKE_GENERATORS.join(", ")}.`);
91
+ assertComponentName(spec.name);
92
+ const flags = Object.entries(spec.flags ?? {}).map(([name, value]) => flagArgument(spec.generator, name, value));
93
+ return [
94
+ `generate.${spec.generator}`,
95
+ spec.name,
96
+ ...flags
97
+ ];
98
+ }
99
+
100
+ //#endregion
101
+ export { MAKE_GENERATORS, MAKE_GENERATOR_FLAGS, buildGeneratorArgs, isMakeGenerator };
102
+ //# sourceMappingURL=generator-spec.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator-spec.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/generate/generator-spec.ts"],"sourcesContent":["/**\n * What a generation request names, and the `warlock` argv it becomes.\n *\n * Validated strictly because the request usually comes from an agent over MCP:\n * only the generators and flags `warlock generate.*` / `warlock add` declare\n * are accepted, and no value can be read as another flag.\n */\n\n/** The `warlock generate.<name>` scaffolders. */\nexport const MAKE_GENERATORS = [\n \"module\",\n \"controller\",\n \"service\",\n \"use-case\",\n \"model\",\n \"repository\",\n \"resource\",\n \"migration\",\n] as const;\n\n/** One `warlock generate.<name>` scaffolder. */\nexport type MakeGenerator = (typeof MAKE_GENERATORS)[number];\n\n/**\n * The flags each generator declares (see `cli/commands/generate/generate.command.ts`),\n * minus `--dry-run`: the sandbox generates for real into a throwaway copy.\n */\nexport const MAKE_GENERATOR_FLAGS: Readonly<Record<MakeGenerator, readonly string[]>> = {\n module: [\"minimal\", \"force\", \"overwrite\"],\n controller: [\"with-validation\", \"force\"],\n service: [\"force\"],\n \"use-case\": [\"force\"],\n model: [\"with-resource\", \"table\", \"force\", \"overwrite\", \"timestamps\", \"no-timestamps\"],\n repository: [\"force\"],\n resource: [\"force\"],\n migration: [\"force\", \"add\", \"drop\", \"rename\", \"timestamps\", \"no-timestamps\"],\n};\n\n/**\n * A generation request.\n *\n * - `make`: `warlock generate.<generator> <name> [--flag…]`; `name` is what the\n * command takes (`users`, `users/create-user`, a model path for `migration`).\n * - `add`: `warlock add <features…>`.\n */\nexport type GeneratorSpec =\n | {\n type: \"make\";\n generator: MakeGenerator;\n name: string;\n /** `true` → `--flag`, `false` → `--flag=false`, a string → `--flag=value`. */\n flags?: Record<string, string | boolean>;\n }\n | {\n type: \"add\";\n features: string[];\n };\n\n/** Options of {@link buildGeneratorArgs}. */\nexport type GeneratorArgsOptions = {\n /**\n * For `add`: install the packages (`false` adds `--no-install`, which still\n * records them in package.json). Default `false`.\n */\n install?: boolean;\n};\n\nconst FLAG_NAME = /^[a-z][a-z0-9-]*$/;\nconst FEATURE_NAME = /^[a-z0-9][a-z0-9-]*$/i;\nconst COMPONENT_NAME = /^[A-Za-z0-9][A-Za-z0-9._/-]*$/;\n\n/** Whether a string names a `warlock generate.*` scaffolder. */\nexport function isMakeGenerator(value: string): value is MakeGenerator {\n return (MAKE_GENERATORS as readonly string[]).includes(value);\n}\n\nfunction assertComponentName(name: string): void {\n const segments = name.split(\"/\");\n\n if (\n !COMPONENT_NAME.test(name) ||\n segments.some((segment) => segment === \"\" || segment === \".\" || segment === \"..\")\n ) {\n throw new Error(\n `Invalid name ${JSON.stringify(name)}: use letters, digits, \".\", \"_\", \"-\" and \"/\" between segments (for example users/create-user).`,\n );\n }\n}\n\nfunction flagArgument(generator: MakeGenerator, name: string, value: string | boolean): string {\n const known = MAKE_GENERATOR_FLAGS[generator];\n\n if (!FLAG_NAME.test(name) || !known.includes(name)) {\n throw new Error(\n `Unknown flag --${name} for generate.${generator}. Known flags: ${known.map((flag) => `--${flag}`).join(\", \") || \"none\"}.`,\n );\n }\n\n if (typeof value === \"boolean\") return value ? `--${name}` : `--${name}=false`;\n\n if (value.length === 0 || value.startsWith(\"-\") || /[\\0\\r\\n]/.test(value)) {\n throw new Error(\n `Invalid value for --${name}: it may not be empty, start with \"-\" or contain a line break.`,\n );\n }\n\n return `--${name}=${value}`;\n}\n\n/**\n * The `warlock` arguments (without the `warlock` itself) that run a spec.\n * Throws on an unknown generator, flag or feature, or an unsafe name or value.\n *\n * @example\n * buildGeneratorArgs({ type: \"make\", generator: \"controller\", name: \"users/list-users\", flags: { \"with-validation\": true } });\n * // [\"generate.controller\", \"users/list-users\", \"--with-validation\"]\n * buildGeneratorArgs({ type: \"add\", features: [\"devtools\"] });\n * // [\"add\", \"devtools\", \"--no-install\"]\n */\nexport function buildGeneratorArgs(\n spec: GeneratorSpec,\n options: GeneratorArgsOptions = {},\n): string[] {\n if (spec.type === \"add\") {\n if (spec.features.length === 0) {\n throw new Error(\"Name at least one feature to add (warlock add --list shows them).\");\n }\n\n for (const feature of spec.features) {\n if (!FEATURE_NAME.test(feature)) {\n throw new Error(`Invalid feature name ${JSON.stringify(feature)}.`);\n }\n }\n\n return [\"add\", ...spec.features, ...(options.install === true ? [] : [\"--no-install\"])];\n }\n\n if (!isMakeGenerator(spec.generator)) {\n throw new Error(\n `Unknown generator ${JSON.stringify(spec.generator)}. Generators: ${MAKE_GENERATORS.join(\", \")}.`,\n );\n }\n\n assertComponentName(spec.name);\n\n const flags = Object.entries(spec.flags ?? {}).map(([name, value]) =>\n flagArgument(spec.generator, name, value),\n );\n\n return [`generate.${spec.generator}`, spec.name, ...flags];\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,kBAAkB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;AASA,MAAa,uBAA2E;CACtF,QAAQ;EAAC;EAAW;EAAS;CAAW;CACxC,YAAY,CAAC,mBAAmB,OAAO;CACvC,SAAS,CAAC,OAAO;CACjB,YAAY,CAAC,OAAO;CACpB,OAAO;EAAC;EAAiB;EAAS;EAAS;EAAa;EAAc;CAAe;CACrF,YAAY,CAAC,OAAO;CACpB,UAAU,CAAC,OAAO;CAClB,WAAW;EAAC;EAAS;EAAO;EAAQ;EAAU;EAAc;CAAe;AAC7E;AA+BA,MAAM,YAAY;AAClB,MAAM,eAAe;AACrB,MAAM,iBAAiB;;AAGvB,SAAgB,gBAAgB,OAAuC;CACrE,OAAQ,gBAAsC,SAAS,KAAK;AAC9D;AAEA,SAAS,oBAAoB,MAAoB;CAC/C,MAAM,WAAW,KAAK,MAAM,GAAG;CAE/B,IACE,CAAC,eAAe,KAAK,IAAI,KACzB,SAAS,MAAM,YAAY,YAAY,MAAM,YAAY,OAAO,YAAY,IAAI,GAEhF,MAAM,IAAI,MACR,gBAAgB,KAAK,UAAU,IAAI,EAAE,+FACvC;AAEJ;AAEA,SAAS,aAAa,WAA0B,MAAc,OAAiC;CAC7F,MAAM,QAAQ,qBAAqB;CAEnC,IAAI,CAAC,UAAU,KAAK,IAAI,KAAK,CAAC,MAAM,SAAS,IAAI,GAC/C,MAAM,IAAI,MACR,kBAAkB,KAAK,gBAAgB,UAAU,iBAAiB,MAAM,KAAK,SAAS,KAAK,MAAM,CAAC,CAAC,KAAK,IAAI,KAAK,OAAO,EAC1H;CAGF,IAAI,OAAO,UAAU,WAAW,OAAO,QAAQ,KAAK,SAAS,KAAK,KAAK;CAEvE,IAAI,MAAM,WAAW,KAAK,MAAM,WAAW,GAAG,KAAK,WAAW,KAAK,KAAK,GACtE,MAAM,IAAI,MACR,uBAAuB,KAAK,+DAC9B;CAGF,OAAO,KAAK,KAAK,GAAG;AACtB;;;;;;;;;;;AAYA,SAAgB,mBACd,MACA,UAAgC,CAAC,GACvB;CACV,IAAI,KAAK,SAAS,OAAO;EACvB,IAAI,KAAK,SAAS,WAAW,GAC3B,MAAM,IAAI,MAAM,mEAAmE;EAGrF,KAAK,MAAM,WAAW,KAAK,UACzB,IAAI,CAAC,aAAa,KAAK,OAAO,GAC5B,MAAM,IAAI,MAAM,wBAAwB,KAAK,UAAU,OAAO,EAAE,EAAE;EAItE,OAAO;GAAC;GAAO,GAAG,KAAK;GAAU,GAAI,QAAQ,YAAY,OAAO,CAAC,IAAI,CAAC,cAAc;EAAE;CACxF;CAEA,IAAI,CAAC,gBAAgB,KAAK,SAAS,GACjC,MAAM,IAAI,MACR,qBAAqB,KAAK,UAAU,KAAK,SAAS,EAAE,gBAAgB,gBAAgB,KAAK,IAAI,EAAE,EACjG;CAGF,oBAAoB,KAAK,IAAI;CAE7B,MAAM,QAAQ,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,WACzD,aAAa,KAAK,WAAW,MAAM,KAAK,CAC1C;CAEA,OAAO;EAAC,YAAY,KAAK;EAAa,KAAK;EAAM,GAAG;CAAK;AAC3D"}
@@ -0,0 +1,6 @@
1
+ import { MAKE_GENERATORS, MAKE_GENERATOR_FLAGS, buildGeneratorArgs, isMakeGenerator } from "./generator-spec.mjs";
2
+ import { DEFAULT_GENERATION_TIMEOUT_MS, describeRun, resolveCliEntry, spawnCli } from "./run-cli.mjs";
3
+ import { DIFF_CONTEXT_LINES, unifiedDiff } from "./unified-diff.mjs";
4
+ import { MAX_FILE_DIFF_BYTES, applyGeneration, sandboxBackend } from "./generation.mjs";
5
+
6
+ export { };
@@ -0,0 +1,121 @@
1
+ import { createHash } from "node:crypto";
2
+ import path from "node:path";
3
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, symlinkSync } from "node:fs";
4
+
5
+ //#region ../../packages/core/src/tooling/generate/project-files.ts
6
+ /**
7
+ * Which project files a generation can see and change, and how they are
8
+ * copied, hashed and compared.
9
+ *
10
+ * THE SCOPE: the files at the project root plus the `src/` tree. That is where
11
+ * every generator writes (`src/app/**`, `src/config/**`, `package.json`,
12
+ * `warlock.config.ts`, `tsconfig.json`). `.env` files are never copied, hashed
13
+ * or diffed: they hold secrets, and a diff is text an agent will read.
14
+ */
15
+ /** Directory names never entered anywhere. */
16
+ const SKIPPED_DIRECTORIES = new Set([".git", "node_modules"]);
17
+ /** Root directories outside the scope that a sandbox still never copies (listed for the walk of a sandbox). */
18
+ const SKIPPED_ROOT_DIRECTORIES = new Set([
19
+ ".git",
20
+ "node_modules",
21
+ ".warlock",
22
+ "dist",
23
+ "storage",
24
+ "public",
25
+ "coverage"
26
+ ]);
27
+ /** Whether a file name is an env file (`.env`, `.env.local`, `.env.production`…). */
28
+ function isEnvFile(name) {
29
+ return name === ".env" || name.startsWith(".env.");
30
+ }
31
+ function toPosix(relative) {
32
+ return relative.split(path.sep).join("/");
33
+ }
34
+ function hashFile(file) {
35
+ return createHash("sha256").update(readFileSync(file)).digest("hex");
36
+ }
37
+ function walk(root, directory, visit) {
38
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
39
+ if (entry.isSymbolicLink()) continue;
40
+ const absolute = path.join(directory, entry.name);
41
+ if (entry.isDirectory()) {
42
+ if (!SKIPPED_DIRECTORIES.has(entry.name)) walk(root, absolute, visit);
43
+ continue;
44
+ }
45
+ if (entry.isFile() && !isEnvFile(entry.name)) visit(absolute, toPosix(path.relative(root, absolute)));
46
+ }
47
+ }
48
+ /**
49
+ * Visit every file in the generation scope of `root`: root-level files and the
50
+ * `src/` tree, skipping env files, symlinks, `node_modules` and `.git`.
51
+ */
52
+ function forEachScopedFile(root, visit) {
53
+ for (const entry of readdirSync(root, { withFileTypes: true })) if (entry.isFile() && !isEnvFile(entry.name)) visit(path.join(root, entry.name), entry.name);
54
+ const source = path.join(root, "src");
55
+ if (existsSync(source)) walk(root, source, visit);
56
+ }
57
+ /**
58
+ * Visit every file under `root` except env files, symlinks and the
59
+ * {@link SKIPPED_ROOT_DIRECTORIES} — how a sandbox is read after a generator
60
+ * ran, so a file written outside `src/` is still seen.
61
+ */
62
+ function forEachSandboxFile(root, visit) {
63
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
64
+ if (entry.isSymbolicLink()) continue;
65
+ const absolute = path.join(root, entry.name);
66
+ if (entry.isDirectory()) {
67
+ if (!SKIPPED_ROOT_DIRECTORIES.has(entry.name)) walk(root, absolute, visit);
68
+ } else if (entry.isFile() && !isEnvFile(entry.name)) visit(absolute, entry.name);
69
+ }
70
+ }
71
+ /** Hash every file the walker visits. */
72
+ function snapshotFiles(root, walker) {
73
+ const snapshot = /* @__PURE__ */ new Map();
74
+ walker(root, (absolute, relative) => {
75
+ snapshot.set(relative, hashFile(absolute));
76
+ });
77
+ return snapshot;
78
+ }
79
+ /**
80
+ * Copy the generation scope of `projectRoot` into `sandboxRoot` and link the
81
+ * project's `node_modules` into it, so `warlock.config.ts` and every package
82
+ * resolve exactly as they do in the project. Nothing is copied from
83
+ * `node_modules`; the link is removed with the sandbox, never followed.
84
+ */
85
+ function copyProjectScope(projectRoot, sandboxRoot) {
86
+ forEachScopedFile(projectRoot, (absolute, relative) => {
87
+ const target = path.join(sandboxRoot, relative);
88
+ mkdirSync(path.dirname(target), { recursive: true });
89
+ copyFileSync(absolute, target);
90
+ });
91
+ const modules = path.join(projectRoot, "node_modules");
92
+ if (existsSync(modules)) symlinkSync(modules, path.join(sandboxRoot, "node_modules"), "junction");
93
+ }
94
+ /** The files created, modified or deleted between two snapshots, sorted by path. */
95
+ function compareSnapshots(before, after) {
96
+ const changes = [];
97
+ for (const [file, hash] of after) {
98
+ const previous = before.get(file);
99
+ if (previous === void 0) changes.push({
100
+ path: file,
101
+ status: "created"
102
+ });
103
+ else if (previous !== hash) changes.push({
104
+ path: file,
105
+ status: "modified"
106
+ });
107
+ }
108
+ for (const file of before.keys()) if (!after.has(file)) changes.push({
109
+ path: file,
110
+ status: "deleted"
111
+ });
112
+ return changes.sort((first, second) => first.path.localeCompare(second.path));
113
+ }
114
+ /** Whether bytes look binary: a NUL in the first 8000 bytes, as git decides. */
115
+ function isBinary(content) {
116
+ return content.subarray(0, 8e3).includes(0);
117
+ }
118
+
119
+ //#endregion
120
+ export { compareSnapshots, copyProjectScope, forEachSandboxFile, forEachScopedFile, isBinary, snapshotFiles };
121
+ //# sourceMappingURL=project-files.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-files.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/generate/project-files.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport {\n copyFileSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n symlinkSync,\n} from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Which project files a generation can see and change, and how they are\n * copied, hashed and compared.\n *\n * THE SCOPE: the files at the project root plus the `src/` tree. That is where\n * every generator writes (`src/app/**`, `src/config/**`, `package.json`,\n * `warlock.config.ts`, `tsconfig.json`). `.env` files are never copied, hashed\n * or diffed: they hold secrets, and a diff is text an agent will read.\n */\n\n/** Directory names never entered anywhere. */\nconst SKIPPED_DIRECTORIES = new Set([\".git\", \"node_modules\"]);\n\n/** Root directories outside the scope that a sandbox still never copies (listed for the walk of a sandbox). */\nconst SKIPPED_ROOT_DIRECTORIES = new Set([\n \".git\",\n \"node_modules\",\n \".warlock\",\n \"dist\",\n \"storage\",\n \"public\",\n \"coverage\",\n]);\n\n/** Whether a file name is an env file (`.env`, `.env.local`, `.env.production`…). */\nexport function isEnvFile(name: string): boolean {\n return name === \".env\" || name.startsWith(\".env.\");\n}\n\n/** A file's content hash, keyed by project-relative POSIX path. */\nexport type FileSnapshot = Map<string, string>;\n\nfunction toPosix(relative: string): string {\n return relative.split(path.sep).join(\"/\");\n}\n\nfunction hashFile(file: string): string {\n return createHash(\"sha256\").update(readFileSync(file)).digest(\"hex\");\n}\n\nfunction walk(\n root: string,\n directory: string,\n visit: (absolute: string, relative: string) => void,\n): void {\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n if (entry.isSymbolicLink()) continue;\n\n const absolute = path.join(directory, entry.name);\n\n if (entry.isDirectory()) {\n if (!SKIPPED_DIRECTORIES.has(entry.name)) walk(root, absolute, visit);\n continue;\n }\n\n if (entry.isFile() && !isEnvFile(entry.name)) {\n visit(absolute, toPosix(path.relative(root, absolute)));\n }\n }\n}\n\n/**\n * Visit every file in the generation scope of `root`: root-level files and the\n * `src/` tree, skipping env files, symlinks, `node_modules` and `.git`.\n */\nexport function forEachScopedFile(\n root: string,\n visit: (absolute: string, relative: string) => void,\n): void {\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n if (entry.isFile() && !isEnvFile(entry.name)) {\n visit(path.join(root, entry.name), entry.name);\n }\n }\n\n const source = path.join(root, \"src\");\n\n if (existsSync(source)) walk(root, source, visit);\n}\n\n/**\n * Visit every file under `root` except env files, symlinks and the\n * {@link SKIPPED_ROOT_DIRECTORIES} — how a sandbox is read after a generator\n * ran, so a file written outside `src/` is still seen.\n */\nexport function forEachSandboxFile(\n root: string,\n visit: (absolute: string, relative: string) => void,\n): void {\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n if (entry.isSymbolicLink()) continue;\n\n const absolute = path.join(root, entry.name);\n\n if (entry.isDirectory()) {\n if (!SKIPPED_ROOT_DIRECTORIES.has(entry.name)) walk(root, absolute, visit);\n } else if (entry.isFile() && !isEnvFile(entry.name)) {\n visit(absolute, entry.name);\n }\n }\n}\n\n/** Hash every file the walker visits. */\nexport function snapshotFiles(\n root: string,\n walker: (root: string, visit: (absolute: string, relative: string) => void) => void,\n): FileSnapshot {\n const snapshot: FileSnapshot = new Map();\n\n walker(root, (absolute, relative) => {\n snapshot.set(relative, hashFile(absolute));\n });\n\n return snapshot;\n}\n\n/**\n * Copy the generation scope of `projectRoot` into `sandboxRoot` and link the\n * project's `node_modules` into it, so `warlock.config.ts` and every package\n * resolve exactly as they do in the project. Nothing is copied from\n * `node_modules`; the link is removed with the sandbox, never followed.\n */\nexport function copyProjectScope(projectRoot: string, sandboxRoot: string): void {\n forEachScopedFile(projectRoot, (absolute, relative) => {\n const target = path.join(sandboxRoot, relative);\n\n mkdirSync(path.dirname(target), { recursive: true });\n copyFileSync(absolute, target);\n });\n\n const modules = path.join(projectRoot, \"node_modules\");\n\n if (existsSync(modules)) {\n // \"junction\" is ignored off Windows and makes the link work there without admin rights.\n symlinkSync(modules, path.join(sandboxRoot, \"node_modules\"), \"junction\");\n }\n}\n\n/** One file that differs between two snapshots. */\nexport type SnapshotChange = { path: string; status: \"created\" | \"modified\" | \"deleted\" };\n\n/** The files created, modified or deleted between two snapshots, sorted by path. */\nexport function compareSnapshots(before: FileSnapshot, after: FileSnapshot): SnapshotChange[] {\n const changes: SnapshotChange[] = [];\n\n for (const [file, hash] of after) {\n const previous = before.get(file);\n\n if (previous === undefined) changes.push({ path: file, status: \"created\" });\n else if (previous !== hash) changes.push({ path: file, status: \"modified\" });\n }\n\n for (const file of before.keys()) {\n if (!after.has(file)) changes.push({ path: file, status: \"deleted\" });\n }\n\n return changes.sort((first, second) => first.path.localeCompare(second.path));\n}\n\n/** Whether bytes look binary: a NUL in the first 8000 bytes, as git decides. */\nexport function isBinary(content: Buffer): boolean {\n return content.subarray(0, 8000).includes(0);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,MAAM,sBAAsB,IAAI,IAAI,CAAC,QAAQ,cAAc,CAAC;;AAG5D,MAAM,2BAA2B,IAAI,IAAI;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;AAGD,SAAgB,UAAU,MAAuB;CAC/C,OAAO,SAAS,UAAU,KAAK,WAAW,OAAO;AACnD;AAKA,SAAS,QAAQ,UAA0B;CACzC,OAAO,SAAS,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;AAC1C;AAEA,SAAS,SAAS,MAAsB;CACtC,OAAO,WAAW,QAAQ,CAAC,CAAC,OAAO,aAAa,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK;AACrE;AAEA,SAAS,KACP,MACA,WACA,OACM;CACN,KAAK,MAAM,SAAS,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC,GAAG;EACnE,IAAI,MAAM,eAAe,GAAG;EAE5B,MAAM,WAAW,KAAK,KAAK,WAAW,MAAM,IAAI;EAEhD,IAAI,MAAM,YAAY,GAAG;GACvB,IAAI,CAAC,oBAAoB,IAAI,MAAM,IAAI,GAAG,KAAK,MAAM,UAAU,KAAK;GACpE;EACF;EAEA,IAAI,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,IAAI,GACzC,MAAM,UAAU,QAAQ,KAAK,SAAS,MAAM,QAAQ,CAAC,CAAC;CAE1D;AACF;;;;;AAMA,SAAgB,kBACd,MACA,OACM;CACN,KAAK,MAAM,SAAS,YAAY,MAAM,EAAE,eAAe,KAAK,CAAC,GAC3D,IAAI,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,IAAI,GACzC,MAAM,KAAK,KAAK,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI;CAIjD,MAAM,SAAS,KAAK,KAAK,MAAM,KAAK;CAEpC,IAAI,WAAW,MAAM,GAAG,KAAK,MAAM,QAAQ,KAAK;AAClD;;;;;;AAOA,SAAgB,mBACd,MACA,OACM;CACN,KAAK,MAAM,SAAS,YAAY,MAAM,EAAE,eAAe,KAAK,CAAC,GAAG;EAC9D,IAAI,MAAM,eAAe,GAAG;EAE5B,MAAM,WAAW,KAAK,KAAK,MAAM,MAAM,IAAI;EAE3C,IAAI,MAAM,YAAY,GACpB;OAAI,CAAC,yBAAyB,IAAI,MAAM,IAAI,GAAG,KAAK,MAAM,UAAU,KAAK;EAAC,OACrE,IAAI,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,IAAI,GAChD,MAAM,UAAU,MAAM,IAAI;CAE9B;AACF;;AAGA,SAAgB,cACd,MACA,QACc;CACd,MAAM,2BAAyB,IAAI,IAAI;CAEvC,OAAO,OAAO,UAAU,aAAa;EACnC,SAAS,IAAI,UAAU,SAAS,QAAQ,CAAC;CAC3C,CAAC;CAED,OAAO;AACT;;;;;;;AAQA,SAAgB,iBAAiB,aAAqB,aAA2B;CAC/E,kBAAkB,cAAc,UAAU,aAAa;EACrD,MAAM,SAAS,KAAK,KAAK,aAAa,QAAQ;EAE9C,UAAU,KAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;EACnD,aAAa,UAAU,MAAM;CAC/B,CAAC;CAED,MAAM,UAAU,KAAK,KAAK,aAAa,cAAc;CAErD,IAAI,WAAW,OAAO,GAEpB,YAAY,SAAS,KAAK,KAAK,aAAa,cAAc,GAAG,UAAU;AAE3E;;AAMA,SAAgB,iBAAiB,QAAsB,OAAuC;CAC5F,MAAM,UAA4B,CAAC;CAEnC,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO;EAChC,MAAM,WAAW,OAAO,IAAI,IAAI;EAEhC,IAAI,aAAa,QAAW,QAAQ,KAAK;GAAE,MAAM;GAAM,QAAQ;EAAU,CAAC;OACrE,IAAI,aAAa,MAAM,QAAQ,KAAK;GAAE,MAAM;GAAM,QAAQ;EAAW,CAAC;CAC7E;CAEA,KAAK,MAAM,QAAQ,OAAO,KAAK,GAC7B,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG,QAAQ,KAAK;EAAE,MAAM;EAAM,QAAQ;CAAU,CAAC;CAGtE,OAAO,QAAQ,MAAM,OAAO,WAAW,MAAM,KAAK,cAAc,OAAO,IAAI,CAAC;AAC9E;;AAGA,SAAgB,SAAS,SAA0B;CACjD,OAAO,QAAQ,SAAS,GAAG,GAAI,CAAC,CAAC,SAAS,CAAC;AAC7C"}
@@ -0,0 +1,40 @@
1
+ //#region ../../packages/core/src/tooling/generate/run-cli.d.ts
2
+ /** How one CLI run ended. */
3
+ type CliRun = {
4
+ /** The exit code, or `null` when the process was killed. */exitCode: number | null; /** The signal that ended it, or `null`. */
5
+ signal: string | null;
6
+ stdout: string;
7
+ stderr: string; /** Whether the run hit its timeout and was stopped. */
8
+ timedOut: boolean;
9
+ };
10
+ /** What a {@link CliRunner} is asked to run: `node <entry> <args>` in `cwd`. */
11
+ type CliInvocation = {
12
+ /** The CLI entry script (the `warlock` bin). */entry: string;
13
+ args: readonly string[];
14
+ cwd: string;
15
+ timeoutMs: number;
16
+ };
17
+ /** Runs the CLI. Injectable so tests never spawn the real one. */
18
+ type CliRunner = (invocation: CliInvocation) => Promise<CliRun>;
19
+ /** Two minutes: `add` features run setup hooks; a scaffold is far quicker. */
20
+ declare const DEFAULT_GENERATION_TIMEOUT_MS = 120000;
21
+ /**
22
+ * The `warlock` bin the project uses: `<@warlock.js/core>/bin/warlock.js` as
23
+ * the project at `cwd` resolves the package, else the script this process
24
+ * was started with when it is the `warlock` bin.
25
+ *
26
+ * @throws When neither is found; pass the entry explicitly then.
27
+ */
28
+ declare function resolveCliEntry(cwd?: string): string;
29
+ /**
30
+ * The default {@link CliRunner}: spawns `node <entry> <args>` with stdin
31
+ * closed (a prompt reads end-of-input instead of hanging), colors off and
32
+ * `CI=1`, and stops the child it spawned — that one process, by its own
33
+ * handle — when the timeout passes.
34
+ */
35
+ declare const spawnCli: CliRunner;
36
+ /** Output a plan carries: stdout then stderr, ANSI stripped, capped. */
37
+ declare function describeRun(run: CliRun, limit?: number): string;
38
+ //#endregion
39
+ export { CliInvocation, CliRun, CliRunner, DEFAULT_GENERATION_TIMEOUT_MS, describeRun, resolveCliEntry, spawnCli };
40
+ //# sourceMappingURL=run-cli.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cli.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/generate/run-cli.ts"],"mappings":";;KAKY,MAAA;EAAM,4DAEhB,QAAA,iBAFgB;EAIhB,MAAA;EACA,MAAA;EACA,MAAA;EAEA,QAAA;AAAA;AAAQ;AAAA,KAIE,aAAA;EAAa,gDAEvB,KAAA;EACA,IAAA;EACA,GAAA;EACA,SAAA;AAAA;;KAIU,SAAA,IAAa,UAAA,EAAY,aAAA,KAAkB,OAAA,CAAQ,MAAA;AAJpD;AAAA,cAOE,6BAAA;;;;;;;;iBAYG,eAAA,CAAgB,GAAmB;;;;;AAfkB;AAGrE;cAsCa,QAAA,EAAU,SAyCnB;;iBAMY,WAAA,CAAY,GAAA,EAAK,MAAM,EAAE,KAAA"}
@@ -0,0 +1,93 @@
1
+ import { createRequire } from "node:module";
2
+ import path from "node:path";
3
+ import { spawn } from "node:child_process";
4
+
5
+ //#region ../../packages/core/src/tooling/generate/run-cli.ts
6
+ /** Two minutes: `add` features run setup hooks; a scaffold is far quicker. */
7
+ const DEFAULT_GENERATION_TIMEOUT_MS = 12e4;
8
+ /** Output kept per stream; the rest is dropped (the diff is the result, not the log). */
9
+ const MAX_STREAM_BYTES = 256 * 1024;
10
+ /**
11
+ * The `warlock` bin the project uses: `<@warlock.js/core>/bin/warlock.js` as
12
+ * the project at `cwd` resolves the package, else the script this process
13
+ * was started with when it is the `warlock` bin.
14
+ *
15
+ * @throws When neither is found; pass the entry explicitly then.
16
+ */
17
+ function resolveCliEntry(cwd = process.cwd()) {
18
+ try {
19
+ const manifest = createRequire(path.join(cwd, "package.json")).resolve("@warlock.js/core/package.json");
20
+ return path.join(path.dirname(manifest), "bin", "warlock.js");
21
+ } catch {}
22
+ const invoked = process.argv[1];
23
+ if (invoked && /^warlock(\.js)?$/.test(path.basename(invoked))) return invoked;
24
+ throw new Error("Could not find the warlock CLI: install @warlock.js/core in the project, or pass cliEntry.");
25
+ }
26
+ /**
27
+ * The default {@link CliRunner}: spawns `node <entry> <args>` with stdin
28
+ * closed (a prompt reads end-of-input instead of hanging), colors off and
29
+ * `CI=1`, and stops the child it spawned — that one process, by its own
30
+ * handle — when the timeout passes.
31
+ */
32
+ const spawnCli = (invocation) => new Promise((resolve) => {
33
+ const child = spawn(process.execPath, [invocation.entry, ...invocation.args], {
34
+ cwd: invocation.cwd,
35
+ stdio: [
36
+ "ignore",
37
+ "pipe",
38
+ "pipe"
39
+ ],
40
+ windowsHide: true,
41
+ env: {
42
+ ...process.env,
43
+ CI: "1",
44
+ NO_COLOR: "1",
45
+ FORCE_COLOR: "0"
46
+ }
47
+ });
48
+ let stdout = "";
49
+ let stderr = "";
50
+ let timedOut = false;
51
+ child.stdout.setEncoding("utf8");
52
+ child.stderr.setEncoding("utf8");
53
+ child.stdout.on("data", (chunk) => {
54
+ if (stdout.length < MAX_STREAM_BYTES) stdout += chunk;
55
+ });
56
+ child.stderr.on("data", (chunk) => {
57
+ if (stderr.length < MAX_STREAM_BYTES) stderr += chunk;
58
+ });
59
+ const timer = setTimeout(() => {
60
+ timedOut = true;
61
+ child.kill("SIGTERM");
62
+ }, invocation.timeoutMs);
63
+ let settled = false;
64
+ const finish = (exitCode, signal) => {
65
+ if (settled) return;
66
+ settled = true;
67
+ clearTimeout(timer);
68
+ resolve({
69
+ exitCode,
70
+ signal,
71
+ stdout,
72
+ stderr,
73
+ timedOut
74
+ });
75
+ };
76
+ child.on("error", (error) => {
77
+ stderr += `${error.message}\n`;
78
+ finish(null, null);
79
+ });
80
+ child.on("close", (code, signal) => finish(code, signal));
81
+ });
82
+ /** ANSI color and cursor sequences. */
83
+ const ANSI_SEQUENCE = new RegExp(`${String.fromCharCode(27)}\\[[0-9;?]*[A-Za-z]`, "g");
84
+ /** Output a plan carries: stdout then stderr, ANSI stripped, capped. */
85
+ function describeRun(run, limit = 16 * 1024) {
86
+ const text = [run.stdout, run.stderr].map((part) => part.replace(ANSI_SEQUENCE, "").trim()).filter((part) => part.length > 0).join("\n");
87
+ const suffix = run.timedOut ? "\n(stopped: the command timed out)" : "";
88
+ return text.length > limit ? `${text.slice(0, limit)}\n… (output truncated)${suffix}` : `${text}${suffix}`;
89
+ }
90
+
91
+ //#endregion
92
+ export { DEFAULT_GENERATION_TIMEOUT_MS, describeRun, resolveCliEntry, spawnCli };
93
+ //# sourceMappingURL=run-cli.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cli.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/generate/run-cli.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\n/** How one CLI run ended. */\nexport type CliRun = {\n /** The exit code, or `null` when the process was killed. */\n exitCode: number | null;\n /** The signal that ended it, or `null`. */\n signal: string | null;\n stdout: string;\n stderr: string;\n /** Whether the run hit its timeout and was stopped. */\n timedOut: boolean;\n};\n\n/** What a {@link CliRunner} is asked to run: `node <entry> <args>` in `cwd`. */\nexport type CliInvocation = {\n /** The CLI entry script (the `warlock` bin). */\n entry: string;\n args: readonly string[];\n cwd: string;\n timeoutMs: number;\n};\n\n/** Runs the CLI. Injectable so tests never spawn the real one. */\nexport type CliRunner = (invocation: CliInvocation) => Promise<CliRun>;\n\n/** Two minutes: `add` features run setup hooks; a scaffold is far quicker. */\nexport const DEFAULT_GENERATION_TIMEOUT_MS = 120_000;\n\n/** Output kept per stream; the rest is dropped (the diff is the result, not the log). */\nconst MAX_STREAM_BYTES = 256 * 1024;\n\n/**\n * The `warlock` bin the project uses: `<@warlock.js/core>/bin/warlock.js` as\n * the project at `cwd` resolves the package, else the script this process\n * was started with when it is the `warlock` bin.\n *\n * @throws When neither is found; pass the entry explicitly then.\n */\nexport function resolveCliEntry(cwd = process.cwd()): string {\n try {\n const manifest = createRequire(path.join(cwd, \"package.json\")).resolve(\n \"@warlock.js/core/package.json\",\n );\n\n return path.join(path.dirname(manifest), \"bin\", \"warlock.js\");\n } catch {\n // Not resolvable from the project; try the running script.\n }\n\n const invoked = process.argv[1];\n\n if (invoked && /^warlock(\\.js)?$/.test(path.basename(invoked))) return invoked;\n\n throw new Error(\n \"Could not find the warlock CLI: install @warlock.js/core in the project, or pass cliEntry.\",\n );\n}\n\n/**\n * The default {@link CliRunner}: spawns `node <entry> <args>` with stdin\n * closed (a prompt reads end-of-input instead of hanging), colors off and\n * `CI=1`, and stops the child it spawned — that one process, by its own\n * handle — when the timeout passes.\n */\nexport const spawnCli: CliRunner = (invocation) =>\n new Promise((resolve) => {\n const child = spawn(process.execPath, [invocation.entry, ...invocation.args], {\n cwd: invocation.cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n env: { ...process.env, CI: \"1\", NO_COLOR: \"1\", FORCE_COLOR: \"0\" },\n });\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n if (stdout.length < MAX_STREAM_BYTES) stdout += chunk;\n });\n child.stderr.on(\"data\", (chunk: string) => {\n if (stderr.length < MAX_STREAM_BYTES) stderr += chunk;\n });\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n }, invocation.timeoutMs);\n\n let settled = false;\n\n const finish = (exitCode: number | null, signal: string | null) => {\n if (settled) return;\n\n settled = true;\n clearTimeout(timer);\n resolve({ exitCode, signal, stdout, stderr, timedOut });\n };\n\n child.on(\"error\", (error) => {\n stderr += `${error.message}\\n`;\n finish(null, null);\n });\n child.on(\"close\", (code, signal) => finish(code, signal));\n });\n\n/** ANSI color and cursor sequences. */\nconst ANSI_SEQUENCE = new RegExp(`${String.fromCharCode(27)}\\\\[[0-9;?]*[A-Za-z]`, \"g\");\n\n/** Output a plan carries: stdout then stderr, ANSI stripped, capped. */\nexport function describeRun(run: CliRun, limit = 16 * 1024): string {\n const text = [run.stdout, run.stderr]\n .map((part) => part.replace(ANSI_SEQUENCE, \"\").trim())\n .filter((part) => part.length > 0)\n .join(\"\\n\");\n const suffix = run.timedOut ? \"\\n(stopped: the command timed out)\" : \"\";\n\n return text.length > limit\n ? `${text.slice(0, limit)}\\n… (output truncated)${suffix}`\n : `${text}${suffix}`;\n}\n"],"mappings":";;;;;;AA6BA,MAAa,gCAAgC;;AAG7C,MAAM,mBAAmB,MAAM;;;;;;;;AAS/B,SAAgB,gBAAgB,MAAM,QAAQ,IAAI,GAAW;CAC3D,IAAI;EACF,MAAM,WAAW,cAAc,KAAK,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,QAC7D,+BACF;EAEA,OAAO,KAAK,KAAK,KAAK,QAAQ,QAAQ,GAAG,OAAO,YAAY;CAC9D,QAAQ,CAER;CAEA,MAAM,UAAU,QAAQ,KAAK;CAE7B,IAAI,WAAW,mBAAmB,KAAK,KAAK,SAAS,OAAO,CAAC,GAAG,OAAO;CAEvE,MAAM,IAAI,MACR,4FACF;AACF;;;;;;;AAQA,MAAa,YAAuB,eAClC,IAAI,SAAS,YAAY;CACvB,MAAM,QAAQ,MAAM,QAAQ,UAAU,CAAC,WAAW,OAAO,GAAG,WAAW,IAAI,GAAG;EAC5E,KAAK,WAAW;EAChB,OAAO;GAAC;GAAU;GAAQ;EAAM;EAChC,aAAa;EACb,KAAK;GAAE,GAAG,QAAQ;GAAK,IAAI;GAAK,UAAU;GAAK,aAAa;EAAI;CAClE,CAAC;CACD,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,WAAW;CAEf,MAAM,OAAO,YAAY,MAAM;CAC/B,MAAM,OAAO,YAAY,MAAM;CAC/B,MAAM,OAAO,GAAG,SAAS,UAAkB;EACzC,IAAI,OAAO,SAAS,kBAAkB,UAAU;CAClD,CAAC;CACD,MAAM,OAAO,GAAG,SAAS,UAAkB;EACzC,IAAI,OAAO,SAAS,kBAAkB,UAAU;CAClD,CAAC;CAED,MAAM,QAAQ,iBAAiB;EAC7B,WAAW;EACX,MAAM,KAAK,SAAS;CACtB,GAAG,WAAW,SAAS;CAEvB,IAAI,UAAU;CAEd,MAAM,UAAU,UAAyB,WAA0B;EACjE,IAAI,SAAS;EAEb,UAAU;EACV,aAAa,KAAK;EAClB,QAAQ;GAAE;GAAU;GAAQ;GAAQ;GAAQ;EAAS,CAAC;CACxD;CAEA,MAAM,GAAG,UAAU,UAAU;EAC3B,UAAU,GAAG,MAAM,QAAQ;EAC3B,OAAO,MAAM,IAAI;CACnB,CAAC;CACD,MAAM,GAAG,UAAU,MAAM,WAAW,OAAO,MAAM,MAAM,CAAC;AAC1D,CAAC;;AAGH,MAAM,gBAAgB,IAAI,OAAO,GAAG,OAAO,aAAa,EAAE,EAAE,sBAAsB,GAAG;;AAGrF,SAAgB,YAAY,KAAa,QAAQ,KAAK,MAAc;CAClE,MAAM,OAAO,CAAC,IAAI,QAAQ,IAAI,MAAM,CAAC,CAClC,KAAK,SAAS,KAAK,QAAQ,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CACrD,QAAQ,SAAS,KAAK,SAAS,CAAC,CAAC,CACjC,KAAK,IAAI;CACZ,MAAM,SAAS,IAAI,WAAW,uCAAuC;CAErE,OAAO,KAAK,SAAS,QACjB,GAAG,KAAK,MAAM,GAAG,KAAK,EAAE,wBAAwB,WAChD,GAAG,OAAO;AAChB"}
@@ -0,0 +1,37 @@
1
+ //#region ../../packages/core/src/tooling/generate/unified-diff.d.ts
2
+ /**
3
+ * A small, dependency-free unified diff, in the format `git diff` and
4
+ * `patch -p1` read: `--- a/<path>` / `+++ b/<path>` headers (`/dev/null` for a
5
+ * created or deleted file), `@@ -l,c +l,c @@` hunks with three lines of
6
+ * context, and `` markers.
7
+ *
8
+ * Lines are matched with a longest-common-subsequence table after the common
9
+ * prefix and suffix are trimmed. Generated files are small, so that is plenty;
10
+ * a pair too large for the table falls back to "every line replaced", which is
11
+ * still a correct (if larger) diff.
12
+ */
13
+ /** Lines of context around each change. */
14
+ declare const DIFF_CONTEXT_LINES = 3;
15
+ /** Inputs of {@link unifiedDiff}. */
16
+ type UnifiedDiffInput = {
17
+ /** Project-relative POSIX path, used in the headers. */path: string; /** The old content; `null` when the file is created. */
18
+ before: string | null; /** The new content; `null` when the file is deleted. */
19
+ after: string | null; /** Lines of context. Default {@link DIFF_CONTEXT_LINES}. */
20
+ context?: number;
21
+ };
22
+ /**
23
+ * The unified diff between two versions of one file, or `""` when they are
24
+ * equal.
25
+ *
26
+ * @example
27
+ * unifiedDiff({ path: "src/app/users/routes.ts", before: "a\n", after: "a\nb\n" });
28
+ * // --- a/src/app/users/routes.ts
29
+ * // +++ b/src/app/users/routes.ts
30
+ * // @@ -1,1 +1,2 @@
31
+ * // a
32
+ * // +b
33
+ */
34
+ declare function unifiedDiff(input: UnifiedDiffInput): string;
35
+ //#endregion
36
+ export { DIFF_CONTEXT_LINES, UnifiedDiffInput, unifiedDiff };
37
+ //# sourceMappingURL=unified-diff.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified-diff.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/generate/unified-diff.ts"],"mappings":";;AAaA;;;;AAA+B;AAuH/B;;;;;;cAvHa,kBAAA;;KAuHD,gBAAA;EAQH,wDANP,IAAA,UAqByB;EAnBzB,MAAA,iBAmBiC;EAjBjC,KAAA;EAEA,OAAA;AAAA;;;;;;;;;;;;;iBAec,WAAA,CAAY,KAAuB,EAAhB,gBAAgB"}