primitive-admin 1.0.62 → 1.0.64

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 (344) hide show
  1. package/README.md +132 -42
  2. package/assets/skill/skills/primitive-platform/SKILL.md +142 -661
  3. package/dist/bin/primitive.js +121 -41
  4. package/dist/bin/primitive.js.map +1 -1
  5. package/dist/src/commands/admins.js +37 -50
  6. package/dist/src/commands/admins.js.map +1 -1
  7. package/dist/src/commands/analytics.js +178 -9
  8. package/dist/src/commands/analytics.js.map +1 -1
  9. package/dist/src/commands/apps.js +17 -7
  10. package/dist/src/commands/apps.js.map +1 -1
  11. package/dist/src/commands/auth-sessions.d.ts +7 -0
  12. package/dist/src/commands/auth-sessions.js +144 -0
  13. package/dist/src/commands/auth-sessions.js.map +1 -0
  14. package/dist/src/commands/auth.js +76 -116
  15. package/dist/src/commands/auth.js.map +1 -1
  16. package/dist/src/commands/blob-buckets.js +2 -1
  17. package/dist/src/commands/blob-buckets.js.map +1 -1
  18. package/dist/src/commands/catalog.js +26 -10
  19. package/dist/src/commands/catalog.js.map +1 -1
  20. package/dist/src/commands/collection-type-configs.js +3 -10
  21. package/dist/src/commands/collection-type-configs.js.map +1 -1
  22. package/dist/src/commands/collections.js +736 -19
  23. package/dist/src/commands/collections.js.map +1 -1
  24. package/dist/src/commands/config.js +13 -27
  25. package/dist/src/commands/config.js.map +1 -1
  26. package/dist/src/commands/connections.js +8 -9
  27. package/dist/src/commands/connections.js.map +1 -1
  28. package/dist/src/commands/cron-triggers.js +2 -1
  29. package/dist/src/commands/cron-triggers.js.map +1 -1
  30. package/dist/src/commands/database-type-configs.js +5 -12
  31. package/dist/src/commands/database-type-configs.js.map +1 -1
  32. package/dist/src/commands/databases.js +59 -72
  33. package/dist/src/commands/databases.js.map +1 -1
  34. package/dist/src/commands/documents.d.ts +58 -0
  35. package/dist/src/commands/documents.js +1623 -95
  36. package/dist/src/commands/documents.js.map +1 -1
  37. package/dist/src/commands/email-templates.js +5 -4
  38. package/dist/src/commands/email-templates.js.map +1 -1
  39. package/dist/src/commands/env.d.ts +1 -1
  40. package/dist/src/commands/env.js +106 -44
  41. package/dist/src/commands/env.js.map +1 -1
  42. package/dist/src/commands/feature-flags.js +2 -1
  43. package/dist/src/commands/feature-flags.js.map +1 -1
  44. package/dist/src/commands/functions.d.ts +20 -0
  45. package/dist/src/commands/functions.js +1630 -0
  46. package/dist/src/commands/functions.js.map +1 -0
  47. package/dist/src/commands/group-type-configs.js +2 -1
  48. package/dist/src/commands/group-type-configs.js.map +1 -1
  49. package/dist/src/commands/groups.js +30 -17
  50. package/dist/src/commands/groups.js.map +1 -1
  51. package/dist/src/commands/guides.js +17 -11
  52. package/dist/src/commands/guides.js.map +1 -1
  53. package/dist/src/commands/init.d.ts +24 -12
  54. package/dist/src/commands/init.js +198 -110
  55. package/dist/src/commands/init.js.map +1 -1
  56. package/dist/src/commands/integrations.js +65 -26
  57. package/dist/src/commands/integrations.js.map +1 -1
  58. package/dist/src/commands/locks.js +17 -2
  59. package/dist/src/commands/locks.js.map +1 -1
  60. package/dist/src/commands/metadata-category-configs.js +2 -1
  61. package/dist/src/commands/metadata-category-configs.js.map +1 -1
  62. package/dist/src/commands/metadata.js +8 -1
  63. package/dist/src/commands/metadata.js.map +1 -1
  64. package/dist/src/commands/prompts.js +106 -59
  65. package/dist/src/commands/prompts.js.map +1 -1
  66. package/dist/src/commands/rule-sets.js +3 -10
  67. package/dist/src/commands/rule-sets.js.map +1 -1
  68. package/dist/src/commands/scripts.d.ts +10 -0
  69. package/dist/src/commands/scripts.js +159 -25
  70. package/dist/src/commands/scripts.js.map +1 -1
  71. package/dist/src/commands/secrets.js +2 -1
  72. package/dist/src/commands/secrets.js.map +1 -1
  73. package/dist/src/commands/sessions.js +10 -9
  74. package/dist/src/commands/sessions.js.map +1 -1
  75. package/dist/src/commands/sync-app-settings.js +3 -5
  76. package/dist/src/commands/sync-app-settings.js.map +1 -1
  77. package/dist/src/commands/sync.d.ts +391 -44
  78. package/dist/src/commands/sync.js +2622 -534
  79. package/dist/src/commands/sync.js.map +1 -1
  80. package/dist/src/commands/tokens.js +2 -1
  81. package/dist/src/commands/tokens.js.map +1 -1
  82. package/dist/src/commands/users.js +19 -10
  83. package/dist/src/commands/users.js.map +1 -1
  84. package/dist/src/commands/vars.js +2 -1
  85. package/dist/src/commands/vars.js.map +1 -1
  86. package/dist/src/commands/waitlist.js +2 -1
  87. package/dist/src/commands/waitlist.js.map +1 -1
  88. package/dist/src/commands/webhooks.d.ts +29 -0
  89. package/dist/src/commands/webhooks.js +135 -64
  90. package/dist/src/commands/webhooks.js.map +1 -1
  91. package/dist/src/commands/workflows.d.ts +1 -29
  92. package/dist/src/commands/workflows.js +113 -179
  93. package/dist/src/commands/workflows.js.map +1 -1
  94. package/dist/src/lib/api-client.d.ts +628 -14
  95. package/dist/src/lib/api-client.js +776 -70
  96. package/dist/src/lib/api-client.js.map +1 -1
  97. package/dist/src/lib/app-settings-descriptor.d.ts +1 -1
  98. package/dist/src/lib/app-settings-descriptor.js +9 -1
  99. package/dist/src/lib/app-settings-descriptor.js.map +1 -1
  100. package/dist/src/lib/block-selector.d.ts +58 -0
  101. package/dist/src/lib/block-selector.js +92 -0
  102. package/dist/src/lib/block-selector.js.map +1 -0
  103. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +24 -54
  104. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +31 -153
  105. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -1
  106. package/dist/src/lib/collection-export.d.ts +184 -0
  107. package/dist/src/lib/collection-export.js +252 -0
  108. package/dist/src/lib/collection-export.js.map +1 -0
  109. package/dist/src/lib/config-json-field.d.ts +28 -0
  110. package/dist/src/lib/config-json-field.js +56 -0
  111. package/dist/src/lib/config-json-field.js.map +1 -0
  112. package/dist/src/lib/config-object-descriptor.js +88 -6
  113. package/dist/src/lib/config-object-descriptor.js.map +1 -1
  114. package/dist/src/lib/config-payload.d.ts +8 -1
  115. package/dist/src/lib/config-payload.js +49 -4
  116. package/dist/src/lib/config-payload.js.map +1 -1
  117. package/dist/src/lib/config-surface.d.ts +12 -1
  118. package/dist/src/lib/config-surface.js +71 -3
  119. package/dist/src/lib/config-surface.js.map +1 -1
  120. package/dist/src/lib/config.d.ts +31 -13
  121. package/dist/src/lib/config.js +34 -70
  122. package/dist/src/lib/config.js.map +1 -1
  123. package/dist/src/lib/credentials-store.d.ts +37 -22
  124. package/dist/src/lib/credentials-store.js +103 -97
  125. package/dist/src/lib/credentials-store.js.map +1 -1
  126. package/dist/src/lib/db-codegen/dbTypeIR.js +8 -0
  127. package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -1
  128. package/dist/src/lib/deprecation.d.ts +22 -0
  129. package/dist/src/lib/deprecation.js +43 -0
  130. package/dist/src/lib/deprecation.js.map +1 -0
  131. package/dist/src/lib/document-export-permissions.d.ts +30 -0
  132. package/dist/src/lib/document-export-permissions.js +54 -0
  133. package/dist/src/lib/document-export-permissions.js.map +1 -0
  134. package/dist/src/lib/document-ingest-artifact.d.ts +120 -0
  135. package/dist/src/lib/document-ingest-artifact.js +505 -0
  136. package/dist/src/lib/document-ingest-artifact.js.map +1 -0
  137. package/dist/src/lib/document-ingest-input.d.ts +51 -0
  138. package/dist/src/lib/document-ingest-input.js +132 -0
  139. package/dist/src/lib/document-ingest-input.js.map +1 -0
  140. package/dist/src/lib/document-ingest-rows.d.ts +137 -0
  141. package/dist/src/lib/document-ingest-rows.js +181 -0
  142. package/dist/src/lib/document-ingest-rows.js.map +1 -0
  143. package/dist/src/lib/document-ingest.d.ts +101 -0
  144. package/dist/src/lib/document-ingest.js +384 -0
  145. package/dist/src/lib/document-ingest.js.map +1 -0
  146. package/dist/src/lib/env-resolver-core.d.ts +128 -17
  147. package/dist/src/lib/env-resolver-core.js +204 -22
  148. package/dist/src/lib/env-resolver-core.js.map +1 -1
  149. package/dist/src/lib/env-resolver.d.ts +18 -3
  150. package/dist/src/lib/env-resolver.js +23 -3
  151. package/dist/src/lib/env-resolver.js.map +1 -1
  152. package/dist/src/lib/function-bundle.d.ts +147 -0
  153. package/dist/src/lib/function-bundle.js +341 -0
  154. package/dist/src/lib/function-bundle.js.map +1 -0
  155. package/dist/src/lib/function-collect.d.ts +123 -0
  156. package/dist/src/lib/function-collect.js +610 -0
  157. package/dist/src/lib/function-collect.js.map +1 -0
  158. package/dist/src/lib/function-db-types.d.ts +202 -0
  159. package/dist/src/lib/function-db-types.js +870 -0
  160. package/dist/src/lib/function-db-types.js.map +1 -0
  161. package/dist/src/lib/function-document-types.d.ts +144 -0
  162. package/dist/src/lib/function-document-types.js +370 -0
  163. package/dist/src/lib/function-document-types.js.map +1 -0
  164. package/dist/src/lib/function-grants-preflight.d.ts +64 -0
  165. package/dist/src/lib/function-grants-preflight.js +105 -0
  166. package/dist/src/lib/function-grants-preflight.js.map +1 -0
  167. package/dist/src/lib/function-log-lines.d.ts +76 -0
  168. package/dist/src/lib/function-log-lines.js +160 -0
  169. package/dist/src/lib/function-log-lines.js.map +1 -0
  170. package/dist/src/lib/function-log-row.d.ts +29 -0
  171. package/dist/src/lib/function-log-row.js +73 -0
  172. package/dist/src/lib/function-log-row.js.map +1 -0
  173. package/dist/src/lib/function-log-tail.d.ts +132 -0
  174. package/dist/src/lib/function-log-tail.js +262 -0
  175. package/dist/src/lib/function-log-tail.js.map +1 -0
  176. package/dist/src/lib/function-run.d.ts +289 -0
  177. package/dist/src/lib/function-run.js +389 -0
  178. package/dist/src/lib/function-run.js.map +1 -0
  179. package/dist/src/lib/function-schema-codegen.d.ts +143 -0
  180. package/dist/src/lib/function-schema-codegen.js +420 -0
  181. package/dist/src/lib/function-schema-codegen.js.map +1 -0
  182. package/dist/src/lib/function-sync.d.ts +459 -0
  183. package/dist/src/lib/function-sync.js +1258 -0
  184. package/dist/src/lib/function-sync.js.map +1 -0
  185. package/dist/src/lib/function-trigger-listing.d.ts +27 -0
  186. package/dist/src/lib/function-trigger-listing.js +70 -0
  187. package/dist/src/lib/function-trigger-listing.js.map +1 -0
  188. package/dist/src/lib/function-typecheck.d.ts +86 -0
  189. package/dist/src/lib/function-typecheck.js +370 -0
  190. package/dist/src/lib/function-typecheck.js.map +1 -0
  191. package/dist/src/lib/function-versions.d.ts +122 -0
  192. package/dist/src/lib/function-versions.js +182 -0
  193. package/dist/src/lib/function-versions.js.map +1 -0
  194. package/dist/src/lib/generated-allowlist.js +4 -0
  195. package/dist/src/lib/generated-allowlist.js.map +1 -1
  196. package/dist/src/lib/generated-config-surfaces.d.ts +2332 -78
  197. package/dist/src/lib/generated-config-surfaces.js +6979 -468
  198. package/dist/src/lib/generated-config-surfaces.js.map +1 -1
  199. package/dist/src/lib/generated-sdk-types.d.ts +12 -0
  200. package/dist/src/lib/generated-sdk-types.js +13 -0
  201. package/dist/src/lib/generated-sdk-types.js.map +1 -0
  202. package/dist/src/lib/init-adopt.js +2 -2
  203. package/dist/src/lib/init-adopt.js.map +1 -1
  204. package/dist/src/lib/init-assets.js +3 -3
  205. package/dist/src/lib/init-client-platforms.d.ts +14 -0
  206. package/dist/src/lib/init-client-platforms.js +71 -0
  207. package/dist/src/lib/init-client-platforms.js.map +1 -0
  208. package/dist/src/lib/init-config.d.ts +1 -1
  209. package/dist/src/lib/init-email-redirect-uris.d.ts +37 -0
  210. package/dist/src/lib/init-email-redirect-uris.js +46 -0
  211. package/dist/src/lib/init-email-redirect-uris.js.map +1 -0
  212. package/dist/src/lib/init-ios-links.d.ts +41 -0
  213. package/dist/src/lib/init-ios-links.js +67 -1
  214. package/dist/src/lib/init-ios-links.js.map +1 -1
  215. package/dist/src/lib/init-plan.d.ts +1 -1
  216. package/dist/src/lib/init-plan.js +1 -1
  217. package/dist/src/lib/init-xcode.d.ts +6 -5
  218. package/dist/src/lib/init-xcode.js +34 -10
  219. package/dist/src/lib/init-xcode.js.map +1 -1
  220. package/dist/src/lib/integration-selector.d.ts +42 -0
  221. package/dist/src/lib/integration-selector.js +46 -0
  222. package/dist/src/lib/integration-selector.js.map +1 -0
  223. package/dist/src/lib/ios-app-id.d.ts +34 -0
  224. package/dist/src/lib/ios-app-id.js +69 -0
  225. package/dist/src/lib/ios-app-id.js.map +1 -0
  226. package/dist/src/lib/list-options.d.ts +68 -0
  227. package/dist/src/lib/list-options.js +89 -0
  228. package/dist/src/lib/list-options.js.map +1 -0
  229. package/dist/src/lib/local-state.d.ts +1 -1
  230. package/dist/src/lib/local-state.js +1 -1
  231. package/dist/src/lib/local-test-cases.d.ts +63 -0
  232. package/dist/src/lib/local-test-cases.js +136 -0
  233. package/dist/src/lib/local-test-cases.js.map +1 -0
  234. package/dist/src/lib/log-inspection.d.ts +152 -5
  235. package/dist/src/lib/log-inspection.js +179 -2
  236. package/dist/src/lib/log-inspection.js.map +1 -1
  237. package/dist/src/lib/logout-admin-session.d.ts +33 -0
  238. package/dist/src/lib/logout-admin-session.js +70 -0
  239. package/dist/src/lib/logout-admin-session.js.map +1 -0
  240. package/dist/src/lib/output.d.ts +15 -0
  241. package/dist/src/lib/output.js +28 -0
  242. package/dist/src/lib/output.js.map +1 -1
  243. package/dist/src/lib/paginate.d.ts +15 -0
  244. package/dist/src/lib/paginate.js +17 -0
  245. package/dist/src/lib/paginate.js.map +1 -1
  246. package/dist/src/lib/project-config.d.ts +46 -21
  247. package/dist/src/lib/project-config.js +74 -47
  248. package/dist/src/lib/project-config.js.map +1 -1
  249. package/dist/src/lib/prompt-cost-format.d.ts +11 -0
  250. package/dist/src/lib/prompt-cost-format.js +41 -0
  251. package/dist/src/lib/prompt-cost-format.js.map +1 -0
  252. package/dist/src/lib/prompt-schema-codegen.d.ts +147 -0
  253. package/dist/src/lib/prompt-schema-codegen.js +462 -0
  254. package/dist/src/lib/prompt-schema-codegen.js.map +1 -0
  255. package/dist/src/lib/refresh-admin-credentials.d.ts +9 -1
  256. package/dist/src/lib/refresh-admin-credentials.js +22 -2
  257. package/dist/src/lib/refresh-admin-credentials.js.map +1 -1
  258. package/dist/src/lib/resolve-owner.d.ts +19 -0
  259. package/dist/src/lib/resolve-owner.js +20 -0
  260. package/dist/src/lib/resolve-owner.js.map +1 -0
  261. package/dist/src/lib/skill-installer.d.ts +49 -3
  262. package/dist/src/lib/skill-installer.js +275 -100
  263. package/dist/src/lib/skill-installer.js.map +1 -1
  264. package/dist/src/lib/snapshot-audit-source.d.ts +45 -0
  265. package/dist/src/lib/snapshot-audit-source.js +58 -0
  266. package/dist/src/lib/snapshot-audit-source.js.map +1 -0
  267. package/dist/src/lib/snapshot-audit-store.d.ts +52 -0
  268. package/dist/src/lib/snapshot-audit-store.js +196 -0
  269. package/dist/src/lib/snapshot-audit-store.js.map +1 -0
  270. package/dist/src/lib/snapshot-audit.d.ts +207 -0
  271. package/dist/src/lib/snapshot-audit.js +431 -0
  272. package/dist/src/lib/snapshot-audit.js.map +1 -0
  273. package/dist/src/lib/snapshot-build-rows.d.ts +60 -0
  274. package/dist/src/lib/snapshot-build-rows.js +87 -0
  275. package/dist/src/lib/snapshot-build-rows.js.map +1 -0
  276. package/dist/src/lib/snapshot-build.d.ts +50 -0
  277. package/dist/src/lib/snapshot-build.js +111 -0
  278. package/dist/src/lib/snapshot-build.js.map +1 -0
  279. package/dist/src/lib/snapshot-manifest-layout.d.ts +61 -0
  280. package/dist/src/lib/snapshot-manifest-layout.js +70 -0
  281. package/dist/src/lib/snapshot-manifest-layout.js.map +1 -0
  282. package/dist/src/lib/snapshots.d.ts +8 -9
  283. package/dist/src/lib/snapshots.js +20 -83
  284. package/dist/src/lib/snapshots.js.map +1 -1
  285. package/dist/src/lib/step-run-table.d.ts +43 -0
  286. package/dist/src/lib/step-run-table.js +129 -0
  287. package/dist/src/lib/step-run-table.js.map +1 -0
  288. package/dist/src/lib/storage-pending-retry.d.ts +26 -0
  289. package/dist/src/lib/storage-pending-retry.js +42 -0
  290. package/dist/src/lib/storage-pending-retry.js.map +1 -0
  291. package/dist/src/lib/swift-codegen/agentGenerator.d.ts +42 -0
  292. package/dist/src/lib/swift-codegen/agentGenerator.js +118 -0
  293. package/dist/src/lib/swift-codegen/agentGenerator.js.map +1 -0
  294. package/dist/src/lib/swift-codegen/banners.d.ts +24 -0
  295. package/dist/src/lib/swift-codegen/banners.js +25 -0
  296. package/dist/src/lib/swift-codegen/banners.js.map +1 -0
  297. package/dist/src/lib/swift-codegen/dbGenerator.js +19 -7
  298. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -1
  299. package/dist/src/lib/swift-codegen/functionGenerator.d.ts +139 -0
  300. package/dist/src/lib/swift-codegen/functionGenerator.js +462 -0
  301. package/dist/src/lib/swift-codegen/functionGenerator.js.map +1 -0
  302. package/dist/src/lib/swift-codegen/generator.d.ts +7 -1
  303. package/dist/src/lib/swift-codegen/generator.js +28 -11
  304. package/dist/src/lib/swift-codegen/generator.js.map +1 -1
  305. package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +15 -0
  306. package/dist/src/lib/swift-codegen/schemaToSwift.js +21 -4
  307. package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -1
  308. package/dist/src/lib/sync-paths.d.ts +72 -55
  309. package/dist/src/lib/sync-paths.js +97 -100
  310. package/dist/src/lib/sync-paths.js.map +1 -1
  311. package/dist/src/lib/sync-resource-types.d.ts +23 -4
  312. package/dist/src/lib/sync-resource-types.js +106 -8
  313. package/dist/src/lib/sync-resource-types.js.map +1 -1
  314. package/dist/src/lib/sync-selectors.d.ts +45 -2
  315. package/dist/src/lib/sync-selectors.js +66 -5
  316. package/dist/src/lib/sync-selectors.js.map +1 -1
  317. package/dist/src/lib/template.d.ts +2 -2
  318. package/dist/src/lib/template.js +2 -2
  319. package/dist/src/lib/test-case-file-names.d.ts +40 -0
  320. package/dist/src/lib/test-case-file-names.js +91 -0
  321. package/dist/src/lib/test-case-file-names.js.map +1 -0
  322. package/dist/src/lib/test-case-keys.d.ts +1 -1
  323. package/dist/src/lib/test-case-keys.js +1 -1
  324. package/dist/src/lib/test-case-variables.d.ts +14 -0
  325. package/dist/src/lib/test-case-variables.js +42 -0
  326. package/dist/src/lib/test-case-variables.js.map +1 -1
  327. package/dist/src/lib/toml-database-config.js +19 -2
  328. package/dist/src/lib/toml-database-config.js.map +1 -1
  329. package/dist/src/lib/web-url.d.ts +40 -0
  330. package/dist/src/lib/web-url.js +76 -0
  331. package/dist/src/lib/web-url.js.map +1 -0
  332. package/dist/src/lib/webhook-deliver.d.ts +209 -0
  333. package/dist/src/lib/webhook-deliver.js +519 -0
  334. package/dist/src/lib/webhook-deliver.js.map +1 -0
  335. package/dist/src/lib/workflow-codegen/generator.d.ts +1 -1
  336. package/dist/src/lib/workflow-codegen/generator.js +1 -1
  337. package/dist/src/lib/workflow-toml-validator.d.ts +17 -8
  338. package/dist/src/lib/workflow-toml-validator.js +25 -12
  339. package/dist/src/lib/workflow-toml-validator.js.map +1 -1
  340. package/dist/src/lib/workflow-usage.d.ts +196 -0
  341. package/dist/src/lib/workflow-usage.js +310 -0
  342. package/dist/src/lib/workflow-usage.js.map +1 -0
  343. package/dist/src/types/index.d.ts +12 -2
  344. package/package.json +5 -4
