@sixthsummit/ship-api 0.0.0-stage → 4.1.1

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 (556) hide show
  1. package/CHANGELOG.md +605 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +4 -0
  4. package/README.md +58 -2
  5. package/cli/commands/add.js +537 -0
  6. package/cli/commands/contract.js +2 -0
  7. package/cli/commands/create.js +250 -0
  8. package/cli/commands/dev.js +227 -0
  9. package/cli/commands/doctor.js +286 -0
  10. package/cli/commands/generate.js +937 -0
  11. package/cli/commands/graph.js +2 -0
  12. package/cli/commands/migrate-orm.js +1171 -0
  13. package/cli/commands/update.js +37 -0
  14. package/cli/ship-api.js +285 -0
  15. package/lib/app/auth/AuthProvider.d.ts +91 -0
  16. package/lib/app/auth/AuthProvider.d.ts.map +1 -0
  17. package/lib/app/auth/AuthProvider.js +13 -0
  18. package/lib/app/auth/AuthProvider.js.map +1 -0
  19. package/lib/app/auth/adapters/firebase.d.ts +79 -0
  20. package/lib/app/auth/adapters/firebase.d.ts.map +1 -0
  21. package/lib/app/auth/adapters/firebase.js +122 -0
  22. package/lib/app/auth/adapters/firebase.js.map +1 -0
  23. package/lib/app/auth/adapters/jwtCookie.d.ts +55 -0
  24. package/lib/app/auth/adapters/jwtCookie.d.ts.map +1 -0
  25. package/lib/app/auth/adapters/jwtCookie.js +120 -0
  26. package/lib/app/auth/adapters/jwtCookie.js.map +1 -0
  27. package/lib/app/auth/index.d.ts +8 -0
  28. package/lib/app/auth/index.d.ts.map +1 -0
  29. package/lib/app/auth/index.js +7 -0
  30. package/lib/app/auth/index.js.map +1 -0
  31. package/lib/app/auth/jwt/AuthFlow.d.ts +94 -0
  32. package/lib/app/auth/jwt/AuthFlow.d.ts.map +1 -0
  33. package/lib/app/auth/jwt/AuthFlow.js +127 -0
  34. package/lib/app/auth/jwt/AuthFlow.js.map +1 -0
  35. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts +80 -0
  36. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts.map +1 -0
  37. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js +134 -0
  38. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js.map +1 -0
  39. package/lib/app/auth/jwt/JwtSigner.d.ts +123 -0
  40. package/lib/app/auth/jwt/JwtSigner.d.ts.map +1 -0
  41. package/lib/app/auth/jwt/JwtSigner.js +118 -0
  42. package/lib/app/auth/jwt/JwtSigner.js.map +1 -0
  43. package/lib/app/auth/jwt/RefreshTokenStore.d.ts +97 -0
  44. package/lib/app/auth/jwt/RefreshTokenStore.d.ts.map +1 -0
  45. package/lib/app/auth/jwt/RefreshTokenStore.js +122 -0
  46. package/lib/app/auth/jwt/RefreshTokenStore.js.map +1 -0
  47. package/lib/app/auth/permissionDefinition.d.ts +20 -0
  48. package/lib/app/auth/permissionDefinition.d.ts.map +1 -0
  49. package/lib/app/auth/permissionDefinition.js +2 -0
  50. package/lib/app/auth/permissionDefinition.js.map +1 -0
  51. package/lib/app/context/RequestContext.d.ts +59 -0
  52. package/lib/app/context/RequestContext.d.ts.map +1 -0
  53. package/lib/app/context/RequestContext.js +25 -0
  54. package/lib/app/context/RequestContext.js.map +1 -0
  55. package/lib/app/db/QueryOptions.d.ts +82 -0
  56. package/lib/app/db/QueryOptions.d.ts.map +1 -0
  57. package/lib/app/db/QueryOptions.js +37 -0
  58. package/lib/app/db/QueryOptions.js.map +1 -0
  59. package/lib/app/db/baseFields.d.ts +60 -0
  60. package/lib/app/db/baseFields.d.ts.map +1 -0
  61. package/lib/app/db/baseFields.js +54 -0
  62. package/lib/app/db/baseFields.js.map +1 -0
  63. package/lib/app/db/buildWhere.d.ts +22 -0
  64. package/lib/app/db/buildWhere.d.ts.map +1 -0
  65. package/lib/app/db/buildWhere.js +75 -0
  66. package/lib/app/db/buildWhere.js.map +1 -0
  67. package/lib/app/db/client.d.ts +111 -0
  68. package/lib/app/db/client.d.ts.map +1 -0
  69. package/lib/app/db/client.js +99 -0
  70. package/lib/app/db/client.js.map +1 -0
  71. package/lib/app/db/tenantScoped.d.ts +59 -0
  72. package/lib/app/db/tenantScoped.d.ts.map +1 -0
  73. package/lib/app/db/tenantScoped.js +54 -0
  74. package/lib/app/db/tenantScoped.js.map +1 -0
  75. package/lib/app/db/transaction.d.ts +58 -0
  76. package/lib/app/db/transaction.d.ts.map +1 -0
  77. package/lib/app/db/transaction.js +106 -0
  78. package/lib/app/db/transaction.js.map +1 -0
  79. package/lib/app/health/HealthCheck.d.ts +121 -0
  80. package/lib/app/health/HealthCheck.d.ts.map +1 -0
  81. package/lib/app/health/HealthCheck.js +151 -0
  82. package/lib/app/health/HealthCheck.js.map +1 -0
  83. package/lib/app/health/redisHealthCheck.d.ts +14 -0
  84. package/lib/app/health/redisHealthCheck.d.ts.map +1 -0
  85. package/lib/app/health/redisHealthCheck.js +21 -0
  86. package/lib/app/health/redisHealthCheck.js.map +1 -0
  87. package/lib/app/lifecycle/Bootstrapper.d.ts +92 -0
  88. package/lib/app/lifecycle/Bootstrapper.d.ts.map +1 -0
  89. package/lib/app/lifecycle/Bootstrapper.js +99 -0
  90. package/lib/app/lifecycle/Bootstrapper.js.map +1 -0
  91. package/lib/app/registry/routes.d.ts +89 -0
  92. package/lib/app/registry/routes.d.ts.map +1 -0
  93. package/lib/app/registry/routes.js +72 -0
  94. package/lib/app/registry/routes.js.map +1 -0
  95. package/lib/app/services/DrizzleEntityService.d.ts +123 -0
  96. package/lib/app/services/DrizzleEntityService.d.ts.map +1 -0
  97. package/lib/app/services/DrizzleEntityService.js +342 -0
  98. package/lib/app/services/DrizzleEntityService.js.map +1 -0
  99. package/lib/app/services/RedisProvider.d.ts +52 -0
  100. package/lib/app/services/RedisProvider.d.ts.map +1 -0
  101. package/lib/app/services/RedisProvider.js +75 -0
  102. package/lib/app/services/RedisProvider.js.map +1 -0
  103. package/lib/app/services/cache/Cache.d.ts +70 -0
  104. package/lib/app/services/cache/Cache.d.ts.map +1 -0
  105. package/lib/app/services/cache/Cache.js +18 -0
  106. package/lib/app/services/cache/Cache.js.map +1 -0
  107. package/lib/app/services/cache/InMemoryCache.d.ts +35 -0
  108. package/lib/app/services/cache/InMemoryCache.d.ts.map +1 -0
  109. package/lib/app/services/cache/InMemoryCache.js +76 -0
  110. package/lib/app/services/cache/InMemoryCache.js.map +1 -0
  111. package/lib/app/services/cache/RedisCache.d.ts +99 -0
  112. package/lib/app/services/cache/RedisCache.d.ts.map +1 -0
  113. package/lib/app/services/cache/RedisCache.js +150 -0
  114. package/lib/app/services/cache/RedisCache.js.map +1 -0
  115. package/lib/app/services/cache/cached.d.ts +30 -0
  116. package/lib/app/services/cache/cached.d.ts.map +1 -0
  117. package/lib/app/services/cache/cached.js +38 -0
  118. package/lib/app/services/cache/cached.js.map +1 -0
  119. package/lib/app/services/cache/index.d.ts +5 -0
  120. package/lib/app/services/cache/index.d.ts.map +1 -0
  121. package/lib/app/services/cache/index.js +4 -0
  122. package/lib/app/services/cache/index.js.map +1 -0
  123. package/lib/app/services/cron/defineCron.d.ts +57 -0
  124. package/lib/app/services/cron/defineCron.d.ts.map +1 -0
  125. package/lib/app/services/cron/defineCron.js +15 -0
  126. package/lib/app/services/cron/defineCron.js.map +1 -0
  127. package/lib/app/services/cron/index.d.ts +2 -0
  128. package/lib/app/services/cron/index.d.ts.map +1 -0
  129. package/lib/app/services/cron/index.js +2 -0
  130. package/lib/app/services/cron/index.js.map +1 -0
  131. package/lib/app/services/hooks/LifecycleHooks.d.ts +61 -0
  132. package/lib/app/services/hooks/LifecycleHooks.d.ts.map +1 -0
  133. package/lib/app/services/hooks/LifecycleHooks.js +85 -0
  134. package/lib/app/services/hooks/LifecycleHooks.js.map +1 -0
  135. package/lib/app/services/jobs/JobsManager.d.ts +67 -0
  136. package/lib/app/services/jobs/JobsManager.d.ts.map +1 -0
  137. package/lib/app/services/jobs/JobsManager.js +121 -0
  138. package/lib/app/services/jobs/JobsManager.js.map +1 -0
  139. package/lib/app/services/jobs/bullBoard.d.ts +72 -0
  140. package/lib/app/services/jobs/bullBoard.d.ts.map +1 -0
  141. package/lib/app/services/jobs/bullBoard.js +96 -0
  142. package/lib/app/services/jobs/bullBoard.js.map +1 -0
  143. package/lib/app/services/jobs/defineJob.d.ts +81 -0
  144. package/lib/app/services/jobs/defineJob.d.ts.map +1 -0
  145. package/lib/app/services/jobs/defineJob.js +49 -0
  146. package/lib/app/services/jobs/defineJob.js.map +1 -0
  147. package/lib/app/services/jobs/index.d.ts +4 -0
  148. package/lib/app/services/jobs/index.d.ts.map +1 -0
  149. package/lib/app/services/jobs/index.js +4 -0
  150. package/lib/app/services/jobs/index.js.map +1 -0
  151. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts +23 -0
  152. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts.map +1 -0
  153. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js +51 -0
  154. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js.map +1 -0
  155. package/lib/app/services/rateLimit/RateLimitBackend.d.ts +41 -0
  156. package/lib/app/services/rateLimit/RateLimitBackend.d.ts.map +1 -0
  157. package/lib/app/services/rateLimit/RateLimitBackend.js +19 -0
  158. package/lib/app/services/rateLimit/RateLimitBackend.js.map +1 -0
  159. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts +16 -0
  160. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts.map +1 -0
  161. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js +80 -0
  162. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js.map +1 -0
  163. package/lib/app/services/rateLimit/index.d.ts +4 -0
  164. package/lib/app/services/rateLimit/index.d.ts.map +1 -0
  165. package/lib/app/services/rateLimit/index.js +3 -0
  166. package/lib/app/services/rateLimit/index.js.map +1 -0
  167. package/lib/app/services/storage/DiskStorageAdapter.d.ts +62 -0
  168. package/lib/app/services/storage/DiskStorageAdapter.d.ts.map +1 -0
  169. package/lib/app/services/storage/DiskStorageAdapter.js +295 -0
  170. package/lib/app/services/storage/DiskStorageAdapter.js.map +1 -0
  171. package/lib/app/services/storage/GCSStorageAdapter.d.ts +44 -0
  172. package/lib/app/services/storage/GCSStorageAdapter.d.ts.map +1 -0
  173. package/lib/app/services/storage/GCSStorageAdapter.js +133 -0
  174. package/lib/app/services/storage/GCSStorageAdapter.js.map +1 -0
  175. package/lib/app/services/storage/S3StorageAdapter.d.ts +57 -0
  176. package/lib/app/services/storage/S3StorageAdapter.d.ts.map +1 -0
  177. package/lib/app/services/storage/S3StorageAdapter.js +162 -0
  178. package/lib/app/services/storage/S3StorageAdapter.js.map +1 -0
  179. package/lib/app/services/storage/StorageService.d.ts +88 -0
  180. package/lib/app/services/storage/StorageService.d.ts.map +1 -0
  181. package/lib/app/services/storage/StorageService.js +18 -0
  182. package/lib/app/services/storage/StorageService.js.map +1 -0
  183. package/lib/app/services/storage/index.d.ts +5 -0
  184. package/lib/app/services/storage/index.d.ts.map +1 -0
  185. package/lib/app/services/storage/index.js +4 -0
  186. package/lib/app/services/storage/index.js.map +1 -0
  187. package/lib/app/utils/ContextValidators.d.ts +46 -0
  188. package/lib/app/utils/ContextValidators.d.ts.map +1 -0
  189. package/lib/app/utils/ContextValidators.js +81 -0
  190. package/lib/app/utils/ContextValidators.js.map +1 -0
  191. package/lib/app/utils/defineEnv.d.ts +80 -0
  192. package/lib/app/utils/defineEnv.d.ts.map +1 -0
  193. package/lib/app/utils/defineEnv.js +95 -0
  194. package/lib/app/utils/defineEnv.js.map +1 -0
  195. package/lib/client.d.ts +139 -0
  196. package/lib/client.d.ts.map +1 -0
  197. package/lib/client.js +98 -0
  198. package/lib/client.js.map +1 -0
  199. package/lib/contract/application.d.ts +3 -0
  200. package/lib/contract/application.d.ts.map +1 -0
  201. package/lib/contract/application.js +2 -0
  202. package/lib/contract/application.js.map +1 -0
  203. package/lib/contract/client.d.ts +3 -0
  204. package/lib/contract/client.d.ts.map +1 -0
  205. package/lib/contract/client.js +3 -0
  206. package/lib/contract/client.js.map +1 -0
  207. package/lib/contract/index.d.ts +3 -0
  208. package/lib/contract/index.d.ts.map +1 -0
  209. package/lib/contract/index.js +3 -0
  210. package/lib/contract/index.js.map +1 -0
  211. package/lib/contract/manifest.d.ts +3 -0
  212. package/lib/contract/manifest.d.ts.map +1 -0
  213. package/lib/contract/manifest.js +2 -0
  214. package/lib/contract/manifest.js.map +1 -0
  215. package/lib/contract/openapi.d.ts +3 -0
  216. package/lib/contract/openapi.d.ts.map +1 -0
  217. package/lib/contract/openapi.js +3 -0
  218. package/lib/contract/openapi.js.map +1 -0
  219. package/lib/contract/project.d.ts +3 -0
  220. package/lib/contract/project.d.ts.map +1 -0
  221. package/lib/contract/project.js +3 -0
  222. package/lib/contract/project.js.map +1 -0
  223. package/lib/contract/schema.d.ts +3 -0
  224. package/lib/contract/schema.d.ts.map +1 -0
  225. package/lib/contract/schema.js +3 -0
  226. package/lib/contract/schema.js.map +1 -0
  227. package/lib/drizzle/index.d.ts +3 -0
  228. package/lib/drizzle/index.d.ts.map +1 -0
  229. package/lib/drizzle/index.js +3 -0
  230. package/lib/drizzle/index.js.map +1 -0
  231. package/lib/hono/auth.d.ts +6 -0
  232. package/lib/hono/auth.d.ts.map +1 -0
  233. package/lib/hono/auth.js +54 -0
  234. package/lib/hono/auth.js.map +1 -0
  235. package/lib/hono/index.d.ts +4 -0
  236. package/lib/hono/index.d.ts.map +1 -0
  237. package/lib/hono/index.js +4 -0
  238. package/lib/hono/index.js.map +1 -0
  239. package/lib/http/app/createApp.d.ts +132 -0
  240. package/lib/http/app/createApp.d.ts.map +1 -0
  241. package/lib/http/app/createApp.js +215 -0
  242. package/lib/http/app/createApp.js.map +1 -0
  243. package/lib/http/app/devRoutes.d.ts +31 -0
  244. package/lib/http/app/devRoutes.d.ts.map +1 -0
  245. package/lib/http/app/devRoutes.js +145 -0
  246. package/lib/http/app/devRoutes.js.map +1 -0
  247. package/lib/http/app/errors.d.ts +45 -0
  248. package/lib/http/app/errors.d.ts.map +1 -0
  249. package/lib/http/app/errors.js +93 -0
  250. package/lib/http/app/errors.js.map +1 -0
  251. package/lib/http/app/health.d.ts +66 -0
  252. package/lib/http/app/health.d.ts.map +1 -0
  253. package/lib/http/app/health.js +104 -0
  254. package/lib/http/app/health.js.map +1 -0
  255. package/lib/http/errors/AppError.d.ts +10 -0
  256. package/lib/http/errors/AppError.d.ts.map +1 -0
  257. package/lib/http/errors/AppError.js +19 -0
  258. package/lib/http/errors/AppError.js.map +1 -0
  259. package/lib/http/errors/AuthenticationError.d.ts +8 -0
  260. package/lib/http/errors/AuthenticationError.d.ts.map +1 -0
  261. package/lib/http/errors/AuthenticationError.js +10 -0
  262. package/lib/http/errors/AuthenticationError.js.map +1 -0
  263. package/lib/http/errors/AuthorizationError.d.ts +8 -0
  264. package/lib/http/errors/AuthorizationError.d.ts.map +1 -0
  265. package/lib/http/errors/AuthorizationError.js +10 -0
  266. package/lib/http/errors/AuthorizationError.js.map +1 -0
  267. package/lib/http/errors/BadRequestError.d.ts +8 -0
  268. package/lib/http/errors/BadRequestError.d.ts.map +1 -0
  269. package/lib/http/errors/BadRequestError.js +10 -0
  270. package/lib/http/errors/BadRequestError.js.map +1 -0
  271. package/lib/http/errors/ConflictError.d.ts +8 -0
  272. package/lib/http/errors/ConflictError.d.ts.map +1 -0
  273. package/lib/http/errors/ConflictError.js +10 -0
  274. package/lib/http/errors/ConflictError.js.map +1 -0
  275. package/lib/http/errors/InternalServerError.d.ts +8 -0
  276. package/lib/http/errors/InternalServerError.d.ts.map +1 -0
  277. package/lib/http/errors/InternalServerError.js +10 -0
  278. package/lib/http/errors/InternalServerError.js.map +1 -0
  279. package/lib/http/errors/NotFoundError.d.ts +8 -0
  280. package/lib/http/errors/NotFoundError.d.ts.map +1 -0
  281. package/lib/http/errors/NotFoundError.js +10 -0
  282. package/lib/http/errors/NotFoundError.js.map +1 -0
  283. package/lib/http/errors/RateLimitError.d.ts +13 -0
  284. package/lib/http/errors/RateLimitError.d.ts.map +1 -0
  285. package/lib/http/errors/RateLimitError.js +16 -0
  286. package/lib/http/errors/RateLimitError.js.map +1 -0
  287. package/lib/http/errors/ServiceUnavailableError.d.ts +8 -0
  288. package/lib/http/errors/ServiceUnavailableError.d.ts.map +1 -0
  289. package/lib/http/errors/ServiceUnavailableError.js +10 -0
  290. package/lib/http/errors/ServiceUnavailableError.js.map +1 -0
  291. package/lib/http/errors/ValidationError.d.ts +9 -0
  292. package/lib/http/errors/ValidationError.d.ts.map +1 -0
  293. package/lib/http/errors/ValidationError.js +12 -0
  294. package/lib/http/errors/ValidationError.js.map +1 -0
  295. package/lib/http/errors/index.d.ts +11 -0
  296. package/lib/http/errors/index.d.ts.map +1 -0
  297. package/lib/http/errors/index.js +12 -0
  298. package/lib/http/errors/index.js.map +1 -0
  299. package/lib/http/middleware/apiKey.d.ts +9 -0
  300. package/lib/http/middleware/apiKey.d.ts.map +1 -0
  301. package/lib/http/middleware/apiKey.js +71 -0
  302. package/lib/http/middleware/apiKey.js.map +1 -0
  303. package/lib/http/middleware/csrf.d.ts +63 -0
  304. package/lib/http/middleware/csrf.d.ts.map +1 -0
  305. package/lib/http/middleware/csrf.js +169 -0
  306. package/lib/http/middleware/csrf.js.map +1 -0
  307. package/lib/http/middleware/httpLogger.d.ts +39 -0
  308. package/lib/http/middleware/httpLogger.d.ts.map +1 -0
  309. package/lib/http/middleware/httpLogger.js +118 -0
  310. package/lib/http/middleware/httpLogger.js.map +1 -0
  311. package/lib/http/middleware/idempotency.d.ts +48 -0
  312. package/lib/http/middleware/idempotency.d.ts.map +1 -0
  313. package/lib/http/middleware/idempotency.js +180 -0
  314. package/lib/http/middleware/idempotency.js.map +1 -0
  315. package/lib/http/middleware/rateLimit.d.ts +105 -0
  316. package/lib/http/middleware/rateLimit.d.ts.map +1 -0
  317. package/lib/http/middleware/rateLimit.js +84 -0
  318. package/lib/http/middleware/rateLimit.js.map +1 -0
  319. package/lib/http/middleware/requireAuth.d.ts +58 -0
  320. package/lib/http/middleware/requireAuth.d.ts.map +1 -0
  321. package/lib/http/middleware/requireAuth.js +63 -0
  322. package/lib/http/middleware/requireAuth.js.map +1 -0
  323. package/lib/http/middleware/requirePermission.d.ts +23 -0
  324. package/lib/http/middleware/requirePermission.d.ts.map +1 -0
  325. package/lib/http/middleware/requirePermission.js +50 -0
  326. package/lib/http/middleware/requirePermission.js.map +1 -0
  327. package/lib/http/middleware/resolveTenant.d.ts +41 -0
  328. package/lib/http/middleware/resolveTenant.d.ts.map +1 -0
  329. package/lib/http/middleware/resolveTenant.js +17 -0
  330. package/lib/http/middleware/resolveTenant.js.map +1 -0
  331. package/lib/http/streaming/sse.d.ts +31 -0
  332. package/lib/http/streaming/sse.d.ts.map +1 -0
  333. package/lib/http/streaming/sse.js +11 -0
  334. package/lib/http/streaming/sse.js.map +1 -0
  335. package/lib/http/streaming/streamLLM.d.ts +94 -0
  336. package/lib/http/streaming/streamLLM.d.ts.map +1 -0
  337. package/lib/http/streaming/streamLLM.js +94 -0
  338. package/lib/http/streaming/streamLLM.js.map +1 -0
  339. package/lib/http/utils/authCookies.d.ts +74 -0
  340. package/lib/http/utils/authCookies.d.ts.map +1 -0
  341. package/lib/http/utils/authCookies.js +102 -0
  342. package/lib/http/utils/authCookies.js.map +1 -0
  343. package/lib/http/utils/clientIp.d.ts +85 -0
  344. package/lib/http/utils/clientIp.d.ts.map +1 -0
  345. package/lib/http/utils/clientIp.js +249 -0
  346. package/lib/http/utils/clientIp.js.map +1 -0
  347. package/lib/http/utils/index.d.ts +4 -0
  348. package/lib/http/utils/index.d.ts.map +1 -0
  349. package/lib/http/utils/index.js +5 -0
  350. package/lib/http/utils/index.js.map +1 -0
  351. package/lib/http/utils/metaTags.d.ts +49 -0
  352. package/lib/http/utils/metaTags.d.ts.map +1 -0
  353. package/lib/http/utils/metaTags.js +32 -0
  354. package/lib/http/utils/metaTags.js.map +1 -0
  355. package/lib/http/utils/publicSuffix.d.ts +34 -0
  356. package/lib/http/utils/publicSuffix.d.ts.map +1 -0
  357. package/lib/http/utils/publicSuffix.js +276 -0
  358. package/lib/http/utils/publicSuffix.js.map +1 -0
  359. package/lib/http/utils/uploads.d.ts +92 -0
  360. package/lib/http/utils/uploads.d.ts.map +1 -0
  361. package/lib/http/utils/uploads.js +126 -0
  362. package/lib/http/utils/uploads.js.map +1 -0
  363. package/lib/http/utils/validate.d.ts +41 -0
  364. package/lib/http/utils/validate.d.ts.map +1 -0
  365. package/lib/http/utils/validate.js +55 -0
  366. package/lib/http/utils/validate.js.map +1 -0
  367. package/lib/http/utils/webhooks.d.ts +63 -0
  368. package/lib/http/utils/webhooks.d.ts.map +1 -0
  369. package/lib/http/utils/webhooks.js +133 -0
  370. package/lib/http/utils/webhooks.js.map +1 -0
  371. package/lib/http/ws/auth.d.ts +46 -0
  372. package/lib/http/ws/auth.d.ts.map +1 -0
  373. package/lib/http/ws/auth.js +123 -0
  374. package/lib/http/ws/auth.js.map +1 -0
  375. package/lib/index.d.ts +80 -0
  376. package/lib/index.d.ts.map +1 -0
  377. package/lib/index.js +61 -0
  378. package/lib/index.js.map +1 -0
  379. package/lib/kernel/index.d.ts +3 -0
  380. package/lib/kernel/index.d.ts.map +1 -0
  381. package/lib/kernel/index.js +3 -0
  382. package/lib/kernel/index.js.map +1 -0
  383. package/lib/libraries/.gitkeep +0 -0
  384. package/lib/libraries/ai/CHANGELOG.md +17 -0
  385. package/lib/libraries/ai/README.md +164 -0
  386. package/lib/libraries/ai/adapters/AnthropicAdapter.ts +382 -0
  387. package/lib/libraries/ai/adapters/LLMProvider.ts +76 -0
  388. package/lib/libraries/ai/adapters/OpenAIAdapter.ts +466 -0
  389. package/lib/libraries/ai/experimental/index.ts +20 -0
  390. package/lib/libraries/ai/index.ts +128 -0
  391. package/lib/libraries/ai/library.json +19 -0
  392. package/lib/libraries/ai/loop/agentLoop.ts +377 -0
  393. package/lib/libraries/ai/prompts/definePrompt.ts +0 -0
  394. package/lib/libraries/ai/rag/retrieveAndAnswer.ts +177 -0
  395. package/lib/libraries/ai/streaming/streamLLM.ts +94 -0
  396. package/lib/libraries/ai/structured/completeStructured.ts +143 -0
  397. package/lib/libraries/ai/tokens/Tokenizer.ts +216 -0
  398. package/lib/libraries/ai/tools/defineTool.ts +208 -0
  399. package/lib/libraries/ai/types.ts +260 -0
  400. package/lib/libraries/chunking/ChunkingService.ts +103 -0
  401. package/lib/libraries/chunking/README.md +104 -0
  402. package/lib/libraries/chunking/docs/api-reference.md +549 -0
  403. package/lib/libraries/chunking/docs/best-practices.md +321 -0
  404. package/lib/libraries/chunking/docs/code-organization.md +538 -0
  405. package/lib/libraries/chunking/docs/configuration.md +418 -0
  406. package/lib/libraries/chunking/docs/index.md +236 -0
  407. package/lib/libraries/chunking/docs/quick-start.md +298 -0
  408. package/lib/libraries/chunking/docs/strategies.md +407 -0
  409. package/lib/libraries/chunking/docs/summary.md +258 -0
  410. package/lib/libraries/chunking/docs/troubleshooting.md +527 -0
  411. package/lib/libraries/chunking/index.ts +17 -0
  412. package/lib/libraries/chunking/library.json +16 -0
  413. package/lib/libraries/chunking/strategies/ChunkingStrategy.ts +13 -0
  414. package/lib/libraries/chunking/strategies/FixedLengthChunkingStrategy.ts +88 -0
  415. package/lib/libraries/chunking/strategies/SemanticChunkingStrategy.ts +389 -0
  416. package/lib/libraries/chunking/strategies/SlidingWindowChunkingStrategy.ts +258 -0
  417. package/lib/libraries/chunking/types/index.ts +63 -0
  418. package/lib/libraries/email/EmailService.ts +591 -0
  419. package/lib/libraries/email/README.md +777 -0
  420. package/lib/libraries/email/TemplateRegistry.ts +148 -0
  421. package/lib/libraries/email/TemplateRenderer.ts +273 -0
  422. package/lib/libraries/email/index.ts +4 -0
  423. package/lib/libraries/email/initializeEmailService.ts +60 -0
  424. package/lib/libraries/email/library.json +12 -0
  425. package/lib/libraries/email/types/EmailAddress.ts +4 -0
  426. package/lib/libraries/email/types/EmailAttachment.ts +11 -0
  427. package/lib/libraries/email/types/EmailTag.ts +9 -0
  428. package/lib/libraries/email/types/EmailTemplate.ts +124 -0
  429. package/lib/libraries/email/types/SendBatchEmailsOptions.ts +9 -0
  430. package/lib/libraries/email/types/SendBatchEmailsResult.ts +9 -0
  431. package/lib/libraries/email/types/SendEmailOptions.ts +33 -0
  432. package/lib/libraries/email/types/SendEmailResult.ts +9 -0
  433. package/lib/libraries/email/types/index.ts +8 -0
  434. package/lib/libraries/weaviate/QueryBuilder.ts +292 -0
  435. package/lib/libraries/weaviate/README.md +284 -0
  436. package/lib/libraries/weaviate/Weaviate.ts +1419 -0
  437. package/lib/libraries/weaviate/WeaviateConfig.ts +268 -0
  438. package/lib/libraries/weaviate/docs/.gitkeep +1 -0
  439. package/lib/libraries/weaviate/docs/API_REFERENCE.md +1067 -0
  440. package/lib/libraries/weaviate/docs/CONFIGURATION.md +320 -0
  441. package/lib/libraries/weaviate/docs/ERROR_HANDLING.md +271 -0
  442. package/lib/libraries/weaviate/docs/MULTI_TENANCY.md +348 -0
  443. package/lib/libraries/weaviate/docs/PERFORMANCE.md +602 -0
  444. package/lib/libraries/weaviate/docs/PLUGIN_DEVELOPMENT.md +547 -0
  445. package/lib/libraries/weaviate/docs/QUICK_START.md +443 -0
  446. package/lib/libraries/weaviate/docs/README.md +269 -0
  447. package/lib/libraries/weaviate/docs/SCHEMA_GUIDE.md +630 -0
  448. package/lib/libraries/weaviate/docs/WEAVIATE_README.md +520 -0
  449. package/lib/libraries/weaviate/errors/WeaviateError.ts +92 -0
  450. package/lib/libraries/weaviate/errors/index.ts +1 -0
  451. package/lib/libraries/weaviate/index.ts +35 -0
  452. package/lib/libraries/weaviate/library.json +26 -0
  453. package/lib/libraries/weaviate/plugins/index.ts +2 -0
  454. package/lib/libraries/weaviate/schemas/SchemaRegistry.ts +284 -0
  455. package/lib/libraries/weaviate/schemas/index.ts +2 -0
  456. package/lib/libraries/weaviate/types/BM25SearchOptions.ts +9 -0
  457. package/lib/libraries/weaviate/types/ExtendedWeaviateClient.ts +7 -0
  458. package/lib/libraries/weaviate/types/HybridSearchOptions.ts +11 -0
  459. package/lib/libraries/weaviate/types/MultiTenancy.ts +81 -0
  460. package/lib/libraries/weaviate/types/Plugin.ts +17 -0
  461. package/lib/libraries/weaviate/types/SchemaConfig.ts +25 -0
  462. package/lib/libraries/weaviate/types/SearchMethod.ts +8 -0
  463. package/lib/libraries/weaviate/types/SearchOptions.ts +16 -0
  464. package/lib/libraries/weaviate/types/SearchRequest.ts +19 -0
  465. package/lib/libraries/weaviate/types/SearchResult.ts +16 -0
  466. package/lib/libraries/weaviate/types/SearchableField.ts +87 -0
  467. package/lib/libraries/weaviate/types/VectorIndexConfig.ts +19 -0
  468. package/lib/libraries/weaviate/types/VectorSearchOptions.ts +18 -0
  469. package/lib/libraries/weaviate/types/VectorizerConfig.ts +8 -0
  470. package/lib/libraries/weaviate/types/index.ts +29 -0
  471. package/lib/libraries/weaviate/utils/TenantContextManager.ts +94 -0
  472. package/lib/modules/accounts/index.ts +47 -0
  473. package/lib/modules/accounts/module.json +15 -0
  474. package/lib/modules/accounts/permissions.ts +33 -0
  475. package/lib/modules/accounts/routes.ts +200 -0
  476. package/lib/modules/accounts/schema.ts +219 -0
  477. package/lib/modules/accounts/services/AccountService.ts +44 -0
  478. package/lib/modules/accounts/validation/schemas.ts +70 -0
  479. package/lib/modules/oauth/adapters/GmailOAuthAdapter.ts +35 -0
  480. package/lib/modules/oauth/adapters/GoogleOAuthAdapter.ts +278 -0
  481. package/lib/modules/oauth/adapters/MicrosoftOAuthAdapter.ts +269 -0
  482. package/lib/modules/oauth/adapters/MockOAuthAdapter.ts +138 -0
  483. package/lib/modules/oauth/adapters/OAuthAdapter.ts +211 -0
  484. package/lib/modules/oauth/adapters/OAuthAdapterRegistry.ts +77 -0
  485. package/lib/modules/oauth/adapters/OutlookOAuthAdapter.ts +38 -0
  486. package/lib/modules/oauth/index.ts +79 -0
  487. package/lib/modules/oauth/module.json +23 -0
  488. package/lib/modules/oauth/permissions.ts +39 -0
  489. package/lib/modules/oauth/routes.ts +497 -0
  490. package/lib/modules/oauth/schema.ts +127 -0
  491. package/lib/modules/oauth/services/OAuthConnectionService.ts +147 -0
  492. package/lib/modules/oauth/state.ts +234 -0
  493. package/lib/modules/oauth/stateJtiCache.ts +85 -0
  494. package/lib/modules/oauth/verifyIdToken.ts +178 -0
  495. package/lib/modules/outbox/EventEmitter.ts +106 -0
  496. package/lib/modules/outbox/OutboxDrainer.ts +163 -0
  497. package/lib/modules/outbox/handlers/EventHandler.ts +115 -0
  498. package/lib/modules/outbox/index.ts +43 -0
  499. package/lib/modules/outbox/module.json +15 -0
  500. package/lib/modules/outbox/permissions.ts +36 -0
  501. package/lib/modules/outbox/routes.ts +219 -0
  502. package/lib/modules/outbox/schema.ts +207 -0
  503. package/lib/modules/outbox/services/OutboxEventService.ts +223 -0
  504. package/lib/observability/logger.d.ts +30 -0
  505. package/lib/observability/logger.d.ts.map +1 -0
  506. package/lib/observability/logger.js +110 -0
  507. package/lib/observability/logger.js.map +1 -0
  508. package/lib/observability/metrics.d.ts +3 -0
  509. package/lib/observability/metrics.d.ts.map +1 -0
  510. package/lib/observability/metrics.js +3 -0
  511. package/lib/observability/metrics.js.map +1 -0
  512. package/lib/observability/otel.d.ts +3 -0
  513. package/lib/observability/otel.d.ts.map +1 -0
  514. package/lib/observability/otel.js +3 -0
  515. package/lib/observability/otel.js.map +1 -0
  516. package/lib/observability/safeErrorFields.d.ts +14 -0
  517. package/lib/observability/safeErrorFields.d.ts.map +1 -0
  518. package/lib/observability/safeErrorFields.js +14 -0
  519. package/lib/observability/safeErrorFields.js.map +1 -0
  520. package/lib/observability/tracing.d.ts +3 -0
  521. package/lib/observability/tracing.d.ts.map +1 -0
  522. package/lib/observability/tracing.js +3 -0
  523. package/lib/observability/tracing.js.map +1 -0
  524. package/lib/package.json +4 -0
  525. package/lib/testing.d.ts +3 -0
  526. package/lib/testing.d.ts.map +1 -0
  527. package/lib/testing.js +3 -0
  528. package/lib/testing.js.map +1 -0
  529. package/package.json +193 -3
  530. package/templates/default/.claude/agents/qa-brief.md +106 -0
  531. package/templates/default/.claude/commands/sherpa-brief.md +23 -0
  532. package/templates/default/.cursor/rules/api.mdc +80 -0
  533. package/templates/default/.cursor/rules/commits.mdc +88 -0
  534. package/templates/default/.cursor/rules/security.mdc +92 -0
  535. package/templates/default/.cursor/rules/testing.mdc +123 -0
  536. package/templates/default/.cursor/rules/typescript.mdc +86 -0
  537. package/templates/default/.env.example +79 -0
  538. package/templates/default/.github/workflows/sherpa-brief.yml +180 -0
  539. package/templates/default/AGENTS.md +166 -0
  540. package/templates/default/CLAUDE.md +17 -0
  541. package/templates/default/README.md +97 -0
  542. package/templates/default/_gitignore +27 -0
  543. package/templates/default/docker-compose.yml +83 -0
  544. package/templates/default/drizzle.config.ts +34 -0
  545. package/templates/default/eslint.config.mjs +106 -0
  546. package/templates/default/package.json +57 -0
  547. package/templates/default/ship-api.config.ts +21 -0
  548. package/templates/default/src/client.ts +34 -0
  549. package/templates/default/src/config/modules.ts +23 -0
  550. package/templates/default/src/db/schema.ts +26 -0
  551. package/templates/default/src/environment.ts +81 -0
  552. package/templates/default/src/index.test.ts +53 -0
  553. package/templates/default/src/index.ts +11 -0
  554. package/templates/default/src/instrumentation.ts +13 -0
  555. package/templates/default/src/server.ts +90 -0
  556. package/templates/default/tsconfig.json +24 -0
