primitive-admin 1.0.63 → 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 (328) 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 +12 -5
  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 +2 -1
  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 +89 -43
  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 +12 -15
  54. package/dist/src/commands/init.js +44 -92
  55. package/dist/src/commands/init.js.map +1 -1
  56. package/dist/src/commands/integrations.js +35 -12
  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.js +33 -28
  69. package/dist/src/commands/scripts.js.map +1 -1
  70. package/dist/src/commands/secrets.js +2 -1
  71. package/dist/src/commands/secrets.js.map +1 -1
  72. package/dist/src/commands/sessions.js +10 -9
  73. package/dist/src/commands/sessions.js.map +1 -1
  74. package/dist/src/commands/sync-app-settings.js +3 -5
  75. package/dist/src/commands/sync-app-settings.js.map +1 -1
  76. package/dist/src/commands/sync.d.ts +390 -13
  77. package/dist/src/commands/sync.js +2613 -451
  78. package/dist/src/commands/sync.js.map +1 -1
  79. package/dist/src/commands/tokens.js +2 -1
  80. package/dist/src/commands/tokens.js.map +1 -1
  81. package/dist/src/commands/users.js +19 -10
  82. package/dist/src/commands/users.js.map +1 -1
  83. package/dist/src/commands/vars.js +2 -1
  84. package/dist/src/commands/vars.js.map +1 -1
  85. package/dist/src/commands/waitlist.js +2 -1
  86. package/dist/src/commands/waitlist.js.map +1 -1
  87. package/dist/src/commands/webhooks.d.ts +29 -0
  88. package/dist/src/commands/webhooks.js +135 -64
  89. package/dist/src/commands/webhooks.js.map +1 -1
  90. package/dist/src/commands/workflows.d.ts +1 -29
  91. package/dist/src/commands/workflows.js +113 -179
  92. package/dist/src/commands/workflows.js.map +1 -1
  93. package/dist/src/lib/api-client.d.ts +628 -14
  94. package/dist/src/lib/api-client.js +776 -70
  95. package/dist/src/lib/api-client.js.map +1 -1
  96. package/dist/src/lib/app-settings-descriptor.d.ts +1 -1
  97. package/dist/src/lib/app-settings-descriptor.js +9 -1
  98. package/dist/src/lib/app-settings-descriptor.js.map +1 -1
  99. package/dist/src/lib/block-selector.d.ts +58 -0
  100. package/dist/src/lib/block-selector.js +92 -0
  101. package/dist/src/lib/block-selector.js.map +1 -0
  102. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +24 -54
  103. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +31 -153
  104. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -1
  105. package/dist/src/lib/collection-export.d.ts +184 -0
  106. package/dist/src/lib/collection-export.js +252 -0
  107. package/dist/src/lib/collection-export.js.map +1 -0
  108. package/dist/src/lib/config-json-field.d.ts +28 -0
  109. package/dist/src/lib/config-json-field.js +56 -0
  110. package/dist/src/lib/config-json-field.js.map +1 -0
  111. package/dist/src/lib/config-object-descriptor.js +88 -6
  112. package/dist/src/lib/config-object-descriptor.js.map +1 -1
  113. package/dist/src/lib/config-payload.d.ts +8 -1
  114. package/dist/src/lib/config-payload.js +49 -4
  115. package/dist/src/lib/config-payload.js.map +1 -1
  116. package/dist/src/lib/config-surface.d.ts +12 -1
  117. package/dist/src/lib/config-surface.js +71 -3
  118. package/dist/src/lib/config-surface.js.map +1 -1
  119. package/dist/src/lib/config.d.ts +31 -13
  120. package/dist/src/lib/config.js +34 -70
  121. package/dist/src/lib/config.js.map +1 -1
  122. package/dist/src/lib/credentials-store.d.ts +37 -22
  123. package/dist/src/lib/credentials-store.js +103 -97
  124. package/dist/src/lib/credentials-store.js.map +1 -1
  125. package/dist/src/lib/db-codegen/dbTypeIR.js +8 -0
  126. package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -1
  127. package/dist/src/lib/deprecation.d.ts +22 -0
  128. package/dist/src/lib/deprecation.js +43 -0
  129. package/dist/src/lib/deprecation.js.map +1 -0
  130. package/dist/src/lib/document-export-permissions.d.ts +30 -0
  131. package/dist/src/lib/document-export-permissions.js +54 -0
  132. package/dist/src/lib/document-export-permissions.js.map +1 -0
  133. package/dist/src/lib/document-ingest-artifact.d.ts +120 -0
  134. package/dist/src/lib/document-ingest-artifact.js +505 -0
  135. package/dist/src/lib/document-ingest-artifact.js.map +1 -0
  136. package/dist/src/lib/document-ingest-input.d.ts +51 -0
  137. package/dist/src/lib/document-ingest-input.js +132 -0
  138. package/dist/src/lib/document-ingest-input.js.map +1 -0
  139. package/dist/src/lib/document-ingest-rows.d.ts +137 -0
  140. package/dist/src/lib/document-ingest-rows.js +181 -0
  141. package/dist/src/lib/document-ingest-rows.js.map +1 -0
  142. package/dist/src/lib/document-ingest.d.ts +101 -0
  143. package/dist/src/lib/document-ingest.js +384 -0
  144. package/dist/src/lib/document-ingest.js.map +1 -0
  145. package/dist/src/lib/env-resolver-core.d.ts +89 -18
  146. package/dist/src/lib/env-resolver-core.js +145 -23
  147. package/dist/src/lib/env-resolver-core.js.map +1 -1
  148. package/dist/src/lib/env-resolver.d.ts +18 -3
  149. package/dist/src/lib/env-resolver.js +23 -3
  150. package/dist/src/lib/env-resolver.js.map +1 -1
  151. package/dist/src/lib/function-bundle.d.ts +147 -0
  152. package/dist/src/lib/function-bundle.js +341 -0
  153. package/dist/src/lib/function-bundle.js.map +1 -0
  154. package/dist/src/lib/function-collect.d.ts +123 -0
  155. package/dist/src/lib/function-collect.js +610 -0
  156. package/dist/src/lib/function-collect.js.map +1 -0
  157. package/dist/src/lib/function-db-types.d.ts +202 -0
  158. package/dist/src/lib/function-db-types.js +870 -0
  159. package/dist/src/lib/function-db-types.js.map +1 -0
  160. package/dist/src/lib/function-document-types.d.ts +144 -0
  161. package/dist/src/lib/function-document-types.js +370 -0
  162. package/dist/src/lib/function-document-types.js.map +1 -0
  163. package/dist/src/lib/function-grants-preflight.d.ts +64 -0
  164. package/dist/src/lib/function-grants-preflight.js +105 -0
  165. package/dist/src/lib/function-grants-preflight.js.map +1 -0
  166. package/dist/src/lib/function-log-lines.d.ts +76 -0
  167. package/dist/src/lib/function-log-lines.js +160 -0
  168. package/dist/src/lib/function-log-lines.js.map +1 -0
  169. package/dist/src/lib/function-log-row.d.ts +29 -0
  170. package/dist/src/lib/function-log-row.js +73 -0
  171. package/dist/src/lib/function-log-row.js.map +1 -0
  172. package/dist/src/lib/function-log-tail.d.ts +132 -0
  173. package/dist/src/lib/function-log-tail.js +262 -0
  174. package/dist/src/lib/function-log-tail.js.map +1 -0
  175. package/dist/src/lib/function-run.d.ts +289 -0
  176. package/dist/src/lib/function-run.js +389 -0
  177. package/dist/src/lib/function-run.js.map +1 -0
  178. package/dist/src/lib/function-schema-codegen.d.ts +143 -0
  179. package/dist/src/lib/function-schema-codegen.js +420 -0
  180. package/dist/src/lib/function-schema-codegen.js.map +1 -0
  181. package/dist/src/lib/function-sync.d.ts +459 -0
  182. package/dist/src/lib/function-sync.js +1258 -0
  183. package/dist/src/lib/function-sync.js.map +1 -0
  184. package/dist/src/lib/function-trigger-listing.d.ts +27 -0
  185. package/dist/src/lib/function-trigger-listing.js +70 -0
  186. package/dist/src/lib/function-trigger-listing.js.map +1 -0
  187. package/dist/src/lib/function-typecheck.d.ts +86 -0
  188. package/dist/src/lib/function-typecheck.js +370 -0
  189. package/dist/src/lib/function-typecheck.js.map +1 -0
  190. package/dist/src/lib/function-versions.d.ts +122 -0
  191. package/dist/src/lib/function-versions.js +182 -0
  192. package/dist/src/lib/function-versions.js.map +1 -0
  193. package/dist/src/lib/generated-allowlist.js +4 -0
  194. package/dist/src/lib/generated-allowlist.js.map +1 -1
  195. package/dist/src/lib/generated-config-surfaces.d.ts +2332 -78
  196. package/dist/src/lib/generated-config-surfaces.js +6979 -468
  197. package/dist/src/lib/generated-config-surfaces.js.map +1 -1
  198. package/dist/src/lib/generated-sdk-types.d.ts +12 -0
  199. package/dist/src/lib/generated-sdk-types.js +13 -0
  200. package/dist/src/lib/generated-sdk-types.js.map +1 -0
  201. package/dist/src/lib/init-adopt.js +2 -2
  202. package/dist/src/lib/init-adopt.js.map +1 -1
  203. package/dist/src/lib/init-assets.js +3 -3
  204. package/dist/src/lib/init-config.d.ts +1 -1
  205. package/dist/src/lib/init-ios-links.d.ts +6 -5
  206. package/dist/src/lib/init-ios-links.js +9 -8
  207. package/dist/src/lib/init-ios-links.js.map +1 -1
  208. package/dist/src/lib/init-plan.d.ts +1 -1
  209. package/dist/src/lib/init-plan.js +1 -1
  210. package/dist/src/lib/init-xcode.d.ts +6 -5
  211. package/dist/src/lib/init-xcode.js +34 -10
  212. package/dist/src/lib/init-xcode.js.map +1 -1
  213. package/dist/src/lib/ios-app-id.d.ts +34 -0
  214. package/dist/src/lib/ios-app-id.js +69 -0
  215. package/dist/src/lib/ios-app-id.js.map +1 -0
  216. package/dist/src/lib/list-options.d.ts +68 -0
  217. package/dist/src/lib/list-options.js +89 -0
  218. package/dist/src/lib/list-options.js.map +1 -0
  219. package/dist/src/lib/local-state.d.ts +1 -1
  220. package/dist/src/lib/local-state.js +1 -1
  221. package/dist/src/lib/local-test-cases.d.ts +1 -1
  222. package/dist/src/lib/local-test-cases.js +2 -1
  223. package/dist/src/lib/local-test-cases.js.map +1 -1
  224. package/dist/src/lib/log-inspection.d.ts +152 -5
  225. package/dist/src/lib/log-inspection.js +179 -2
  226. package/dist/src/lib/log-inspection.js.map +1 -1
  227. package/dist/src/lib/logout-admin-session.d.ts +33 -0
  228. package/dist/src/lib/logout-admin-session.js +70 -0
  229. package/dist/src/lib/logout-admin-session.js.map +1 -0
  230. package/dist/src/lib/output.d.ts +15 -0
  231. package/dist/src/lib/output.js +28 -0
  232. package/dist/src/lib/output.js.map +1 -1
  233. package/dist/src/lib/paginate.d.ts +15 -0
  234. package/dist/src/lib/paginate.js +17 -0
  235. package/dist/src/lib/paginate.js.map +1 -1
  236. package/dist/src/lib/project-config.d.ts +38 -21
  237. package/dist/src/lib/project-config.js +57 -47
  238. package/dist/src/lib/project-config.js.map +1 -1
  239. package/dist/src/lib/prompt-cost-format.d.ts +11 -0
  240. package/dist/src/lib/prompt-cost-format.js +41 -0
  241. package/dist/src/lib/prompt-cost-format.js.map +1 -0
  242. package/dist/src/lib/prompt-schema-codegen.d.ts +147 -0
  243. package/dist/src/lib/prompt-schema-codegen.js +462 -0
  244. package/dist/src/lib/prompt-schema-codegen.js.map +1 -0
  245. package/dist/src/lib/refresh-admin-credentials.d.ts +9 -1
  246. package/dist/src/lib/refresh-admin-credentials.js +22 -2
  247. package/dist/src/lib/refresh-admin-credentials.js.map +1 -1
  248. package/dist/src/lib/resolve-owner.d.ts +19 -0
  249. package/dist/src/lib/resolve-owner.js +20 -0
  250. package/dist/src/lib/resolve-owner.js.map +1 -0
  251. package/dist/src/lib/skill-installer.d.ts +49 -3
  252. package/dist/src/lib/skill-installer.js +275 -100
  253. package/dist/src/lib/skill-installer.js.map +1 -1
  254. package/dist/src/lib/snapshot-audit-source.d.ts +45 -0
  255. package/dist/src/lib/snapshot-audit-source.js +58 -0
  256. package/dist/src/lib/snapshot-audit-source.js.map +1 -0
  257. package/dist/src/lib/snapshot-audit-store.d.ts +52 -0
  258. package/dist/src/lib/snapshot-audit-store.js +196 -0
  259. package/dist/src/lib/snapshot-audit-store.js.map +1 -0
  260. package/dist/src/lib/snapshot-audit.d.ts +207 -0
  261. package/dist/src/lib/snapshot-audit.js +431 -0
  262. package/dist/src/lib/snapshot-audit.js.map +1 -0
  263. package/dist/src/lib/snapshot-build-rows.d.ts +60 -0
  264. package/dist/src/lib/snapshot-build-rows.js +87 -0
  265. package/dist/src/lib/snapshot-build-rows.js.map +1 -0
  266. package/dist/src/lib/snapshot-build.d.ts +50 -0
  267. package/dist/src/lib/snapshot-build.js +111 -0
  268. package/dist/src/lib/snapshot-build.js.map +1 -0
  269. package/dist/src/lib/snapshot-manifest-layout.d.ts +61 -0
  270. package/dist/src/lib/snapshot-manifest-layout.js +70 -0
  271. package/dist/src/lib/snapshot-manifest-layout.js.map +1 -0
  272. package/dist/src/lib/snapshots.d.ts +8 -9
  273. package/dist/src/lib/snapshots.js +20 -83
  274. package/dist/src/lib/snapshots.js.map +1 -1
  275. package/dist/src/lib/step-run-table.d.ts +43 -0
  276. package/dist/src/lib/step-run-table.js +129 -0
  277. package/dist/src/lib/step-run-table.js.map +1 -0
  278. package/dist/src/lib/storage-pending-retry.d.ts +26 -0
  279. package/dist/src/lib/storage-pending-retry.js +42 -0
  280. package/dist/src/lib/storage-pending-retry.js.map +1 -0
  281. package/dist/src/lib/swift-codegen/agentGenerator.d.ts +42 -0
  282. package/dist/src/lib/swift-codegen/agentGenerator.js +118 -0
  283. package/dist/src/lib/swift-codegen/agentGenerator.js.map +1 -0
  284. package/dist/src/lib/swift-codegen/banners.d.ts +24 -0
  285. package/dist/src/lib/swift-codegen/banners.js +25 -0
  286. package/dist/src/lib/swift-codegen/banners.js.map +1 -0
  287. package/dist/src/lib/swift-codegen/dbGenerator.js +19 -7
  288. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -1
  289. package/dist/src/lib/swift-codegen/functionGenerator.d.ts +139 -0
  290. package/dist/src/lib/swift-codegen/functionGenerator.js +462 -0
  291. package/dist/src/lib/swift-codegen/functionGenerator.js.map +1 -0
  292. package/dist/src/lib/swift-codegen/generator.d.ts +7 -1
  293. package/dist/src/lib/swift-codegen/generator.js +28 -11
  294. package/dist/src/lib/swift-codegen/generator.js.map +1 -1
  295. package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +15 -0
  296. package/dist/src/lib/swift-codegen/schemaToSwift.js +21 -4
  297. package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -1
  298. package/dist/src/lib/sync-paths.d.ts +72 -55
  299. package/dist/src/lib/sync-paths.js +97 -100
  300. package/dist/src/lib/sync-paths.js.map +1 -1
  301. package/dist/src/lib/sync-resource-types.d.ts +23 -4
  302. package/dist/src/lib/sync-resource-types.js +106 -8
  303. package/dist/src/lib/sync-resource-types.js.map +1 -1
  304. package/dist/src/lib/sync-selectors.d.ts +45 -2
  305. package/dist/src/lib/sync-selectors.js +66 -5
  306. package/dist/src/lib/sync-selectors.js.map +1 -1
  307. package/dist/src/lib/template.d.ts +2 -2
  308. package/dist/src/lib/template.js +2 -2
  309. package/dist/src/lib/test-case-keys.d.ts +1 -1
  310. package/dist/src/lib/test-case-keys.js +1 -1
  311. package/dist/src/lib/test-case-variables.d.ts +14 -0
  312. package/dist/src/lib/test-case-variables.js +42 -0
  313. package/dist/src/lib/test-case-variables.js.map +1 -1
  314. package/dist/src/lib/toml-database-config.js +19 -2
  315. package/dist/src/lib/toml-database-config.js.map +1 -1
  316. package/dist/src/lib/webhook-deliver.d.ts +209 -0
  317. package/dist/src/lib/webhook-deliver.js +519 -0
  318. package/dist/src/lib/webhook-deliver.js.map +1 -0
  319. package/dist/src/lib/workflow-codegen/generator.d.ts +1 -1
  320. package/dist/src/lib/workflow-codegen/generator.js +1 -1
  321. package/dist/src/lib/workflow-toml-validator.d.ts +17 -8
  322. package/dist/src/lib/workflow-toml-validator.js +25 -12
  323. package/dist/src/lib/workflow-toml-validator.js.map +1 -1
  324. package/dist/src/lib/workflow-usage.d.ts +196 -0
  325. package/dist/src/lib/workflow-usage.js +310 -0
  326. package/dist/src/lib/workflow-usage.js.map +1 -0
  327. package/dist/src/types/index.d.ts +12 -2
  328. package/package.json +5 -4
