@classytic/arc 1.1.0 → 2.1.2

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 (322) hide show
  1. package/README.md +247 -794
  2. package/bin/arc.js +91 -52
  3. package/dist/EventTransport-BD2U0BTc.d.mts +100 -0
  4. package/dist/EventTransport-BD2U0BTc.d.mts.map +1 -0
  5. package/dist/HookSystem-BsGV-j2l.mjs +405 -0
  6. package/dist/HookSystem-BsGV-j2l.mjs.map +1 -0
  7. package/dist/ResourceRegistry-DsN4KJjV.mjs +250 -0
  8. package/dist/ResourceRegistry-DsN4KJjV.mjs.map +1 -0
  9. package/dist/adapters/index.d.mts +5 -0
  10. package/dist/adapters/index.mjs +3 -0
  11. package/dist/audit/index.d.mts +82 -0
  12. package/dist/audit/index.d.mts.map +1 -0
  13. package/dist/audit/index.mjs +276 -0
  14. package/dist/audit/index.mjs.map +1 -0
  15. package/dist/audit/mongodb.d.mts +5 -0
  16. package/dist/audit/mongodb.mjs +3 -0
  17. package/dist/audited-C3T5DTUx.mjs +141 -0
  18. package/dist/audited-C3T5DTUx.mjs.map +1 -0
  19. package/dist/auth/index.d.mts +189 -0
  20. package/dist/auth/index.d.mts.map +1 -0
  21. package/dist/auth/index.mjs +1102 -0
  22. package/dist/auth/index.mjs.map +1 -0
  23. package/dist/auth/redis-session.d.mts +44 -0
  24. package/dist/auth/redis-session.d.mts.map +1 -0
  25. package/dist/auth/redis-session.mjs +76 -0
  26. package/dist/auth/redis-session.mjs.map +1 -0
  27. package/dist/betterAuthOpenApi-BrHKeSAx.mjs +250 -0
  28. package/dist/betterAuthOpenApi-BrHKeSAx.mjs.map +1 -0
  29. package/dist/cache/index.d.mts +146 -0
  30. package/dist/cache/index.d.mts.map +1 -0
  31. package/dist/cache/index.mjs +92 -0
  32. package/dist/cache/index.mjs.map +1 -0
  33. package/dist/caching-Bl28lYsR.mjs +94 -0
  34. package/dist/caching-Bl28lYsR.mjs.map +1 -0
  35. package/dist/chunk-C7Uep-_p.mjs +20 -0
  36. package/dist/circuitBreaker-DeY4FCjs.mjs +1097 -0
  37. package/dist/circuitBreaker-DeY4FCjs.mjs.map +1 -0
  38. package/dist/cli/commands/describe.d.mts +19 -0
  39. package/dist/cli/commands/describe.d.mts.map +1 -0
  40. package/dist/cli/commands/describe.mjs +239 -0
  41. package/dist/cli/commands/describe.mjs.map +1 -0
  42. package/dist/cli/commands/docs.d.mts +14 -0
  43. package/dist/cli/commands/docs.d.mts.map +1 -0
  44. package/dist/cli/commands/docs.mjs +53 -0
  45. package/dist/cli/commands/docs.mjs.map +1 -0
  46. package/dist/cli/commands/{generate.d.ts → generate.d.mts} +3 -1
  47. package/dist/cli/commands/generate.d.mts.map +1 -0
  48. package/dist/cli/commands/generate.mjs +358 -0
  49. package/dist/cli/commands/generate.mjs.map +1 -0
  50. package/dist/cli/commands/{init.d.ts → init.d.mts} +12 -8
  51. package/dist/cli/commands/init.d.mts.map +1 -0
  52. package/dist/cli/commands/{init.js → init.mjs} +807 -616
  53. package/dist/cli/commands/init.mjs.map +1 -0
  54. package/dist/cli/commands/introspect.d.mts +11 -0
  55. package/dist/cli/commands/introspect.d.mts.map +1 -0
  56. package/dist/cli/commands/introspect.mjs +76 -0
  57. package/dist/cli/commands/introspect.mjs.map +1 -0
  58. package/dist/cli/index.d.mts +17 -0
  59. package/dist/cli/index.d.mts.map +1 -0
  60. package/dist/cli/index.mjs +157 -0
  61. package/dist/cli/index.mjs.map +1 -0
  62. package/dist/constants-DdXFXQtN.mjs +85 -0
  63. package/dist/constants-DdXFXQtN.mjs.map +1 -0
  64. package/dist/core/index.d.mts +5 -0
  65. package/dist/core/index.mjs +4 -0
  66. package/dist/createApp-CUgNqegw.mjs +560 -0
  67. package/dist/createApp-CUgNqegw.mjs.map +1 -0
  68. package/dist/defineResource-k0_BDn8v.mjs +2197 -0
  69. package/dist/defineResource-k0_BDn8v.mjs.map +1 -0
  70. package/dist/discovery/index.d.mts +47 -0
  71. package/dist/discovery/index.d.mts.map +1 -0
  72. package/dist/discovery/index.mjs +110 -0
  73. package/dist/discovery/index.mjs.map +1 -0
  74. package/dist/docs/index.d.mts +163 -0
  75. package/dist/docs/index.d.mts.map +1 -0
  76. package/dist/docs/index.mjs +73 -0
  77. package/dist/docs/index.mjs.map +1 -0
  78. package/dist/elevation-BRy3yFWT.mjs +113 -0
  79. package/dist/elevation-BRy3yFWT.mjs.map +1 -0
  80. package/dist/elevation-B_2dRLVP.d.mts +88 -0
  81. package/dist/elevation-B_2dRLVP.d.mts.map +1 -0
  82. package/dist/errorHandler-BbcgBmIH.d.mts +73 -0
  83. package/dist/errorHandler-BbcgBmIH.d.mts.map +1 -0
  84. package/dist/errorHandler-C1okiriz.mjs +109 -0
  85. package/dist/errorHandler-C1okiriz.mjs.map +1 -0
  86. package/dist/errors-B9bZok84.mjs +212 -0
  87. package/dist/errors-B9bZok84.mjs.map +1 -0
  88. package/dist/errors-ChKiFz62.d.mts +125 -0
  89. package/dist/errors-ChKiFz62.d.mts.map +1 -0
  90. package/dist/eventPlugin-CTrLH3mt.d.mts +125 -0
  91. package/dist/eventPlugin-CTrLH3mt.d.mts.map +1 -0
  92. package/dist/eventPlugin-DGR_B2on.mjs +230 -0
  93. package/dist/eventPlugin-DGR_B2on.mjs.map +1 -0
  94. package/dist/events/index.d.mts +54 -0
  95. package/dist/events/index.d.mts.map +1 -0
  96. package/dist/events/index.mjs +52 -0
  97. package/dist/events/index.mjs.map +1 -0
  98. package/dist/events/transports/redis-stream-entry.d.mts +2 -0
  99. package/dist/events/transports/redis-stream-entry.mjs +178 -0
  100. package/dist/events/transports/redis-stream-entry.mjs.map +1 -0
  101. package/dist/events/transports/redis.d.mts +77 -0
  102. package/dist/events/transports/redis.d.mts.map +1 -0
  103. package/dist/events/transports/redis.mjs +125 -0
  104. package/dist/events/transports/redis.mjs.map +1 -0
  105. package/dist/externalPaths-DlINfKbP.d.mts +51 -0
  106. package/dist/externalPaths-DlINfKbP.d.mts.map +1 -0
  107. package/dist/factory/index.d.mts +64 -0
  108. package/dist/factory/index.d.mts.map +1 -0
  109. package/dist/factory/index.mjs +3 -0
  110. package/dist/fastifyAdapter-BkrGrlFi.d.mts +217 -0
  111. package/dist/fastifyAdapter-BkrGrlFi.d.mts.map +1 -0
  112. package/dist/fields-DyaDVX4J.d.mts +110 -0
  113. package/dist/fields-DyaDVX4J.d.mts.map +1 -0
  114. package/dist/fields-iagOozy0.mjs +115 -0
  115. package/dist/fields-iagOozy0.mjs.map +1 -0
  116. package/dist/hooks/index.d.mts +4 -0
  117. package/dist/hooks/index.mjs +3 -0
  118. package/dist/idempotency/index.d.mts +97 -0
  119. package/dist/idempotency/index.d.mts.map +1 -0
  120. package/dist/idempotency/index.mjs +320 -0
  121. package/dist/idempotency/index.mjs.map +1 -0
  122. package/dist/idempotency/mongodb.d.mts +2 -0
  123. package/dist/idempotency/mongodb.mjs +115 -0
  124. package/dist/idempotency/mongodb.mjs.map +1 -0
  125. package/dist/idempotency/redis.d.mts +2 -0
  126. package/dist/idempotency/redis.mjs +104 -0
  127. package/dist/idempotency/redis.mjs.map +1 -0
  128. package/dist/index.d.mts +261 -0
  129. package/dist/index.d.mts.map +1 -0
  130. package/dist/index.mjs +105 -0
  131. package/dist/index.mjs.map +1 -0
  132. package/dist/integrations/event-gateway.d.mts +47 -0
  133. package/dist/integrations/event-gateway.d.mts.map +1 -0
  134. package/dist/integrations/event-gateway.mjs +44 -0
  135. package/dist/integrations/event-gateway.mjs.map +1 -0
  136. package/dist/integrations/index.d.mts +5 -0
  137. package/dist/integrations/index.mjs +1 -0
  138. package/dist/integrations/jobs.d.mts +104 -0
  139. package/dist/integrations/jobs.d.mts.map +1 -0
  140. package/dist/integrations/jobs.mjs +124 -0
  141. package/dist/integrations/jobs.mjs.map +1 -0
  142. package/dist/integrations/streamline.d.mts +61 -0
  143. package/dist/integrations/streamline.d.mts.map +1 -0
  144. package/dist/integrations/streamline.mjs +126 -0
  145. package/dist/integrations/streamline.mjs.map +1 -0
  146. package/dist/integrations/websocket.d.mts +83 -0
  147. package/dist/integrations/websocket.d.mts.map +1 -0
  148. package/dist/integrations/websocket.mjs +289 -0
  149. package/dist/integrations/websocket.mjs.map +1 -0
  150. package/dist/interface-B01JvPVc.d.mts +78 -0
  151. package/dist/interface-B01JvPVc.d.mts.map +1 -0
  152. package/dist/interface-CZe8IkMf.d.mts +55 -0
  153. package/dist/interface-CZe8IkMf.d.mts.map +1 -0
  154. package/dist/interface-Ch8HU9uM.d.mts +1098 -0
  155. package/dist/interface-Ch8HU9uM.d.mts.map +1 -0
  156. package/dist/introspectionPlugin-rFdO8ZUa.mjs +54 -0
  157. package/dist/introspectionPlugin-rFdO8ZUa.mjs.map +1 -0
  158. package/dist/keys-BqNejWup.mjs +43 -0
  159. package/dist/keys-BqNejWup.mjs.map +1 -0
  160. package/dist/logger-Df2O2WsW.mjs +79 -0
  161. package/dist/logger-Df2O2WsW.mjs.map +1 -0
  162. package/dist/memory-cQgelFOj.mjs +144 -0
  163. package/dist/memory-cQgelFOj.mjs.map +1 -0
  164. package/dist/migrations/index.d.mts +157 -0
  165. package/dist/migrations/index.d.mts.map +1 -0
  166. package/dist/migrations/index.mjs +261 -0
  167. package/dist/migrations/index.mjs.map +1 -0
  168. package/dist/mongodb-BfJVlUJH.mjs +94 -0
  169. package/dist/mongodb-BfJVlUJH.mjs.map +1 -0
  170. package/dist/mongodb-CGzRbfAK.d.mts +119 -0
  171. package/dist/mongodb-CGzRbfAK.d.mts.map +1 -0
  172. package/dist/mongodb-JN-9JA7K.d.mts +72 -0
  173. package/dist/mongodb-JN-9JA7K.d.mts.map +1 -0
  174. package/dist/openapi-G3Cw7XuM.mjs +524 -0
  175. package/dist/openapi-G3Cw7XuM.mjs.map +1 -0
  176. package/dist/org/index.d.mts +69 -0
  177. package/dist/org/index.d.mts.map +1 -0
  178. package/dist/org/index.mjs +514 -0
  179. package/dist/org/index.mjs.map +1 -0
  180. package/dist/org/types.d.mts +83 -0
  181. package/dist/org/types.d.mts.map +1 -0
  182. package/dist/org/types.mjs +1 -0
  183. package/dist/permissions/index.d.mts +279 -0
  184. package/dist/permissions/index.d.mts.map +1 -0
  185. package/dist/permissions/index.mjs +579 -0
  186. package/dist/permissions/index.mjs.map +1 -0
  187. package/dist/plugins/index.d.mts +173 -0
  188. package/dist/plugins/index.d.mts.map +1 -0
  189. package/dist/plugins/index.mjs +523 -0
  190. package/dist/plugins/index.mjs.map +1 -0
  191. package/dist/plugins/response-cache.d.mts +88 -0
  192. package/dist/plugins/response-cache.d.mts.map +1 -0
  193. package/dist/plugins/response-cache.mjs +284 -0
  194. package/dist/plugins/response-cache.mjs.map +1 -0
  195. package/dist/plugins/tracing-entry.d.mts +2 -0
  196. package/dist/plugins/tracing-entry.mjs +186 -0
  197. package/dist/plugins/tracing-entry.mjs.map +1 -0
  198. package/dist/pluralize-CEweyOEm.mjs +87 -0
  199. package/dist/pluralize-CEweyOEm.mjs.map +1 -0
  200. package/dist/policies/{index.d.ts → index.d.mts} +204 -169
  201. package/dist/policies/index.d.mts.map +1 -0
  202. package/dist/policies/index.mjs +322 -0
  203. package/dist/policies/index.mjs.map +1 -0
  204. package/dist/presets/{index.d.ts → index.d.mts} +63 -131
  205. package/dist/presets/index.d.mts.map +1 -0
  206. package/dist/presets/index.mjs +144 -0
  207. package/dist/presets/index.mjs.map +1 -0
  208. package/dist/presets/multiTenant.d.mts +25 -0
  209. package/dist/presets/multiTenant.d.mts.map +1 -0
  210. package/dist/presets/multiTenant.mjs +114 -0
  211. package/dist/presets/multiTenant.mjs.map +1 -0
  212. package/dist/presets-BITljm96.mjs +120 -0
  213. package/dist/presets-BITljm96.mjs.map +1 -0
  214. package/dist/presets-DzSMwlKj.d.mts +58 -0
  215. package/dist/presets-DzSMwlKj.d.mts.map +1 -0
  216. package/dist/prisma-DJbMt3yf.mjs +628 -0
  217. package/dist/prisma-DJbMt3yf.mjs.map +1 -0
  218. package/dist/prisma-Dg9GoVdj.d.mts +275 -0
  219. package/dist/prisma-Dg9GoVdj.d.mts.map +1 -0
  220. package/dist/queryCachePlugin-7THaI5mt.d.mts +72 -0
  221. package/dist/queryCachePlugin-7THaI5mt.d.mts.map +1 -0
  222. package/dist/queryCachePlugin-DMBnp2Q0.mjs +139 -0
  223. package/dist/queryCachePlugin-DMBnp2Q0.mjs.map +1 -0
  224. package/dist/redis-D-JAeLtm.d.mts +50 -0
  225. package/dist/redis-D-JAeLtm.d.mts.map +1 -0
  226. package/dist/redis-stream-Bdh_vUU8.d.mts +104 -0
  227. package/dist/redis-stream-Bdh_vUU8.d.mts.map +1 -0
  228. package/dist/registry/index.d.mts +12 -0
  229. package/dist/registry/index.d.mts.map +1 -0
  230. package/dist/registry/index.mjs +4 -0
  231. package/dist/requestContext-QQD6ROJc.mjs +56 -0
  232. package/dist/requestContext-QQD6ROJc.mjs.map +1 -0
  233. package/dist/schemaConverter-BwrmWroW.mjs +99 -0
  234. package/dist/schemaConverter-BwrmWroW.mjs.map +1 -0
  235. package/dist/schemas/index.d.mts +64 -0
  236. package/dist/schemas/index.d.mts.map +1 -0
  237. package/dist/schemas/index.mjs +83 -0
  238. package/dist/schemas/index.mjs.map +1 -0
  239. package/dist/scope/index.d.mts +22 -0
  240. package/dist/scope/index.d.mts.map +1 -0
  241. package/dist/scope/index.mjs +66 -0
  242. package/dist/scope/index.mjs.map +1 -0
  243. package/dist/sessionManager-jPKLbHE0.d.mts +187 -0
  244. package/dist/sessionManager-jPKLbHE0.d.mts.map +1 -0
  245. package/dist/sse-B3c3_yZp.mjs +124 -0
  246. package/dist/sse-B3c3_yZp.mjs.map +1 -0
  247. package/dist/testing/index.d.mts +908 -0
  248. package/dist/testing/index.d.mts.map +1 -0
  249. package/dist/testing/index.mjs +1977 -0
  250. package/dist/testing/index.mjs.map +1 -0
  251. package/dist/tracing-Cc7vVQPp.d.mts +71 -0
  252. package/dist/tracing-Cc7vVQPp.d.mts.map +1 -0
  253. package/dist/typeGuards-DhMNLuvU.mjs +10 -0
  254. package/dist/typeGuards-DhMNLuvU.mjs.map +1 -0
  255. package/dist/types/index.d.mts +947 -0
  256. package/dist/types/index.d.mts.map +1 -0
  257. package/dist/types/index.mjs +15 -0
  258. package/dist/types/index.mjs.map +1 -0
  259. package/dist/types-Beqn1Un7.mjs +39 -0
  260. package/dist/types-Beqn1Un7.mjs.map +1 -0
  261. package/dist/types-CIgB7UUl.d.mts +446 -0
  262. package/dist/types-CIgB7UUl.d.mts.map +1 -0
  263. package/dist/types-aYB4V7uN.d.mts +87 -0
  264. package/dist/types-aYB4V7uN.d.mts.map +1 -0
  265. package/dist/utils/index.d.mts +748 -0
  266. package/dist/utils/index.d.mts.map +1 -0
  267. package/dist/utils/index.mjs +6 -0
  268. package/package.json +194 -68
  269. package/dist/BaseController-DVAiHxEQ.d.ts +0 -233
  270. package/dist/adapters/index.d.ts +0 -237
  271. package/dist/adapters/index.js +0 -668
  272. package/dist/arcCorePlugin-CsShQdyP.d.ts +0 -273
  273. package/dist/audit/index.d.ts +0 -195
  274. package/dist/audit/index.js +0 -319
  275. package/dist/auth/index.d.ts +0 -47
  276. package/dist/auth/index.js +0 -174
  277. package/dist/cli/commands/docs.d.ts +0 -11
  278. package/dist/cli/commands/docs.js +0 -474
  279. package/dist/cli/commands/generate.js +0 -334
  280. package/dist/cli/commands/introspect.d.ts +0 -8
  281. package/dist/cli/commands/introspect.js +0 -338
  282. package/dist/cli/index.d.ts +0 -4
  283. package/dist/cli/index.js +0 -3269
  284. package/dist/core/index.d.ts +0 -220
  285. package/dist/core/index.js +0 -2786
  286. package/dist/createApp-Ce9wl8W9.d.ts +0 -77
  287. package/dist/docs/index.d.ts +0 -166
  288. package/dist/docs/index.js +0 -658
  289. package/dist/errors-8WIxGS_6.d.ts +0 -122
  290. package/dist/events/index.d.ts +0 -117
  291. package/dist/events/index.js +0 -89
  292. package/dist/factory/index.d.ts +0 -38
  293. package/dist/factory/index.js +0 -1652
  294. package/dist/hooks/index.d.ts +0 -4
  295. package/dist/hooks/index.js +0 -199
  296. package/dist/idempotency/index.d.ts +0 -323
  297. package/dist/idempotency/index.js +0 -500
  298. package/dist/index-B4t03KQ0.d.ts +0 -1366
  299. package/dist/index.d.ts +0 -135
  300. package/dist/index.js +0 -4756
  301. package/dist/migrations/index.d.ts +0 -185
  302. package/dist/migrations/index.js +0 -274
  303. package/dist/org/index.d.ts +0 -129
  304. package/dist/org/index.js +0 -220
  305. package/dist/permissions/index.d.ts +0 -144
  306. package/dist/permissions/index.js +0 -103
  307. package/dist/plugins/index.d.ts +0 -46
  308. package/dist/plugins/index.js +0 -1069
  309. package/dist/policies/index.js +0 -196
  310. package/dist/presets/index.js +0 -384
  311. package/dist/presets/multiTenant.d.ts +0 -39
  312. package/dist/presets/multiTenant.js +0 -112
  313. package/dist/registry/index.d.ts +0 -16
  314. package/dist/registry/index.js +0 -253
  315. package/dist/testing/index.d.ts +0 -618
  316. package/dist/testing/index.js +0 -48020
  317. package/dist/types/index.d.ts +0 -4
  318. package/dist/types/index.js +0 -8
  319. package/dist/types-B99TBmFV.d.ts +0 -76
  320. package/dist/types-BvckRbs2.d.ts +0 -143
  321. package/dist/utils/index.d.ts +0 -679
  322. package/dist/utils/index.js +0 -931
