primitive-admin 1.1.0-alpha.7 → 1.1.0-alpha.71

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 (438) hide show
  1. package/README.md +404 -80
  2. package/assets/skill/skills/primitive-platform/SKILL.md +808 -0
  3. package/dist/bin/primitive.d.ts +2 -0
  4. package/dist/bin/primitive.js +294 -21
  5. package/dist/bin/primitive.js.map +1 -1
  6. package/dist/src/commands/admins.d.ts +2 -0
  7. package/dist/src/commands/admins.js +138 -19
  8. package/dist/src/commands/admins.js.map +1 -1
  9. package/dist/src/commands/analytics.d.ts +2 -0
  10. package/dist/src/commands/analytics.js +544 -55
  11. package/dist/src/commands/analytics.js.map +1 -1
  12. package/dist/src/commands/apps.d.ts +2 -0
  13. package/dist/src/commands/apps.js +51 -96
  14. package/dist/src/commands/apps.js.map +1 -1
  15. package/dist/src/commands/auth.d.ts +2 -0
  16. package/dist/src/commands/auth.js +177 -7
  17. package/dist/src/commands/auth.js.map +1 -1
  18. package/dist/src/commands/blob-buckets.d.ts +2 -0
  19. package/dist/src/commands/blob-buckets.js +330 -0
  20. package/dist/src/commands/blob-buckets.js.map +1 -0
  21. package/dist/src/commands/catalog.d.ts +2 -0
  22. package/dist/src/commands/catalog.js +37 -38
  23. package/dist/src/commands/catalog.js.map +1 -1
  24. package/dist/src/commands/collection-type-configs.d.ts +2 -0
  25. package/dist/src/commands/collection-type-configs.js +92 -0
  26. package/dist/src/commands/collection-type-configs.js.map +1 -0
  27. package/dist/src/commands/collections.d.ts +2 -0
  28. package/dist/src/commands/collections.js +565 -0
  29. package/dist/src/commands/collections.js.map +1 -0
  30. package/dist/src/commands/comparisons.d.ts +2 -0
  31. package/dist/src/commands/comparisons.js +6 -6
  32. package/dist/src/commands/comparisons.js.map +1 -1
  33. package/dist/src/commands/config.d.ts +46 -0
  34. package/dist/src/commands/config.js +479 -0
  35. package/dist/src/commands/config.js.map +1 -0
  36. package/dist/src/commands/connections.d.ts +2 -0
  37. package/dist/src/commands/connections.js +100 -0
  38. package/dist/src/commands/connections.js.map +1 -0
  39. package/dist/src/commands/cron-triggers.d.ts +2 -0
  40. package/dist/src/commands/cron-triggers.js +265 -0
  41. package/dist/src/commands/cron-triggers.js.map +1 -0
  42. package/dist/src/commands/database-type-configs.d.ts +2 -0
  43. package/dist/src/commands/database-type-configs.js +171 -0
  44. package/dist/src/commands/database-type-configs.js.map +1 -0
  45. package/dist/src/commands/database-types.d.ts +2 -0
  46. package/dist/src/commands/database-types.js +471 -0
  47. package/dist/src/commands/database-types.js.map +1 -0
  48. package/dist/src/commands/databases.d.ts +65 -0
  49. package/dist/src/commands/databases.js +2140 -112
  50. package/dist/src/commands/databases.js.map +1 -1
  51. package/dist/src/commands/documents.d.ts +2 -0
  52. package/dist/src/commands/documents.js +1357 -19
  53. package/dist/src/commands/documents.js.map +1 -1
  54. package/dist/src/commands/email-templates.d.ts +2 -0
  55. package/dist/src/commands/email-templates.js +174 -0
  56. package/dist/src/commands/email-templates.js.map +1 -0
  57. package/dist/src/commands/env.d.ts +23 -0
  58. package/dist/src/commands/env.js +333 -0
  59. package/dist/src/commands/env.js.map +1 -0
  60. package/dist/src/commands/feature-flags.d.ts +14 -0
  61. package/dist/src/commands/feature-flags.js +116 -0
  62. package/dist/src/commands/feature-flags.js.map +1 -0
  63. package/dist/src/commands/group-type-configs.d.ts +2 -0
  64. package/dist/src/commands/group-type-configs.js +86 -0
  65. package/dist/src/commands/group-type-configs.js.map +1 -0
  66. package/dist/src/commands/groups.d.ts +2 -0
  67. package/dist/src/commands/groups.js +38 -99
  68. package/dist/src/commands/groups.js.map +1 -1
  69. package/dist/src/commands/guides.d.ts +223 -0
  70. package/dist/src/commands/guides.js +617 -65
  71. package/dist/src/commands/guides.js.map +1 -1
  72. package/dist/src/commands/init.d.ts +25 -0
  73. package/dist/src/commands/init.js +1605 -208
  74. package/dist/src/commands/init.js.map +1 -1
  75. package/dist/src/commands/integrations.d.ts +2 -0
  76. package/dist/src/commands/integrations.js +380 -178
  77. package/dist/src/commands/integrations.js.map +1 -1
  78. package/dist/src/commands/llm.d.ts +2 -0
  79. package/dist/src/commands/llm.js +4 -2
  80. package/dist/src/commands/llm.js.map +1 -1
  81. package/dist/src/commands/locks.d.ts +8 -0
  82. package/dist/src/commands/locks.js +160 -0
  83. package/dist/src/commands/locks.js.map +1 -0
  84. package/dist/src/commands/metadata-category-configs.d.ts +12 -0
  85. package/dist/src/commands/metadata-category-configs.js +112 -0
  86. package/dist/src/commands/metadata-category-configs.js.map +1 -0
  87. package/dist/src/commands/metadata.d.ts +2 -0
  88. package/dist/src/commands/metadata.js +281 -0
  89. package/dist/src/commands/metadata.js.map +1 -0
  90. package/dist/src/commands/prompts.d.ts +2 -0
  91. package/dist/src/commands/prompts.js +225 -584
  92. package/dist/src/commands/prompts.js.map +1 -1
  93. package/dist/src/commands/rule-sets.d.ts +3 -0
  94. package/dist/src/commands/rule-sets.js +272 -0
  95. package/dist/src/commands/rule-sets.js.map +1 -0
  96. package/dist/src/commands/scripts.d.ts +20 -0
  97. package/dist/src/commands/scripts.js +554 -0
  98. package/dist/src/commands/scripts.js.map +1 -0
  99. package/dist/src/commands/secrets.d.ts +2 -0
  100. package/dist/src/commands/secrets.js +108 -0
  101. package/dist/src/commands/secrets.js.map +1 -0
  102. package/dist/src/commands/sessions.d.ts +2 -0
  103. package/dist/src/commands/sessions.js +75 -0
  104. package/dist/src/commands/sessions.js.map +1 -0
  105. package/dist/src/commands/skill.d.ts +2 -0
  106. package/dist/src/commands/skill.js +29 -0
  107. package/dist/src/commands/skill.js.map +1 -0
  108. package/dist/src/commands/sync-app-settings.d.ts +158 -0
  109. package/dist/src/commands/sync-app-settings.js +330 -0
  110. package/dist/src/commands/sync-app-settings.js.map +1 -0
  111. package/dist/src/commands/sync.d.ts +2323 -0
  112. package/dist/src/commands/sync.js +15065 -843
  113. package/dist/src/commands/sync.js.map +1 -1
  114. package/dist/src/commands/tokens.d.ts +2 -0
  115. package/dist/src/commands/tokens.js +130 -21
  116. package/dist/src/commands/tokens.js.map +1 -1
  117. package/dist/src/commands/users.d.ts +2 -0
  118. package/dist/src/commands/users.js +532 -23
  119. package/dist/src/commands/users.js.map +1 -1
  120. package/dist/src/commands/vars.d.ts +8 -0
  121. package/dist/src/commands/vars.js +96 -0
  122. package/dist/src/commands/vars.js.map +1 -0
  123. package/dist/src/commands/waitlist.d.ts +2 -0
  124. package/dist/src/commands/waitlist.js +10 -10
  125. package/dist/src/commands/waitlist.js.map +1 -1
  126. package/dist/src/commands/webhooks.d.ts +2 -0
  127. package/dist/src/commands/webhooks.js +562 -0
  128. package/dist/src/commands/webhooks.js.map +1 -0
  129. package/dist/src/commands/workflows.d.ts +116 -0
  130. package/dist/src/commands/workflows.js +1583 -681
  131. package/dist/src/commands/workflows.js.map +1 -1
  132. package/dist/src/lib/access-rule-display.d.ts +21 -0
  133. package/dist/src/lib/access-rule-display.js +34 -0
  134. package/dist/src/lib/access-rule-display.js.map +1 -0
  135. package/dist/src/lib/api-client.d.ts +1936 -0
  136. package/dist/src/lib/api-client.js +1826 -138
  137. package/dist/src/lib/api-client.js.map +1 -1
  138. package/dist/src/lib/app-settings-descriptor.d.ts +263 -0
  139. package/dist/src/lib/app-settings-descriptor.js +575 -0
  140. package/dist/src/lib/app-settings-descriptor.js.map +1 -0
  141. package/dist/src/lib/auth-flow.d.ts +8 -0
  142. package/dist/src/lib/batch.d.ts +26 -0
  143. package/dist/src/lib/batch.js +32 -0
  144. package/dist/src/lib/batch.js.map +1 -0
  145. package/dist/src/lib/block-layout.d.ts +160 -0
  146. package/dist/src/lib/block-layout.js +451 -0
  147. package/dist/src/lib/block-layout.js.map +1 -0
  148. package/dist/src/lib/canonical-json.d.ts +12 -0
  149. package/dist/src/lib/canonical-json.js +35 -0
  150. package/dist/src/lib/canonical-json.js.map +1 -0
  151. package/dist/src/lib/channel.d.ts +30 -0
  152. package/dist/src/lib/channel.js +68 -0
  153. package/dist/src/lib/channel.js.map +1 -0
  154. package/dist/src/lib/cli-manifest.d.ts +68 -0
  155. package/dist/src/lib/cli-manifest.js +71 -0
  156. package/dist/src/lib/cli-manifest.js.map +1 -0
  157. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +101 -0
  158. package/dist/src/lib/codegen-shared/generatedFiles.js +191 -0
  159. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
  160. package/dist/src/lib/codegen-shared/prettierStable.d.ts +262 -0
  161. package/dist/src/lib/codegen-shared/prettierStable.js +610 -0
  162. package/dist/src/lib/codegen-shared/prettierStable.js.map +1 -0
  163. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +68 -0
  164. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +168 -0
  165. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
  166. package/dist/src/lib/config-object-descriptor.d.ts +127 -0
  167. package/dist/src/lib/config-object-descriptor.js +658 -0
  168. package/dist/src/lib/config-object-descriptor.js.map +1 -0
  169. package/dist/src/lib/config-payload.d.ts +85 -0
  170. package/dist/src/lib/config-payload.js +116 -0
  171. package/dist/src/lib/config-payload.js.map +1 -0
  172. package/dist/src/lib/config-surface.d.ts +130 -0
  173. package/dist/src/lib/config-surface.js +300 -0
  174. package/dist/src/lib/config-surface.js.map +1 -0
  175. package/dist/src/lib/config-toml.d.ts +10 -0
  176. package/dist/src/lib/config-toml.js +42 -0
  177. package/dist/src/lib/config-toml.js.map +1 -0
  178. package/dist/src/lib/config.d.ts +53 -0
  179. package/dist/src/lib/config.js +92 -53
  180. package/dist/src/lib/config.js.map +1 -1
  181. package/dist/src/lib/confirm-prompt.d.ts +83 -0
  182. package/dist/src/lib/confirm-prompt.js +110 -0
  183. package/dist/src/lib/confirm-prompt.js.map +1 -0
  184. package/dist/src/lib/constants.d.ts +11 -0
  185. package/dist/src/lib/constants.js +12 -0
  186. package/dist/src/lib/constants.js.map +1 -0
  187. package/dist/src/lib/crash-handlers.d.ts +20 -0
  188. package/dist/src/lib/crash-handlers.js +49 -0
  189. package/dist/src/lib/crash-handlers.js.map +1 -0
  190. package/dist/src/lib/credentials-store.d.ts +89 -0
  191. package/dist/src/lib/credentials-store.js +330 -0
  192. package/dist/src/lib/credentials-store.js.map +1 -0
  193. package/dist/src/lib/csv.d.ts +47 -0
  194. package/dist/src/lib/csv.js +172 -0
  195. package/dist/src/lib/csv.js.map +1 -0
  196. package/dist/src/lib/data-input.d.ts +23 -0
  197. package/dist/src/lib/data-input.js +50 -0
  198. package/dist/src/lib/data-input.js.map +1 -0
  199. package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
  200. package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
  201. package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
  202. package/dist/src/lib/db-codegen/dbGenerator.d.ts +67 -0
  203. package/dist/src/lib/db-codegen/dbGenerator.js +170 -0
  204. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
  205. package/dist/src/lib/db-codegen/dbNaming.d.ts +87 -0
  206. package/dist/src/lib/db-codegen/dbNaming.js +180 -0
  207. package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
  208. package/dist/src/lib/db-codegen/dbTemplates.d.ts +272 -0
  209. package/dist/src/lib/db-codegen/dbTemplates.js +480 -0
  210. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
  211. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +73 -0
  212. package/dist/src/lib/db-codegen/dbTsTypes.js +139 -0
  213. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
  214. package/dist/src/lib/db-codegen/dbTypeIR.d.ts +146 -0
  215. package/dist/src/lib/db-codegen/dbTypeIR.js +517 -0
  216. package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -0
  217. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +112 -0
  218. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +211 -0
  219. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -0
  220. package/dist/src/lib/env-resolver-core.d.ts +147 -0
  221. package/dist/src/lib/env-resolver-core.js +265 -0
  222. package/dist/src/lib/env-resolver-core.js.map +1 -0
  223. package/dist/src/lib/env-resolver.d.ts +84 -0
  224. package/dist/src/lib/env-resolver.js +133 -0
  225. package/dist/src/lib/env-resolver.js.map +1 -0
  226. package/dist/src/lib/fetch.d.ts +5 -0
  227. package/dist/src/lib/generated-allowlist.d.ts +28 -0
  228. package/dist/src/lib/generated-allowlist.js +277 -0
  229. package/dist/src/lib/generated-allowlist.js.map +1 -0
  230. package/dist/src/lib/generated-config-surfaces.d.ts +682 -0
  231. package/dist/src/lib/generated-config-surfaces.js +4058 -0
  232. package/dist/src/lib/generated-config-surfaces.js.map +1 -0
  233. package/dist/src/lib/generated-template-lint.d.ts +212 -0
  234. package/dist/src/lib/generated-template-lint.js +624 -0
  235. package/dist/src/lib/generated-template-lint.js.map +1 -0
  236. package/dist/src/lib/init-adopt.d.ts +16 -0
  237. package/dist/src/lib/init-adopt.js +34 -0
  238. package/dist/src/lib/init-adopt.js.map +1 -0
  239. package/dist/src/lib/init-assets.d.ts +39 -0
  240. package/dist/src/lib/init-assets.js +97 -0
  241. package/dist/src/lib/init-assets.js.map +1 -0
  242. package/dist/src/lib/init-config.d.ts +98 -0
  243. package/dist/src/lib/init-config.js +186 -0
  244. package/dist/src/lib/init-config.js.map +1 -0
  245. package/dist/src/lib/init-ios-links.d.ts +50 -0
  246. package/dist/src/lib/init-ios-links.js +153 -0
  247. package/dist/src/lib/init-ios-links.js.map +1 -0
  248. package/dist/src/lib/init-plan.d.ts +80 -0
  249. package/dist/src/lib/init-plan.js +95 -0
  250. package/dist/src/lib/init-plan.js.map +1 -0
  251. package/dist/src/lib/init-production-env.d.ts +48 -0
  252. package/dist/src/lib/init-production-env.js +59 -0
  253. package/dist/src/lib/init-production-env.js.map +1 -0
  254. package/dist/src/lib/init-schema.d.ts +74 -0
  255. package/dist/src/lib/init-schema.js +358 -0
  256. package/dist/src/lib/init-schema.js.map +1 -0
  257. package/dist/src/lib/init-xcode.d.ts +33 -0
  258. package/dist/src/lib/init-xcode.js +114 -0
  259. package/dist/src/lib/init-xcode.js.map +1 -0
  260. package/dist/src/lib/integration-request-config.d.ts +30 -0
  261. package/dist/src/lib/integration-request-config.js +145 -0
  262. package/dist/src/lib/integration-request-config.js.map +1 -0
  263. package/dist/src/lib/local-state.d.ts +55 -0
  264. package/dist/src/lib/local-state.js +167 -0
  265. package/dist/src/lib/local-state.js.map +1 -0
  266. package/dist/src/lib/log-inspection.d.ts +568 -0
  267. package/dist/src/lib/log-inspection.js +639 -0
  268. package/dist/src/lib/log-inspection.js.map +1 -0
  269. package/dist/src/lib/migration-nag.d.ts +49 -0
  270. package/dist/src/lib/migration-nag.js +163 -0
  271. package/dist/src/lib/migration-nag.js.map +1 -0
  272. package/dist/src/lib/object-status-filter.d.ts +22 -0
  273. package/dist/src/lib/object-status-filter.js +45 -0
  274. package/dist/src/lib/object-status-filter.js.map +1 -0
  275. package/dist/src/lib/output.d.ts +109 -0
  276. package/dist/src/lib/output.js +191 -8
  277. package/dist/src/lib/output.js.map +1 -1
  278. package/dist/src/lib/package-manager.d.ts +140 -0
  279. package/dist/src/lib/package-manager.js +305 -0
  280. package/dist/src/lib/package-manager.js.map +1 -0
  281. package/dist/src/lib/paginate.d.ts +83 -0
  282. package/dist/src/lib/paginate.js +95 -0
  283. package/dist/src/lib/paginate.js.map +1 -0
  284. package/dist/src/lib/platform-owned.d.ts +63 -0
  285. package/dist/src/lib/platform-owned.js +85 -0
  286. package/dist/src/lib/platform-owned.js.map +1 -0
  287. package/dist/src/lib/project-config.d.ts +97 -0
  288. package/dist/src/lib/project-config.js +217 -0
  289. package/dist/src/lib/project-config.js.map +1 -0
  290. package/dist/src/lib/query-operators.d.ts +43 -0
  291. package/dist/src/lib/query-operators.js +80 -0
  292. package/dist/src/lib/query-operators.js.map +1 -0
  293. package/dist/src/lib/record-filter.d.ts +18 -0
  294. package/dist/src/lib/record-filter.js +55 -0
  295. package/dist/src/lib/record-filter.js.map +1 -0
  296. package/dist/src/lib/refresh-admin-credentials.d.ts +65 -0
  297. package/dist/src/lib/refresh-admin-credentials.js +103 -0
  298. package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
  299. package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
  300. package/dist/src/lib/resolve-init-dev-port.js +55 -0
  301. package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
  302. package/dist/src/lib/resolve-init-server.d.ts +64 -0
  303. package/dist/src/lib/resolve-init-server.js +77 -0
  304. package/dist/src/lib/resolve-init-server.js.map +1 -0
  305. package/dist/src/lib/resolve-platform.d.ts +74 -0
  306. package/dist/src/lib/resolve-platform.js +105 -0
  307. package/dist/src/lib/resolve-platform.js.map +1 -0
  308. package/dist/src/lib/run-status.d.ts +19 -0
  309. package/dist/src/lib/run-status.generated.d.ts +39 -0
  310. package/dist/src/lib/run-status.generated.js +66 -0
  311. package/dist/src/lib/run-status.generated.js.map +1 -0
  312. package/dist/src/lib/run-status.js +19 -0
  313. package/dist/src/lib/run-status.js.map +1 -0
  314. package/dist/src/lib/server-text-normalization.d.ts +51 -0
  315. package/dist/src/lib/server-text-normalization.js +90 -0
  316. package/dist/src/lib/server-text-normalization.js.map +1 -0
  317. package/dist/src/lib/server-url.d.ts +22 -0
  318. package/dist/src/lib/server-url.js +33 -0
  319. package/dist/src/lib/server-url.js.map +1 -0
  320. package/dist/src/lib/signing-secret-status.d.ts +81 -0
  321. package/dist/src/lib/signing-secret-status.js +116 -0
  322. package/dist/src/lib/signing-secret-status.js.map +1 -0
  323. package/dist/src/lib/skill-installer.d.ts +25 -0
  324. package/dist/src/lib/skill-installer.js +266 -0
  325. package/dist/src/lib/skill-installer.js.map +1 -0
  326. package/dist/src/lib/snapshots.d.ts +99 -0
  327. package/dist/src/lib/snapshots.js +357 -0
  328. package/dist/src/lib/snapshots.js.map +1 -0
  329. package/dist/src/lib/swift-codegen/dbGenerator.d.ts +113 -0
  330. package/dist/src/lib/swift-codegen/dbGenerator.js +914 -0
  331. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
  332. package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
  333. package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
  334. package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
  335. package/dist/src/lib/swift-codegen/generator.d.ts +94 -0
  336. package/dist/src/lib/swift-codegen/generator.js +440 -0
  337. package/dist/src/lib/swift-codegen/generator.js.map +1 -0
  338. package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +72 -0
  339. package/dist/src/lib/swift-codegen/schemaToSwift.js +644 -0
  340. package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
  341. package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +94 -0
  342. package/dist/src/lib/swift-codegen/siblingSymbols.js +155 -0
  343. package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -0
  344. package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
  345. package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
  346. package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
  347. package/dist/src/lib/sync-dir-selector.d.ts +21 -0
  348. package/dist/src/lib/sync-dir-selector.js +30 -0
  349. package/dist/src/lib/sync-dir-selector.js.map +1 -0
  350. package/dist/src/lib/sync-paths.d.ts +111 -0
  351. package/dist/src/lib/sync-paths.js +198 -0
  352. package/dist/src/lib/sync-paths.js.map +1 -0
  353. package/dist/src/lib/sync-resource-types.d.ts +544 -0
  354. package/dist/src/lib/sync-resource-types.js +975 -0
  355. package/dist/src/lib/sync-resource-types.js.map +1 -0
  356. package/dist/src/lib/sync-selectors.d.ts +95 -0
  357. package/dist/src/lib/sync-selectors.js +228 -0
  358. package/dist/src/lib/sync-selectors.js.map +1 -0
  359. package/dist/src/lib/template.d.ts +170 -0
  360. package/dist/src/lib/template.js +484 -68
  361. package/dist/src/lib/template.js.map +1 -1
  362. package/dist/src/lib/test-case-keys.d.ts +29 -0
  363. package/dist/src/lib/test-case-keys.js +55 -0
  364. package/dist/src/lib/test-case-keys.js.map +1 -0
  365. package/dist/src/lib/test-case-variables.d.ts +15 -0
  366. package/dist/src/lib/test-case-variables.js +29 -0
  367. package/dist/src/lib/test-case-variables.js.map +1 -0
  368. package/dist/src/lib/token-inject.d.ts +56 -0
  369. package/dist/src/lib/token-inject.js +204 -0
  370. package/dist/src/lib/token-inject.js.map +1 -0
  371. package/dist/src/lib/toml-database-config.d.ts +123 -0
  372. package/dist/src/lib/toml-database-config.js +527 -0
  373. package/dist/src/lib/toml-database-config.js.map +1 -0
  374. package/dist/src/lib/toml-metadata-config.d.ts +151 -0
  375. package/dist/src/lib/toml-metadata-config.js +476 -0
  376. package/dist/src/lib/toml-metadata-config.js.map +1 -0
  377. package/dist/src/lib/toml-native-form.d.ts +46 -0
  378. package/dist/src/lib/toml-native-form.js +78 -0
  379. package/dist/src/lib/toml-native-form.js.map +1 -0
  380. package/dist/src/lib/toml-params-validator.d.ts +129 -0
  381. package/dist/src/lib/toml-params-validator.js +298 -0
  382. package/dist/src/lib/toml-params-validator.js.map +1 -0
  383. package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
  384. package/dist/src/lib/toml-scalar-edit.js +283 -0
  385. package/dist/src/lib/toml-scalar-edit.js.map +1 -0
  386. package/dist/src/lib/user-selector.d.ts +24 -0
  387. package/dist/src/lib/user-selector.js +33 -0
  388. package/dist/src/lib/user-selector.js.map +1 -0
  389. package/dist/src/lib/version-check.d.ts +35 -0
  390. package/dist/src/lib/version-check.js +241 -0
  391. package/dist/src/lib/version-check.js.map +1 -0
  392. package/dist/src/lib/watch.d.ts +121 -0
  393. package/dist/src/lib/watch.js +169 -0
  394. package/dist/src/lib/watch.js.map +1 -0
  395. package/dist/src/lib/workflow-apply.d.ts +110 -0
  396. package/dist/src/lib/workflow-apply.js +164 -0
  397. package/dist/src/lib/workflow-apply.js.map +1 -0
  398. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
  399. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
  400. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
  401. package/dist/src/lib/workflow-codegen/generator.d.ts +96 -0
  402. package/dist/src/lib/workflow-codegen/generator.js +361 -0
  403. package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
  404. package/dist/src/lib/workflow-codegen/invokerIR.d.ts +94 -0
  405. package/dist/src/lib/workflow-codegen/invokerIR.js +76 -0
  406. package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
  407. package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
  408. package/dist/src/lib/workflow-codegen/naming.js +81 -0
  409. package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
  410. package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +80 -0
  411. package/dist/src/lib/workflow-codegen/schemaToTs.js +303 -0
  412. package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
  413. package/dist/src/lib/workflow-config-apply.d.ts +70 -0
  414. package/dist/src/lib/workflow-config-apply.js +137 -0
  415. package/dist/src/lib/workflow-config-apply.js.map +1 -0
  416. package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
  417. package/dist/src/lib/workflow-config-sidecar.js +96 -0
  418. package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
  419. package/dist/src/lib/workflow-defaults.d.ts +29 -0
  420. package/dist/src/lib/workflow-defaults.js +41 -0
  421. package/dist/src/lib/workflow-defaults.js.map +1 -0
  422. package/dist/src/lib/workflow-fragments.d.ts +64 -0
  423. package/dist/src/lib/workflow-fragments.js +342 -0
  424. package/dist/src/lib/workflow-fragments.js.map +1 -0
  425. package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
  426. package/dist/src/lib/workflow-include-preserve.js +286 -0
  427. package/dist/src/lib/workflow-include-preserve.js.map +1 -0
  428. package/dist/src/lib/workflow-payload.d.ts +98 -0
  429. package/dist/src/lib/workflow-payload.js +178 -0
  430. package/dist/src/lib/workflow-payload.js.map +1 -0
  431. package/dist/src/lib/workflow-toml-validator.d.ts +202 -0
  432. package/dist/src/lib/workflow-toml-validator.js +757 -0
  433. package/dist/src/lib/workflow-toml-validator.js.map +1 -0
  434. package/dist/src/types/index.d.ts +581 -0
  435. package/dist/src/validators.d.ts +65 -0
  436. package/dist/src/validators.js +64 -0
  437. package/dist/src/validators.js.map +1 -0
  438. package/package.json +32 -8