package/README.md CHANGED
@@ -59,10 +59,7 @@ The globally linked `primitive` command uses the compiled files in `cli/dist/`,
59
59
  # Login via browser OAuth
60
60
  primitive login
61
61
 
62
- # Set your working app context
63
- primitive use "My App"
64
-
65
- # List users in the current app
62
+ # List users in the app this project's environment names
66
63
  primitive users list
67
64
 
68
65
  # View help for any command
@@ -75,14 +72,14 @@ primitive apps --help
75
72
  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.
76
73
 
77
74
  ```bash
78
- # Login to the environment resolved from .primitive/config.json
79
- # (project mode), or the default/PRIMITIVE_SERVER_URL server (legacy mode)
75
+ # Login to the environment resolved from the project config, or — outside a
76
+ # project — to the default/PRIMITIVE_SERVER_URL server
80
77
  primitive login
81
78
 
82
79
  # Login to a specific named environment
83
80
  primitive -e prod login
84
81
 
85
- # Login to a custom server without a project config (legacy mode)
82
+ # Login to a custom server from outside a project
86
83
  PRIMITIVE_SERVER_URL=https://api.example.com primitive login
87
84
 
88
85
  # View current session
@@ -95,39 +92,50 @@ primitive token
95
92
  primitive logout
96
93
  ```