@@ -1,27 +1,23 @@
1
- import { Option } from "commander";
2
1
  import { readFileSync, writeFileSync, appendFileSync, mkdirSync, existsSync, readdirSync } from "fs";
3
2
  import * as path from "path";
4
3
  import { ApiClient } from "../lib/api-client.js";
5
- import { getCurrentAppId } from "../lib/config.js";
4
+ import { getCurrentAppId, resolveAppId } from "../lib/config.js";
6
5
  import { resolveCodegenSourceDir } from "../lib/codegen-shared/resolveCodegenSourceDir.js";
7
- import { resolveSyncDirOverride } from "../lib/sync-dir-selector.js";
6
+ import { resolveSyncDir } from "../lib/sync-paths.js";
8
7
  import { parseCsv, applyColumnMap, buildRows } from "../lib/csv.js";
9
8
  import { chunk, parseBatchSize } from "../lib/batch.js";
10
9
  import { generateDbTypes, } from "../lib/db-codegen/dbGenerator.js";
11
10
  import { generateDbSwiftTypes } from "../lib/swift-codegen/dbGenerator.js";
12
11
  import { success, error, info, warn, keyValue, result as printResult, formatTable, formatId, formatDate, json, } from "../lib/output.js";
13
12
  import { confirmPrompt } from "../lib/confirm-prompt.js";