package/README.md CHANGED
@@ -5,9 +5,13 @@ Command-line interface for administering Primitive applications. This CLI provid
5
5
  ## Installation
6
6
 
7
7
  ```bash
8
- npm install -g primitive-admin
8
+ pnpm add -g primitive-admin
9
9
  ```
10
10
 
11
+ pnpm is the recommended package manager. If you use npm instead, run
12
+ `npm install -g primitive-admin` — install with one manager only, or you end up
13
+ with two global copies.
14
+
11
15
  ### Development Setup
12
16
 
13
17
  From the **worklet root directory**:
@@ -71,11 +75,15 @@ primitive apps --help
71
75
  The CLI uses browser-based OAuth for authentication. When you run `primitive login`, it opens your browser to authenticate via Google OAuth and stores credentials locally.
72
76
 
73
77
  ```bash
74
- # Login to the default server
78
+ # Login to the environment resolved from .primitive/config.json
79
+ # (project mode), or the default/PRIMITIVE_SERVER_URL server (legacy mode)
75
80
  primitive login
76
81
 
77
- # Login to a custom server
78
- primitive login --server https://api.example.com
82
+ # Login to a specific named environment
83
+ primitive -e prod login
84
+
85
+ # Login to a custom server without a project config (legacy mode)
86
+ PRIMITIVE_SERVER_URL=https://api.example.com primitive login
79
87
 
80
88
  # View current session
81
89
  primitive whoami
@@ -129,17 +137,20 @@ Manage applications (requires admin access).
129
137
 
130
138
  ```bash