97
94
 
98
- Credentials are stored in `~/.primitive/credentials.json` with mode 0600.
95
+ Inside a project, credentials are stored per environment in the gitignored
96
+ `<projectRoot>/.primitive/credentials.json`; a `login` run outside a project
97
+ writes `~/.primitive/credentials.json`. Both are mode 0600. Only `login`,
98
+ `logout`, `bootstrap` and `init` work outside a project — every other command
99
+ stops with an error naming the missing `primitive/config.json`, rather than
100
+ reading the global file (see [Outside a project](#outside-a-project)).
99
101
 
100
102
  ## App Context
101
103
 
102
- Most commands require an app ID. You can specify it in two ways:
104
+ Every environment names exactly one app, via `"appId"` in
105
+ `primitive/config.json`. Selecting an environment selects its app, so most
106
+ commands need no app argument at all — and there is no separate, per-machine
107
+ "current app" that could point somewhere else.
103
108
 
104
- 1. **Flag**: `primitive users list --app 01HXYZ...`
105
- 2. **Context**: Set once with `primitive use`, then omit from commands
109
+ ```bash
110
+ # The app the selected environment names
111
+ primitive whoami
112
+ primitive env show
113
+
114
+ # Point an environment at a different app: edit its "appId" in
115
+ # primitive/config.json.
116
+ ```
106
117
 
107
- Commands that only need an app ID (like `list`) also accept it as a positional argument:
118
+ Commands that read across apps still take an explicit one. Those that only need
119
+ an app ID (like `list`) accept it as a positional argument:
108
120
  ```bash
109
121
  primitive users list 01HXYZ...
110
122
  ```
111
123
 
112
- Commands with other required arguments use only `--app` for the app ID:
124
+ Commands with other required arguments use `--app`:
113
125
  ```bash
114
126
  primitive workflows get <workflow-id> --app 01HXYZ...
115
127
  ```
116
128
 
117
- ```bash
118
- # Interactive app selection
119
- primitive use
120
-
121
- # Set by name or ID
122
- primitive use "My App"
123
- primitive use 01HXYZ...
129
+ ### Outside a project
124
130
 
125
- # View current context
126
- primitive context
127
-
128
- # Clear context
129
- primitive context clear
130
- ```
131
+ With no project config up the directory tree there is no environment, so there
132
+ is nothing for an app-scoped command to target. Only `login`, `logout`,
133
+ `bootstrap` and `init` work there; everything else (`whoami`, `apps list`,
134
+ `env add`, `config pull`, …) exits non-zero with an error that names the
135
+ missing `primitive/config.json` and points at `primitive init`. The CLI never
136
+ falls back to `~/.primitive/credentials.json` for those commands, and no flag
137
+ redirects a command at another project's tree — run it from inside the project
138
+ whose environment names the app.
131
139
 
132
140
  ## Commands
133
141
 
@@ -459,6 +467,40 @@ primitive documents import [app-id] <path> --overwrite --aliases overwrite|skip
459
467
 
460
468
  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
469
 
470
+ ### Collections
471
+
472
+ Group documents into a named set and share the whole set at once.
473
+
474
+ ```bash
475
+ primitive collections list [app-id] --all # --all: every collection (admin)
476
+ primitive collections create <name> --description <text> # --owner <userId-or-email> (admin)
477
+ primitive collections get <collection-id>
478
+ primitive collections update <collection-id> --name <name>
479
+ primitive collections delete <collection-id> # documents are preserved
480
+ primitive collections access <collection-id> # groups + members in one view
481
+ primitive collections for-document <document-id>
482
+ ```
483
+
484
+ **Documents, members and group grants:**
485
+ ```bash
486
+ primitive collections documents list|add|remove <collection-id> [document-id]
487
+ primitive collections members list|add|remove <collection-id> [user-id] --permission reader
488
+ primitive collections share <collection-id> --group <type>/<id> --permission read-write
489
+ primitive collections unshare <collection-id> --group <type>/<id>
490
+ ```
491
+
492
+ **Export / Import:**
493
+ ```bash
494
+ primitive collections export --output <dir> # writes <dir>/collections.json
495
+ primitive collections import <path> --dry-run # plan and problems, writes nothing
496
+ primitive collections import <path> --overwrite # merge into an existing same-named collection
497
+ primitive collections import <path> --owner <userId-or-email> # one owner for every collection
498
+ ```
499
+
500
+ `collections export` writes `collections.json` beside the `manifest.json` and `documents/` directory a document export leaves there, so one directory is one app's migration: per collection its name, description, type, context id, owner, group grants, direct members with their level, and which documents it holds. Run `documents import` **before** `collections import` — the file refers to documents by the ids that import preserves.
501
+
502
+ Both verbs are for admin tokens. Owners and members are recorded as emails, because app users are scoped to their app and a source app's user id means nothing in the target. The import reads before it writes: it resolves every owner, member, document and group, plans `create`/`merge`/`skip`/`refused` per collection, then applies group grants, members and documents in that order. Matching is by name; `--overwrite` merges only into a collection whose owner, type and context id match, since none of those can change after creation. A group grant the target holds at another level is updated to the level the file records, and effective access follows it — except above 200 documents, where the server refuses a collection-wide group change whole (`COLLECTION_FANOUT_LIMIT`) and the import reports it as a `group` problem. Per-item problems go to stderr and to `--json.problems`; the exit code is 1 when any was reported. Collection ids are not preserved, and the groups themselves, collection resource metadata and pending member invitations do not travel.
503
+
462
504
  ### Groups
463
505
 
464
506
  Manage groups, members, and memberships.
@@ -565,14 +607,17 @@ primitive catalog integrations delete <catalog-id>
565
607
  Author app configuration as TOML files and reconcile them with the server.
566
608
 
567
609
  ```bash
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
610
+ primitive config init # Scaffold the environment's config directory
611
+ primitive config pull # Pull remote config into it
612
+ primitive config push # Push it to the server
613
+ primitive config diff # Show differences
572
614
  ```
573
615
 
616
+ The directory is the selected environment's committed tree,
617
+ `primitive/<env>/`, and there is no flag that relocates it or points it at
618
+ another app: select a different environment with `--env <name>` (#3154).
619
+
574
620
  **Options:**
575
- - `--dir <path>` - Config directory (default: ./config)
576
621
  - `--dry-run` - Show changes without applying (push only)
577
622
  - `--force` - Overwrite remote changes (push only)
578
623
 
@@ -581,8 +626,8 @@ primitive config diff [app-id] --dir ./config # Show differences
581
626
  The sync commands use TOML files for configuration. Here's the directory structure:
582
627
 
583
628
  ```
584
- config/
585
- .primitive-sync.json # Sync state (auto-generated)
629
+ primitive/<env>/
630
+ .sync-state.json # Sync state (auto-generated, committed)
586
631
  app.toml # App settings
587
632
  integrations/
588
633
  weather-api.toml # Integration configs
@@ -646,6 +691,7 @@ allowedPaths = ["/weather", "/forecast"]
646
691
 
647
692
  ```toml
648
693
  [prompt]
694
+ kind = "chat"
649
695
  key = "summarizer"
650
696
  displayName = "Text Summarizer"
651
697
  description = "Summarizes input text"
@@ -654,6 +700,8 @@ description = "Summarizes input text"
654
700
  name = "default"
655
701
  provider = "openrouter"
656
702
  model = "google/gemini-2.0-flash-001"
703
+
704
+ [configs.chat]
657
705
  temperature = "0.7"
658
706
  maxTokens = 500
659
707
  systemPrompt = "You are a helpful assistant."
@@ -663,6 +711,8 @@ userPromptTemplate = "Summarize: {{ input.text }}"
663
711
  name = "concise"
664
712
  provider = "openrouter"
665
713
  model = "google/gemini-2.0-flash-001"
714
+
715
+ [configs.chat]
666
716
  temperature = "0.3"
667
717
  maxTokens = 200
668
718
  systemPrompt = "You create very brief summaries."
@@ -678,9 +728,46 @@ All list/get commands support `--json` for machine-readable output:
678
728
  primitive apps list
679
729
 
680
730
  # JSON output for scripting
681
- primitive apps list --json | jq '.[0].appId'
731
+ primitive apps list --json | jq '.items[0].id'
732
+ ```
733
+
734
+ ### The list envelope
735
+
736
+ **Every** `<noun> list --json` prints the same object — no exceptions, and
737
+ never a bare array. It is `{ items, hasMore, nextCursor? }`, the envelope
738
+ #2357 named, and #3646 made universal:
739
+
740
+ ```jsonc
741
+ {
742
+ "items": [ /* the rows */ ],
743
+ "hasMore": false, // is there another page?
744
+ "nextCursor": "01HXY..." // present only when hasMore is true
745
+ }
746
+ ```
747
+
748
+ So `jq '.items[]'` works against any noun, and a script never has to know which
749
+ one it asked about. A `list` whose subject carries context that is not a row —
750
+ `env list`'s current selection, `guides list`'s resolved docs version — prints
751
+ those as extra keys beside these three; the three always mean the same thing.
752
+
753
+ Pagination follows the **route**, not the verb:
754
+
755
+ - A `list` backed by a paged server route carries `--limit <n>` and
756
+ `--cursor <cursor>`, prints exactly one page, and reports that page's
757
+ `hasMore`/`nextCursor`. It never walks the chain for you.
758
+ - A `list` backed by a route that does not paginate carries neither flag and
759
+ prints the whole set as `{ "items": [...], "hasMore": false }`.
760
+
761
+ ```bash
762
+ # One page, then the next
763
+ primitive users list --json --limit 50
764
+ primitive users list --json --limit 50 --cursor "$(primitive users list --json --limit 50 | jq -r .nextCursor)"
682
765
  ```
683
766
 
767
+ `primitive help --json` reports which flags a given `list` carries. The rules
768
+ themselves, and the guard that enforces them across the whole command manifest,
769
+ are in [`docs/cli-design.md`](../docs/cli-design.md).
770
+
684
771
  ### Stdout vs. stderr
685
772
 
686
773
  The CLI follows the same convention as `git`, `kubectl`, `aws`, and `gh`:
@@ -745,8 +832,8 @@ Shape (`schemaVersion: 1`):
745
832
  "name": "push",
746
833
  "description": "…",
747
834
  "aliases": [],
748
- "args": [ { "name": "app-id", "required": false, "variadic": false, "description": "…" } ],
749
- "options": [ { "flags": "--dir <path>", "description": "…", "required": true, "defaultValue": null, "hidden": false } ],
835
+ "args": [],
836
+ "options": [ { "flags": "--dry-run", "description": "…", "required": false, "defaultValue": null, "hidden": false } ],
750
837
  "commands": []
751
838
  }
752
839
  ]
@@ -816,17 +903,17 @@ Internal helpers (`collectParamRefs`, `declaredParamNames`,
816
903
 
817
904
  ## Environment Variables
818
905
 
819
- - `PRIMITIVE_SERVER_URL` - Server URL for login in legacy mode (defaults to `https://primitiveapi.com`)
906
+ - `PRIMITIVE_SERVER_URL` - Server URL for `login` outside a project (defaults to `https://primitiveapi.com`)
820
907
 
821
908
  **Login server resolution:**
822
- 1. Project mode (`.primitive/config.json` present): the active environment's
909
+ 1. Project mode (`primitive/config.json` present): the active environment's
823
910
  `apiUrl`. Select the environment with `-e <name>`, `PRIMITIVE_ENV`,
824
911
  `primitive env use <name>` (this machine's selection, stored in the
825
912
  gitignored `.primitive/local.json`), or the committed `defaultEnvironment`
826
913
  — in that order. An unresolvable environment fails loudly — `login`
827
914
  never silently falls back to production.
828
- 2. Legacy mode (no project config): `PRIMITIVE_SERVER_URL`, else the default
829
- `https://primitiveapi.com`.
915
+ 2. Outside a project (no project config): `PRIMITIVE_SERVER_URL`, else the
916
+ default `https://primitiveapi.com`.
830
917
 
831
918
  > `login` no longer accepts `-s/--server` (removed in a breaking change). Use
832
919
  > `-e <env>` in a project, or `PRIMITIVE_SERVER_URL` for local dev / scripts.
@@ -907,8 +994,11 @@ cli/tests/
907
994
  ### "Not logged in" error
908
995
  Run `primitive login` to authenticate.
909
996
 
910
- ### "No app specified" error
911
- Either pass an app ID as an argument, use `--app <id>`, or set context with `primitive use`.
997
+ ### "No primitive/config.json found" error
998
+ The command ran outside a Primitive project. Every app-scoped command reads its
999
+ server, app and configuration tree from the project's environment, so `cd` into
1000
+ the project (any subdirectory works) or create one with `primitive init`. There
1001
+ is no global fallback and no flag that points the command elsewhere.
912
1002
 
913
1003
  ### Token expired
914
1004
  The CLI automatically refreshes tokens. If issues persist, try `primitive logout` then `primitive login`.