@@ -0,0 +1,537 @@
1
+ import chalk from "chalk";
2
+ import { execSync } from "child_process";
3
+ import fs from "fs/promises";
4
+ import path from "path";
5
+ import { fileURLToPath } from "url";
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ /**
11
+ * Install npm dependencies
12
+ * Supports two formats:
13
+ * - Array of package names: ["lodash", "uuid"] (installs latest version)
14
+ * - Object with versions: {"lodash": "^4.17.21", "uuid": "^9.0.0"}
15
+ *
16
+ * @param {string[] | Record<string, string>} npmDependencies - Dependencies to install
17
+ * @param {string} projectPath - Path to the project
18
+ */
19
+ async function installNpmDependencies(npmDependencies, projectPath) {
20
+ if (!npmDependencies) {
21
+ return;
22
+ }
23
+
24
+ let packages;
25
+
26
+ if (Array.isArray(npmDependencies)) {
27
+ // Array format: ["lodash", "uuid"]
28
+ if (npmDependencies.length === 0) {
29
+ return;
30
+ }
31
+ packages = npmDependencies.join(" ");
32
+ } else if (typeof npmDependencies === "object") {
33
+ // Object format: {"lodash": "^4.17.21"}
34
+ if (Object.keys(npmDependencies).length === 0) {
35
+ return;
36
+ }
37
+ packages = Object.entries(npmDependencies)
38
+ .map(([name, version]) => `${name}@${version}`)
39
+ .join(" ");
40
+ } else {
41
+ return;
42
+ }
43
+
44
+ console.log(chalk.blue(`📦 Installing npm dependencies...`));
45
+
46
+ try {
47
+ execSync(`npm install ${packages}`, {
48
+ cwd: projectPath,
49
+ stdio: "inherit",
50
+ });
51
+ console.log(chalk.green(`✅ Dependencies installed successfully`));
52
+ } catch (error) {
53
+ console.error(chalk.red(`❌ Failed to install dependencies: ${error.message}`));
54
+ console.log(chalk.yellow(`\nYou can install them manually:`));
55
+ console.log(chalk.yellow(` npm install ${packages}`));
56
+ }
57
+ }
58
+
59
+ export async function addModule(moduleName, options, _installedDeps = new Set()) {
60
+ // Track installed dependencies to prevent circular installs
61
+ if (_installedDeps.has(moduleName)) {
62
+ return;
63
+ }
64
+
65
+ console.log(chalk.blue(`📦 Adding module: ${moduleName}`));
66
+
67
+ const projectPath = process.cwd();
68
+
69
+ // Check if we're in a ShipAPI project
70
+ const packageJsonPath = path.join(projectPath, "package.json");
71
+ try {
72
+ const packageJson = JSON.parse(await fs.readFile(packageJsonPath, "utf8"));
73
+ if (!packageJson.dependencies?.["@sixthsummit/ship-api"]) {
74
+ throw new Error("Not a ShipAPI project. Run this command from your project root.");
75
+ }
76
+ } catch (error) {
77
+ if (error.code === "ENOENT") {
78
+ throw new Error("No package.json found. Run this command from your project root.");
79
+ }
80
+ throw error;
81
+ }
82
+
83
+ // Find the module in the modules directory
84
+ // In development, modules are at ../../modules relative to cli/commands
85
+ // When published, modules are copied to lib/modules
86
+ let modulesDir = path.join(__dirname, "..", "..", "..", "..", "modules");
87
+
88
+ // Check if we're running from the published package (lib/modules exists)
89
+ const libModulesDir = path.join(__dirname, "..", "..", "lib", "modules");
90
+ try {
91
+ await fs.access(libModulesDir);
92
+ modulesDir = libModulesDir;
93
+ } catch {
94
+ // Use the repo modules directory
95
+ }
96
+
97
+ const moduleSourcePath = path.join(modulesDir, moduleName);
98
+ const moduleJsonPath = path.join(moduleSourcePath, "module.json");
99
+
100
+ // Check if module exists
101
+ try {
102
+ await fs.access(moduleSourcePath);
103
+ } catch {
104
+ console.error(chalk.red(`❌ Module '${moduleName}' not found.`));
105
+ console.log(chalk.yellow(`\nAvailable modules:`));
106
+ await listAvailableModules(modulesDir);
107
+ process.exit(1);
108
+ }
109
+
110
+ // Read module metadata
111
+ let moduleInfo = { name: moduleName, description: "", postInstall: [], dependencies: [] };
112
+ try {
113
+ moduleInfo = JSON.parse(await fs.readFile(moduleJsonPath, "utf8"));
114
+ } catch {
115
+ // No module.json, use defaults
116
+ }
117
+
118
+ // Install ShipAPI dependencies first (other modules or libraries)
119
+ if (moduleInfo.dependencies && moduleInfo.dependencies.length > 0) {
120
+ console.log(chalk.blue(`\n📋 Installing dependencies for ${moduleName}...`));
121
+ for (const dep of moduleInfo.dependencies) {
122
+ if (_installedDeps.has(dep)) {
123
+ console.log(chalk.gray(` ⏭️ ${dep} already installed`));
124
+ continue;
125
+ }
126
+
127
+ // Try to install as module first, then as library
128
+ const isModule = await isAvailableModule(dep, modulesDir);
129
+ const librariesDir = await getLibrariesDir();
130
+ const isLibrary = await isAvailableLibrary(dep, librariesDir);
131
+
132
+ if (isModule) {
133
+ await addModule(dep, { ...options, force: false }, _installedDeps);
134
+ } else if (isLibrary) {
135
+ await addLibrary(dep, { ...options, force: false }, _installedDeps);
136
+ } else {
137
+ console.log(chalk.yellow(` ⚠️ Dependency '${dep}' not found as module or library`));
138
+ }
139
+ }
140
+ console.log(chalk.blue(`\n📦 Continuing with ${moduleName}...`));
141
+ }
142
+
143
+ // Mark this module as being installed
144
+ _installedDeps.add(moduleName);
145
+
146
+ // Check if module already exists in project
147
+ const destPath = path.join(projectPath, "src", "modules", moduleName);
148
+ try {
149
+ await fs.access(destPath);
150
+ if (!options.force) {
151
+ console.log(chalk.gray(` ⏭️ Module '${moduleName}' already exists, skipping`));
152
+ return;
153
+ }
154
+ console.log(chalk.yellow(`⚠️ Overwriting existing module: ${moduleName}`));
155
+ await fs.rm(destPath, { recursive: true });
156
+ } catch (error) {
157
+ if (error.code !== "ENOENT") throw error;
158
+ }
159
+
160
+ // Copy module files (excluding module.json)
161
+ await copyModuleFiles(moduleSourcePath, destPath);
162
+
163
+ // Install npm dependencies if specified
164
+ if (moduleInfo.npmDependencies) {
165
+ await installNpmDependencies(moduleInfo.npmDependencies, projectPath);
166
+ }
167
+
168
+ console.log(chalk.green(`✅ Module '${moduleName}' added successfully!`));
169
+
170
+ // Print post-install instructions
171
+ if (moduleInfo.postInstall && moduleInfo.postInstall.length > 0) {
172
+ console.log(chalk.cyan(`\nNext steps:`));
173
+ moduleInfo.postInstall.forEach((step) => {
174
+ console.log(chalk.cyan(` • ${step}`));
175
+ });
176
+ }
177
+
178
+ if (moduleInfo.requiredEnvVars && moduleInfo.requiredEnvVars.length > 0) {
179
+ console.log(chalk.yellow(`\nRequired environment variables:`));
180
+ moduleInfo.requiredEnvVars.forEach((envVar) => {
181
+ console.log(chalk.yellow(` • ${envVar}`));
182
+ });
183
+ }
184
+
185
+ if (moduleInfo.optionalEnvVars && moduleInfo.optionalEnvVars.length > 0) {
186
+ console.log(chalk.gray(`\nOptional environment variables:`));
187
+ moduleInfo.optionalEnvVars.forEach((envVar) => {
188
+ console.log(chalk.gray(` • ${envVar}`));
189
+ });
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Check if a module is available
195
+ */
196
+ async function isAvailableModule(name, modulesDir) {
197
+ try {
198
+ await fs.access(path.join(modulesDir, name));
199
+ return true;
200
+ } catch {
201
+ return false;
202
+ }
203
+ }
204
+
205
+ /**
206
+ * Check if a library is available
207
+ */
208
+ async function isAvailableLibrary(name, librariesDir) {
209
+ try {
210
+ await fs.access(path.join(librariesDir, name));
211
+ return true;
212
+ } catch {
213
+ return false;
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Get the libraries directory path
219
+ */
220
+ async function getLibrariesDir() {
221
+ const librariesDir = path.join(__dirname, "..", "..", "..", "..", "libraries");
222
+ const libLibrariesDir = path.join(__dirname, "..", "..", "lib", "libraries");
223
+
224
+ try {
225
+ await fs.access(libLibrariesDir);
226
+ return libLibrariesDir;
227
+ } catch {
228
+ return librariesDir;
229
+ }
230
+ }
231
+
232
+ async function copyModuleFiles(src, dest) {
233
+ await fs.mkdir(dest, { recursive: true });
234
+ const entries = await fs.readdir(src, { withFileTypes: true });
235
+
236
+ for (const entry of entries) {
237
+ // Skip module.json - it's only for CLI metadata
238
+ if (entry.name === "module.json") continue;
239
+
240
+ const srcPath = path.join(src, entry.name);
241
+ const destPath = path.join(dest, entry.name);
242
+
243
+ if (entry.isDirectory()) {
244
+ await copyModuleFiles(srcPath, destPath);
245
+ } else {
246
+ await fs.copyFile(srcPath, destPath);
247
+ }
248
+ }
249
+ }
250
+
251
+ export async function listModules() {
252
+ console.log(chalk.blue(`📦 Available modules:\n`));
253
+
254
+ // Find modules directory
255
+ let modulesDir = path.join(__dirname, "..", "..", "..", "..", "modules");
256
+ const libModulesDir = path.join(__dirname, "..", "..", "lib", "modules");
257
+
258
+ try {
259
+ await fs.access(libModulesDir);
260
+ modulesDir = libModulesDir;
261
+ } catch {
262
+ // Use the repo modules directory
263
+ }
264
+
265
+ await listAvailableModules(modulesDir);
266
+ }
267
+
268
+ async function listAvailableModules(modulesDir) {
269
+ try {
270
+ const entries = await fs.readdir(modulesDir, { withFileTypes: true });
271
+ const modules = entries.filter((e) => e.isDirectory());
272
+
273
+ for (const mod of modules) {
274
+ const moduleJsonPath = path.join(modulesDir, mod.name, "module.json");
275
+ let description = "";
276
+
277
+ try {
278
+ const moduleInfo = JSON.parse(await fs.readFile(moduleJsonPath, "utf8"));
279
+ description = moduleInfo.description || "";
280
+ } catch {
281
+ // No module.json
282
+ }
283
+
284
+ console.log(chalk.white(` ${mod.name.padEnd(20)} ${chalk.gray(description)}`));
285
+ }
286
+ } catch (_error) {
287
+ console.log(chalk.yellow(` No modules found.`));
288
+ }
289
+ }
290
+
291
+ // ============================================================================
292
+ // Library Functions
293
+ // ============================================================================
294
+
295
+ export async function addLibrary(libraryName, options, _installedDeps = new Set()) {
296
+ // Track installed dependencies to prevent circular installs
297
+ if (_installedDeps.has(libraryName)) {
298
+ return;
299
+ }
300
+
301
+ console.log(chalk.blue(`📚 Adding library: ${libraryName}`));
302
+
303
+ const projectPath = process.cwd();
304
+
305
+ // Check if we're in a ShipAPI project
306
+ const packageJsonPath = path.join(projectPath, "package.json");
307
+ try {
308
+ const packageJson = JSON.parse(await fs.readFile(packageJsonPath, "utf8"));
309
+ if (!packageJson.dependencies?.["@sixthsummit/ship-api"]) {
310
+ throw new Error("Not a ShipAPI project. Run this command from your project root.");
311
+ }
312
+ } catch (error) {
313
+ if (error.code === "ENOENT") {
314
+ throw new Error("No package.json found. Run this command from your project root.");
315
+ }
316
+ throw error;
317
+ }
318
+
319
+ // Find the library in the libraries directory
320
+ // In development, libraries are at ../../libraries relative to cli/commands
321
+ // When published, libraries are copied to lib/libraries
322
+ const librariesDir = await getLibrariesDir();
323
+
324
+ const librarySourcePath = path.join(librariesDir, libraryName);
325
+ const libraryJsonPath = path.join(librarySourcePath, "library.json");
326
+
327
+ // Check if library exists
328
+ try {
329
+ await fs.access(librarySourcePath);
330
+ } catch {
331
+ console.error(chalk.red(`❌ Library '${libraryName}' not found.`));
332
+ console.log(chalk.yellow(`\nAvailable libraries:`));
333
+ await listAvailableLibraries(librariesDir);
334
+ process.exit(1);
335
+ }
336
+
337
+ // Read library metadata
338
+ let libraryInfo = { name: libraryName, description: "", postInstall: [], dependencies: [] };
339
+ try {
340
+ libraryInfo = JSON.parse(await fs.readFile(libraryJsonPath, "utf8"));
341
+ } catch {
342
+ // No library.json, use defaults
343
+ }
344
+
345
+ // Install ShipAPI dependencies first (other modules or libraries)
346
+ if (libraryInfo.dependencies && libraryInfo.dependencies.length > 0) {
347
+ console.log(chalk.blue(`\n📋 Installing dependencies for ${libraryName}...`));
348
+
349
+ // Get modules directory for checking
350
+ let modulesDir = path.join(__dirname, "..", "..", "..", "..", "modules");
351
+ const libModulesDir = path.join(__dirname, "..", "..", "lib", "modules");
352
+ try {
353
+ await fs.access(libModulesDir);
354
+ modulesDir = libModulesDir;
355
+ } catch {
356
+ // Use the repo modules directory
357
+ }
358
+
359
+ for (const dep of libraryInfo.dependencies) {
360
+ if (_installedDeps.has(dep)) {
361
+ console.log(chalk.gray(` ⏭️ ${dep} already installed`));
362
+ continue;
363
+ }
364
+
365
+ // Try to install as module first, then as library
366
+ const isModule = await isAvailableModule(dep, modulesDir);
367
+ const isLibrary = await isAvailableLibrary(dep, librariesDir);
368
+
369
+ if (isModule) {
370
+ await addModule(dep, { ...options, force: false }, _installedDeps);
371
+ } else if (isLibrary) {
372
+ await addLibrary(dep, { ...options, force: false }, _installedDeps);
373
+ } else {
374
+ console.log(chalk.yellow(` ⚠️ Dependency '${dep}' not found as module or library`));
375
+ }
376
+ }
377
+ console.log(chalk.blue(`\n📚 Continuing with ${libraryName}...`));
378
+ }
379
+
380
+ // Mark this library as being installed
381
+ _installedDeps.add(libraryName);
382
+
383
+ // Check if library already exists in project (destination: src/lib/)
384
+ const destPath = path.join(projectPath, "src", "lib", libraryName);
385
+ try {
386
+ await fs.access(destPath);
387
+ if (!options.force) {
388
+ console.log(chalk.gray(` ⏭️ Library '${libraryName}' already exists, skipping`));
389
+ return;
390
+ }
391
+ console.log(chalk.yellow(`⚠️ Overwriting existing library: ${libraryName}`));
392
+ await fs.rm(destPath, { recursive: true });
393
+ } catch (error) {
394
+ if (error.code !== "ENOENT") throw error;
395
+ }
396
+
397
+ // Ensure src/lib directory exists
398
+ await fs.mkdir(path.join(projectPath, "src", "lib"), { recursive: true });
399
+
400
+ // Copy library files (excluding library.json)
401
+ await copyLibraryFiles(librarySourcePath, destPath);
402
+
403
+ // AI-A3: stamp the vendored library version into the consumer so the
404
+ // independently-versioned `library.json#version` is recorded + diffable on
405
+ // `ship-api update`. Mirrors the g-scaffold provenance breadcrumb; the
406
+ // `library.json` itself stays CLI-only metadata (skipped on copy above).
407
+ await writeLibraryStamp(destPath, libraryName, libraryInfo, options);
408
+
409
+ // NOTE: Libraries don't update config/modules.ts
410
+
411
+ // Install npm dependencies if specified
412
+ if (libraryInfo.npmDependencies) {
413
+ await installNpmDependencies(libraryInfo.npmDependencies, projectPath);
414
+ }
415
+
416
+ console.log(chalk.green(`✅ Library '${libraryName}' added successfully!`));
417
+
418
+ // Print usage example
419
+ console.log(chalk.cyan(`\nUsage:`));
420
+ console.log(chalk.gray(` import { ... } from "./lib/${libraryName}/index.js";`));
421
+
422
+ // Print post-install instructions
423
+ if (libraryInfo.postInstall && libraryInfo.postInstall.length > 0) {
424
+ console.log(chalk.cyan(`\nNext steps:`));
425
+ libraryInfo.postInstall.forEach((step) => {
426
+ console.log(chalk.cyan(` • ${step}`));
427
+ });
428
+ }
429
+
430
+ if (libraryInfo.requiredEnvVars && libraryInfo.requiredEnvVars.length > 0) {
431
+ console.log(chalk.yellow(`\nRequired environment variables:`));
432
+ libraryInfo.requiredEnvVars.forEach((envVar) => {
433
+ console.log(chalk.yellow(` • ${envVar}`));
434
+ });
435
+ }
436
+
437
+ if (libraryInfo.optionalEnvVars && libraryInfo.optionalEnvVars.length > 0) {
438
+ console.log(chalk.gray(`\nOptional environment variables:`));
439
+ libraryInfo.optionalEnvVars.forEach((envVar) => {
440
+ console.log(chalk.gray(` • ${envVar}`));
441
+ });
442
+ }
443
+ }
444
+
445
+ async function copyLibraryFiles(src, dest) {
446
+ await fs.mkdir(dest, { recursive: true });
447
+ const entries = await fs.readdir(src, { withFileTypes: true });
448
+
449
+ for (const entry of entries) {
450
+ // Skip library.json - it's only for CLI metadata
451
+ if (entry.name === "library.json") continue;
452
+
453
+ const srcPath = path.join(src, entry.name);
454
+ const destPath = path.join(dest, entry.name);
455
+
456
+ if (entry.isDirectory()) {
457
+ await copyLibraryFiles(srcPath, destPath);
458
+ } else {
459
+ await fs.copyFile(srcPath, destPath);
460
+ }
461
+ }
462
+ }
463
+
464
+ /**
465
+ * AI-A3 — write the vendored-library provenance stamp into the consumer's
466
+ * copied library dir. Records the library's independent `version` (from its
467
+ * `library.json`, which itself isn't copied) so staleness is detectable and
468
+ * `ship-api update` has an anchor to diff against. `options.now` /
469
+ * `options.frameworkVersion` are injectable for deterministic tests.
470
+ */
471
+ export async function writeLibraryStamp(destPath, libraryName, libraryInfo, options = {}) {
472
+ const stamp = {
473
+ name: libraryInfo.name ?? libraryName,
474
+ version: libraryInfo.version ?? "unknown",
475
+ source: "ship-api add -l",
476
+ at: options.now ?? new Date().toISOString(),
477
+ frameworkVersion: options.frameworkVersion ?? (await resolveFrameworkVersion()),
478
+ };
479
+ await fs.writeFile(path.join(destPath, ".ship-lib.json"), JSON.stringify(stamp, null, 2) + "\n");
480
+ }
481
+
482
+ /** The running `@sixthsummit/ship-api` version (packages/core/package.json). */
483
+ async function resolveFrameworkVersion() {
484
+ try {
485
+ const pkg = JSON.parse(
486
+ await fs.readFile(path.join(__dirname, "..", "..", "package.json"), "utf8"),
487
+ );
488
+ return typeof pkg.version === "string" ? pkg.version : "unknown";
489
+ } catch {
490
+ return "unknown";
491
+ }
492
+ }
493
+
494
+ export async function listLibraries() {
495
+ console.log(chalk.blue(`📚 Available libraries:\n`));
496
+
497
+ // Find libraries directory
498
+ let librariesDir = path.join(__dirname, "..", "..", "..", "..", "libraries");
499
+ const libLibrariesDir = path.join(__dirname, "..", "..", "lib", "libraries");
500
+
501
+ try {
502
+ await fs.access(libLibrariesDir);
503
+ librariesDir = libLibrariesDir;
504
+ } catch {
505
+ // Use the repo libraries directory
506
+ }
507
+
508
+ await listAvailableLibraries(librariesDir);
509
+ }
510
+
511
+ async function listAvailableLibraries(librariesDir) {
512
+ try {
513
+ const entries = await fs.readdir(librariesDir, { withFileTypes: true });
514
+ const libraries = entries.filter((e) => e.isDirectory());
515
+
516
+ if (libraries.length === 0) {
517
+ console.log(chalk.yellow(` No libraries available yet.`));
518
+ return;
519
+ }
520
+
521
+ for (const lib of libraries) {
522
+ const libraryJsonPath = path.join(librariesDir, lib.name, "library.json");
523
+ let description = "";
524
+
525
+ try {
526
+ const libraryInfo = JSON.parse(await fs.readFile(libraryJsonPath, "utf8"));
527
+ description = libraryInfo.description || "";
528
+ } catch {
529
+ // No library.json
530
+ }
531
+
532
+ console.log(chalk.white(` ${lib.name.padEnd(20)} ${chalk.gray(description)}`));
533
+ }
534
+ } catch (_error) {
535
+ console.log(chalk.yellow(` No libraries found.`));
536
+ }
537
+ }
@@ -0,0 +1,2 @@
1
+ /** @deprecated Install `@sixthsummit/ship-cli` and import from its `/contract` entry. */
2
+ export * from "@sixthsummit/ship-cli/contract";