131
139
  primitive apps list # List all accessible apps
132
- primitive apps create "My App" # Create a new app
140
+ primitive apps create "My App" # Create a new app (mints the app id)
133
141
  primitive apps get <app-id> # Get app details
134
- primitive apps update <app-id> [opts] # Update app settings
135
142
  primitive apps delete <app-id> # Delete an app
136
143
  ```
137
144
 
138
- **Update options:**
139
- - `--name <name>` - App display name
140
- - `--mode <mode>` - Access mode: public, invite-only, waitlist
141
- - `--base-url <url>` - Application base URL
142
- - `--waitlist` / `--no-waitlist` - Enable/disable waitlist
145
+ App settings are configuration, so they are authored in `app.toml` and applied
146
+ with `config push` (issue #2645) there is no `apps update`:
147
+
148
+ ```bash
149
+ primitive apps get # what the server is running
150
+ primitive config pull --only app # write those settings into app.toml
151
+ primitive config set app app.mode=invite-only
152
+ primitive config push --only app # apply the edit
153
+ ```
143
154
  - `--google-oauth` / `--no-google-oauth` - Enable/disable Google OAuth
144
155
  - `--passkey` / `--no-passkey` - Enable/disable passkey auth
145
156
  - `--magic-link` / `--no-magic-link` - Enable/disable magic link auth
@@ -150,12 +161,13 @@ Manage users within an app.
150
161
 
151
162
  ```bash
