primitive-admin 1.1.0-alpha.8 → 1.1.0-alpha.80

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 (522) hide show
  1. package/README.md +444 -106
  2. package/assets/skill/skills/primitive-platform/SKILL.md +811 -0
  3. package/dist/bin/primitive.d.ts +2 -0
  4. package/dist/bin/primitive.js +373 -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 +128 -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 +700 -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 +54 -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 +196 -105
  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 +84 -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 +465 -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 +163 -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 +171 -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 +1859 -238
  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 +2062 -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 +385 -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/functions.d.ts +20 -0
  64. package/dist/src/commands/functions.js +672 -0
  65. package/dist/src/commands/functions.js.map +1 -0
  66. package/dist/src/commands/group-type-configs.d.ts +2 -0
  67. package/dist/src/commands/group-type-configs.js +86 -0
  68. package/dist/src/commands/group-type-configs.js.map +1 -0
  69. package/dist/src/commands/groups.d.ts +2 -0
  70. package/dist/src/commands/groups.js +39 -108
  71. package/dist/src/commands/groups.js.map +1 -1
  72. package/dist/src/commands/guides.d.ts +223 -0
  73. package/dist/src/commands/guides.js +617 -65
  74. package/dist/src/commands/guides.js.map +1 -1
  75. package/dist/src/commands/init.d.ts +37 -0
  76. package/dist/src/commands/init.js +1693 -208
  77. package/dist/src/commands/init.js.map +1 -1
  78. package/dist/src/commands/integrations.d.ts +2 -0
  79. package/dist/src/commands/integrations.js +402 -182
  80. package/dist/src/commands/integrations.js.map +1 -1
  81. package/dist/src/commands/llm.d.ts +2 -0
  82. package/dist/src/commands/llm.js +13 -8
  83. package/dist/src/commands/llm.js.map +1 -1
  84. package/dist/src/commands/locks.d.ts +8 -0
  85. package/dist/src/commands/locks.js +160 -0
  86. package/dist/src/commands/locks.js.map +1 -0
  87. package/dist/src/commands/metadata-category-configs.d.ts +12 -0
  88. package/dist/src/commands/metadata-category-configs.js +112 -0
  89. package/dist/src/commands/metadata-category-configs.js.map +1 -0
  90. package/dist/src/commands/metadata.d.ts +2 -0
  91. package/dist/src/commands/metadata.js +281 -0
  92. package/dist/src/commands/metadata.js.map +1 -0
  93. package/dist/src/commands/prompts.d.ts +2 -0
  94. package/dist/src/commands/prompts.js +275 -621
  95. package/dist/src/commands/prompts.js.map +1 -1
  96. package/dist/src/commands/rule-sets.d.ts +3 -0
  97. package/dist/src/commands/rule-sets.js +137 -147
  98. package/dist/src/commands/rule-sets.js.map +1 -1
  99. package/dist/src/commands/scripts.d.ts +30 -0
  100. package/dist/src/commands/scripts.js +679 -0
  101. package/dist/src/commands/scripts.js.map +1 -0
  102. package/dist/src/commands/secrets.d.ts +2 -0
  103. package/dist/src/commands/secrets.js +108 -0
  104. package/dist/src/commands/secrets.js.map +1 -0
  105. package/dist/src/commands/sessions.d.ts +2 -0
  106. package/dist/src/commands/sessions.js +75 -0
  107. package/dist/src/commands/sessions.js.map +1 -0
  108. package/dist/src/commands/settings.d.ts +18 -0
  109. package/dist/src/commands/settings.js +54 -0
  110. package/dist/src/commands/settings.js.map +1 -0
  111. package/dist/src/commands/skill.d.ts +2 -0
  112. package/dist/src/commands/skill.js +29 -0
  113. package/dist/src/commands/skill.js.map +1 -0
  114. package/dist/src/commands/sync-app-settings.d.ts +158 -0
  115. package/dist/src/commands/sync-app-settings.js +328 -0
  116. package/dist/src/commands/sync-app-settings.js.map +1 -0
  117. package/dist/src/commands/sync.d.ts +2514 -0
  118. package/dist/src/commands/sync.js +16106 -848
  119. package/dist/src/commands/sync.js.map +1 -1
  120. package/dist/src/commands/tokens.d.ts +2 -0
  121. package/dist/src/commands/tokens.js +130 -21
  122. package/dist/src/commands/tokens.js.map +1 -1
  123. package/dist/src/commands/users.d.ts +2 -0
  124. package/dist/src/commands/users.js +532 -23
  125. package/dist/src/commands/users.js.map +1 -1
  126. package/dist/src/commands/vars.d.ts +8 -0
  127. package/dist/src/commands/vars.js +96 -0
  128. package/dist/src/commands/vars.js.map +1 -0
  129. package/dist/src/commands/waitlist.d.ts +2 -0
  130. package/dist/src/commands/waitlist.js +10 -10
  131. package/dist/src/commands/waitlist.js.map +1 -1
  132. package/dist/src/commands/webhooks.d.ts +2 -0
  133. package/dist/src/commands/webhooks.js +562 -0
  134. package/dist/src/commands/webhooks.js.map +1 -0
  135. package/dist/src/commands/workflows.d.ts +116 -0
  136. package/dist/src/commands/workflows.js +1638 -729
  137. package/dist/src/commands/workflows.js.map +1 -1
  138. package/dist/src/lib/access-rule-display.d.ts +21 -0
  139. package/dist/src/lib/access-rule-display.js +34 -0
  140. package/dist/src/lib/access-rule-display.js.map +1 -0
  141. package/dist/src/lib/api-client.d.ts +2147 -0
  142. package/dist/src/lib/api-client.js +2042 -160
  143. package/dist/src/lib/api-client.js.map +1 -1
  144. package/dist/src/lib/app-match-guard.d.ts +44 -0
  145. package/dist/src/lib/app-match-guard.js +72 -0
  146. package/dist/src/lib/app-match-guard.js.map +1 -0
  147. package/dist/src/lib/app-settings-descriptor.d.ts +263 -0
  148. package/dist/src/lib/app-settings-descriptor.js +584 -0
  149. package/dist/src/lib/app-settings-descriptor.js.map +1 -0
  150. package/dist/src/lib/auth-flow.d.ts +8 -0
  151. package/dist/src/lib/batch.d.ts +26 -0
  152. package/dist/src/lib/batch.js +32 -0
  153. package/dist/src/lib/batch.js.map +1 -0
  154. package/dist/src/lib/block-layout.d.ts +160 -0
  155. package/dist/src/lib/block-layout.js +451 -0
  156. package/dist/src/lib/block-layout.js.map +1 -0
  157. package/dist/src/lib/block-selector.d.ts +58 -0
  158. package/dist/src/lib/block-selector.js +92 -0
  159. package/dist/src/lib/block-selector.js.map +1 -0
  160. package/dist/src/lib/canonical-json.d.ts +12 -0
  161. package/dist/src/lib/canonical-json.js +35 -0
  162. package/dist/src/lib/canonical-json.js.map +1 -0
  163. package/dist/src/lib/channel.d.ts +30 -0
  164. package/dist/src/lib/channel.js +68 -0
  165. package/dist/src/lib/channel.js.map +1 -0
  166. package/dist/src/lib/cli-manifest.d.ts +68 -0
  167. package/dist/src/lib/cli-manifest.js +71 -0
  168. package/dist/src/lib/cli-manifest.js.map +1 -0
  169. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +101 -0
  170. package/dist/src/lib/codegen-shared/generatedFiles.js +191 -0
  171. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
  172. package/dist/src/lib/codegen-shared/prettierStable.d.ts +262 -0
  173. package/dist/src/lib/codegen-shared/prettierStable.js +610 -0
  174. package/dist/src/lib/codegen-shared/prettierStable.js.map +1 -0
  175. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +38 -0
  176. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +46 -0
  177. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
  178. package/dist/src/lib/config-json-field.d.ts +28 -0
  179. package/dist/src/lib/config-json-field.js +56 -0
  180. package/dist/src/lib/config-json-field.js.map +1 -0
  181. package/dist/src/lib/config-object-descriptor.d.ts +127 -0
  182. package/dist/src/lib/config-object-descriptor.js +696 -0
  183. package/dist/src/lib/config-object-descriptor.js.map +1 -0
  184. package/dist/src/lib/config-payload.d.ts +85 -0
  185. package/dist/src/lib/config-payload.js +116 -0
  186. package/dist/src/lib/config-payload.js.map +1 -0
  187. package/dist/src/lib/config-surface.d.ts +140 -0
  188. package/dist/src/lib/config-surface.js +317 -0
  189. package/dist/src/lib/config-surface.js.map +1 -0
  190. package/dist/src/lib/config-toml.d.ts +10 -0
  191. package/dist/src/lib/config-toml.js +42 -0
  192. package/dist/src/lib/config-toml.js.map +1 -0
  193. package/dist/src/lib/config.d.ts +71 -0
  194. package/dist/src/lib/config.js +71 -68
  195. package/dist/src/lib/config.js.map +1 -1
  196. package/dist/src/lib/confirm-prompt.d.ts +83 -0
  197. package/dist/src/lib/confirm-prompt.js +110 -0
  198. package/dist/src/lib/confirm-prompt.js.map +1 -0
  199. package/dist/src/lib/constants.d.ts +11 -0
  200. package/dist/src/lib/constants.js +12 -0
  201. package/dist/src/lib/constants.js.map +1 -0
  202. package/dist/src/lib/crash-handlers.d.ts +20 -0
  203. package/dist/src/lib/crash-handlers.js +49 -0
  204. package/dist/src/lib/crash-handlers.js.map +1 -0
  205. package/dist/src/lib/credentials-store.d.ts +104 -0
  206. package/dist/src/lib/credentials-store.js +336 -0
  207. package/dist/src/lib/credentials-store.js.map +1 -0
  208. package/dist/src/lib/csv.d.ts +47 -0
  209. package/dist/src/lib/csv.js +172 -0
  210. package/dist/src/lib/csv.js.map +1 -0
  211. package/dist/src/lib/data-input.d.ts +23 -0
  212. package/dist/src/lib/data-input.js +50 -0
  213. package/dist/src/lib/data-input.js.map +1 -0
  214. package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
  215. package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
  216. package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
  217. package/dist/src/lib/db-codegen/dbGenerator.d.ts +67 -0
  218. package/dist/src/lib/db-codegen/dbGenerator.js +170 -0
  219. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
  220. package/dist/src/lib/db-codegen/dbNaming.d.ts +87 -0
  221. package/dist/src/lib/db-codegen/dbNaming.js +180 -0
  222. package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
  223. package/dist/src/lib/db-codegen/dbTemplates.d.ts +272 -0
  224. package/dist/src/lib/db-codegen/dbTemplates.js +480 -0
  225. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
  226. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +73 -0
  227. package/dist/src/lib/db-codegen/dbTsTypes.js +139 -0
  228. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
  229. package/dist/src/lib/db-codegen/dbTypeIR.d.ts +146 -0
  230. package/dist/src/lib/db-codegen/dbTypeIR.js +517 -0
  231. package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -0
  232. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +112 -0
  233. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +211 -0
  234. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -0
  235. package/dist/src/lib/document-export-permissions.d.ts +30 -0
  236. package/dist/src/lib/document-export-permissions.js +54 -0
  237. package/dist/src/lib/document-export-permissions.js.map +1 -0
  238. package/dist/src/lib/env-resolver-core.d.ts +253 -0
  239. package/dist/src/lib/env-resolver-core.js +459 -0
  240. package/dist/src/lib/env-resolver-core.js.map +1 -0
  241. package/dist/src/lib/env-resolver.d.ts +99 -0
  242. package/dist/src/lib/env-resolver.js +153 -0
  243. package/dist/src/lib/env-resolver.js.map +1 -0
  244. package/dist/src/lib/fetch.d.ts +5 -0
  245. package/dist/src/lib/function-bundle.d.ts +141 -0
  246. package/dist/src/lib/function-bundle.js +333 -0
  247. package/dist/src/lib/function-bundle.js.map +1 -0
  248. package/dist/src/lib/function-collect.d.ts +123 -0
  249. package/dist/src/lib/function-collect.js +594 -0
  250. package/dist/src/lib/function-collect.js.map +1 -0
  251. package/dist/src/lib/function-db-types.d.ts +187 -0
  252. package/dist/src/lib/function-db-types.js +782 -0
  253. package/dist/src/lib/function-db-types.js.map +1 -0
  254. package/dist/src/lib/function-document-types.d.ts +50 -0
  255. package/dist/src/lib/function-document-types.js +163 -0
  256. package/dist/src/lib/function-document-types.js.map +1 -0
  257. package/dist/src/lib/function-grants-preflight.d.ts +64 -0
  258. package/dist/src/lib/function-grants-preflight.js +100 -0
  259. package/dist/src/lib/function-grants-preflight.js.map +1 -0
  260. package/dist/src/lib/function-log-tail.d.ts +83 -0
  261. package/dist/src/lib/function-log-tail.js +115 -0
  262. package/dist/src/lib/function-log-tail.js.map +1 -0
  263. package/dist/src/lib/function-schema-codegen.d.ts +118 -0
  264. package/dist/src/lib/function-schema-codegen.js +402 -0
  265. package/dist/src/lib/function-schema-codegen.js.map +1 -0
  266. package/dist/src/lib/function-sync.d.ts +263 -0
  267. package/dist/src/lib/function-sync.js +604 -0
  268. package/dist/src/lib/function-sync.js.map +1 -0
  269. package/dist/src/lib/function-triggers.d.ts +66 -0
  270. package/dist/src/lib/function-triggers.js +285 -0
  271. package/dist/src/lib/function-triggers.js.map +1 -0
  272. package/dist/src/lib/function-typecheck.d.ts +86 -0
  273. package/dist/src/lib/function-typecheck.js +370 -0
  274. package/dist/src/lib/function-typecheck.js.map +1 -0
  275. package/dist/src/lib/generated-allowlist.d.ts +28 -0
  276. package/dist/src/lib/generated-allowlist.js +281 -0
  277. package/dist/src/lib/generated-allowlist.js.map +1 -0
  278. package/dist/src/lib/generated-config-surfaces.d.ts +1445 -0
  279. package/dist/src/lib/generated-config-surfaces.js +5836 -0
  280. package/dist/src/lib/generated-config-surfaces.js.map +1 -0
  281. package/dist/src/lib/generated-sdk-types.d.ts +12 -0
  282. package/dist/src/lib/generated-sdk-types.js +13 -0
  283. package/dist/src/lib/generated-sdk-types.js.map +1 -0
  284. package/dist/src/lib/generated-template-lint.d.ts +212 -0
  285. package/dist/src/lib/generated-template-lint.js +624 -0
  286. package/dist/src/lib/generated-template-lint.js.map +1 -0
  287. package/dist/src/lib/generated-workflow-model-fields.d.ts +20 -0
  288. package/dist/src/lib/generated-workflow-model-fields.js +53 -0
  289. package/dist/src/lib/generated-workflow-model-fields.js.map +1 -0
  290. package/dist/src/lib/google-client-secret-status.d.ts +35 -0
  291. package/dist/src/lib/google-client-secret-status.js +56 -0
  292. package/dist/src/lib/google-client-secret-status.js.map +1 -0
  293. package/dist/src/lib/init-adopt.d.ts +16 -0
  294. package/dist/src/lib/init-adopt.js +34 -0
  295. package/dist/src/lib/init-adopt.js.map +1 -0
  296. package/dist/src/lib/init-assets.d.ts +39 -0
  297. package/dist/src/lib/init-assets.js +97 -0
  298. package/dist/src/lib/init-assets.js.map +1 -0
  299. package/dist/src/lib/init-client-platforms.d.ts +14 -0
  300. package/dist/src/lib/init-client-platforms.js +71 -0
  301. package/dist/src/lib/init-client-platforms.js.map +1 -0
  302. package/dist/src/lib/init-config.d.ts +98 -0
  303. package/dist/src/lib/init-config.js +186 -0
  304. package/dist/src/lib/init-config.js.map +1 -0
  305. package/dist/src/lib/init-email-redirect-uris.d.ts +37 -0
  306. package/dist/src/lib/init-email-redirect-uris.js +46 -0
  307. package/dist/src/lib/init-email-redirect-uris.js.map +1 -0
  308. package/dist/src/lib/init-ios-links.d.ts +91 -0
  309. package/dist/src/lib/init-ios-links.js +219 -0
  310. package/dist/src/lib/init-ios-links.js.map +1 -0
  311. package/dist/src/lib/init-plan.d.ts +80 -0
  312. package/dist/src/lib/init-plan.js +95 -0
  313. package/dist/src/lib/init-plan.js.map +1 -0
  314. package/dist/src/lib/init-production-env.d.ts +48 -0
  315. package/dist/src/lib/init-production-env.js +59 -0
  316. package/dist/src/lib/init-production-env.js.map +1 -0
  317. package/dist/src/lib/init-schema.d.ts +74 -0
  318. package/dist/src/lib/init-schema.js +358 -0
  319. package/dist/src/lib/init-schema.js.map +1 -0
  320. package/dist/src/lib/init-xcode.d.ts +34 -0
  321. package/dist/src/lib/init-xcode.js +138 -0
  322. package/dist/src/lib/init-xcode.js.map +1 -0
  323. package/dist/src/lib/integration-request-config.d.ts +30 -0
  324. package/dist/src/lib/integration-request-config.js +145 -0
  325. package/dist/src/lib/integration-request-config.js.map +1 -0
  326. package/dist/src/lib/integration-selector.d.ts +42 -0
  327. package/dist/src/lib/integration-selector.js +46 -0
  328. package/dist/src/lib/integration-selector.js.map +1 -0
  329. package/dist/src/lib/ios-app-id.d.ts +34 -0
  330. package/dist/src/lib/ios-app-id.js +69 -0
  331. package/dist/src/lib/ios-app-id.js.map +1 -0
  332. package/dist/src/lib/local-state.d.ts +55 -0
  333. package/dist/src/lib/local-state.js +167 -0
  334. package/dist/src/lib/local-state.js.map +1 -0
  335. package/dist/src/lib/local-test-cases.d.ts +63 -0
  336. package/dist/src/lib/local-test-cases.js +136 -0
  337. package/dist/src/lib/local-test-cases.js.map +1 -0
  338. package/dist/src/lib/log-inspection.d.ts +680 -0
  339. package/dist/src/lib/log-inspection.js +784 -0
  340. package/dist/src/lib/log-inspection.js.map +1 -0
  341. package/dist/src/lib/migration-nag.d.ts +49 -0
  342. package/dist/src/lib/migration-nag.js +164 -0
  343. package/dist/src/lib/migration-nag.js.map +1 -0
  344. package/dist/src/lib/object-status-filter.d.ts +22 -0
  345. package/dist/src/lib/object-status-filter.js +45 -0
  346. package/dist/src/lib/object-status-filter.js.map +1 -0
  347. package/dist/src/lib/output.d.ts +109 -0
  348. package/dist/src/lib/output.js +191 -8
  349. package/dist/src/lib/output.js.map +1 -1
  350. package/dist/src/lib/package-manager.d.ts +140 -0
  351. package/dist/src/lib/package-manager.js +305 -0
  352. package/dist/src/lib/package-manager.js.map +1 -0
  353. package/dist/src/lib/paginate.d.ts +83 -0
  354. package/dist/src/lib/paginate.js +95 -0
  355. package/dist/src/lib/paginate.js.map +1 -0
  356. package/dist/src/lib/platform-owned.d.ts +63 -0
  357. package/dist/src/lib/platform-owned.js +85 -0
  358. package/dist/src/lib/platform-owned.js.map +1 -0
  359. package/dist/src/lib/project-config.d.ts +122 -0
  360. package/dist/src/lib/project-config.js +244 -0
  361. package/dist/src/lib/project-config.js.map +1 -0
  362. package/dist/src/lib/query-operators.d.ts +43 -0
  363. package/dist/src/lib/query-operators.js +80 -0
  364. package/dist/src/lib/query-operators.js.map +1 -0
  365. package/dist/src/lib/record-filter.d.ts +18 -0
  366. package/dist/src/lib/record-filter.js +55 -0
  367. package/dist/src/lib/record-filter.js.map +1 -0
  368. package/dist/src/lib/refresh-admin-credentials.d.ts +65 -0
  369. package/dist/src/lib/refresh-admin-credentials.js +103 -0
  370. package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
  371. package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
  372. package/dist/src/lib/resolve-init-dev-port.js +55 -0
  373. package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
  374. package/dist/src/lib/resolve-init-server.d.ts +64 -0
  375. package/dist/src/lib/resolve-init-server.js +77 -0
  376. package/dist/src/lib/resolve-init-server.js.map +1 -0
  377. package/dist/src/lib/resolve-platform.d.ts +74 -0
  378. package/dist/src/lib/resolve-platform.js +105 -0
  379. package/dist/src/lib/resolve-platform.js.map +1 -0
  380. package/dist/src/lib/run-status.d.ts +19 -0
  381. package/dist/src/lib/run-status.generated.d.ts +39 -0
  382. package/dist/src/lib/run-status.generated.js +66 -0
  383. package/dist/src/lib/run-status.generated.js.map +1 -0
  384. package/dist/src/lib/run-status.js +19 -0
  385. package/dist/src/lib/run-status.js.map +1 -0
  386. package/dist/src/lib/server-text-normalization.d.ts +51 -0
  387. package/dist/src/lib/server-text-normalization.js +90 -0
  388. package/dist/src/lib/server-text-normalization.js.map +1 -0
  389. package/dist/src/lib/server-url.d.ts +22 -0
  390. package/dist/src/lib/server-url.js +33 -0
  391. package/dist/src/lib/server-url.js.map +1 -0
  392. package/dist/src/lib/signing-secret-status.d.ts +81 -0
  393. package/dist/src/lib/signing-secret-status.js +116 -0
  394. package/dist/src/lib/signing-secret-status.js.map +1 -0
  395. package/dist/src/lib/skill-installer.d.ts +25 -0
  396. package/dist/src/lib/skill-installer.js +266 -0
  397. package/dist/src/lib/skill-installer.js.map +1 -0
  398. package/dist/src/lib/snapshots.d.ts +98 -0
  399. package/dist/src/lib/snapshots.js +294 -0
  400. package/dist/src/lib/snapshots.js.map +1 -0
  401. package/dist/src/lib/swift-codegen/dbGenerator.d.ts +113 -0
  402. package/dist/src/lib/swift-codegen/dbGenerator.js +914 -0
  403. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
  404. package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
  405. package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
  406. package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
  407. package/dist/src/lib/swift-codegen/generator.d.ts +94 -0
  408. package/dist/src/lib/swift-codegen/generator.js +440 -0
  409. package/dist/src/lib/swift-codegen/generator.js.map +1 -0
  410. package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +72 -0
  411. package/dist/src/lib/swift-codegen/schemaToSwift.js +644 -0
  412. package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
  413. package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +94 -0
  414. package/dist/src/lib/swift-codegen/siblingSymbols.js +155 -0
  415. package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -0
  416. package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
  417. package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
  418. package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
  419. package/dist/src/lib/sync-dir-selector.d.ts +21 -0
  420. package/dist/src/lib/sync-dir-selector.js +30 -0
  421. package/dist/src/lib/sync-dir-selector.js.map +1 -0
  422. package/dist/src/lib/sync-paths.d.ts +123 -0
  423. package/dist/src/lib/sync-paths.js +193 -0
  424. package/dist/src/lib/sync-paths.js.map +1 -0
  425. package/dist/src/lib/sync-resource-types.d.ts +563 -0
  426. package/dist/src/lib/sync-resource-types.js +1073 -0
  427. package/dist/src/lib/sync-resource-types.js.map +1 -0
  428. package/dist/src/lib/sync-selectors.d.ts +95 -0
  429. package/dist/src/lib/sync-selectors.js +228 -0
  430. package/dist/src/lib/sync-selectors.js.map +1 -0
  431. package/dist/src/lib/template.d.ts +170 -0
  432. package/dist/src/lib/template.js +484 -68
  433. package/dist/src/lib/template.js.map +1 -1
  434. package/dist/src/lib/test-case-file-names.d.ts +40 -0
  435. package/dist/src/lib/test-case-file-names.js +91 -0
  436. package/dist/src/lib/test-case-file-names.js.map +1 -0
  437. package/dist/src/lib/test-case-keys.d.ts +29 -0
  438. package/dist/src/lib/test-case-keys.js +55 -0
  439. package/dist/src/lib/test-case-keys.js.map +1 -0
  440. package/dist/src/lib/test-case-variables.d.ts +29 -0
  441. package/dist/src/lib/test-case-variables.js +71 -0
  442. package/dist/src/lib/test-case-variables.js.map +1 -0
  443. package/dist/src/lib/token-inject.d.ts +56 -0
  444. package/dist/src/lib/token-inject.js +204 -0
  445. package/dist/src/lib/token-inject.js.map +1 -0
  446. package/dist/src/lib/toml-database-config.d.ts +123 -0
  447. package/dist/src/lib/toml-database-config.js +544 -0
  448. package/dist/src/lib/toml-database-config.js.map +1 -0
  449. package/dist/src/lib/toml-metadata-config.d.ts +151 -0
  450. package/dist/src/lib/toml-metadata-config.js +476 -0
  451. package/dist/src/lib/toml-metadata-config.js.map +1 -0
  452. package/dist/src/lib/toml-native-form.d.ts +46 -0
  453. package/dist/src/lib/toml-native-form.js +78 -0
  454. package/dist/src/lib/toml-native-form.js.map +1 -0
  455. package/dist/src/lib/toml-params-validator.d.ts +129 -0
  456. package/dist/src/lib/toml-params-validator.js +298 -0
  457. package/dist/src/lib/toml-params-validator.js.map +1 -0
  458. package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
  459. package/dist/src/lib/toml-scalar-edit.js +283 -0
  460. package/dist/src/lib/toml-scalar-edit.js.map +1 -0
  461. package/dist/src/lib/user-selector.d.ts +24 -0
  462. package/dist/src/lib/user-selector.js +33 -0
  463. package/dist/src/lib/user-selector.js.map +1 -0
  464. package/dist/src/lib/version-check.d.ts +35 -0
  465. package/dist/src/lib/version-check.js +241 -0
  466. package/dist/src/lib/version-check.js.map +1 -0
  467. package/dist/src/lib/watch.d.ts +121 -0
  468. package/dist/src/lib/watch.js +169 -0
  469. package/dist/src/lib/watch.js.map +1 -0
  470. package/dist/src/lib/web-url.d.ts +40 -0
  471. package/dist/src/lib/web-url.js +76 -0
  472. package/dist/src/lib/web-url.js.map +1 -0
  473. package/dist/src/lib/workflow-apply.d.ts +110 -0
  474. package/dist/src/lib/workflow-apply.js +164 -0
  475. package/dist/src/lib/workflow-apply.js.map +1 -0
  476. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
  477. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
  478. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
  479. package/dist/src/lib/workflow-codegen/generator.d.ts +96 -0
  480. package/dist/src/lib/workflow-codegen/generator.js +361 -0
  481. package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
  482. package/dist/src/lib/workflow-codegen/invokerIR.d.ts +94 -0
  483. package/dist/src/lib/workflow-codegen/invokerIR.js +76 -0
  484. package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
  485. package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
  486. package/dist/src/lib/workflow-codegen/naming.js +81 -0
  487. package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
  488. package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +80 -0
  489. package/dist/src/lib/workflow-codegen/schemaToTs.js +303 -0
  490. package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
  491. package/dist/src/lib/workflow-config-apply.d.ts +70 -0
  492. package/dist/src/lib/workflow-config-apply.js +137 -0
  493. package/dist/src/lib/workflow-config-apply.js.map +1 -0
  494. package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
  495. package/dist/src/lib/workflow-config-sidecar.js +96 -0
  496. package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
  497. package/dist/src/lib/workflow-defaults.d.ts +29 -0
  498. package/dist/src/lib/workflow-defaults.js +41 -0
  499. package/dist/src/lib/workflow-defaults.js.map +1 -0
  500. package/dist/src/lib/workflow-field-descriptor.d.ts +91 -0
  501. package/dist/src/lib/workflow-field-descriptor.js +153 -0
  502. package/dist/src/lib/workflow-field-descriptor.js.map +1 -0
  503. package/dist/src/lib/workflow-fragments.d.ts +64 -0
  504. package/dist/src/lib/workflow-fragments.js +342 -0
  505. package/dist/src/lib/workflow-fragments.js.map +1 -0
  506. package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
  507. package/dist/src/lib/workflow-include-preserve.js +286 -0
  508. package/dist/src/lib/workflow-include-preserve.js.map +1 -0
  509. package/dist/src/lib/workflow-payload.d.ts +98 -0
  510. package/dist/src/lib/workflow-payload.js +178 -0
  511. package/dist/src/lib/workflow-payload.js.map +1 -0
  512. package/dist/src/lib/workflow-toml-validator.d.ts +207 -0
  513. package/dist/src/lib/workflow-toml-validator.js +762 -0
  514. package/dist/src/lib/workflow-toml-validator.js.map +1 -0
  515. package/dist/src/lib/workflow-usage.d.ts +198 -0
  516. package/dist/src/lib/workflow-usage.js +312 -0
  517. package/dist/src/lib/workflow-usage.js.map +1 -0
  518. package/dist/src/types/index.d.ts +591 -0
  519. package/dist/src/validators.d.ts +65 -0
  520. package/dist/src/validators.js +64 -0
  521. package/dist/src/validators.js.map +1 -0
  522. package/package.json +34 -9