13
+ import { deprecateCommandGroup, warnDeprecated, } from "../lib/deprecation.js";
14
+ /** Successor for the deprecated database CEL context commands and flags. */
15
+ const CEL_CONTEXT_SUCCESSOR = "resource metadata categories (`primitive metadata get|set database <database-id> <category>`; define categories with `primitive config push`)";
14
16
  import { parseFilterOptions } from "../lib/record-filter.js";
15
17
  import { parseDataOption } from "../lib/data-input.js";
16
18
  import { ulid } from "ulid";
17
- function resolveAppId(appId, options) {
18
- const resolved = appId || options.app || getCurrentAppId();
19
- if (!resolved) {
20
- error("No app specified. Use <app-id>, --app, or 'primitive use <app-id>' to set context.");
21
- process.exit(1);
22
- }
23
- return resolved;
24
- }
19
+ import { normalizeCliListEnvelope, wholeListEnvelope, } from "../lib/paginate.js";
20
+ import { pageCursorOption, pageLimitOption, parsePageLimit, printEmptyPage, printPageHint, } from "../lib/list-options.js";
25
21
  /**
26
22
  * Render the flat `{ success, id, appliedFields }` response that
27
23
  * `records/save` and `records/patch` return — these endpoints answer with a
@@ -232,21 +228,26 @@ database-type-config' and the 'database-type-configs' group for inspection:
232
228
  .argument("[app-id]", "App ID (uses current app if not specified)")
233
229
  .option("--app <app-id>", "App ID")
234
230
  .option("--owner <user-id>", "Only list databases created by this user")
231
+ .addOption(pageLimitOption())
232
+ .addOption(pageCursorOption())
235
233
  .option("--json", "Output as JSON")
236
234
  .action(async (appId, options) => {
235
+ const limit = parsePageLimit(options.limit);
237
236
  const resolvedAppId = resolveAppId(appId, options);
238
237
  const client = new ApiClient();
239
238
  try {
240
- const result = await client.listDatabases(resolvedAppId, {
239
+ const page = normalizeCliListEnvelope(await client.listDatabases(resolvedAppId, {
241
240
  owner: options.owner,
242
- });
243
- const list = Array.isArray(result) ? result : result?.databases ?? [];
241
+ limit,
242
+ cursor: options.cursor,
243
+ }));
244
+ const list = page.items;
244
245
  if (options.json) {
245
- json(list);
246
+ json(page);
246
247
  return;
247
248
  }
248
249
  if (list.length === 0) {
249
- info("No databases found.");
250
+ printEmptyPage(page, "databases");
250
251
  return;
251
252
  }
252
253
  console.log(formatTable(list, [
@@ -268,6 +269,7 @@ database-type-config' and the 'database-type-configs' group for inspection:
268
269
  : []),
269
270
  { header: "CREATED", key: "createdAt", format: formatDate },
270
271
  ]));
272
+ printPageHint(page);
271
273
  }
272
274
  catch (err) {
273
275
  error(err.message);
@@ -293,6 +295,9 @@ database-type-config' and the 'database-type-configs' group for inspection:
293
295
  // `--cel-context` is the new user-facing name; `--metadata` remains
294
296
  // supported for backwards compatibility. When both are provided,
295
297
  // --cel-context wins.
298
+ if (options.celContext !== undefined || options.metadata !== undefined) {
299
+ warnDeprecated(`primitive databases create ${options.celContext !== undefined ? "--cel-context" : "--metadata"}`, "--initial-metadata (resource metadata categories)", 1815);
300
+ }
296
301
  const contextSource = options.celContext ?? options.metadata;
297
302
  if (contextSource) {
298
303
  try {
@@ -451,7 +456,7 @@ database-type-config' and the 'database-type-configs' group for inspection:
451
456
  const result = await client.listDatabasePermissions(resolvedAppId, databaseId);
452
457
  const list = Array.isArray(result) ? result : result?.permissions ?? [];
453
458
  if (options.json) {
454
- json(list);
459
+ json(wholeListEnvelope(list));
455
460
  return;
456
461
  }
457
462
  if (list.length === 0) {
@@ -1226,8 +1231,11 @@ database-type-config' and the 'database-type-configs' group for inspection:
1226
1231
  const group = databases
1227
1232
  .command(name, { hidden })
1228
1233
  .description(hidden
1229
- ? "Manage database CEL context (alias of 'cel-context')"
1230
- : "Manage database CEL context (the dict referenced by access rules and filters)");
1234
+ ? "(deprecated: use resource metadata categories, `primitive metadata`) Manage database CEL context (alias of 'cel-context')"
1235
+ : "(deprecated: use resource metadata categories, `primitive metadata`) Manage database CEL context (the dict referenced by access rules and filters)");
1236
+ // CEL context is deprecated in favour of resource metadata categories
1237
+ // (#1420, #1815), which carry separate read and write rules.
1238
+ deprecateCommandGroup(group, CEL_CONTEXT_SUCCESSOR, { issue: 1815 });
1231
1239
  group
1232
1240
  .command("get")
1233
1241
  .description("Read database CEL context")
@@ -1315,7 +1323,7 @@ database-type-config' and the 'database-type-configs' group for inspection:
1315
1323
  const result = await client.listDatabaseOperations(resolvedAppId, databaseId);
1316
1324
  const list = Array.isArray(result) ? result : [];
1317
1325
  if (options.json) {
1318
- json(list);
1326
+ json(wholeListEnvelope(list));
1319
1327
  return;
1320
1328
  }
1321
1329
  if (list.length === 0) {
@@ -1455,7 +1463,7 @@ database-type-config' and the 'database-type-configs' group for inspection:
1455
1463
  const result = await client.listDatabaseIndexes(resolvedAppId, databaseId, options.model);
1456
1464
  const list = result.indexes || [];
1457
1465
  if (options.json) {
1458
- json(list);
1466
+ json(wholeListEnvelope(list));
1459
1467
  return;
1460
1468
  }
1461
1469
  if (list.length === 0) {
@@ -1579,8 +1587,14 @@ database-type-config' and the 'database-type-configs' group for inspection:
1579
1587
  databases
1580
1588
  .command("export")
1581
1589
  .description("Export a database (records, indexes, constraints)")
1590
+ // Both positionals are declared optional and the action decides which is
1591
+ // which (#3645). A required positional AFTER an optional one makes the
1592
+ // optional one mandatory: commander binds the first value it sees to
1593
+ // `[app-id]` and then reports the required argument missing, so
1594
+ // `databases export <database-id>` never reached the action. The database
1595
+ // id is still required — enforced below, where the shift is known.
1582
1596
  .argument("[app-id]", "App ID (uses current app if not specified)")
1583
- .argument("<database-id>", "Database ID to export")
1597
+ .argument("[database-id]", "Database ID to export (required)")
1584
1598
  .option("--app <app-id>", "App ID")
1585
1599
  .option("--output <dir>", "Output directory", "./primitive-export")
1586
1600
  .option("--json", "Output as JSON")
@@ -1611,8 +1625,10 @@ database-type-config' and the 'database-type-configs' group for inspection:
1611
1625
  databases
1612
1626
  .command("import")
1613
1627
  .description("Import a database from an export directory")
1628
+ // Optional in commander, required in the action (#3645) — see `export`
1629
+ // above for why a `<...>` here would make `[app-id]` mandatory.
1614
1630
  .argument("[app-id]", "App ID (uses current app if not specified)")
1615
- .argument("<path>", "Path to database export directory")
1631
+ .argument("[path]", "Path to database export directory (required)")
1616
1632
  .option("--app <app-id>", "App ID")
1617
1633
  .option("--overwrite", "Replace existing database if ID collides")
1618
1634
  .option("--dry-run", "Show what would be imported without making changes")
@@ -1912,16 +1928,13 @@ database-type-config' and the 'database-type-configs' group for inspection:
1912
1928
  .command("generate")
1913
1929
  .description("Scaffold a starting TOML schema for <database-type> from existing operations + DO introspection, and insert it into the local database-type-configs/<type>.toml file.")
1914
1930
  .argument("<database-type>", "Database type name")
1915
- .option("--app <app-id>", "App ID")
1916
- .option("--dir <path>", "Config directory (overrides the auto-resolved per-env path)")
1917
- .addOption(new Option("--sync-dir <path>", "Deprecated alias of --dir").hideHelp())
1918
1931
  .option("-f, --force", "Overwrite an existing [models.*] block in the local file")
1919
1932
  .option("--json", "Output the generated TOML as JSON")
1920
1933
  .action(async (databaseType, options) => {
1921
- // Resolve the sync-dir override before the API call, so a caller who
1922
- // passed both spellings hears about it without a network round trip.
1923
- const configDir = resolveSyncDirOverride(options, "databases schema generate");
1924
- const resolvedAppId = resolveAppId(undefined, options);
1934
+ // Resolved before the API call, so a project the CLI cannot resolve is
1935
+ // heard about without a round trip.
1936
+ const targetDir = resolveSyncDir();
1937
+ const resolvedAppId = getCurrentAppId();
1925
1938
  const client = new ApiClient();
1926
1939
  try {
1927
1940
  // 1. Call the server's :scaffold endpoint.
@@ -1931,39 +1944,23 @@ database-type-config' and the 'database-type-configs' group for inspection:
1931
1944
  json({ schema: scaffoldedToml });
1932
1945
  return;
1933
1946
  }
1934
- // 2. Locate the local `database-type-configs/<type>.toml` file. Per the
1935
- // plan-of-record CLI sync layout, the file lives at
1936
- // `<config-dir>/database-type-configs/<type>.toml`. We don't need to know
1937
- // the exact config dir for the happy path — just look for an existing
1938
- // file relative to the CWD's `.primitive/sync/` directory tree.
1947
+ // 2. Locate the local `database-type-configs/<type>.toml` file, at
1948
+ // `<config-dir>/database-type-configs/<type>.toml`.
1949
+ //
1950
+ // ONE file, for ONE environment (#3153, F4). This used to scan every
1951
+ // `primitive/<env>/` slot under the cwd and edit every
1952
+ // match, which spliced a scaffold generated against the selected
1953
+ // environment's server into other environments' committed files. The
1954
+ // directory now comes from the same resolver every other tree command
1955
+ // uses, so the file it edits is the selected environment's.
1939
1956
  const candidateFiles = [];
1940
- if (configDir) {
1941
- candidateFiles.push(path.join(configDir, "database-type-configs", `${databaseType}.toml`));
1942
- }
1943
- else {
1944
- // Search any env/appId subtree under .primitive/sync that matches.
1945
- const root = path.join(process.cwd(), ".primitive", "sync");
1946
- if (existsSync(root)) {
1947
- for (const env of readdirSync(root)) {
1948
- const envDir = path.join(root, env);
1949
- try {
1950
- for (const app of readdirSync(envDir)) {
1951
- const candidate = path.join(envDir, app, "database-type-configs", `${databaseType}.toml`);
1952
- if (existsSync(candidate)) {
1953
- candidateFiles.push(candidate);
1954
- }
1955
- }
1956
- }
1957
- catch {
1958
- // skip non-dirs
1959
- }
1960
- }
1961
- }
1962
- }
1957
+ const candidate = path.join(targetDir, "database-type-configs", `${databaseType}.toml`);
1958
+ if (existsSync(candidate))
1959
+ candidateFiles.push(candidate);
1963
1960
  if (candidateFiles.length === 0) {
1964
1961
  // No local file found — print the scaffold to stdout and tell
1965
1962
  // the user where to put it.
1966
- info(`No local database-type-configs/${databaseType}.toml found under .primitive/sync/. Generated TOML:`);
1963
+ info(`No local database-type-configs/${databaseType}.toml found at ${candidate}. Generated TOML:`);
1967
1964
  console.log("");
1968
1965
  console.log(scaffoldedToml);
1969
1966
  return;
@@ -2017,9 +2014,6 @@ database-type-config' and the 'database-type-configs' group for inspection:
2017
2014
  .command("codegen")
2018
2015
  .description("Generate record + operation types from the local database-type-configs/*.toml schema. TypeScript (default): a <type>.generated.ts per database type (record interfaces, per-op input-params interfaces, per-op result aliases, and a typed <type>Ops factory). Swift (--lang swift): a <type>.generated.swift per database type (record structs, per-op params structs, per-op result typealiases, and a typed <Type>Ops factory).\n\nFormatting: the emitted TypeScript is already formatted the way Prettier's DEFAULT config formats it, so a `codegen` -> `prettier --write` -> `codegen --check` pipeline stays green. If your project uses a NON-default Prettier config (a different printWidth, trailingComma, or quote style), Prettier will reformat the generated files and `--check` will then fail: add the generated directory to `.prettierignore` and commit the raw emission instead.")
2019
2016
  .argument("[database-type]", "Generate for a single database type (defaults to every database-type-configs/*.toml found)")
2020
- .option("--app <app-id>", "App ID")
2021
- .option("--dir <path>", "Config directory (overrides the auto-resolved per-env path)")
2022
- .addOption(new Option("--sync-dir <path>", "Deprecated alias of --dir").hideHelp())
2023
2017
  .option("-o, --output <dir>", "Output directory for the generated files (defaults to <config-dir>/database-type-configs/generated/)")
2024
2018
  .option("--lang <lang>", "Target language for the generated types: 'ts' (default) or 'swift'.", "ts")
2025
2019
  .option("--check", "Exit non-zero if generated output is out of date (CI guard); does not write. Compares byte-for-byte, so the file on disk must match the emission exactly.")
@@ -2033,17 +2027,10 @@ database-type-config' and the 'database-type-configs' group for inspection:
2033
2027
  error(`Unknown --lang "${options.lang}". Use "ts" or "swift".`);
2034
2028
  process.exit(1);
2035
2029
  }
2036
- // 1. Resolve the single source database-type-configs/ directory via the
2037
- // shared active-environment resolver (issue #1510). Honors
2038
- // --dir / --app overrides and resolves the active env
2039
- // (--env → PRIMITIVE_ENV → defaultEnvironment → single-env) instead
2040
- // of silently merging types across every synced env.
2030
+ // 1. The single source database-type-configs/ directory: the
2031
+ // environment's, and only ever the environment's (#1510, #3154).
2041
2032
  const dbTypesSourceDir = resolveCodegenSourceDir({
2042
2033
  subdir: "database-type-configs",
2043
- options: {
2044
- app: options.app,
2045
- syncDir: resolveSyncDirOverride(options, "databases codegen"),
2046
- },
2047
2034
  });
2048
2035
  // 2. Collect the source .toml files (one per database type), filtered
2049
2036
  // to a single type when an argument is given.
@@ -2063,7 +2050,7 @@ database-type-config' and the 'database-type-configs' group for inspection:
2063
2050
  }
2064
2051
  if (inputs.length === 0) {
2065
2052
  error(databaseType
2066
- ? `No database-type-configs/${databaseType}.toml found under .primitive/sync/.`
2053
+ ? `No database-type-configs/${databaseType}.toml found under primitive/<env>/.`
2067
2054
  : "No database-type-configs/*.toml files found to generate from.");
2068
2055
  process.exit(1);
2069
2056
  }