152
163
  primitive users list [app-id] # List users
164
+ primitive users create <email> [--role admin|member] # Create/add user by email
153
165
  primitive users invite [app-id] <email> [--role admin] # Invite user
154
166
  primitive users remove [app-id] <user-id> # Remove user
155
167
  primitive users set-role [app-id] <user-id> <role> # Change role
156
168
  primitive users transfer-owner [app-id] <new-owner-id> # Transfer ownership
157
- primitive users invitations list [app-id] # List pending invitations
158
- primitive users invitations delete [app-id] <inv-id> # Delete invitation
169
+ primitive users mint-jwt <user-id> [--role <role>] # Mint test JWT (dev/test only)
170
+ primitive users invitations [app-id] # List pending invitations
159
171
  ```
160
172
 
161
173
  ### Waitlist
@@ -175,57 +187,72 @@ Manage HTTP integrations (external API connections).
175
187
 
176
188
  ```bash
177
189
  primitive integrations list [app-id] # List integrations
178
- primitive integrations create [app-id] [options] # Create integration
179
190
  primitive integrations get <integration-id> # Get details
180
- primitive integrations update <id> [options] # Update integration
181
- primitive integrations delete <id> # Soft delete
182
191
  primitive integrations test <id> # Test connection
183
192
  primitive integrations logs <id> # View invocation logs