@@ -0,0 +1,145 @@
1
+ /**
2
+ * The CLI's mirror of the server's integration `requestConfig` normalization
3
+ * (issue #2880, DSO-003).
4
+ *
5
+ * `normalizeIntegrationRequestConfig` (`src/services/integration-utils.ts`)
6
+ * rewrites an accepted request config on the way in: the base URL gains a
7
+ * single trailing slash, methods are upper-cased and de-duplicated, header and
8
+ * query lists are trimmed, and the optional keys are materialized. So the state
9
+ * the server RETURNS is not the text a hand-authored file holds — and comparing
10
+ * the two raw makes an authored integration read `local-edited` on every run,
11
+ * with push re-applying the same update forever. Baseline restamping cannot
12
+ * save it: after an apply the remote hash equals the fresh baseline while the
13
+ * local hash still does not.
14
+ *
15
+ * Mirrored rather than imported: the published CLI must not import server
16
+ * `src/` at runtime (the same rule the vendored config surfaces follow). The
17
+ * acceptance fixture pinning this mirror is the tripwire if the server's rule
18
+ * moves — a disagreement then shows as an ordinary `Modified` row, never a
19
+ * crash, which is why every step here is total: an input the server would
20
+ * REJECT (a missing base URL, a bogus method) is left exactly as authored so
21
+ * the server's own error is what the operator sees.
22
+ */
23
+ /** Trim, drop empties, optionally re-case, and de-duplicate. */
24
+ function normalizeStringList(value, { lowercase = false, uppercase = false } = {}) {
25
+ if (!Array.isArray(value))
26
+ return [];
27
+ const out = [];
28
+ for (const item of value) {
29
+ if (typeof item !== "string")
30
+ continue;
31
+ let normalized = item.trim();
32
+ if (!normalized)
33
+ continue;
34
+ if (lowercase)
35
+ normalized = normalized.toLowerCase();
36
+ if (uppercase)
37
+ normalized = normalized.toUpperCase();
38
+ out.push(normalized);
39
+ }
40
+ return [...new Set(out)];
41
+ }
42
+ /** `https://host/v1///` → `https://host/v1/`; anything else stays as authored. */
43
+ function canonicalBaseUrl(raw) {
44
+ if (typeof raw !== "string")
45
+ return raw;
46
+ const base = raw.trim();
47
+ if (!(base.startsWith("http://") ||
48
+ base.startsWith("https://") ||
49
+ base.startsWith("test://"))) {
50
+ // The server rejects this; leaving it alone keeps the rejection the
51
+ // server's to make and the difference visible in the meantime.
52
+ return base;
53
+ }
54
+ return `${base.replace(/\/+$/, "")}/`;
55
+ }
56
+ /**
57
+ * The request config as the server would store it, from what the file says.
58
+ *
59
+ * Applied to BOTH sides of the comparison (the remote side reaches it through
60
+ * the same projection), which is safe because the server's own output is
61
+ * already canonical and this is idempotent.
62
+ */
63
+ export function canonicalizeIntegrationRequestConfig(input) {
64
+ if (!input || typeof input !== "object" || Array.isArray(input))
65
+ return input;
66
+ const raw = input;
67
+ const allowedMethods = normalizeStringList(raw.allowedMethods, {
68
+ uppercase: true,
69
+ });
70
+ const defaultMethod = raw.defaultMethod
71
+ ? String(raw.defaultMethod).toUpperCase()
72
+ : allowedMethods[0] || "GET";
73
+ const methods = allowedMethods.length > 0 ? allowedMethods : ["GET"];
74
+ if (!methods.includes(defaultMethod))
75
+ methods.push(defaultMethod);
76
+ const allowedPaths = normalizeStringList(raw.allowedPaths).map((path) => path === "*" ? "/*" : path);
77
+ const defaultHeaders = {};
78
+ if (raw.defaultHeaders && typeof raw.defaultHeaders === "object") {
79
+ for (const [key, value] of Object.entries(raw.defaultHeaders)) {
80
+ if (!key)
81
+ continue;
82
+ defaultHeaders[key] = value == null ? "" : String(value);
83
+ }
84
+ }
85
+ const staticQuery = {};
86
+ if (raw.staticQuery && typeof raw.staticQuery === "object") {
87
+ for (const [key, value] of Object.entries(raw.staticQuery)) {
88
+ if (!key)
89
+ continue;
90
+ if (typeof value === "string" ||
91
+ typeof value === "number" ||
92
+ typeof value === "boolean") {
93
+ staticQuery[key] = value;
94
+ }
95
+ }
96
+ }
97
+ const validBodyModes = ["json", "raw", "multipart"];
98
+ const bodyMode = validBodyModes.includes(raw.bodyMode)
99
+ ? raw.bodyMode
100
+ : undefined;
101
+ let multipartFieldMapping;
102
+ if (Array.isArray(raw.multipartFieldMapping)) {
103
+ multipartFieldMapping = raw.multipartFieldMapping
104
+ .filter((f) => f &&
105
+ typeof f === "object" &&
106
+ typeof f.fieldName === "string" &&
107
+ (f.type === "attachment" || f.type === "value"))
108
+ .map((f) => ({
109
+ fieldName: f.fieldName,
110
+ type: f.type,
111
+ ...(f.attachmentIndex !== undefined && {
112
+ attachmentIndex: f.attachmentIndex,
113
+ }),
114
+ ...(f.attachmentName !== undefined && {
115
+ attachmentName: f.attachmentName,
116
+ }),
117
+ ...(f.value !== undefined && { value: f.value }),
118
+ }));
119
+ if (multipartFieldMapping.length === 0)
120
+ multipartFieldMapping = undefined;
121
+ }
122
+ return {
123
+ baseUrl: canonicalBaseUrl(raw.baseUrl),
124
+ allowedMethods: methods,
125
+ allowedPaths: allowedPaths.length > 0 ? allowedPaths : ["/*"],
126
+ defaultMethod,
127
+ defaultHeaders,
128
+ forwardHeaders: normalizeStringList(raw.forwardHeaders, {
129
+ lowercase: true,
130
+ }),
131
+ staticQuery,
132
+ forwardQueryParams: normalizeStringList(raw.forwardQueryParams, {
133
+ lowercase: true,
134
+ }),
135
+ // The server stores `true` unless the value is exactly `false`.
136
+ responsePassthrough: raw.responsePassthrough === false ? false : true,
137
+ ...(raw.exampleQuery && typeof raw.exampleQuery === "object"
138
+ ? { exampleQuery: raw.exampleQuery }
139
+ : {}),
140
+ ...(raw.exampleBody !== undefined ? { exampleBody: raw.exampleBody } : {}),
141
+ ...(bodyMode ? { bodyMode } : {}),
142
+ ...(multipartFieldMapping ? { multipartFieldMapping } : {}),
143
+ };
144
+ }
145
+ //# sourceMappingURL=integration-request-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-request-config.js","sourceRoot":"","sources":["../../../src/lib/integration-request-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Resolve the identifier the `integrations tests` verbs take (issue #3000).
3
+ *
4
+ * The block-testing endpoints key on the composite `integration#<blockId>` and
5
+ * never check that the block exists, so an identifier that names no
6
+ * integration came back as an empty page rather than a 404: `tests list`
7
+ * printed "No test cases found." and `tests run-all` printed
8
+ * `Total Tests: 0 / Failed: 0` and exited 0. That is success-shaped in CI and
9
+ * indistinguishable from an integration that genuinely has no cases, so a
10
+ * typo, an integration KEY, or an ID from another app all read as "nothing to
11
+ * run".
12
+ *
13
+ * Resolving here — against the app's own integration list — is what makes
14
+ * `Total Tests: 0` mean "this integration exists and has no cases". The list
15
+ * is the one call that can answer both halves: it maps a key to its ID (keys
16
+ * are stored lowercased, so the match is case-insensitive) and it proves the
17
+ * identifier belongs to THIS app. Archived integrations are included, because
18
+ * their cases stay inspectable.
19
+ */
20
+ export interface ResolvedIntegration {
21
+ integrationId: string;
22
+ /** The integration's key, when the summary carries one. */
23
+ integrationKey?: string;
24
+ }
25
+ /** The one method this resolver needs from `ApiClient`. */
26
+ export interface IntegrationLister {
27
+ listIntegrations(appId: string, params?: {
28
+ status?: string;
29
+ cursor?: string;
30
+ limit?: number;
31
+ }): Promise<{
32
+ items: any[];
33
+ nextCursor?: string | null;
34
+ }>;
35
+ }
36
+ /**
37
+ * Map an integration ID or key to its integration ID.
38
+ *
39
+ * Throws — naming the identifier — when nothing in the app matches, so the
40
+ * caller's existing catch prints the message and exits non-zero.
41
+ */
42
+ export declare function resolveIntegrationSelector(client: IntegrationLister, appId: string, selector: string): Promise<ResolvedIntegration>;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Resolve the identifier the `integrations tests` verbs take (issue #3000).
3
+ *
4
+ * The block-testing endpoints key on the composite `integration#<blockId>` and
5
+ * never check that the block exists, so an identifier that names no
6
+ * integration came back as an empty page rather than a 404: `tests list`
7
+ * printed "No test cases found." and `tests run-all` printed
8
+ * `Total Tests: 0 / Failed: 0` and exited 0. That is success-shaped in CI and
9
+ * indistinguishable from an integration that genuinely has no cases, so a
10
+ * typo, an integration KEY, or an ID from another app all read as "nothing to
11
+ * run".
12
+ *
13
+ * Resolving here — against the app's own integration list — is what makes
14
+ * `Total Tests: 0` mean "this integration exists and has no cases". The list
15
+ * is the one call that can answer both halves: it maps a key to its ID (keys
16
+ * are stored lowercased, so the match is case-insensitive) and it proves the
17
+ * identifier belongs to THIS app. Archived integrations are included, because
18
+ * their cases stay inspectable.
19
+ */
20
+ import { paginateAll } from "./paginate.js";
21
+ /**
22
+ * Map an integration ID or key to its integration ID.
23
+ *
24
+ * Throws — naming the identifier — when nothing in the app matches, so the
25
+ * caller's existing catch prints the message and exits non-zero.
26
+ */
27
+ export async function resolveIntegrationSelector(client, appId, selector) {
28
+ const identifier = (selector ?? "").trim();
29
+ if (!identifier) {
30
+ throw new Error("An integration ID or key is required.");
31
+ }
32
+ const items = await paginateAll((cursor) => client.listIntegrations(appId, cursor ? { cursor } : {}));
33
+ const lowered = identifier.toLowerCase();
34
+ const match = items.find((item) => item?.integrationId === identifier) ??
35
+ items.find((item) => typeof item?.integrationKey === "string" &&
36
+ item.integrationKey.toLowerCase() === lowered);
37
+ if (!match) {
38
+ throw new Error(`No integration '${identifier}' in app ${appId}. ` +
39
+ `Pass an integration key or ID from 'primitive integrations list'.`);
40
+ }
41
+ return {
42
+ integrationId: match.integrationId ?? identifier,
43
+ ...(match.integrationKey ? { integrationKey: match.integrationKey } : {}),
44
+ };
45
+ }
46
+ //# sourceMappingURL=integration-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-selector.js","sourceRoot":"","sources":["../../../src/lib/integration-selector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAgB5C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAyB,EACzB,KAAa,EACb,QAAgB;IAEhB,MAAM,UAAU,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,WAAW,CAAM,CAAC,MAAM,EAAE,EAAE,CAC9C,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACzD,CAAC;IAEF,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,KAAK,GACT,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,UAAU,CAAC;QACxD,KAAK,CAAC,IAAI,CACR,CAAC,IAAI,EAAE,EAAE,CACP,OAAO,IAAI,EAAE,cAAc,KAAK,QAAQ;YACxC,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,KAAK,OAAO,CAChD,CAAC;IAEJ,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,mBAAmB,UAAU,YAAY,KAAK,IAAI;YAChD,mEAAmE,CACtE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,UAAU;QAChD,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The iOS client's Apple app identifier, per environment (#3081).
3
+ *
4
+ * Apple matches an association document against
5
+ * `<Application Identifier Prefix>.<Bundle Identifier>` — the prefix is ten
6
+ * alphanumerics, and it is USUALLY the Team ID but a legacy app's can differ
7
+ * (TN2311). Every message below therefore says "Application Identifier Prefix"
8
+ * and points at the signed app's `application-identifier` entitlement: a
9
+ * well-formed identifier with the wrong prefix produces a document that PARSES,
10
+ * so Apple caches it and both universal links and passkeys fail with nothing to
11
+ * read.
12
+ *
13
+ * One value per environment, because an app with alpha and production has one
14
+ * bundle id each. It is declared beside `webUrl` (#2982) — that pair is one
15
+ * cross-client link, the origin and the app it vouches for — and the Vue
16
+ * template's `scripts/deploy.mjs` generates the association document from it at
17
+ * deploy time.
18
+ *
19
+ * Returns the `string | true` shape `@inquirer/prompts` expects, like
20
+ * `validateWebUrl`, so the same function backs the flag check, the project
21
+ * config's field validation and any future prompt. `deploy.mjs` duplicates the
22
+ * shape rule (it is self-contained, node builtins only) but not these messages.
23
+ */
24
+ /**
25
+ * Validates an Apple app identifier. Returns `true` when valid, otherwise the
26
+ * message to show the user.
27
+ */
28
+ export declare function validateIosAppId(value: string): string | true;
29
+ /**
30
+ * The stored form of an already-validated identifier: trimmed, and otherwise
31
+ * byte-for-byte what Apple matches. Case is NOT folded — a bundle id is
32
+ * case-sensitive to Apple, and the prefix is uppercase already.
33
+ */
34
+ export declare function normalizeIosAppId(value: string): string;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * The iOS client's Apple app identifier, per environment (#3081).
3
+ *
4
+ * Apple matches an association document against
5
+ * `<Application Identifier Prefix>.<Bundle Identifier>` — the prefix is ten
6
+ * alphanumerics, and it is USUALLY the Team ID but a legacy app's can differ
7
+ * (TN2311). Every message below therefore says "Application Identifier Prefix"
8
+ * and points at the signed app's `application-identifier` entitlement: a
9
+ * well-formed identifier with the wrong prefix produces a document that PARSES,
10
+ * so Apple caches it and both universal links and passkeys fail with nothing to
11
+ * read.
12
+ *
13
+ * One value per environment, because an app with alpha and production has one
14
+ * bundle id each. It is declared beside `webUrl` (#2982) — that pair is one
15
+ * cross-client link, the origin and the app it vouches for — and the Vue
16
+ * template's `scripts/deploy.mjs` generates the association document from it at
17
+ * deploy time.
18
+ *
19
+ * Returns the `string | true` shape `@inquirer/prompts` expects, like
20
+ * `validateWebUrl`, so the same function backs the flag check, the project
21
+ * config's field validation and any future prompt. `deploy.mjs` duplicates the
22
+ * shape rule (it is self-contained, node builtins only) but not these messages.
23
+ */
24
+ /** The example every message ends with, so a rejection is actionable. */
25
+ const SHAPE = "e.g. ABCDE12345.com.example.app";
26
+ /** Where the authoritative value is, when the Team ID is not the prefix. */
27
+ const VERIFY = "verify it against the signed app's application-identifier entitlement";
28
+ /** `<Application Identifier Prefix>.<Bundle Identifier>`, after trimming. */
29
+ const IOS_APP_ID = /^[A-Z0-9]{10}\.[A-Za-z0-9.-]+$/;
30
+ /** The placeholder the template's `.example` document ships with. */
31
+ const PLACEHOLDER_PREFIX = "TEAMID";
32
+ /**
33
+ * Validates an Apple app identifier. Returns `true` when valid, otherwise the
34
+ * message to show the user.
35
+ */
36
+ export function validateIosAppId(value) {
37
+ if (typeof value !== "string" || !value.trim()) {
38
+ return `iOS app id cannot be empty — ${SHAPE}`;
39
+ }
40
+ const trimmed = value.trim();
41
+ const dot = trimmed.indexOf(".");
42
+ if (dot === -1) {
43
+ return `iOS app id must be <Application Identifier Prefix>.<bundle id> — ${SHAPE}`;
44
+ }
45
+ const prefix = trimmed.slice(0, dot);
46
+ const bundleId = trimmed.slice(dot + 1);
47
+ if (prefix === PLACEHOLDER_PREFIX || bundleId === "BUNDLEID") {
48
+ return `iOS app id is still the "${PLACEHOLDER_PREFIX}.BUNDLEID" placeholder — replace it with this environment's Application Identifier Prefix (usually your Team ID; ${VERIFY}) and the iOS client's bundle id (${SHAPE})`;
49
+ }
50
+ if (!/^[A-Z0-9]{10}$/.test(prefix)) {
51
+ return `iOS app id must start with the 10-character Application Identifier Prefix (usually your Team ID; ${VERIFY}), not "${prefix}" — ${SHAPE}`;
52
+ }
53
+ if (!bundleId) {
54
+ return `iOS app id has no bundle id after the Application Identifier Prefix — ${SHAPE}`;
55
+ }
56
+ if (!IOS_APP_ID.test(trimmed)) {
57
+ return `iOS app id's bundle id may only contain letters, digits, dots and dashes — ${SHAPE}`;
58
+ }
59
+ return true;
60
+ }
61
+ /**
62
+ * The stored form of an already-validated identifier: trimmed, and otherwise
63
+ * byte-for-byte what Apple matches. Case is NOT folded — a bundle id is
64
+ * case-sensitive to Apple, and the prefix is uppercase already.
65
+ */
66
+ export function normalizeIosAppId(value) {
67
+ return value.trim();
68
+ }
69
+ //# sourceMappingURL=ios-app-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios-app-id.js","sourceRoot":"","sources":["../../../src/lib/ios-app-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,yEAAyE;AACzE,MAAM,KAAK,GAAG,iCAAiC,CAAC;AAEhD,4EAA4E;AAC5E,MAAM,MAAM,GACV,uEAAuE,CAAC;AAE1E,6EAA6E;AAC7E,MAAM,UAAU,GAAG,gCAAgC,CAAC;AAEpD,qEAAqE;AACrE,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,OAAO,gCAAgC,KAAK,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,OAAO,oEAAoE,KAAK,EAAE,CAAC;IACrF,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACxC,IAAI,MAAM,KAAK,kBAAkB,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC7D,OAAO,4BAA4B,kBAAkB,oHAAoH,MAAM,qCAAqC,KAAK,GAAG,CAAC;IAC/N,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,OAAO,oGAAoG,MAAM,WAAW,MAAM,OAAO,KAAK,EAAE,CAAC;IACnJ,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,yEAAyE,KAAK,EAAE,CAAC;IAC1F,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,8EAA8E,KAAK,EAAE,CAAC;IAC/F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Per-machine Primitive state: `.primitive/local.json` (#2873).
3
+ *
4
+ * `primitive env use` records which environment THIS machine is pointed at.
5
+ * That is not a team decision, so it must not land in the committed
6
+ * `primitive/config.json` — `defaultEnvironment` stays the team default a
7
+ * fresh clone resolves. The file sits beside `credentials.json`, which has the
8
+ * same "local, never committed" property.
9
+ *
10
+ * Reads go through the shared core (`env-resolver-core.ts`) so every reader —
11
+ * CLI, Vite plugin, Swift script — agrees; this module owns the writes and the
12
+ * ignore coverage that keeps the file out of `git status`.
13
+ */
14
+ import { localStatePathForConfigPath, readLocalSelection } from "./env-resolver-core.js";
15
+ export { localStatePathForConfigPath, readLocalSelection };
16
+ /**
17
+ * Writes this machine's environment selection. Returns the path written so
18
+ * callers can name it in their success message.
19
+ */
20
+ export declare function writeLocalSelection(configPath: string, name: string): string;
21
+ /**
22
+ * Clears the selection if (and only if) it names `name`. Used by `env remove`
23
+ * so removing the selected environment can't leave a dangling selection that
24
+ * makes every later command fail.
25
+ */
26
+ export declare function clearLocalSelection(configPath: string, name: string): boolean;
27
+ export interface IgnoreCoverageOutcome {
28
+ /**
29
+ * - `not-a-repo` — nothing to do; the file cannot show up in a diff.
30
+ * - `already-ignored`— a committed .gitignore (or an earlier exclude) covers it.
31
+ * - `excluded` — we appended a pattern to the repo's info/exclude file.
32
+ * - `failed` — git was unavailable or the write failed; caller warns.
33
+ */
34
+ status: "not-a-repo" | "already-ignored" | "excluded" | "failed";
35
+ /** The exclude file written, for `excluded`. */
36
+ excludePath?: string;
37
+ /** The pattern written, for `excluded`. */
38
+ pattern?: string;
39
+ /** Why, for `failed`. */
40
+ detail?: string;
41
+ }
42
+ /**
43
+ * Makes sure `.primitive/local.json` is ignored before it is written.
44
+ *
45
+ * Templates scaffolded from now on carry the entry in their `.gitignore`, but
46
+ * projects created before this change do not — and `env use` writing an
47
+ * untracked-but-committable file would be exactly the "switching backends
48
+ * dirties the repo" problem this replaced. When the file is not already
49
+ * covered we append an anchored pattern to the repository's exclude file,
50
+ * resolved via `git rev-parse --git-path info/exclude` so a linked worktree
51
+ * (where `.git` is a FILE) works, and anchored relative to
52
+ * `git rev-parse --show-toplevel` so a project root nested below the worktree
53
+ * root is not mis-rooted.
54
+ */
55
+ export declare function ensureLocalStateIgnored(localStatePath: string): IgnoreCoverageOutcome;
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Per-machine Primitive state: `.primitive/local.json` (#2873).
3
+ *
4
+ * `primitive env use` records which environment THIS machine is pointed at.
5
+ * That is not a team decision, so it must not land in the committed
6
+ * `primitive/config.json` — `defaultEnvironment` stays the team default a
7
+ * fresh clone resolves. The file sits beside `credentials.json`, which has the
8
+ * same "local, never committed" property.
9
+ *
10
+ * Reads go through the shared core (`env-resolver-core.ts`) so every reader —
11
+ * CLI, Vite plugin, Swift script — agrees; this module owns the writes and the
12
+ * ignore coverage that keeps the file out of `git status`.
13
+ */
14
+ import { execFileSync } from "child_process";
15
+ import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "fs";
16
+ import { basename, dirname, join, relative, sep } from "path";
17
+ import { PRIMITIVE_LOCAL_STATE_VERSION, localStatePathForConfigPath, readLocalSelection, } from "./env-resolver-core.js";
18
+ export { localStatePathForConfigPath, readLocalSelection };
19
+ /**
20
+ * Writes this machine's environment selection. Returns the path written so
21
+ * callers can name it in their success message.
22
+ */
23
+ export function writeLocalSelection(configPath, name) {
24
+ const path = localStatePathForConfigPath(configPath);
25
+ const dir = dirname(path);
26
+ if (!existsSync(dir))
27
+ mkdirSync(dir, { recursive: true });
28
+ // Preserve any unrelated keys a future version of the CLI may have written.
29
+ let existing = {};
30
+ if (existsSync(path)) {
31
+ try {
32
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
33
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
34
+ existing = parsed;
35
+ }
36
+ }
37
+ catch {
38
+ // A corrupt file is replaced wholesale — that is exactly the remedy the
39
+ // corrupt-local-state error tells the user to reach for.
40
+ }
41
+ }
42
+ const body = {
43
+ ...existing,
44
+ version: PRIMITIVE_LOCAL_STATE_VERSION,
45
+ selectedEnvironment: name,
46
+ };
47
+ writeFileSync(path, JSON.stringify(body, null, 2) + "\n");
48
+ return path;
49
+ }
50
+ /**
51
+ * Clears the selection if (and only if) it names `name`. Used by `env remove`
52
+ * so removing the selected environment can't leave a dangling selection that
53
+ * makes every later command fail.
54
+ */
55
+ export function clearLocalSelection(configPath, name) {
56
+ const path = localStatePathForConfigPath(configPath);
57
+ if (!existsSync(path))
58
+ return false;
59
+ let current;
60
+ try {
61
+ current = readLocalSelection(configPath);
62
+ }
63
+ catch {
64
+ // Corrupt local state: nothing to match against, and rewriting it here
65
+ // would swallow an error the user should see from a resolution instead.
66
+ return false;
67
+ }
68
+ if (current !== name)
69
+ return false;
70
+ let existing = {};
71
+ try {
72
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
73
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
74
+ existing = parsed;
75
+ }
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ delete existing.selectedEnvironment;
81
+ writeFileSync(path, JSON.stringify({ version: PRIMITIVE_LOCAL_STATE_VERSION, ...existing }, null, 2) + "\n");
82
+ return true;
83
+ }
84
+ function git(cwd, args) {
85
+ return execFileSync("git", args, {
86
+ cwd,
87
+ encoding: "utf-8",
88
+ stdio: ["ignore", "pipe", "ignore"],
89
+ }).trim();
90
+ }
91
+ /**
92
+ * Escapes a path segment for use in a gitignore pattern. `*`, `?`, `[`, `]`
93
+ * and `\` are pattern syntax; `#` and `!` are line-leading syntax. Anchoring
94
+ * the pattern with a leading `/` (done by the caller) is what makes it
95
+ * relative to the repository root rather than "any directory named this".
96
+ */
97
+ function escapeGitignorePattern(relPath) {
98
+ return relPath.replace(/[\\*?[\]]/g, (c) => "\\" + c).replace(/^([#!])/, "\\$1");
99
+ }
100
+ /**
101
+ * Makes sure `.primitive/local.json` is ignored before it is written.
102
+ *
103
+ * Templates scaffolded from now on carry the entry in their `.gitignore`, but
104
+ * projects created before this change do not — and `env use` writing an
105
+ * untracked-but-committable file would be exactly the "switching backends
106
+ * dirties the repo" problem this replaced. When the file is not already
107
+ * covered we append an anchored pattern to the repository's exclude file,
108
+ * resolved via `git rev-parse --git-path info/exclude` so a linked worktree
109
+ * (where `.git` is a FILE) works, and anchored relative to
110
+ * `git rev-parse --show-toplevel` so a project root nested below the worktree
111
+ * root is not mis-rooted.
112
+ */
113
+ export function ensureLocalStateIgnored(localStatePath) {
114
+ const dir = dirname(localStatePath);
115
+ if (!existsSync(dir))
116
+ mkdirSync(dir, { recursive: true });
117
+ let topLevel;
118
+ try {
119
+ topLevel = git(dir, ["rev-parse", "--show-toplevel"]);
120
+ }
121
+ catch {
122
+ return { status: "not-a-repo" };
123
+ }
124
+ if (!topLevel)
125
+ return { status: "not-a-repo" };
126
+ try {
127
+ execFileSync("git", ["check-ignore", "-q", "--", localStatePath], {
128
+ cwd: dir,
129
+ stdio: "ignore",
130
+ });
131
+ return { status: "already-ignored" };
132
+ }
133
+ catch {
134
+ // Exit 1 means "not ignored" — carry on and add coverage.
135
+ }
136
+ // git reports the toplevel with symlinks resolved (/private/var on macOS);
137
+ // the caller's path usually is not (/var). Compare like for like or the
138
+ // "relative" path escapes the repository entirely.
139
+ const realDir = realpathSync(dir);
140
+ const rel = relative(topLevel, join(realDir, basename(localStatePath)))
141
+ .split(sep)
142
+ .join("/");
143
+ const pattern = "/" + escapeGitignorePattern(rel);
144
+ try {
145
+ const excludePath = git(dir, ["rev-parse", "--path-format=absolute", "--git-path", "info/exclude"]);
146
+ if (!excludePath)
147
+ return { status: "failed", detail: "could not locate the git exclude file" };
148
+ mkdirSync(dirname(excludePath), { recursive: true });
149
+ const existing = existsSync(excludePath) ? readFileSync(excludePath, "utf-8") : "";
150
+ if (existing.split(/\r?\n/).some((line) => line.trim() === pattern)) {
151
+ return { status: "already-ignored" };
152
+ }
153
+ const prefix = existing === "" || existing.endsWith("\n") ? "" : "\n";
154
+ writeFileSync(excludePath, existing +
155
+ prefix +
156
+ `\n# Added by 'primitive env use' — this machine's Primitive environment\n` +
157
+ `# selection is local state, not a team decision. Add the same pattern to a\n` +
158
+ `# committed .gitignore to make the coverage shared.\n` +
159
+ pattern +
160
+ "\n");
161
+ return { status: "excluded", excludePath, pattern };
162
+ }
163
+ catch (err) {
164
+ return { status: "failed", detail: err?.message || String(err) };
165
+ }
166
+ }
167
+ //# sourceMappingURL=local-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-state.js","sourceRoot":"","sources":["../../../src/lib/local-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The case files on disk that the server has never been told about (#3061).
3
+ *
4
+ * A `<key>.tests/*.toml` sidecar is authored locally and becomes runnable only
5
+ * when `config push` registers it. The test verbs run the REGISTERED set, so a
6
+ * file nobody pushed contributes nothing to `Total Tests` — and until this
7
+ * module existed, nothing to the output either. `Total Tests: 3 / Failed: 0`
8
+ * beside four case files is a pass standing in for work that did not happen,
9
+ * and is indistinguishable from a case that genuinely ran.
10
+ *
11
+ * Naming those files is only useful if the naming is never wrong, so pairing
12
+ * here mirrors what push pairs with:
13
+ * 1. the sync manifest, which maps a file to the live case it manages even
14
+ * when the file has since been renamed;
15
+ * 2. the file name pull would give the case — its committed key, or the slug
16
+ * of an unkeyed case's name (web-admin, an older CLI or the raw API),
17
+ * collision suffixes included — from the one shared naming rule in
18
+ * `test-case-file-names.ts`.
19
+ * Both passes CLAIM: one live case accounts for one file, the way pull assigns
20
+ * one file per case and push's adoption pass pairs. Matching a name loosely
21
+ * instead would let a single registered "foo" excuse both `foo.toml` and a
22
+ * newly authored `foo-2.toml`, which is the silence this issue is about.
23
+ * Anything left over is a file no live case accounts for. The bias is toward
24
+ * silence: a pairing this module cannot make is a warning it does not print.
25
+ *
26
+ * Reads only — the scan never registers anything. `config push` stays the one
27
+ * verb that mutates the server, which is what the warning tells the user.
28
+ */
29
+ /** What one suite's sidecar directory holds, against what is registered. */
30
+ export interface LocalTestCaseScan {
31
+ /** Every `*.toml` case file in the directory, basename order. */
32
+ localFiles: string[];
33
+ /** The subset no registered case accounts for, basename order. */
34
+ unregistered: string[];
35
+ }
36
+ /** The sync-state baseline rows that map a sidecar to a live case. */
37
+ export type ManagedTestCases = Record<string, {
38
+ id?: string;
39
+ } | undefined>;
40
+ /** Read the manifest's test-case rows, or nothing when it cannot be read. */
41
+ export declare function readManagedTestCases(configDir: string): ManagedTestCases;
42
+ /**
43
+ * The `*.toml` case files in a suite's sidecar directory, if it has one.
44
+ *
45
+ * An empty array means the directory is absent or holds no case file. A
46
+ * directory that cannot be READ throws instead of reporting nothing: this whole
47
+ * issue is about a silence indistinguishable from having no work, and callers
48
+ * turn the throw into a diagnostic that names the directory.
49
+ */
50
+ export declare function listLocalTestCaseFiles(testsDir: string): string[];
51
+ /**
52
+ * Which of a suite's local case files no registered case accounts for.
53
+ *
54
+ * `managedPrefix` is the manifest's namespace for this block —
55
+ * `<blockType>/<blockKey>` — so a row that maps `foo.toml` to a live case is
56
+ * read only for the block that owns it.
57
+ */
58
+ export declare function scanLocalTestCases(params: {
59
+ testsDir: string;
60
+ registered: any[];
61
+ managed?: ManagedTestCases;
62
+ managedPrefix?: string;
63
+ }): LocalTestCaseScan;