package/bin/arc.js CHANGED
@@ -9,7 +9,9 @@
9
9
  * arc generate controller <name> Generate a controller only
10
10
  * arc generate model <name> Generate a model only
11
11
  * arc introspect Show all registered resources
12
+ * arc describe <entry-file> Output JSON metadata for AI agents
12
13
  * arc docs [output-path] Export OpenAPI specification
14
+ * arc doctor Check environment and dependencies
13
15
  *
14
16
  * Examples:
15
17
  * arc init my-api
@@ -21,8 +23,6 @@
21
23
  */
22
24
 
23
25
  import { readFileSync } from 'node:fs';
24
- import { resolve } from 'node:path';
25
- import { pathToFileURL } from 'node:url';
26
26
 
27
27
  function getPackageVersion() {
28
28
  try {
@@ -78,11 +78,20 @@ async function main() {
78
78
  await handleIntrospect(rest);
79
79
  break;
80
80
 
81
+ case 'describe':
82
+ case 'desc':
83
+ await handleDescribe(subcommand ? [subcommand, ...rest] : rest);
84
+ break;
85
+
81
86
  case 'docs':
82
87
  case 'd':
83
88
  await handleDocs(subcommand ? [subcommand, ...rest] : rest);
84
89
  break;
85
90
 
91
+ case 'doctor':
92
+ await handleDoctor(subcommand ? [subcommand, ...rest] : rest);
93
+ break;
94
+
86
95
  default:
87
96
  console.error(`Unknown command: ${command}`);
88
97
  console.error('Run "arc --help" for usage');
@@ -103,7 +112,7 @@ async function main() {
103
112
 
104
113
  async function handleInit(args) {
105
114
  const options = parseInitOptions(args);
106
- const { init } = await import('../dist/cli/commands/init.js');
115
+ const { init } = await import('../dist/cli/commands/init.mjs');
107
116
  await init(options);
108
117
  }
109
118
 
@@ -146,72 +155,75 @@ async function handleGenerate(type, args) {
146
155
  }
147
156
 
148
157
  // Import and run
149
- const { generate } = await import('../dist/cli/commands/generate.js');
158
+ const { generate } = await import('../dist/cli/commands/generate.mjs');
150
159
  await generate(normalizedType, args);
151
160
  }
152
161
 
153
- async function handleIntrospect(args) {
154
- // Check for --entry flag
155
- const entryIndex = args.findIndex(arg => arg === '--entry' || arg === '-e');
156
- if (entryIndex !== -1 && args[entryIndex + 1]) {
157
- const entryPath = args[entryIndex + 1];
158
- // Resolve path relative to CWD and convert to file URL for ESM import
159
- const absolutePath = resolve(process.cwd(), entryPath);
160
- const fileUrl = pathToFileURL(absolutePath).href;
161
-
162
- console.log(`Loading resources from: ${entryPath}\n`);
163
- try {
164
- await import(fileUrl);
165
- } catch (err) {
166
- console.error(`Failed to load entry file: ${err.message}`);
167
- if (process.env.DEBUG) {
168
- console.error(err.stack);
169
- }
170
- process.exit(1);
171
- }
172
- }
162
+ async function handleIntrospect(rawArgs) {
163
+ const args = normalizeArgs(rawArgs);
164
+ const { entryPath, filteredArgs } = extractEntryArg(args);
173
165
 
174
- const { introspect } = await import('../dist/cli/commands/introspect.js');
175
- await introspect(args.filter((arg, i) => arg !== '--entry' && arg !== '-e' && i !== entryIndex + 1));
166
+ const { introspect } = await import('../dist/cli/commands/introspect.mjs');
167
+ await introspect(entryPath ? [entryPath, ...filteredArgs] : filteredArgs);
176
168
  }
177
169
 
178
- async function handleDocs(args) {
179
- // Check for --entry flag
180
- const entryIndex = args.findIndex(arg => arg === '--entry' || arg === '-e');
181
- if (entryIndex !== -1 && args[entryIndex + 1]) {
182
- const entryPath = args[entryIndex + 1];
183
- // Resolve path relative to CWD and convert to file URL for ESM import
184
- const absolutePath = resolve(process.cwd(), entryPath);
185
- const fileUrl = pathToFileURL(absolutePath).href;
186
-
187
- console.log(`Loading resources from: ${entryPath}\n`);
188
- try {
189
- await import(fileUrl);
190
- } catch (err) {
191
- console.error(`Failed to load entry file: ${err.message}`);
192
- if (process.env.DEBUG) {
193
- console.error(err.stack);
194
- }
195
- process.exit(1);
196
- }
197
- }
170
+ async function handleDescribe(rawArgs) {
171
+ const args = normalizeArgs(rawArgs);
172
+ const { describe } = await import('../dist/cli/commands/describe.mjs');
173
+ await describe(args);
174
+ }
175
+
176
+ async function handleDocs(rawArgs) {
177
+ const args = normalizeArgs(rawArgs);
178
+ const { entryPath, filteredArgs } = extractEntryArg(args);
179
+ const { exportDocs } = await import('../dist/cli/commands/docs.mjs');
180
+ await exportDocs(entryPath ? [entryPath, ...filteredArgs] : filteredArgs);
181
+ }
198
182
 
199
- const filteredArgs = args.filter((arg, i) => arg !== '--entry' && arg !== '-e' && i !== entryIndex + 1);
200
- const outputPath = filteredArgs[0] || './openapi.json';
201
- const { exportDocs } = await import('../dist/cli/commands/docs.js');
202
- await exportDocs([outputPath]);
183
+ async function handleDoctor(rawArgs) {
184
+ const { doctor } = await import('../dist/cli/commands/doctor.mjs');
185
+ await doctor(rawArgs);
203
186
  }
204
187
 
205
188
  // ============================================================================
206
189
  // Option Parsing
207
190
  // ============================================================================
208
191
 
209
- function parseInitOptions(args) {
192
+ // Mirrors src/cli/utils/normalizeArgs.ts — keep in sync
193
+ // (bin/arc.js is unbundled, can't import tree-shaken dist internals)
194
+ function normalizeArgs(raw) {
195
+ const out = [];
196
+ for (const arg of raw) {
197
+ if (arg.startsWith('--') && arg.includes('=')) {
198
+ const eqIdx = arg.indexOf('=');
199
+ out.push(arg.slice(0, eqIdx), arg.slice(eqIdx + 1));
200
+ } else {
201
+ out.push(arg);
202
+ }
203
+ }
204
+ return out;
205
+ }
206
+
207
+ function extractEntryArg(args) {
208
+ const entryIndex = args.findIndex(arg => arg === '--entry' || arg === '-e');
209
+ const hasEntry = entryIndex !== -1 && !!args[entryIndex + 1];
210
+ const entryPath = hasEntry ? args[entryIndex + 1] : undefined;
211
+ const filteredArgs = hasEntry
212
+ ? args.filter((arg, i) => i !== entryIndex && i !== entryIndex + 1)
213
+ : args;
214
+
215
+ return { entryPath, filteredArgs };
216
+ }
217
+
218
+ function parseInitOptions(rawArgs) {
219
+ const args = normalizeArgs(rawArgs);
220
+
210
221
  const opts = {
211
222
  name: undefined,
212
223
  adapter: undefined,
213
224
  tenant: undefined,
214
225
  typescript: undefined,
226
+ edge: undefined,
215
227
  skipInstall: false,
216
228
  force: false,
217
229
  };
@@ -261,6 +273,19 @@ function parseInitOptions(args) {
261
273
  opts.typescript = false;
262
274
  break;
263
275
 
276
+ case '--better-auth':
277
+ opts.auth = 'better-auth';
278
+ break;
279
+
280
+ case '--jwt':
281
+ opts.auth = 'jwt';
282
+ break;
283
+
284
+ case '--edge':
285
+ case '--serverless':
286
+ opts.edge = true;
287
+ break;
288
+
264
289
  case '--skip-install':
265
290
  opts.skipInstall = true;
266
291
  break;
@@ -291,7 +316,9 @@ COMMANDS
291
316
  init, new Initialize a new Arc project
292
317
  generate, g Generate resources, controllers, or models
293
318
  introspect, i Show all registered resources
319
+ describe, desc Output JSON metadata for AI agents
294
320
  docs, d Export OpenAPI specification
321
+ doctor Check environment and dependencies
295
322
 
296
323
  GLOBAL OPTIONS
297
324
  --entry, -e <path> Entry file to load before running command
@@ -302,10 +329,13 @@ GLOBAL OPTIONS
302
329
  INIT OPTIONS
303
330
  --mongokit Use MongoKit adapter (default, recommended)
304
331
  --custom Use custom adapter (empty template)
332
+ --better-auth Use Better Auth (default, recommended)
333
+ --jwt Use Arc built-in JWT auth
305
334
  --multi-tenant, --multi Multi-tenant mode (adds org scoping)
306
335
  --single-tenant, --single Single-tenant mode (default)
307
336
  --ts, --typescript Generate TypeScript (default)
308
337
  --js, --javascript Generate JavaScript
338
+ --edge, --serverless Target Edge/Serverless environments
309
339
  --force, -f Overwrite existing directory
310
340
  --skip-install Skip npm install after scaffolding
311
341
 
@@ -326,7 +356,10 @@ EXAMPLES
326
356
  arc init my-api
327
357
 
328
358
  # Initialize with all options (non-interactive)
329
- arc init my-api --mongokit --single --ts
359
+ arc init my-api --mongokit --better-auth --single --ts
360
+
361
+ # Initialize with JWT auth instead of Better Auth
362
+ arc init my-api --mongokit --jwt --single --ts
330
363
 
331
364
  # Initialize a JavaScript single-tenant app
332
365
  arc init my-api --mongokit --single --js
@@ -349,6 +382,12 @@ EXAMPLES
349
382
  # Show registered resources
350
383
  arc introspect --entry ./dist/index.js
351
384
 
385
+ # Output JSON metadata for AI agents
386
+ arc describe ./dist/resources.js --json
387
+
388
+ # Describe a single resource
389
+ arc describe ./dist/resources.js product
390
+
352
391
  MORE INFO
353
392
  Documentation: https://github.com/classytic/arc
354
393
  Issues: https://github.com/classytic/arc/issues
@@ -0,0 +1,100 @@
1
+ //#region src/events/EventTransport.d.ts
2
+ /**
3
+ * Event Transport Interface
4
+ *
5
+ * Defines contract for event delivery backends.
6
+ * Implement for durable transports (Redis, RabbitMQ, Kafka, etc.)
7
+ *
8
+ * @example
9
+ * // Redis Pub/Sub implementation
10
+ * class RedisEventTransport implements EventTransport {
11
+ * async publish(event) {
12
+ * await redis.publish(event.type, JSON.stringify(event));
13
+ * }
14
+ * async subscribe(pattern, handler) {
15
+ * redis.psubscribe(pattern);
16
+ * redis.on('pmessage', (p, channel, msg) => handler(JSON.parse(msg)));
17
+ * }
18
+ * }
19
+ */
20
+ interface DomainEvent<T = unknown> {
21
+ /** Event type (e.g., 'product.created', 'order.shipped') */
22
+ type: string;
23
+ /** Event payload */
24
+ payload: T;
25
+ /** Event metadata */
26
+ meta: {
27
+ /** Unique event ID */id: string; /** Event timestamp */
28
+ timestamp: Date; /** Source resource */
29
+ resource?: string; /** Resource ID */
30
+ resourceId?: string; /** User who triggered the event */
31
+ userId?: string; /** Organization context */
32
+ organizationId?: string; /** Correlation ID for tracing */
33
+ correlationId?: string;
34
+ };
35
+ }
36
+ type EventHandler<T = unknown> = (event: DomainEvent<T>) => void | Promise<void>;
37
+ /**
38
+ * Minimal logger interface for event transports.
39
+ * Compatible with `console`, `pino`, `fastify.log`, and any custom logger.
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * // Use Fastify's logger
44
+ * new MemoryEventTransport({ logger: fastify.log });
45
+ *
46
+ * // Use a custom logger
47
+ * new MemoryEventTransport({ logger: { warn: myWarn, error: myError } });
48
+ *
49
+ * // Default: console (no logger option needed)
50
+ * new MemoryEventTransport();
51
+ * ```
52
+ */
53
+ interface EventLogger {
54
+ warn(message: string, ...args: unknown[]): void;
55
+ error(message: string, ...args: unknown[]): void;
56
+ }
57
+ interface EventTransport {
58
+ /** Transport name for logging */
59
+ readonly name: string;
60
+ /**
61
+ * Publish an event to the transport
62
+ */
63
+ publish(event: DomainEvent): Promise<void>;
64
+ /**
65
+ * Subscribe to events matching a pattern
66
+ * @param pattern - Event type pattern (e.g., 'product.*', '*')
67
+ * @param handler - Handler function
68
+ * @returns Unsubscribe function
69
+ */
70
+ subscribe(pattern: string, handler: EventHandler): Promise<() => void>;
71
+ /**
72
+ * Close transport connections
73
+ */
74
+ close?(): Promise<void>;
75
+ }
76
+ interface MemoryEventTransportOptions {
77
+ /** Logger for error/warning messages (default: console) */
78
+ logger?: EventLogger;
79
+ }
80
+ /**
81
+ * In-memory event transport (default)
82
+ * Events are delivered synchronously within the process.
83
+ * Not suitable for multi-instance deployments.
84
+ */
85
+ declare class MemoryEventTransport implements EventTransport {
86
+ readonly name = "memory";
87
+ private handlers;
88
+ private logger;
89
+ constructor(options?: MemoryEventTransportOptions);
90
+ publish(event: DomainEvent): Promise<void>;
91
+ subscribe(pattern: string, handler: EventHandler): Promise<() => void>;
92
+ close(): Promise<void>;
93
+ }
94
+ /**
95
+ * Create a domain event with auto-generated metadata
96
+ */
97
+ declare function createEvent<T>(type: string, payload: T, meta?: Partial<DomainEvent['meta']>): DomainEvent<T>;
98
+ //#endregion
99
+ export { MemoryEventTransport as a, EventTransport as i, EventHandler as n, MemoryEventTransportOptions as o, EventLogger as r, createEvent as s, DomainEvent as t };
100
+ //# sourceMappingURL=EventTransport-BD2U0BTc.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventTransport-BD2U0BTc.d.mts","names":[],"sources":["../src/events/EventTransport.ts"],"mappings":";;AAmBA;;;;;;;;;;;;;;;;;UAAiB,WAAA;EAoBA;EAlBf,IAAA;EAsBsB;EApBtB,OAAA,EAAS,CAAA;EAoBiD;EAlB1D,IAAA;IAkBwE,sBAhBtE,EAAA,UAgB6E;IAd7E,SAAA,EAAW,IAAA,EAciC;IAZ5C,QAAA,WAYqC;IAVrC,UAAA,WAU6E;IAR7E,MAAA,WA0Ba;IAxBb,cAAA,WAwBwB;IAtBxB,aAAA;EAAA;AAAA;AAAA,KAIQ,YAAA,iBAA6B,KAAA,EAAO,WAAA,CAAY,CAAA,aAAc,OAAA;;;;;;AAuB1E;;;;;;;;;;;UALiB,WAAA;EACf,IAAA,CAAK,OAAA,aAAoB,IAAA;EACzB,KAAA,CAAM,OAAA,aAAoB,IAAA;AAAA;AAAA,UAGX,cAAA;EAeL;EAAA,SAbD,IAAA;EAakB;;;EAR3B,OAAA,CAAQ,KAAA,EAAO,WAAA,GAAc,OAAA;EAaZ;;AAGnB;;;;EARE,SAAA,CAAU,OAAA,UAAiB,OAAA,EAAS,YAAA,GAAe,OAAA;EAkBxC;;;EAbX,KAAA,KAAU,OAAA;AAAA;AAAA,UAGK,2BAAA;EAiD2B;EA/C1C,MAAA,GAAS,WAAA;AAAA;;;;;;cAQE,oBAAA,YAAgC,cAAA;EAAA,SAClC,IAAA;EAAA,QACD,QAAA;EAAA,QACA,MAAA;cAEI,OAAA,GAAU,2BAAA;EAIhB,OAAA,CAAQ,KAAA,EAAO,WAAA,GAAc,OAAA;EA8B7B,SAAA,CAAU,OAAA,UAAiB,OAAA,EAAS,YAAA,GAAe,OAAA;EAWnD,KAAA,CAAA,GAAS,OAAA;AAAA;;;;iBAQD,WAAA,GAAA,CACd,IAAA,UACA,OAAA,EAAS,CAAA,EACT,IAAA,GAAO,OAAA,CAAQ,WAAA,YACd,WAAA,CAAY,CAAA"}