184
193
  ```
185
194
 
186
- **Create options:**
187
- - `--from-file <path>` - Load from TOML file
188
- - `--key <key>` - Integration key (identifier)
189
- - `--name <name>` - Display name
190
- - `--base-url <url>` - Base URL for API calls
191
- - `--timeout <ms>` - Request timeout in milliseconds
195
+ An integration is authored in `integrations/<key>.toml` and applied with
196
+ `config push` creating, updating and deleting one are all edits to that file:
197
+
198
+ ```bash
199
+ primitive config fields integration # its keys, types, defaults
200
+ primitive config create integration weather-api # scaffold the file
201
+ primitive config push --only integration/weather-api
202
+ ```
192
203
 
193
204
  **Secrets management:**
205
+
206
+ Integration-scoped secrets are **retired** — the `primitive integrations secrets`
207
+ command group no longer exists. Use app-level secrets instead
208
+ (`primitive secrets set <KEY> --value <value>`) and reference them in integration
209
+ config via `{{secrets.KEY}}`. See the **Secrets** section below.
210
+
211
+ ### Secrets
212
+
213
+ Manage encrypted app secrets (API keys, tokens, credentials). Values are encrypted at rest and never displayed after creation.
214
+
194
215
  ```bash
195
- primitive integrations secrets list <integration-id>
196
- primitive integrations secrets add <id> --data '{"apiKey":"..."}'
197
- primitive integrations secrets archive <id> <secret-id>
216
+ primitive secrets list [--app <app-id>] # List secrets (values never shown)
217
+ primitive secrets set <KEY> --value <value> [--summary <text>] # Create or update a secret
218
+ primitive secrets delete <KEY> # Delete a secret
198
219
  ```
199
220
 
221
+ **Examples:**
222
+ ```bash
223
+ primitive secrets set OPENAI_API_KEY --value "sk-..." --summary "Production key"
224
+ primitive secrets set STRIPE_SECRET --value "sk_live_..."
225
+ primitive secrets list --json
226
+ primitive secrets delete STRIPE_SECRET
227
+ ```
228
+
229
+ Keys must be uppercase letters, digits, and underscores (e.g., `OPENAI_API_KEY`). Max 100 secrets per app, 2 KB per value. The `set` command is an upsert — it creates or updates automatically. Use `{{secrets.KEY}}` in workflows and `secrets.KEY` in CEL rules.
230
+
200
231
  ### Prompts
201
232
 
202
233
  Manage LLM prompt configurations.
203
234
 
204
235
  ```bash
205
236
  primitive prompts list [app-id] # List prompts
206
- primitive prompts create [app-id] [options] # Create prompt
207
237
  primitive prompts get <prompt-id> # Get details
208
- primitive prompts update <id> [options] # Update prompt
209
- primitive prompts delete <id> # Soft delete
210
238
  primitive prompts execute <id> --vars '{}' # Execute prompt
211
239
  primitive prompts preview <id> --vars '{}' # Preview rendered template
212
240
  ```
213
241
 
214
- **Create options:**
215
- - `--from-file <path>` - Load from TOML file
216
- - `--key <key>` - Prompt key (identifier)
217
- - `--name <name>` - Display name
218
- - `--provider <provider>` - LLM provider (openrouter, gemini)
219
- - `--model <model>` - Model name
220
- - `--system-prompt <text>` - System prompt
221
- - `--user-template <text>` - User prompt template
242
+ A prompt is authored in `prompts/<key>.toml` and applied with `config push`:
243
+
244
+ ```bash
245
+ primitive config create prompt summarizer
246
+ primitive config push --only prompt/summarizer
247
+ ```
248
+
249
+ **Configs (prompt variations)** are `[[configs]]` entries in that same file —
250
+ `active = true` marks the live one, `status = "archived"` retires one, and
251
+ duplicating is copying the block under a new `name`. The CLI reads them:
222
252
 
223
- **Configs (prompt variations):**
224
253
  ```bash
225
254
  primitive prompts configs list <prompt-id>
226
- primitive prompts configs create <prompt-id> [options]
227
- primitive prompts configs activate <prompt-id> <config-id>
228
- primitive prompts configs duplicate <prompt-id> <config-id>
255
+ primitive prompts configs get <prompt> <config>
229
256
  ```
230
257
 
231
258
  ### Workflows
@@ -234,20 +261,103 @@ Manage multi-step workflow definitions.
234
261
 
235
262
  ```bash
236
263
  primitive workflows list [app-id] # List workflows
237
- primitive workflows create [app-id] --from-file wf.toml # Create workflow
238
264
  primitive workflows get <workflow-id> # Get details
239
- primitive workflows update <id> [options] # Update metadata
240
- primitive workflows draft update <id> --from-file wf.toml # Update draft
241
- primitive workflows publish <id> # Publish draft
242
265
  primitive workflows preview <id> --input '{}' # Preview execution
266
+ primitive workflows disable <id> # Take it out of service now
267
+ primitive workflows enable <id> # Put it back
243
268
  ```
244
269
 
270
+ A workflow is authored in `workflows/<key>.toml` (named config bodies in
271
+ `workflows/<key>.configs/<name>.toml`) and applied with `config push`:
272
+
273
+ ```bash
274
+ primitive config create workflow process-doc
275
+ primitive config push --only workflow/process-doc
276
+ ```
277
+
278
+ Revisions are read-only history from the retired legacy path (issue #2768:
279
+ `workflows publish` and its endpoint are gone). A workflow created before the
280
+ configuration model — one with no active config — is migrated by authoring
281
+ `workflows/<key>.configs/<name>.toml`, setting `activeConfigName = "<name>"` in
282
+ `workflows/<key>.toml`, and pushing.
283
+
245
284
  **Run management:**
246
285
  ```bash
247
286
  primitive workflows runs list <workflow-id>
248
287
  primitive workflows runs status <workflow-id> <run-id>
249
288
  ```
250
289
 
290
+ **Workflow TOML push-time validation (issue #685):** `primitive config push` —
291
+ the only command that sends a workflow TOML since #2645 — runs the
292
+ file through `cli/src/lib/workflow-toml-validator.ts` before sending it to
293
+ the server. For a step whose `kind` the CLI knows about, the validator
294
+ rejects any top-level field outside the allowlist — most commonly catching
295
+ the footgun where `[steps.<id>.request]` is written under `[[steps]]` (TOML
296
+ places the sub-table under `steps[N][<id>]`, not the intended
297
+ `steps[N].request`, so the runtime silently runs the step with an empty
298
+ `request` block). The correct form for the most-recent step is
299
+ `[steps.request]`. For a step whose `kind` the CLI does NOT know (an older
300
+ CLI run against a newer server that registered a new step kind), the
301
+ per-field check is skipped — so a valid new-kind field is never falsely
302
+ rejected — while the kind-agnostic misnested-header footgun detector still
303
+ fires (issue #998).
304
+
305
+ **The allowlist is generated, not hand-maintained (issue #998):** The field
306
+ union and the known-kind set live in the committed artifact
307
+ `cli/src/lib/generated-allowlist.ts`, generated from the server step runners
308
+ (`src/workflows/steps/*.ts`) and the universal `BaseStepDefinition` shape by
309
+ `cli/scripts/gen-allowlist.mjs`. The generator runs automatically at CLI
310
+ `prebuild`; regenerate manually with `node cli/scripts/gen-allowlist.mjs`
311
+ (or `pnpm -C cli gen:allowlist`). The union is derived from what each runner
312
+ *reads* off the step config — not from what the `*StepDefinition` type
313
+ declares (types over-declare and would weaken the footgun detector). A
314
+ freshness guard (`node cli/scripts/gen-allowlist.mjs --check`, also asserted
315
+ by `cli/tests/unit/workflow-toml-validator-drift-guard.test.ts`) fails if the
316
+ committed artifact drifts from a fresh scan, so the historical hand-edit
317
+ drift (#685/#802/#971) cannot recur. When you add a new step kind or a runner
318
+ starts reading a new field, just regenerate and commit the artifact — there is
319
+ no hand-maintained list to update.
320
+
321
+ **A configuration object's field surface has ONE definition (issue #2644):**
322
+ `src/config-surface/` on the server records, per configuration object, which
323
+ `models.yaml` fields exist, which TOML key each carries, which modes the server
324
+ accepts it in, and — for a field with real behavior — the handler that owns it.
325
+ The server's create/update handlers take their accepted key set from it
326
+ (`pickWritableFields`), and `cli/scripts/gen-config-surfaces.mjs` vendors the
327
+ same modules into the committed artifact
328
+ `cli/src/lib/generated-config-surfaces.ts`, which the CLI's push builder, pull
329
+ serializer and TOML key validation read. The generator runs automatically at CLI
330
+ `prebuild`; regenerate manually with `node cli/scripts/gen-config-surfaces.mjs`
331
+ (or `pnpm -C cli gen:config-surfaces`).
332
+
333
+ Three hard-fail checks live in `cli/tests/unit/config-surface-drift-guard.test.ts`:
334
+ freshness (`--check`, a byte comparison), coverage (every model field of every
335
+ registered object is either exposed or classified `notExposed` **with a
336
+ reason**), and registry existence (every `SYNC_RESOURCE_TYPES` label has a
337
+ definition — the migration's `PENDING_MIGRATION` exemption list is gone, so
338
+ there is nowhere to park one). Add a
339
+ field to `models.yaml` and the CLI unit suite fails until you regenerate and
340
+ classify it — so the CLI can no longer silently drop a new server-side field.
341
+ This supersedes the workflow-only descriptor and generator from #2326.
342
+
343
+ **Template expressions are linted at push time (issue #2689):** the validator
344
+ also inspects every `{{ }}` expression on a step and rejects the ones that can
345
+ never resolve — an unknown root (`{{ inputs.userId }}`; the valid roots are
346
+ `input`, `steps`, `outputs`, `meta`, `secrets`, `vars`, plus the contextual
347
+ `selected`/`user`/`md`, the built-ins `now`/`today`/`uuid`/`ulid`, and — inside a
348
+ forEach step's body only — `iteration`/`loop` and the loop's binding name) or a
349
+ reference to a `steps.<id>` / `outputs.<name>` the file does not declare. An
350
+ expression that is only sometimes present is marked optional with
351
+ `| default: ''` or a trailing `|| ''`, and anything statically undecidable (a
352
+ dynamic bracket key) is left to the run-time check. The lint itself is a
353
+ verbatim generated copy of the server module
354
+ `src/workflows/runner/template-static-lint.ts` at
355
+ `cli/src/lib/generated-template-lint.ts` (`cli/scripts/gen-template-lint.mjs`,
356
+ run at `prebuild`, with a `--check` freshness mode asserted by
357
+ `cli/tests/unit/template-lint-drift-guard.test.ts`), so the CLI's push-time
358
+ verdict and the server's save-time verdict come from the same code.
359
+
360
+
251
361
  ### Tokens
252
362
 
253
363
  Manage long-lived API access tokens for headless/server authentication.
@@ -263,7 +373,7 @@ primitive tokens revoke <token-id> [app-id] # Revoke t
263
373
  **Create options:**
264
374
  - `--name <name>` - Token name (required)
265
375
  - `--user <user-id>` - App user ID to associate the token with (required)
266
- - `--ttl <duration>` - Token lifetime (e.g., 7d, 30d, 4w, 3m, 1y). Omit for never-expiring
376
+ - `--ttl <duration>` - Token lifetime (e.g., 30m, 2h, 7d, 30d, 4w, 3mo, 1y). Omit for never-expiring. Units: `m`/`min`=minutes (≤1440), `h`=hours (≤24), `d`=days, `w`=weeks, `mo`=months, `y`=years. **Note:** as of #420 `m` means minutes (was months); use `mo` for months.
267
377
 
268
378
  ### Databases
269
379
 
@@ -273,6 +383,7 @@ Manage online databases and permissions. `list` returns databases the user has d
273
383
  primitive databases list [app-id] # List databases (direct access)
274
384
  primitive databases create <title> [app-id] # Create database
275
385
  primitive databases get <database-id> [app-id] # Get details
386
+ primitive databases update <database-id> [options] # Update title or type
276
387
  primitive databases delete <database-id> [app-id] # Delete database
277
388
  ```
278
389
 
@@ -283,18 +394,48 @@ primitive databases permissions grant <database-id> --user-id <uid> --permission
283
394
  primitive databases permissions revoke <database-id> <user-id> [app-id]
284
395
  ```
285
396
 
286
- **Group permissions on databases:**
397
+ Permission values: `owner` (set at creation), `manager`
398
+
399
+ **Metadata:**
400
+ ```bash
401
+ primitive databases metadata update <database-id> --data '{"key":"value"}' # Merge-update metadata
402
+ ```
403
+
404
+ **Operations:**
405
+ ```bash
406
+ primitive databases operations list <database-id> [app-id] # List registered operations
407
+ primitive databases operations execute <database-id> <op-name> --params '{}' # Execute operation
408
+ primitive databases operations execute <database-id> <op-name> --token <jwt> # Execute as specific user
409
+ ```
410
+
411
+ The `--token` flag lets you execute an operation as a specific user using a test JWT from `users mint-jwt`. Useful for testing access rules.
412
+
413
+ Under `--json`, the printed shape is the operation's own. A `query` — and a `pipeline` whose `returnField` names a query step — prints the CLI's list envelope `{ items, hasMore, nextCursor? }`, the same shape as `databases records query --json`. Every other operation type prints unchanged: `count` → `{ count }`, `aggregate` → `{ result }`, mutation → `{ results }`, `applyToQuery` → `{ matched, affected, failed, … }`, and a `returnField = "all"` pipeline → `{ steps: { … } }` with each step's own keys left alone. `--timing` adds `_timing` alongside whichever shape you get.
414
+
415
+ **Records (schema introspection):**
416
+ ```bash
417
+ primitive databases records models <database-id> [app-id] # List model names
418
+ primitive databases records describe <database-id> <model> [app-id] # Show inferred schema
419
+ ```
420
+
421
+ **Indexes:**
422
+ ```bash
423
+ primitive databases indexes list <database-id> [--model <name>] # List indexes
424
+ primitive databases indexes create <database-id> <model> <field> [options] # Create index
425
+ primitive databases indexes drop <database-id> <model> <field> # Drop index
426
+ ```
427
+
428
+ **Export / Import:**
287
429
  ```bash
288
- primitive databases group-permissions list <database-id>
289
- primitive databases group-permissions grant <database-id> --group-type <type> --group-id <id> --permission <perm>
290
- primitive databases group-permissions revoke <database-id> <group-type> <group-id>
430
+ primitive databases export [app-id] <database-id> --output <dir> # Export records, indexes, constraints
431
+ primitive databases import [app-id] <path> --overwrite --dry-run # Import from export directory
291
432
  ```
292
433
 
293
- Permission values: `owner`, `read-write`, `reader`
434
+ Export creates a directory with `metadata.json`, `records.jsonl`, `indexes.json`, and `constraints.json`. Import restores records and indexes into a new or existing database. Database type config (operations, triggers, access rules) is managed separately via `primitive config` — run `config push` on the target app before importing.
294
435
 
295
436
  ### Documents
296
437
 
297
- Manage document ownership and group permissions.
438
+ Manage document ownership, group permissions, and export/import.
298
439
 
299
440
  ```bash
300
441
  primitive documents transfer-owner [app-id] <document-id> <new-owner-id> # Transfer ownership
@@ -309,6 +450,15 @@ primitive documents group-permissions revoke <document-id> <group-type> <group-i
309
450
 
310
451
  Permission values: `read-write`, `reader`
311
452
 
453
+ **Export / Import:**
454
+ ```bash
455
+ primitive documents export [app-id] <document-id> --output <dir> # Export Yjs state, blobs, permissions, aliases
456
+ primitive documents export-all [app-id] --user-id <id> --owned-only # Export all docs for a user
457
+ primitive documents import [app-id] <path> --overwrite --aliases overwrite|skip --dry-run # Import from export
458
+ ```
459
+
460
+ Export creates a directory per document with `metadata.json`, `document.yjs` (Yjs state), `permissions.json` (for reference), and `blobs/` (attachments). Permissions are exported for reference but not restored during import — the importing admin is the new owner and manages sharing in the target app. Document IDs are preserved across import. User-scoped aliases can be restored with `--aliases overwrite` (update existing) or `--aliases skip` (keep existing, default).
461
+
312
462
  ### Groups
313
463
 
314
464
  Manage groups, members, and memberships.
@@ -336,26 +486,44 @@ primitive groups memberships <user-id> [app-id] # List user's group mem
336
486
 
337
487
  **Group resource access:**
338
488
  ```bash
339
- primitive groups databases <group-type> <group-id> # List databases a group can access
340
489
  primitive groups documents <group-type> <group-id> # List documents a group can access
341
490
  ```
342
491
 
343
- Group permissions on databases and documents are managed via `primitive databases group-permissions` and `primitive documents group-permissions` respectively (see [Databases](#databases) and [Documents](#documents) above).
492
+ Group permissions on documents are managed via `primitive documents group-permissions` (see [Documents](#documents) above).
344
493
 
345
494
  ### Analytics
346
495
 
347
496
  View usage analytics for an app.
348
497
 
349
498
  ```bash
350
- primitive analytics overview [app-id] # Activity overview
351
- primitive analytics top-users [app-id] # Most active users
352
- primitive analytics user [app-id] <user-ulid> # User activity details
353
- primitive analytics integrations [app-id] # Integration metrics
499
+ # Overview & active users
500
+ primitive analytics overview [app-id] # DAU / WAU / MAU + growth
501
+ primitive analytics daily-active [app-id] # Daily active users time series
502
+ primitive analytics rolling-active [app-id] # Rolling active users (28 points)
503
+ primitive analytics cohort-retention [app-id] # Weekly cohort retention matrix
504
+
505
+ # Users
506
+ primitive analytics top-users [app-id] # Most active users
507
+ primitive analytics user-search [app-id] --query <q> # Search by email or ULID
508
+ primitive analytics user-detail <user-ulid> [app-id] # User activity breakdown
509
+ primitive analytics user-snapshot <user-ulid> [app-id] # Latest context snapshot
510
+
511
+ # Events
512
+ primitive analytics events [app-id] # Paginated event feed
513
+ primitive analytics events-grouped [app-id] # Events grouped by dimension
514
+
515
+ # Features
516
+ primitive analytics integrations [app-id] # Integration usage metrics
517
+ primitive analytics workflows [app-id] # Top workflows by runs
518
+ primitive analytics prompts [app-id] # Top prompts by executions
354
519
  ```
355
520
 
356
- **Options:**
357
- - `--window-days <n>` - Time window (default: 30)
358
- - `--limit <n>` - Result limit for top-users
521
+ **Common options:**
522
+ - `--window-days <n>` - Time window in days (default varies per command)
523
+ - `--limit <n>` - Result limit (top-users, workflows, prompts)
524
+ - `--group-by <dim>` - Dimension for events-grouped (action, feature, route, country, deviceType, plan, day)
525
+ - `--page <n>` - Page number for events feed (0-based)
526
+ - `--json` - Output raw JSON
359
527
 
360
528
  ### Admins (Super-Admin Only)
361
529
 
@@ -392,15 +560,15 @@ primitive catalog integrations update <catalog-id> [options]
392
560
  primitive catalog integrations delete <catalog-id>
393
561
  ```
394
562
 
395
- ### Sync (TOML Configuration)
563
+ ### Config (TOML Configuration)
396
564
 
397
- Sync app configuration to/from TOML files for version control.
565
+ Author app configuration as TOML files and reconcile them with the server.
398
566
 
399
567
  ```bash
400
- primitive sync init [app-id] --dir ./config # Initialize config directory
401
- primitive sync pull [app-id] --dir ./config # Pull remote config to local
402
- primitive sync push [app-id] --dir ./config # Push local config to remote
403
- primitive sync diff [app-id] --dir ./config # Show differences
568
+ primitive config init [app-id] --dir ./config # Initialize config directory
569
+ primitive config pull [app-id] --dir ./config # Pull remote config to local
570
+ primitive config push [app-id] --dir ./config # Push local config to remote
571
+ primitive config diff [app-id] --dir ./config # Show differences
404
572
  ```
405
573
 
406
574
  **Options:**
@@ -436,7 +604,9 @@ baseUrl = "https://myapp.com"
436
604
  [auth]
437
605
  googleOAuthEnabled = true
438
606
  passkeyEnabled = true
439
- magicLinkEnabled = false
607
+ emailSignInEnabled = true # one email carrying a code and a link
608
+ appleSignInEnabled = true # Sign in with Apple
609
+ appleAudiences = ["com.example.MyApp"] # allowed Apple audiences
440
610
 
441
611
  [cors]
442
612
  mode = "custom"
@@ -444,6 +614,19 @@ allowedOrigins = ["https://myapp.com"]
444
614
  allowCredentials = true
445
615
  ```
446
616
 
617
+ Notes on `[auth]`:
618
+
619
+ - Only keys you actually list are pushed. Omitting a key leaves the server's
620
+ current value untouched — it is **not** reset to `false`. To turn a method
621
+ off, set it explicitly (e.g. `emailSignInEnabled = false`).
622
+ - An unrecognized `[auth]` key (for example a typo like `googleOauthEnabled`)
623
+ produces a warning on `push` and is ignored, rather than being silently
624
+ dropped. The push still applies the recognized keys.
625
+ - `appleAudiences = []` and an omitted `appleAudiences` both mean "no
626
+ audiences" (the server stores them the same way), so `pull` omits the key
627
+ when there are no audiences. A `[] ` round-trip reading back as an omitted
628
+ key is expected, not data loss.
629
+
447
630
  ### Example: integrations/weather-api.toml
448
631
 
449
632
  ```toml
@@ -451,7 +634,6 @@ allowCredentials = true
451
634
  key = "weather-api"
452
635
  displayName = "Weather API"
453
636
  description = "OpenWeatherMap integration"
454
- status = "active"
455
637
  timeoutMs = 30000
456
638
 
457
639
  [requestConfig]
@@ -467,7 +649,6 @@ allowedPaths = ["/weather", "/forecast"]
467
649
  key = "summarizer"
468
650
  displayName = "Text Summarizer"
469
651
  description = "Summarizes input text"
470
- status = "active"
471
652
 
472
653
  [[configs]]
473
654
  name = "default"
@@ -500,6 +681,133 @@ primitive apps list
500
681
  primitive apps list --json | jq '.[0].appId'
501
682
  ```
502
683
 
684
+ ### Stdout vs. stderr
685
+
686
+ The CLI follows the same convention as `git`, `kubectl`, `aws`, and `gh`:
687
+
688
+ - **stdout** carries the *data* the command produced — JSON documents under
689
+ `--json`, tabular listings (`apps list`), raw values (`primitive token`),
690
+ and the primary `label: value` fields a `get` / `show` / `describe` command
691
+ emits (e.g. `primitive integrations get <id>`).
692
+ - **stderr** carries *diagnostics* — status text (`✓ Created…`,
693
+ `i Waiting for completion...`), warnings (`!` markers), progress lines, and
694
+ the `key: value` summaries shown *after* a side-effecting command runs
695
+ (e.g. the `Webhook ID: …` confirmation printed by `webhooks create`).
696
+
697
+ This means `primitive <cmd> --json | jq` always works, regardless of any
698
+ status / warning / progress text the command may print along the way.
699
+ It also means `primitive integrations get <id> > out.txt` writes the
700
+ integration's fields to `out.txt` while the status diagnostics still appear
701
+ on the terminal via stderr.
702
+
703
+ Conversely, redirecting stderr (`primitive <cmd> 2>/dev/null`) silences
704
+ diagnostics — including success checkmarks like `✓ Pushed 3 changes` — so
705
+ prefer `2>&1 >file.txt` if you want the full transcript.
706
+
707
+ For contributors writing new commands, the output helpers in
708
+ `cli/src/lib/output.ts` make the data-vs-diagnostic split explicit: use
709
+ `json()` and `result(label, value)` for data the caller asked for, and
710
+ `success()` / `info()` / `warn()` / `keyValue()` / `divider()` / `heading()`
711
+ for diagnostics about what the command did.
712
+
713
+ ## Programmatic surfaces
714
+
715
+ ### `primitive help --json` — command manifest
716
+
717
+ `primitive help --json` prints a machine-readable manifest of the full command
718
+ tree (commands, subcommands, positional args, options, aliases, global options,
719
+ and the CLI version) to **stdout** as a single JSON document, then exits `0`. It
720
+ is hidden/undocumented in human `--help` output, auth-free, and runs entirely
721
+ offline (no project config, no credentials, no network) — so it works in any
722
+ directory, including one with no `.primitive/`.
723
+
724
+ ```bash
725
+ primitive help --json | jq '.commands[] | select(.name=="sync") | .commands[].name'
726
+ ```
727
+
728
+ Shape (`schemaVersion: 1`):
729
+
730
+ ```jsonc
731
+ {
732
+ "schemaVersion": 1,
733
+ "name": "primitive",
734
+ "version": "1.0.49",
735
+ "globalOptions": [ { "flags": "-e, --env <name>", "description": "…", "required": true, "defaultValue": null, "hidden": false } ],
736
+ "commands": [
737
+ {
738
+ "name": "sync",
739
+ "description": "…",
740
+ "aliases": [],
741
+ "args": [],
742
+ "options": [],
743
+ "commands": [
744
+ {
745
+ "name": "push",
746
+ "description": "…",
747
+ "aliases": [],
748
+ "args": [ { "name": "app-id", "required": false, "variadic": false, "description": "…" } ],
749
+ "options": [ { "flags": "--dir <path>", "description": "…", "required": true, "defaultValue": null, "hidden": false } ],
750
+ "commands": []
751
+ }
752
+ ]
753
+ }
754
+ ]
755
+ }
756
+ ```
757
+
758
+ `hidden` marks a deprecated alias that still works but is not part of the
759
+ supported surface (it is omitted from human `--help` too). Tooling that treats
760
+ the manifest as an allowlist — the docs CLI gate does — should skip those flags.
761
+
762
+ `schemaVersion` is the contract knob: consumers assert the shape they understand
763
+ and fail loud if a future CLI bumps it (a breaking change for downstream tooling
764
+ such as docs CI that drift-gates documented invocations against the published
765
+ CLI).
766
+
767
+ ### `primitive-admin/validators` — TOML validators
768
+
769
+ The TOML validators that `config push` runs as its load-bearing gate are exported
770
+ from the `primitive-admin/validators` subpath (ESM-only, with types) so external
771
+ tooling can validate exactly the way the published CLI does — instead of
772
+ re-implementing the flow and silently drifting.
773
+
774
+ ```ts
775
+ import {
776
+ validateWorkflowTomlSource, // source-level wrapper (parse → expand → validate)
777
+ validateWorkflowToml, // raw: pure fn over already-parsed TOML
778
+ formatWorkflowTomlErrors,
779
+ validateOperations, // raw: pure fn over already-parsed operations[]
780
+ formatIssue,
781
+ } from "primitive-admin/validators";
782
+ ```
783
+
784
+ Two contracts:
785
+
786
+ - **`validateWorkflowTomlSource(raw, filePath)`** — pass the **raw TOML source
787
+ string** and the workflow's path. It runs the *identical* parse →
788
+ `expandWorkflowTomlData()` (`include` fragment expansion) → `validateWorkflowToml`
789
+ → `formatWorkflowTomlErrors` path that `config push` runs, so it cannot diverge
790
+ from `config push` on workflow `include` fragments. Returns
791
+ `{ errors, formatted }` (`formatted` is `null` when valid). Fragment files
792
+ resolve relative to `<filePath>/../../workflow-fragments/`, matching the CLI.
793
+
794
+ - **The raw validators** (`validateWorkflowToml`, `validateOperations`,
795
+ `formatWorkflowTomlErrors`, `formatIssue`) are **pure functions over
796
+ already-parsed TOML** — they do *not* read files or parse TOML. The consumer
797
+ parses (e.g. with `smol-toml`) and, for workflows, performs any `include`
798
+ expansion itself. There is **no coupling on a specific TOML parser version**:
799
+ pass whatever parsed object / `operations[]` you already have.
800
+
801
+ ```ts
802
+ import * as TOML from "smol-toml";
803
+ const data = TOML.parse(raw);
804
+ const errs = validateWorkflowToml(data);
805
+ if (errs.length) throw new Error(formatWorkflowTomlErrors(path, errs));
806
+ ```
807
+
808
+ Internal helpers (`collectParamRefs`, `declaredParamNames`,
809
+ `locateOperationLine`) are intentionally **not** exported.
810
+
503
811
  ## Exit Codes
504
812
 
505
813
  - `0` - Success
@@ -508,15 +816,30 @@ primitive apps list --json | jq '.[0].appId'
508
816
 
509
817
  ## Environment Variables
510
818
 
511
- - `PRIMITIVE_SERVER_URL` - Server URL for login (defaults to `https://primitiveapi.com`)
819
+ - `PRIMITIVE_SERVER_URL` - Server URL for login in legacy mode (defaults to `https://primitiveapi.com`)
820
+
821
+ **Login server resolution:**
822
+ 1. Project mode (`.primitive/config.json` present): the active environment's
823
+ `apiUrl`. Select the environment with `-e <name>`, `PRIMITIVE_ENV`,
824
+ `primitive env use <name>` (this machine's selection, stored in the
825
+ gitignored `.primitive/local.json`), or the committed `defaultEnvironment`
826
+ — in that order. An unresolvable environment fails loudly — `login`
827
+ never silently falls back to production.
828
+ 2. Legacy mode (no project config): `PRIMITIVE_SERVER_URL`, else the default
829
+ `https://primitiveapi.com`.
512
830
 
513
- **Server URL priority:**
514
- 1. `--server` flag (highest priority)
515
- 2. `PRIMITIVE_SERVER_URL` environment variable
516
- 3. Default: `https://primitiveapi.com`
831
+ > `login` no longer accepts `-s/--server` (removed in a breaking change). Use
832
+ > `-e <env>` in a project, or `PRIMITIVE_SERVER_URL` for local dev / scripts.
833
+ > `init` and `bootstrap` keep their own `-s/--server` (they run before a
834
+ > project config exists).
517
835
 
518
836
  ## Development
519
837
 
838
+ Before adding or changing a command, read [`docs/cli-design.md`](../docs/cli-design.md)
839
+ in the repo root — the CLI's design rules (which verbs each kind of noun carries,
840
+ TOML-only authoring, deletion and naming rules, what a breaking change obliges).
841
+ It is internal maintainer guidance and is not published.
842
+
520
843
  ```bash
521
844
  # Run without building (uses tsx)
522
845
  pnpm run cli:dev -- login
@@ -570,12 +893,13 @@ cli/tests/
570
893
  config.test.ts # Credentials and config management
571
894
  output.test.ts # Output formatting functions
572
895
  integration/
573
- api-client.test.ts # API client HTTP tests
574
- commands.test.ts # CLI command tests
575
- tokens.test.ts # Token lifecycle tests
576
- databases.test.ts # Database CRUD, permissions, group permissions tests
577
- documents.test.ts # Document group permissions, group resource listing tests
578
- groups.test.ts # Group CRUD, members, memberships tests
896
+ api-client.test.ts # API client HTTP tests
897
+ commands.test.ts # CLI command tests
898
+ tokens.test.ts # Token lifecycle tests
899
+ databases.test.ts # Database CRUD, permissions, group permissions tests
900
+ documents.test.ts # Document group permissions, group resource listing tests
901
+ groups.test.ts # Group CRUD, members, memberships tests
902
+ classroom-e2e.test.ts # End-to-end classroom app workflow (types, rules, operations, access)
579
903
  ```
580
904
 
581
905
  ## Troubleshooting