@seliseblocks/cli-os 0.1.4 → 0.1.5

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 (389) hide show
  1. package/AI_USAGE_GUIDE.md +328 -58
  2. package/README.md +83 -46
  3. package/dist/commands/auth/client-credentials/delete.d.ts +1 -0
  4. package/dist/commands/auth/client-credentials/delete.js +23 -0
  5. package/dist/commands/auth/client-credentials/list.d.ts +1 -0
  6. package/dist/commands/auth/client-credentials/list.js +14 -0
  7. package/dist/commands/auth/client-credentials/save.d.ts +1 -0
  8. package/dist/commands/auth/client-credentials/save.js +41 -0
  9. package/dist/commands/auth/config/get.d.ts +1 -0
  10. package/dist/commands/auth/config/get.js +14 -0
  11. package/dist/commands/auth/config/save.d.ts +1 -0
  12. package/dist/commands/auth/config/save.js +37 -0
  13. package/dist/commands/auth/idp/create.d.ts +1 -0
  14. package/dist/commands/auth/idp/create.js +46 -0
  15. package/dist/commands/auth/idp/delete.d.ts +1 -0
  16. package/dist/commands/auth/idp/delete.js +23 -0
  17. package/dist/commands/auth/idp/get.d.ts +1 -0
  18. package/dist/commands/auth/idp/get.js +16 -0
  19. package/dist/commands/auth/idp/list.d.ts +1 -0
  20. package/dist/commands/auth/idp/list.js +14 -0
  21. package/dist/commands/auth/idp/status.d.ts +1 -0
  22. package/dist/commands/auth/idp/status.js +27 -0
  23. package/dist/commands/auth/idp/update.d.ts +7 -0
  24. package/dist/commands/auth/idp/update.js +45 -0
  25. package/dist/commands/auth/oidc-clients/delete.d.ts +1 -0
  26. package/dist/commands/auth/oidc-clients/delete.js +23 -0
  27. package/dist/commands/auth/oidc-clients/get.d.ts +1 -0
  28. package/dist/commands/auth/oidc-clients/get.js +16 -0
  29. package/dist/commands/auth/oidc-clients/list.d.ts +1 -0
  30. package/dist/commands/auth/oidc-clients/list.js +14 -0
  31. package/dist/commands/auth/oidc-clients/rotate-secret.d.ts +1 -0
  32. package/dist/commands/auth/oidc-clients/rotate-secret.js +23 -0
  33. package/dist/commands/auth/oidc-clients/save.d.ts +2 -0
  34. package/dist/commands/auth/oidc-clients/save.js +57 -0
  35. package/dist/commands/auth/refresh.js +1 -1
  36. package/dist/commands/data/config/create.d.ts +1 -0
  37. package/dist/commands/data/config/create.js +38 -0
  38. package/dist/commands/data/config/get.d.ts +1 -0
  39. package/dist/commands/data/config/get.js +14 -0
  40. package/dist/commands/data/config/update.d.ts +1 -0
  41. package/dist/commands/data/config/update.js +41 -0
  42. package/dist/commands/data/files/create-folder.d.ts +1 -0
  43. package/dist/commands/data/files/create-folder.js +34 -0
  44. package/dist/commands/data/files/delete-folder.d.ts +1 -0
  45. package/dist/commands/data/files/delete-folder.js +25 -0
  46. package/dist/commands/data/files/delete.d.ts +1 -0
  47. package/dist/commands/data/files/delete.js +28 -0
  48. package/dist/commands/data/files/dms-list.d.ts +1 -0
  49. package/dist/commands/data/files/dms-list.js +27 -0
  50. package/dist/commands/data/files/dms-upload.d.ts +6 -0
  51. package/dist/commands/data/files/dms-upload.js +41 -0
  52. package/dist/commands/data/files/get-many.d.ts +1 -0
  53. package/dist/commands/data/files/get-many.js +24 -0
  54. package/dist/commands/data/files/get.d.ts +1 -0
  55. package/dist/commands/data/files/get.js +21 -0
  56. package/dist/commands/data/files/info.d.ts +1 -0
  57. package/dist/commands/data/files/info.js +30 -0
  58. package/dist/commands/data/files/presigned-upload-url.d.ts +6 -0
  59. package/dist/commands/data/files/presigned-upload-url.js +34 -0
  60. package/dist/commands/data/files/update-additional-info.d.ts +1 -0
  61. package/dist/commands/data/files/update-additional-info.js +26 -0
  62. package/dist/commands/data/files/upload-to-local-storage.d.ts +5 -0
  63. package/dist/commands/data/files/upload-to-local-storage.js +55 -0
  64. package/dist/commands/data/files/upload-to-url.d.ts +8 -0
  65. package/dist/commands/data/files/upload-to-url.js +36 -0
  66. package/dist/commands/data/files/upload.d.ts +7 -0
  67. package/dist/commands/data/files/upload.js +145 -0
  68. package/dist/commands/data/rules/policy/delete.d.ts +1 -0
  69. package/dist/commands/data/rules/policy/delete.js +24 -0
  70. package/dist/commands/data/rules/policy/get.d.ts +1 -0
  71. package/dist/commands/data/rules/policy/get.js +17 -0
  72. package/dist/commands/data/schema/aggregation.d.ts +1 -0
  73. package/dist/commands/data/schema/aggregation.js +26 -0
  74. package/dist/commands/data/schema/change-logs.d.ts +1 -0
  75. package/dist/commands/data/schema/change-logs.js +14 -0
  76. package/dist/commands/data/schema/delete.d.ts +1 -0
  77. package/dist/commands/data/schema/delete.js +24 -0
  78. package/dist/commands/data/schema/fields.d.ts +5 -0
  79. package/dist/commands/data/schema/fields.js +39 -0
  80. package/dist/commands/data/schema/get-by-name.d.ts +1 -0
  81. package/dist/commands/data/schema/get-by-name.js +17 -0
  82. package/dist/commands/data/schema/get.d.ts +1 -0
  83. package/dist/commands/data/schema/get.js +17 -0
  84. package/dist/commands/data/schema/info/list.d.ts +1 -0
  85. package/dist/commands/data/schema/info/list.js +15 -0
  86. package/dist/commands/data/schema/info/save.d.ts +1 -0
  87. package/dist/commands/data/schema/info/save.js +34 -0
  88. package/dist/commands/data/schema/info/update.d.ts +1 -0
  89. package/dist/commands/data/schema/info/update.js +35 -0
  90. package/dist/commands/data/sync.d.ts +7 -0
  91. package/dist/commands/data/sync.js +46 -0
  92. package/dist/commands/data/validation/by-schema-field.d.ts +1 -0
  93. package/dist/commands/data/validation/by-schema-field.js +18 -0
  94. package/dist/commands/data/validation/by-schema.d.ts +1 -0
  95. package/dist/commands/data/validation/by-schema.js +17 -0
  96. package/dist/commands/data/validation/delete.d.ts +1 -0
  97. package/dist/commands/data/validation/delete.js +24 -0
  98. package/dist/commands/data/validation/get.d.ts +1 -0
  99. package/dist/commands/data/validation/get.js +17 -0
  100. package/dist/commands/data/validation/list.d.ts +1 -0
  101. package/dist/commands/data/validation/list.js +25 -0
  102. package/dist/commands/data/validation/save.d.ts +6 -0
  103. package/dist/commands/data/validation/save.js +44 -0
  104. package/dist/commands/deselect.js +1 -1
  105. package/dist/commands/iam/email/available.d.ts +1 -0
  106. package/dist/commands/iam/email/available.js +17 -0
  107. package/dist/commands/iam/organizations/config-get.d.ts +1 -0
  108. package/dist/commands/iam/organizations/config-get.js +14 -0
  109. package/dist/commands/iam/organizations/config-save.d.ts +1 -0
  110. package/dist/commands/iam/organizations/config-save.js +34 -0
  111. package/dist/commands/iam/organizations/create.d.ts +1 -0
  112. package/dist/commands/iam/organizations/create.js +37 -0
  113. package/dist/commands/iam/organizations/get.d.ts +1 -0
  114. package/dist/commands/iam/organizations/get.js +16 -0
  115. package/dist/commands/iam/organizations/list.d.ts +1 -0
  116. package/dist/commands/iam/organizations/list.js +26 -0
  117. package/dist/commands/iam/organizations/my.d.ts +1 -0
  118. package/dist/commands/iam/organizations/my.js +14 -0
  119. package/dist/commands/iam/organizations/update.d.ts +1 -0
  120. package/dist/commands/iam/organizations/update.js +39 -0
  121. package/dist/commands/iam/permissions/by-severity.d.ts +1 -0
  122. package/dist/commands/iam/permissions/by-severity.js +14 -0
  123. package/dist/commands/iam/permissions/create.d.ts +1 -0
  124. package/dist/commands/iam/permissions/create.js +39 -0
  125. package/dist/commands/iam/permissions/get.d.ts +1 -0
  126. package/dist/commands/iam/permissions/get.js +16 -0
  127. package/dist/commands/iam/permissions/list.d.ts +1 -0
  128. package/dist/commands/iam/permissions/list.js +41 -0
  129. package/dist/commands/iam/permissions/update.d.ts +1 -0
  130. package/dist/commands/iam/permissions/update.js +40 -0
  131. package/dist/commands/iam/resources/features.d.ts +1 -0
  132. package/dist/commands/iam/resources/features.js +19 -0
  133. package/dist/commands/iam/resources/groups.d.ts +1 -0
  134. package/dist/commands/iam/resources/groups.js +14 -0
  135. package/dist/commands/iam/roles/assign-permissions.d.ts +1 -0
  136. package/dist/commands/iam/roles/assign-permissions.js +33 -0
  137. package/dist/commands/iam/roles/assignable.d.ts +1 -0
  138. package/dist/commands/iam/roles/assignable.js +14 -0
  139. package/dist/commands/iam/roles/create.d.ts +1 -0
  140. package/dist/commands/iam/roles/create.js +35 -0
  141. package/dist/commands/iam/roles/get.d.ts +1 -0
  142. package/dist/commands/iam/roles/get.js +16 -0
  143. package/dist/commands/iam/roles/list.d.ts +1 -0
  144. package/dist/commands/iam/roles/list.js +34 -0
  145. package/dist/commands/iam/roles/update.d.ts +1 -0
  146. package/dist/commands/iam/roles/update.js +35 -0
  147. package/dist/commands/iam/signup-settings/get.d.ts +1 -0
  148. package/dist/commands/iam/signup-settings/get.js +14 -0
  149. package/dist/commands/iam/signup-settings/save.d.ts +1 -0
  150. package/dist/commands/iam/signup-settings/save.js +32 -0
  151. package/dist/commands/iam/users/access-grant.d.ts +1 -0
  152. package/dist/commands/iam/users/access-grant.js +32 -0
  153. package/dist/commands/iam/users/access-revoke.d.ts +1 -0
  154. package/dist/commands/iam/users/access-revoke.js +24 -0
  155. package/dist/commands/iam/users/activate.d.ts +1 -0
  156. package/dist/commands/iam/users/activate.js +24 -0
  157. package/dist/commands/iam/users/create.d.ts +1 -0
  158. package/dist/commands/iam/users/create.js +39 -0
  159. package/dist/commands/iam/users/deactivate.d.ts +1 -0
  160. package/dist/commands/iam/users/deactivate.js +24 -0
  161. package/dist/commands/iam/users/exists.d.ts +1 -0
  162. package/dist/commands/iam/users/exists.js +17 -0
  163. package/dist/commands/iam/users/get.d.ts +1 -0
  164. package/dist/commands/iam/users/get.js +17 -0
  165. package/dist/commands/iam/users/list.d.ts +1 -0
  166. package/dist/commands/iam/users/list.js +34 -0
  167. package/dist/commands/iam/users/update.d.ts +1 -0
  168. package/dist/commands/iam/users/update.js +35 -0
  169. package/dist/commands/init.js +0 -12
  170. package/dist/commands/localization/assistant/translation-suggestion.d.ts +1 -0
  171. package/dist/commands/localization/assistant/translation-suggestion.js +35 -0
  172. package/dist/commands/localization/config/get-webhook.d.ts +1 -0
  173. package/dist/commands/localization/config/get-webhook.js +14 -0
  174. package/dist/commands/localization/config/save-webhook.d.ts +1 -0
  175. package/dist/commands/localization/config/save-webhook.js +47 -0
  176. package/dist/commands/localization/glossary/delete.d.ts +1 -0
  177. package/dist/commands/localization/glossary/delete.js +24 -0
  178. package/dist/commands/localization/glossary/get.d.ts +1 -0
  179. package/dist/commands/localization/glossary/get.js +17 -0
  180. package/dist/commands/localization/glossary/list.d.ts +1 -0
  181. package/dist/commands/localization/glossary/list.js +22 -0
  182. package/dist/commands/localization/glossary/save.d.ts +1 -0
  183. package/dist/commands/localization/glossary/save.js +38 -0
  184. package/dist/commands/localization/glossary/suggested.d.ts +1 -0
  185. package/dist/commands/localization/glossary/suggested.js +20 -0
  186. package/dist/commands/localization/key/delete-keys.d.ts +1 -0
  187. package/dist/commands/localization/key/delete-keys.js +28 -0
  188. package/dist/commands/localization/key/delete.d.ts +1 -0
  189. package/dist/commands/localization/key/delete.js +24 -0
  190. package/dist/commands/localization/key/generate-uilm-file.d.ts +1 -0
  191. package/dist/commands/localization/key/generate-uilm-file.js +29 -0
  192. package/dist/commands/localization/key/get-by-names.d.ts +1 -0
  193. package/dist/commands/localization/key/get-by-names.js +24 -0
  194. package/dist/commands/localization/key/get-language-file-generation-history.d.ts +1 -0
  195. package/dist/commands/localization/key/get-language-file-generation-history.js +19 -0
  196. package/dist/commands/localization/key/get-localization-timeline.d.ts +1 -0
  197. package/dist/commands/localization/key/get-localization-timeline.js +28 -0
  198. package/dist/commands/localization/key/get-timeline-by-operation-id.d.ts +1 -0
  199. package/dist/commands/localization/key/get-timeline-by-operation-id.js +21 -0
  200. package/dist/commands/localization/key/get-timeline.d.ts +1 -0
  201. package/dist/commands/localization/key/get-timeline.js +25 -0
  202. package/dist/commands/localization/key/get-uilm-exported-files.d.ts +1 -0
  203. package/dist/commands/localization/key/get-uilm-exported-files.js +22 -0
  204. package/dist/commands/localization/key/get-uilm-file.d.ts +1 -0
  205. package/dist/commands/localization/key/get-uilm-file.js +18 -0
  206. package/dist/commands/localization/key/get.d.ts +1 -0
  207. package/dist/commands/localization/key/get.js +17 -0
  208. package/dist/commands/localization/key/list.d.ts +1 -0
  209. package/dist/commands/localization/key/list.js +39 -0
  210. package/dist/commands/localization/key/rollback.d.ts +1 -0
  211. package/dist/commands/localization/key/rollback.js +24 -0
  212. package/dist/commands/localization/key/save.d.ts +1 -0
  213. package/dist/commands/localization/key/save.js +44 -0
  214. package/dist/commands/localization/key/translate-all.d.ts +1 -0
  215. package/dist/commands/localization/key/translate-all.js +30 -0
  216. package/dist/commands/localization/key/translate-and-export.d.ts +7 -0
  217. package/dist/commands/localization/key/translate-and-export.js +132 -0
  218. package/dist/commands/localization/key/translate-key.d.ts +1 -0
  219. package/dist/commands/localization/key/translate-key.js +27 -0
  220. package/dist/commands/localization/key/translate-keys.d.ts +1 -0
  221. package/dist/commands/localization/key/translate-keys.js +31 -0
  222. package/dist/commands/localization/key/uilm-export.d.ts +1 -0
  223. package/dist/commands/localization/key/uilm-export.js +33 -0
  224. package/dist/commands/localization/key/uilm-import.d.ts +1 -0
  225. package/dist/commands/localization/key/uilm-import.js +26 -0
  226. package/dist/commands/localization/language/delete.d.ts +1 -0
  227. package/dist/commands/localization/language/delete.js +24 -0
  228. package/dist/commands/localization/language/list-for-tenant.d.ts +1 -0
  229. package/dist/commands/localization/language/list-for-tenant.js +14 -0
  230. package/dist/commands/localization/language/list.d.ts +1 -0
  231. package/dist/commands/localization/language/list.js +14 -0
  232. package/dist/commands/localization/language/save.d.ts +1 -0
  233. package/dist/commands/localization/language/save.js +36 -0
  234. package/dist/commands/localization/language/set-default.d.ts +1 -0
  235. package/dist/commands/localization/language/set-default.js +24 -0
  236. package/dist/commands/localization/module/list-for-tenant.d.ts +1 -0
  237. package/dist/commands/localization/module/list-for-tenant.js +14 -0
  238. package/dist/commands/localization/module/list.d.ts +1 -0
  239. package/dist/commands/localization/module/list.js +14 -0
  240. package/dist/commands/localization/module/save.d.ts +1 -0
  241. package/dist/commands/localization/module/save.js +32 -0
  242. package/dist/commands/localization/module/tag-glossary.d.ts +1 -0
  243. package/dist/commands/localization/module/tag-glossary.js +28 -0
  244. package/dist/commands/mail/config/delete.d.ts +1 -0
  245. package/dist/commands/mail/config/delete.js +24 -0
  246. package/dist/commands/mail/config/duplicate.d.ts +1 -0
  247. package/dist/commands/mail/config/duplicate.js +24 -0
  248. package/dist/commands/mail/config/get.d.ts +1 -0
  249. package/dist/commands/mail/config/get.js +17 -0
  250. package/dist/commands/mail/config/list.d.ts +1 -0
  251. package/dist/commands/mail/config/list.js +14 -0
  252. package/dist/commands/mail/config/save.d.ts +1 -0
  253. package/dist/commands/mail/config/save.js +44 -0
  254. package/dist/commands/mail/mailbox/get.d.ts +1 -0
  255. package/dist/commands/mail/mailbox/get.js +17 -0
  256. package/dist/commands/mail/mailbox/list.d.ts +1 -0
  257. package/dist/commands/mail/mailbox/list.js +24 -0
  258. package/dist/commands/mail/send.d.ts +1 -0
  259. package/dist/commands/mail/send.js +40 -0
  260. package/dist/commands/mail/sendtoany.d.ts +1 -0
  261. package/dist/commands/mail/sendtoany.js +41 -0
  262. package/dist/commands/mail/template/clone.d.ts +1 -0
  263. package/dist/commands/mail/template/clone.js +33 -0
  264. package/dist/commands/mail/template/delete.d.ts +1 -0
  265. package/dist/commands/mail/template/delete.js +24 -0
  266. package/dist/commands/mail/template/get.d.ts +1 -0
  267. package/dist/commands/mail/template/get.js +17 -0
  268. package/dist/commands/mail/template/list.d.ts +1 -0
  269. package/dist/commands/mail/template/list.js +24 -0
  270. package/dist/commands/mail/template/save.d.ts +1 -0
  271. package/dist/commands/mail/template/save.js +37 -0
  272. package/dist/commands/mfa/backup-codes/generate.d.ts +1 -0
  273. package/dist/commands/mfa/backup-codes/generate.js +22 -0
  274. package/dist/commands/mfa/backup-codes/list.d.ts +1 -0
  275. package/dist/commands/mfa/backup-codes/list.js +14 -0
  276. package/dist/commands/mfa/backup-codes/use.d.ts +1 -0
  277. package/dist/commands/mfa/backup-codes/use.js +18 -0
  278. package/dist/commands/mfa/config-get.d.ts +1 -0
  279. package/dist/commands/mfa/config-get.js +14 -0
  280. package/dist/commands/mfa/config-save.d.ts +1 -0
  281. package/dist/commands/mfa/config-save.js +36 -0
  282. package/dist/commands/mfa/disable.d.ts +1 -0
  283. package/dist/commands/mfa/disable.js +22 -0
  284. package/dist/commands/mfa/generate.d.ts +1 -0
  285. package/dist/commands/mfa/generate.js +22 -0
  286. package/dist/commands/mfa/method-set.d.ts +1 -0
  287. package/dist/commands/mfa/method-set.js +20 -0
  288. package/dist/commands/mfa/resend.d.ts +1 -0
  289. package/dist/commands/mfa/resend.js +20 -0
  290. package/dist/commands/mfa/totp-enable.d.ts +10 -0
  291. package/dist/commands/mfa/totp-enable.js +52 -0
  292. package/dist/commands/mfa/totp-setup.d.ts +1 -0
  293. package/dist/commands/mfa/totp-setup.js +15 -0
  294. package/dist/commands/mfa/totp-verify-setup.d.ts +1 -0
  295. package/dist/commands/mfa/totp-verify-setup.js +17 -0
  296. package/dist/commands/mfa/verify.d.ts +1 -0
  297. package/dist/commands/mfa/verify.js +26 -0
  298. package/dist/commands/new/web.js +115 -15
  299. package/dist/commands/notification/delete.d.ts +1 -0
  300. package/dist/commands/notification/delete.js +24 -0
  301. package/dist/commands/notification/get.d.ts +1 -0
  302. package/dist/commands/notification/get.js +17 -0
  303. package/dist/commands/notification/list.d.ts +1 -0
  304. package/dist/commands/notification/list.js +22 -0
  305. package/dist/commands/notification/save.d.ts +1 -0
  306. package/dist/commands/notification/save.js +34 -0
  307. package/dist/commands/notifier/list.d.ts +1 -0
  308. package/dist/commands/notifier/list.js +23 -0
  309. package/dist/commands/notifier/mark-all-read.d.ts +1 -0
  310. package/dist/commands/notifier/mark-all-read.js +23 -0
  311. package/dist/commands/notifier/mark-read.d.ts +1 -0
  312. package/dist/commands/notifier/mark-read.js +24 -0
  313. package/dist/commands/notifier/notify.d.ts +1 -0
  314. package/dist/commands/notifier/notify.js +39 -0
  315. package/dist/commands/notifier/unread.d.ts +1 -0
  316. package/dist/commands/notifier/unread.js +25 -0
  317. package/dist/commands/projects/get.js +16 -14
  318. package/dist/commands/projects/list.js +2 -7
  319. package/dist/commands/release/builds/list.js +21 -3
  320. package/dist/commands/release/deploy.js +121 -30
  321. package/dist/commands/sdk/client.d.ts +1 -0
  322. package/dist/commands/sdk/client.js +99 -0
  323. package/dist/commands/secrets/get.d.ts +1 -0
  324. package/dist/commands/secrets/get.js +21 -0
  325. package/dist/commands/secrets/save.d.ts +1 -0
  326. package/dist/commands/secrets/save.js +51 -0
  327. package/dist/commands/skill/add.d.ts +1 -0
  328. package/dist/commands/skill/add.js +19 -0
  329. package/dist/commands/skill/list.d.ts +1 -0
  330. package/dist/commands/skill/list.js +15 -0
  331. package/dist/commands/skill/show.d.ts +1 -0
  332. package/dist/commands/skill/show.js +15 -0
  333. package/dist/commands/storage/config/delete.d.ts +1 -0
  334. package/dist/commands/storage/config/delete.js +24 -0
  335. package/dist/commands/storage/config/get.d.ts +1 -0
  336. package/dist/commands/storage/config/get.js +17 -0
  337. package/dist/commands/storage/config/list.d.ts +1 -0
  338. package/dist/commands/storage/config/list.js +14 -0
  339. package/dist/commands/storage/config/save.d.ts +1 -0
  340. package/dist/commands/storage/config/save.js +49 -0
  341. package/dist/index.js +950 -152
  342. package/dist/lib/api.d.ts +1 -1
  343. package/dist/lib/api.js +39 -21
  344. package/dist/lib/args.d.ts +3 -0
  345. package/dist/lib/args.js +15 -0
  346. package/dist/lib/auth.d.ts +5 -2
  347. package/dist/lib/auth.js +23 -35
  348. package/dist/lib/config.js +7 -7
  349. package/dist/lib/json-flag.d.ts +17 -0
  350. package/dist/lib/json-flag.js +55 -0
  351. package/dist/lib/project-info.d.ts +33 -0
  352. package/dist/lib/project-info.js +39 -0
  353. package/dist/lib/prompt.d.ts +2 -0
  354. package/dist/lib/prompt.js +28 -0
  355. package/dist/lib/scaffold-web/dashboard.js +1 -1
  356. package/dist/lib/scaffold-web/root-files.js +1 -1
  357. package/dist/lib/secret-store.js +7 -7
  358. package/dist/lib/skills.d.ts +17 -0
  359. package/dist/lib/skills.js +69 -0
  360. package/dist/lib/token.d.ts +2 -0
  361. package/dist/lib/token.js +12 -0
  362. package/dist/lib/workspace.d.ts +0 -4
  363. package/dist/lib/workspace.js +1 -2
  364. package/dist/skills/blocks-data-gateway-configuration/SKILL.md +204 -0
  365. package/dist/skills/blocks-data-gateway-crud/SKILL.md +223 -0
  366. package/dist/skills/blocks-data-storage/SKILL.md +161 -0
  367. package/dist/skills/blocks-frontend-local-https/SKILL.md +100 -0
  368. package/dist/skills/blocks-iam-access-control/SKILL.md +49 -0
  369. package/dist/skills/blocks-iam-access-control/flows/feature-gating.md +38 -0
  370. package/dist/skills/blocks-iam-access-control/flows/manage-roles-permissions.md +109 -0
  371. package/dist/skills/blocks-iam-account/SKILL.md +169 -0
  372. package/dist/skills/blocks-iam-mfa/SKILL.md +124 -0
  373. package/dist/skills/blocks-iam-organizations/SKILL.md +43 -0
  374. package/dist/skills/blocks-iam-organizations/flows/admin-mutations.md +89 -0
  375. package/dist/skills/blocks-iam-organizations/flows/read-and-switch.md +57 -0
  376. package/dist/skills/blocks-iam-sso-oidc-configuration/SKILL.md +89 -0
  377. package/dist/skills/blocks-iam-sso-oidc-implementation/SKILL.md +80 -0
  378. package/dist/skills/blocks-iam-users/SKILL.md +131 -0
  379. package/dist/skills/blocks-localization-configuration/SKILL.md +149 -0
  380. package/dist/skills/blocks-localization-implementation/SKILL.md +63 -0
  381. package/dist/skills/blocks-mail/SKILL.md +95 -0
  382. package/dist/skills/blocks-notification/SKILL.md +69 -0
  383. package/dist/skills/blocks-notifier/SKILL.md +107 -0
  384. package/dist/skills/blocks-onboarding/SKILL.md +78 -0
  385. package/dist/skills/blocks-release-deployment/SKILL.md +81 -0
  386. package/dist/skills/blocks-secrets/SKILL.md +81 -0
  387. package/dist/skills/blocks-storage-configuration/SKILL.md +93 -0
  388. package/dist/skills/lint.mjs +168 -0
  389. package/package.json +4 -4
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: blocks-notification
3
+ description: "Manage SELISE Blocks notification-channel configuration via `blocks notification *` — no SDK path exists (`@seliseblocks/client` has no `notification` namespace, only the unrelated real-time `notifier` surface). Covers `notification list`/`get` (read configs) and `notification save`/`delete` (project-scoped mutations, impersonated-project-token only). Use for 'list/get notification configs', 'save/update a channel', 'delete a config'. Always `--dry-run` before `--yes` on save/delete."
4
+ ---
5
+
6
+ # Blocks Notification — Channel Configuration
7
+
8
+ Manage notification-channel configuration through `blocks notification *`. This is **100% CLI, no SDK equivalent** — `@seliseblocks/client` has no `notification` namespace at all. It does have a `notifier` namespace (backing `blocks notifier *`), but that's a **different, unrelated surface**: `notifier` pushes real-time/offline notifications and reads a user's own inbox; `notification` (this skill) manages the tenant's notification *channel configuration* — which channel/method a notification type uses, not sending one. Never write a frontend/app-code path for channel configuration — it's always this CLI.
9
+
10
+ **Prerequisite:** a project is selected (`blocks use <tenantId>`, or pass `--project <tenantId>`) — see the blocks-onboarding skill. Every one of the four commands requires an impersonated project session; there is no account-level mode for any of them.
11
+
12
+ ## Safe read commands
13
+
14
+ - **`blocks notification list [--page <n>] [--page-size <n>] [--sort-by <property>] [--sort-desc] [--filter <text>] [--json]`** — read-only.
15
+ - **`blocks notification get <itemId> [--json]`** — `itemId` may be given positionally or as `--id <itemId>`; one of the two is required (the command throws `Missing --id` if neither is given). Read-only.
16
+
17
+ Neither read command mutates anything and neither accepts `--dry-run` (there's nothing to preview — no request body is built, no confirmation gate exists for either).
18
+
19
+ ## Mutating: save (create or update a channel config)
20
+
21
+ ```bash
22
+ blocks notification save --name <n> --channel <0|1> --type <0-3> --dry-run --json # preview first
23
+ blocks notification save --name <n> --channel <0|1> --type <0-3> --yes --json # only after approval
24
+ blocks notification save --update --body '<json>' --yes --json # full custom payload
25
+ ```
26
+
27
+ The request body is built by merging (in this order, later keys win) whatever `--body '<json>'` or `--file <path.json>` supplies, then these convenience flags layered on top (so an unset convenience flag never overwrites a value from `--body`/`--file`):
28
+
29
+ | Flag | Body field | Notes |
30
+ |---|---|---|
31
+ | `--channel <int>` | `channelToNotify` | Raw integer — the CLI does **not** validate or enum-check the value itself. |
32
+ | `--type <int>` | `notificationType` | Same — raw integer, no validation in the command. |
33
+ | `--enable-persistence` | `enablePersistence` | Boolean flag; only ever sent as `true` when passed — passing it absent never sends an explicit `false`. |
34
+ | `--update` | `isUpdateRequest` | Same true-only pattern as `--enable-persistence`. Set this when saving over an existing config rather than creating a new one. |
35
+ | `--name <text>` | `name` | |
36
+ | `--notify-method <text>` | `notifyMethod` | |
37
+
38
+ `--dry-run` prints the resolved request and returns — no network call, no confirmation prompt. Without `--dry-run`, it prompts interactively for a typed `yes` before sending (unless `--yes` is also passed); only then does it resolve the selected project and issue the request. Always show `--dry-run` output and get explicit approval before re-running with `--yes`.
39
+
40
+ `--channel`/`--type` don't have machine-readable names published by the API; the CLI's own usage docs note they correspond to the OS API's channel/receiver-type enums (`--channel` roughly `0|1`, `--type` roughly `0-3`) — treat those ranges as documentation convention, not something this command enforces, and ask the user for the exact intended value rather than guessing one.
41
+
42
+ ## Mutating: delete
43
+
44
+ ```bash
45
+ blocks notification delete <itemId> --dry-run --json
46
+ blocks notification delete <itemId> --yes --json
47
+ ```
48
+
49
+ Same `itemId` resolution as `get` — positional arg or `--id`, one required. `--dry-run` prints the resolved query and returns; otherwise it goes through the same confirmation gate as `save` (interactive `yes` prompt unless `--yes` is passed) before resolving the project and sending the request.
50
+
51
+ ## Gotchas
52
+
53
+ - **No SDK path, ever.** If asked "how do I manage notification channels from my app," the answer is: you don't — this is CLI-only, human/CI-operated configuration, not something to wire into frontend or backend app code.
54
+ - **`notification` and `notifier` are not the same thing.** `notification save/list/get/delete` (this skill) configures *which channel/method* a notification type uses. `notifier notify/list/unread/mark-read/mark-all-read` *sends* notifications and reads a user's inbox — a separate command family with its own commands, not covered here. Don't answer a "send a notification" request with `notification save`, and don't answer a "configure the notification channel" request with `notifier`.
55
+ - **`list` and `get` have no `--dry-run`.** Only `save` and `delete` build a request that's worth previewing; the two read commands hit the API directly. Don't tell a user to `--dry-run` a `list` or `get` call.
56
+ - **`--enable-persistence` and `--update` are true-only flags.** Passing them sets the field to `true`; not passing them omits the field entirely (never sends an explicit `false`). If a user wants to explicitly *unset* persistence or force a plain create, that has to go through `--body`/`--file` directly, not the convenience flag.
57
+ - **`--channel`/`--type` are unvalidated raw integers.** The command will happily send any integer you give it — there's no local check against the underlying enums. Confirm the intended value with the user (or check the Blocks portal/API docs) rather than inventing one.
58
+ - **`itemId` for `get`/`delete` is always required**, positional or `--id` — never guessed. Ask the user rather than assuming a value.
59
+ - **Every command is project-scoped.** All four require a resolved project and an impersonated project token; behavior follows whichever project is currently selected via `blocks use` (or an explicit `--project` override).
60
+ - **`--dry-run` before `--yes`, always**, on `save` and `delete` — same discipline as every other mutating `blocks` command in this pack.
61
+
62
+ ## Example trigger prompts
63
+
64
+ - "List the notification channel configs for this project."
65
+ - "Get notification config `<itemId>`."
66
+ - "Save a new notification config named `<name>` on channel 0, type 1." → preview with `--dry-run` first.
67
+ - "Update the existing `<name>` notification config." → add `--update`, still `--dry-run` before `--yes`.
68
+ - "Delete notification config `<itemId>`."
69
+ - "Send a notification to these users" / "show me a user's unread notifications" → not this skill; that's `blocks notifier *`, a different command family for sending/reading, not channel configuration.
@@ -0,0 +1,107 @@
1
+ ---
2
+ name: blocks-notifier
3
+ description: "Push real-time/offline notifications and manage a signed-in user's own notification inbox, via both the SDK (`blocksClient.notifier.*`) and the CLI (`blocks notifier notify|list|unread|mark-read|mark-all-read`). Distinct from the sibling blocks-notification skill, which configures tenant notification-*channel* settings on a different backing service, not sending. `notifier unread` flattens its subscription filter into GET query params since Fetch forbids a GET body. `--dry-run` before `--yes` on CLI `notify`/`mark-read`/`mark-all-read`."
4
+ ---
5
+
6
+ # Blocks Notifier — Send & Inbox
7
+
8
+ `notifier` pushes real-time/offline notifications to users, roles, or subscription-filter matches, and reads/manages the signed-in user's own notification inbox. This is a **separate, deliberate concern from the blocks-notification skill**, which manages a tenant's notification-*channel configuration* — which channel/method a notification type uses — on an unrelated backing service. Both this skill and the sibling skill confirm the same distinction from their own side. Don't merge them, and don't reconcile them as if one were a typo for the other — they hit different backing services. If the ask is "configure which channel a notification type uses," route to the blocks-notification skill instead.
9
+
10
+ Unlike `blocks-notification` (100% CLI, no SDK path), **`notifier` has both a CLI and an SDK surface**, and every one of the five operations exists on both:
11
+
12
+ | Operation | CLI | SDK (`blocksClient.notifier.*`) |
13
+ |---|---|---|
14
+ | Send a notification | `blocks notifier notify` | `notify(request)` |
15
+ | List the inbox | `blocks notifier list` | `getNotifications(options)` |
16
+ | Unread by subscription filter | `blocks notifier unread` | `getUnreadNotificationsBySubscriptionFilter(request)` |
17
+ | Mark one read | `blocks notifier mark-read <id>` | `markNotificationAsRead(request)` |
18
+ | Mark all read | `blocks notifier mark-all-read` | `markAllNotificationAsRead()` |
19
+
20
+ ## CLI — `blocks notifier *`
21
+
22
+ Every CLI command is project-scoped: each requires an impersonated project session — there is no account-level mode for any of the five. Project resolution follows the same order as everywhere else in this CLI: `--project <tenantId>` flag, then the workspace's `blocks.json`, then the globally selected project from `blocks use <tenantId>`. See the blocks-onboarding skill if no project is selected yet.
23
+
24
+ - **`blocks notifier notify [--user-ids a,b] [--roles a,b] [--connection-id <id>] [--configuration-name <n>] [--subscription-filters '<json>'] [--denormalized-payload <text>] [--save-denormalized-payload-as-object] [--content-available] [--response-key <k>] [--response-value <v>] [--body '<json>'|--file <path>] [--dry-run] [--yes] [--json]`** — target with at least one of `--user-ids`/`--roles`/`--subscription-filters`. `--user-ids` and `--roles` are comma-separated lists; `--subscription-filters` is a raw JSON array string (e.g. `[{"context":"orders","actionName":"created","value":"*"}]`, matching `BlocksNotifierSubscriptionFilter[]`). The body is built by merging `--body`/`--file` first, then layering the convenience flags on top — so an explicit convenience flag always wins over the same field in `--body`/`--file`, and an unset one never overwrites what `--body`/`--file` supplied. `--content-available` and `--save-denormalized-payload-as-object` are true-only booleans (absent when not passed, never an explicit `false`).
25
+ - **`blocks notifier list [--unread-only] [--page <n>] [--page-size <n>] [--sort-by <property>] [--sort-desc] [--filter <text>] [--json]`** — read-only.
26
+ - **`blocks notifier unread [--user-id <id>] [--context <c>] [--action-name <a>] [--value <v>] [--order-by <1|2>] [--json]`** — read-only. See "The GET-with-a-body quirk" below.
27
+ - **`blocks notifier mark-read <id> [--dry-run] [--yes] [--json]`** — `id` may be positional or `--id`; one of the two is required (`Missing --id` if neither given).
28
+ - **`blocks notifier mark-all-read [--dry-run] [--yes] [--json]`** — no body/arguments needed.
29
+
30
+ ### The GET-with-a-body quirk (`unread`)
31
+
32
+ This operation is documented upstream as a read with a JSON request body, which the Fetch spec forbids sending on a plain GET-style read. Both the CLI and SDK work around it the same way: flatten the filter fields into the query string instead. Confirmed field names, read directly from source:
33
+
34
+ ```
35
+ UserId
36
+ SubscriptionFilterData.Context
37
+ SubscriptionFilterData.ActionName
38
+ SubscriptionFilterData.Value
39
+ OrderBy
40
+ ```
41
+
42
+ CLI flags map to them as `--user-id` -> `UserId`, `--context` -> `SubscriptionFilterData.Context`, `--action-name` -> `SubscriptionFilterData.ActionName`, `--value` -> `SubscriptionFilterData.Value`, `--order-by` -> `OrderBy` (an integer, `1|2` per the SDK type — its enum meaning isn't published anywhere, so treat it as opaque and confirm with the user rather than guessing which value means what).
43
+
44
+ This flattening is a **client-side inference, not something verified against a live call** — both the CLI and SDK made the same choice independently, which is corroborating but not proof the real backend accepts it. If a live `notifier unread` call ever errors, re-check this against the actual API response rather than assuming the flattening above is still correct.
45
+
46
+ ## SDK — `blocksClient.notifier.*`
47
+
48
+ ```ts
49
+ import { blocksClient } from "../../lib/blocks/client";
50
+
51
+ await blocksClient.notifier.notify({
52
+ userIds: ["user-1"],
53
+ roles: ["admin"],
54
+ denormalizedPayload: '{"orderId":"123"}',
55
+ saveDenormalizedPayloadAsAnObject: true
56
+ });
57
+
58
+ const inbox = await blocksClient.notifier.getNotifications({ isUnreadOnly: true, page: 1, pageSize: 20 });
59
+
60
+ const unread = await blocksClient.notifier.getUnreadNotificationsBySubscriptionFilter({
61
+ userId: "user-1",
62
+ subscriptionFilterData: { context: "orders", actionName: "created" }
63
+ });
64
+
65
+ await blocksClient.notifier.markNotificationAsRead({ id: notificationId });
66
+ await blocksClient.notifier.markAllNotificationAsRead();
67
+ ```
68
+
69
+ - **`notify(request: BlocksNotifyRequest)`** — fields: `configurationName?`, `connectionId?`, `contentAvailable?: boolean`, `denormalizedPayload?: string`, `responseKey?`, `responseValue?`, `roles?: string[]`, `saveDenormalizedPayloadAsAnObject?: boolean`, `subscriptionFilters?: BlocksNotifierSubscriptionFilter[]`, `userIds?: string[]`.
70
+ - **`getUnreadNotificationsBySubscriptionFilter(request)`** — fields: `orderBy?: 1 | 2` (opaque enum), `subscriptionFilterData?: { actionName?, context?, value? }`, `userId?`. Internally builds the same flattened query as the CLI (see above) — this is the SDK-side half of the same documented workaround.
71
+ - **`getNotifications(options: BlocksGetNotificationsOptions = {})`** — options: `filter?`, `isUnreadOnly?`, `page?`, `pageSize?`, `sortBy?`, `sortDescending?`. Response shape: `{ notifications: Record<string, unknown>[], totalNotificationsCount: number, unReadNotificationsCount: number }`.
72
+ - **`markAllNotificationAsRead()`** — no arguments.
73
+ - **`markNotificationAsRead(request: BlocksMarkNotificationAsReadRequest)`** — request: `{ id: string }`.
74
+
75
+ `BlocksOfflineNotification` (the shape of items `getUnreadNotificationsBySubscriptionFilter` resolves to) is a loose `Record<string, unknown>` plus known fields `correlationId?`, `createdTime?`, `denormalizedPayload?`, `id?`, `isRead?`, `payload?`, `readByRoles?: string[]`, `readByUserIds?: string[]`. `BlocksNotifierPassThroughResponse` (the `notify`/mark-read/mark-all-read return type) is an untyped `Record<string, unknown>` — the SDK doesn't shape it further; don't assume fields beyond what a live response actually contains.
76
+
77
+ The SDK methods don't take a project/tenant argument per call — project context comes from however the app's shared `blocksClient` instance was constructed (its `xBlocksKey`/`appDomain`), same as every other `blocksClient.*` namespace. Don't create a second client just for notifier calls.
78
+
79
+ ## Mutation discipline (CLI only)
80
+
81
+ `notify`, `mark-read`, and `mark-all-read` are the three CLI mutations, and all three follow the same two-gate pattern used throughout this CLI:
82
+
83
+ 1. **`--dry-run`** short-circuits before any network call or confirmation prompt, printing a preview of what would be sent (`mark-all-read`'s preview has no request body since it sends none).
84
+ 2. Without `--dry-run`, a confirmation step accepts `--yes` outright or, interactively, prompts to type "yes" to continue, and cancels on anything else.
85
+
86
+ Always show the `--dry-run` output and get explicit approval before re-running with `--yes`. `list` and `unread` are read-only and have neither flag — don't tell a user to `--dry-run` a `list` or `unread` call. The SDK methods have no equivalent gate at all; that discipline is a CLI-only convention for terminal/CI operators, not something app code needs to replicate.
87
+
88
+ ## Gotchas
89
+
90
+ - **`notifier` and `notification` are not the same thing, and this is not an oversight to fix.** `notifier` (this skill) sends notifications and reads a user's inbox, on both CLI and SDK. `notification` (the sibling skill) configures a tenant's notification channel settings, CLI-only. Don't answer a "send a notification" ask with `notification save`, and don't answer a "configure the channel" ask with `notifier`.
91
+ - **`notifier unread`'s query-param flattening is an inferred client-side workaround for a Fetch-spec conflict, not verified against a live call.** See "The GET-with-a-body quirk" above. If it ever errors in practice, re-check whether the real endpoint tolerates a body server-side (some non-browser/non-Node HTTP stacks do) before assuming the flattening itself is broken.
92
+ - **`--content-available` and `--save-denormalized-payload-as-object` on `notify` are true-only flags.** Passing them sends `true`; omitting them omits the field entirely — there's no way to send an explicit `false` through the convenience flags (use `--body`/`--file` for that).
93
+ - **Convenience flags on `notify` win over `--body`/`--file`.** The merge order is `--body`/`--file` first, then the individual flags spread on top — so a flag like `--connection-id` always overrides the same key in `--body` if both are given.
94
+ - **`order-by` (both CLI `--order-by` and SDK `orderBy`) is an opaque `1|2` enum** — its meaning isn't published anywhere. Ask the user or confirm from the live API rather than guessing which value sorts which way.
95
+ - **Every CLI command is project-scoped**; there's no account-level mode. The SDK has no per-call project argument — it inherits whatever project the shared `blocksClient` was configured for.
96
+ - **`mark-read`'s `id` (positional or `--id`) is always required** — never guessed or defaulted.
97
+ - **`--dry-run` before `--yes`, always**, on the three CLI mutations — same discipline as every other mutating `blocks` command in this pack.
98
+
99
+ ## Example trigger prompts
100
+
101
+ - "Send a notification to these user IDs from my app." -> SDK `blocksClient.notifier.notify({ userIds: [...] })`.
102
+ - "Push a notification to everyone matching this subscription filter." -> SDK `notify({ subscriptionFilters: [...] })`, or `blocks notifier notify --subscription-filters '<json>' --dry-run --json` from the terminal.
103
+ - "Show me a user's unread notifications for the 'orders' context." -> `blocks notifier unread --user-id <id> --context orders --json`, or SDK `getUnreadNotificationsBySubscriptionFilter({ userId, subscriptionFilterData: { context: "orders" } })`.
104
+ - "List my notification inbox, unread only." -> `blocks notifier list --unread-only --json`, or SDK `getNotifications({ isUnreadOnly: true })`.
105
+ - "Mark this notification as read." -> `blocks notifier mark-read <id> --dry-run --json`, then `--yes`.
106
+ - "Mark everything in the inbox as read." -> `blocks notifier mark-all-read --dry-run --json`, then `--yes`.
107
+ - "Configure which channel the order-shipped notification uses." -> not this skill; that's the blocks-notification skill.
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: blocks-onboarding
3
+ description: "Onboard a user into SELISE Blocks before any other Blocks skill can run, using the `blocks` CLI — never raw API calls. Detects current state (CLI installed?, logged in?, project selected?) via `blocks auth status --json`/`doctor --json` and closes each gap: install, `login` (device-code, no setup needed), list/select a project (`projects create` is currently disabled — new projects come from the portal), `blocks init`, then resolve/create the app's OIDC client via `auth oidc-clients` (no portal needed) before handing off to `blocks new web`. Use when a user is new to Blocks, asks how to get started, or hits `not_logged_in`/`project_not_selected` from another command."
4
+ ---
5
+
6
+ # Blocks — Onboarding
7
+
8
+ Every other Blocks skill assumes: the `blocks` CLI is installed, the user is logged in (`login`), and a project is selected (`use`). This skill detects which of those is missing and closes the gap. **Everything here goes through `blocks` — never a raw `fetch`/`curl` against `api.seliseblocks.com`.**
9
+
10
+ The CLI's own usage guide (bundled with the `blocks-cli` package) is the command-level ground truth (exact flags, defaults, failure codes); this skill is the conversational flow around it — what to ask, what's portal-only, and in what order.
11
+
12
+ ## Probe first, ask second
13
+
14
+ Run `blocks auth status --json` and branch on the result — don't interrogate the user about state that's discoverable:
15
+
16
+ | Signal | State | Do this |
17
+ |---|---|---|
18
+ | command not found | CLI not installed | `npm install -g @seliseblocks/cli-os`, then re-probe |
19
+ | `accountAccessToken`/`accountRefreshToken` both `"missing"` | Never logged in | Step 1 — `login` |
20
+ | logged in, no project selected (check `blocks doctor --json`'s "Project selected" check) | No project selected | Step 2 — list/`use` |
21
+ | logged in, project selected | Ready | Confirm the project with the user — always show the full accessible-project list and which one is currently selected, never silently continue on a prior session's selection — then hand off to the skill/task that brought you here |
22
+
23
+ If anything looks broken rather than simply "not yet done" (unreadable/stale local token storage after a machine migration, Windows profile change, Keychain reset), run `blocks doctor --json` for the fuller diagnostic — it checks Node version, config/token/secret file locations, and token freshness in one pass. If storage itself is unreadable or corrupted, `blocks auth remove <account>` clears cached tokens and stored local credentials (restoring the packaged default account), then re-run `login`.
24
+
25
+ ## Step 1 — Log in
26
+
27
+ The CLI authenticates itself with no setup. There is no OIDC client to register in the portal for this, no client id/secret to collect from the user, and nothing about how the CLI does it to look up, print, or report — just log in:
28
+
29
+ ```bash
30
+ blocks login
31
+ ```
32
+
33
+ Device-code flow: it prints a verification URL and user code, opens the browser to the verification page when possible so the user only needs to click approve, then polls until the device is authorized; stores account access and refresh tokens and auto-refreshes later. Run it yourself rather than only telling the user to run it, so you can read the printed code/URL and confirm the result right after.
34
+
35
+ Verify with `blocks auth status --json` — re-run after login rather than assuming it worked.
36
+
37
+ ## Step 2 — Project
38
+
39
+ Ask **what the user wants to build** and whether they already have a project, rather than assuming:
40
+
41
+ ```bash
42
+ blocks projects list --json
43
+ ```
44
+
45
+ Always show the full list of accessible projects, and if one already appears selected, say which one — never silently continue on a prior session's selection. If projects exist, confirm which one (and which environment) the user wants; never guess.
46
+
47
+ **`projects create` is currently disabled in this CLI build** (commented out pending a product decision — there is no CLI path to create a new project). If none of the listed projects fit, tell the user a new project must be created from the Blocks portal first; once they confirm it exists, re-run `blocks projects list --json` and continue from here.
48
+
49
+ Then select it:
50
+
51
+ ```bash
52
+ blocks use <x-blocks-key>
53
+ ```
54
+
55
+ Project (impersonation) tokens are created lazily from the account session the first time a project-scoped command needs one — never ask the user for a project token directly. If an impersonated project token later gets stuck, rejected, or expired and `blocks auth refresh --project --json` doesn't fix it, recover with:
56
+
57
+ ```bash
58
+ blocks deselect # drops the selection and its cached impersonation token
59
+ blocks use <x-blocks-key> # reselect the same x-blocks-key to force a fresh impersonation
60
+ ```
61
+
62
+ ## Step 3 — Local workspace + hand off
63
+
64
+ Run `blocks init` once per project directory to create `blocks.json`, `blocks/data/schemas/`, `blocks/data/rules.json`, and `.env.example` — the later data-gateway skills read/write these. Safe to re-run: it never overwrites files that already exist. (`init` does not create a localization folder or any release-related file — `blocks/localization/` only appears later, lazily, the first time `blocks localization pull` writes to it, and there is no `blocks/release/*` file at all.)
65
+
66
+ Then route to what the user actually wants:
67
+ - Building a frontend from scratch → resolve the app's public OIDC client first, then scaffold:
68
+ - `blocks auth oidc-clients list --json` — check whether a client already registered for this project fits. If none fits, create one directly (no portal visit needed): `blocks auth oidc-clients save --client-display-name <appName> --redirect-uris https://<domain>:5173/login/callback --scope "openid profile" --require-pkce --register-as-identity-provider --dry-run --json`, then re-run with `--yes` after showing the dry-run output and getting approval. See the blocks-iam-sso-oidc-configuration skill for the full decision tree and field-level gotchas.
69
+ - `blocks new web <name> --x-blocks-key <tenantId> --app-domain <domain> --blocks-api-url https://api.seliseblocks.com --client-id <the-resolved-client-id>`. **Always pass `--client-id` and `--app-domain` explicitly** — omitting either drops `new web` into an interactive pick-list prompt with no non-interactive escape (not even to "skip"), which hangs a scripted/agent run with no stdin to answer it.
70
+ - Defining data / CRUD / localization / release on an existing project → hand off to the matching skill; the project is already selected via `blocks use`, so its commands can proceed directly.
71
+
72
+ ## Gotchas
73
+
74
+ - **Only one OIDC client matters here, and it's not the CLI's.** The CLI authenticates itself with no setup — nothing to register, nothing portal-only about `blocks login` itself, and nothing about how it does so to look up or mention. The only OIDC client involved is the scaffolded app's *public* browser client for its own end-user login (Step 3) — and that no longer requires the portal either: `blocks auth oidc-clients list`/`save` resolve or create it entirely through the CLI on the project's impersonated token. The portal remains available if the user prefers it, but it's an alternative, not a requirement. Don't tell a user they need to register anything before `blocks login` will work, and don't send them to the portal for the app's OIDC client by default.
75
+ - **`blocks new web` hangs a non-interactive run if `--client-id` or `--app-domain` is omitted** — it drops into an interactive pick-list (even to offer "skip") with no stdin to answer it in an agent-driven session. Always resolve both explicitly first (Step 3) rather than omitting either and hoping for a graceful default.
76
+ - **Never open, read, print, or expose the CLI's local storage files** (its config/token/secret files on disk) or anything inside them — client ids, root tenant id, account names, tokens. Only ever interact with them through `blocks` commands, never by inspecting the files directly. `auth status`/`doctor` only ever report token state (`missing`/`valid`/`expired`), never the value.
77
+ - **Known CLI error codes and fixes** (from the CLI's own error handling): `not_logged_in` → `blocks login`; `refresh_token_rejected` → `blocks login`; unreadable/stale local auth storage → `blocks auth remove <account>` then `blocks login`; `project_not_selected` → `blocks use <x-blocks-key>` (or pass `--project <tenantId>` for a single one-off command); `api_auth_failed` → `blocks auth status --json` then log in again; `impersonation_invalid_client` → not a stale-token problem, the account's OIDC client isn't registered for impersonation — check `blocks auth config get` and have an admin register it, `login`/`deselect`+`use` won't fix this one.
78
+ - **`--dry-run` before `--yes`** on every mutating command (`auth oidc-clients save`, `data schema push`/`data rules deploy`, `localization push`, `release deploy`) — this recurs in every skill that mutates project state.
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: blocks-release-deployment
3
+ description: "Trigger and inspect SELISE Blocks Release builds/deploys entirely through `blocks release *` — never raw fetch/curl; there is no SDK path (Release has no `@seliseblocks/client` namespace). Covers `release deploy` (auto-resolves the repo, verifies branch matches environment), `release status`/`builds get` (build lookup by id), and `builds list` (list builds for a repo). Use for 'deploy/trigger a release', 'check build status', 'list recent builds'. Always `--dry-run` before `--yes`. No artifact-upload capability — deploy triggers a configured pipeline only."
4
+ ---
5
+
6
+ # Blocks Release — Deployment
7
+
8
+ Trigger and read Release builds through `blocks release *`. This is **100% CLI, no SDK equivalent** — `@seliseblocks/client` (`createBlocksClient()`) exposes only `auth`, `data`, `iam`, and `localization`; there is no `release` namespace anywhere in the SDK. Never write a frontend/app-code path for this — it's always a terminal command.
9
+
10
+ **Prerequisite:** a project is selected (`blocks use <tenantId>`) and that project has a repo linked from the Blocks portal — see the blocks-onboarding skill. There is no local config file for release settings; `blocks init` only scaffolds `blocks/data/schemas/`, `blocks/data/rules.json`, and `.env.example` — it has no release-related output at all. `deploy` and `builds list` both resolve which repo to act on directly from the project's linked assets (see below), not from any file on disk.
11
+
12
+ ## Safe read commands
13
+
14
+ - **`blocks release status <buildId> [--json]`** — one build's status by id (positional arg, or `--build-id <id>`).
15
+ - **`blocks release builds get <buildId> [--json]`** — literally the same call as `release status`; it's a pure alias in the CLI's own source (`releaseBuildsGet` just calls `releaseStatus(argv)`), not a different endpoint or response shape. Use whichever name the user said.
16
+ - **`blocks release builds list [<repoId>] [--repo-id <repoId>] [--json]`** — all builds for one repository. `repoId` is optional: if omitted, the CLI auto-resolves it from the selected project's linked repo assets the same way `deploy` does (see "Resolving the repo" below) — **except** when more than one repo is linked, in which case it falls back to an interactive `selectFromList()` prompt instead of erring or guessing. That prompt has no stdin in a non-interactive/agent run and will hang — if you can't guarantee a human is watching the terminal, resolve and pass `--repo-id` explicitly instead of letting this fall through to the prompt (the same hang risk applies to `blocks new web`'s OIDC-client picker when `--client-id` is omitted — always resolve and pass required values explicitly rather than relying on an interactive fallback).
17
+
18
+ None of these mutate anything — safe to run without confirmation.
19
+
20
+ ## Mutating: trigger a deploy
21
+
22
+ ```bash
23
+ blocks release deploy --dry-run --json # show the exact request first
24
+ blocks release deploy --yes --json # only after the user approves
25
+ ```
26
+
27
+ There is **no `--repo-id` flag on `deploy`** — the repo is always resolved automatically (see below); passing `--repo-id` is not recognized by this command.
28
+
29
+ ### Resolving the repo
30
+
31
+ `deploy` never takes a repo id as input. It resolves one from the currently selected project's linked assets:
32
+
33
+ 1. It looks up the project's linked repo resources for the project's `tenantGroupId`.
34
+ 2. If exactly one repo is linked, that's the one used.
35
+ 3. If multiple are linked, it picks the one whose asset `name` matches the project's `environment` (case-insensitive); if none matches, it throws `repo_ambiguous`.
36
+ 4. If none are linked at all, it throws `repo_not_linked`.
37
+
38
+ ### Branch/environment safety check
39
+
40
+ Before building, `deploy` fetches the resolved repo's details to read its linked branch, then compares that branch to the project's `environment` (case-insensitive). If they don't match, it throws `branch_environment_mismatch` rather than building the wrong branch.
41
+
42
+ ### Error codes you may see
43
+
44
+ | Code | Meaning | Fix |
45
+ |---|---|---|
46
+ | `repo_not_linked` | No repo is linked to this project at all. | Link a repo from the Blocks portal (requires GitHub OAuth), then re-run. |
47
+ | `repo_ambiguous` | Multiple repos are linked and none is named for the project's `environment`. | Check the repo links for this project from the Blocks portal. |
48
+ | `repo_not_found` | The linked asset's repo id wasn't found in blocks-release when fetching repo details. | Check the repo link for this project from the Blocks portal. |
49
+ | `branch_environment_mismatch` | The linked repo's branch doesn't match the project's `environment` (e.g. repo is on `main` but environment is `staging`). Message states the branch found and the environment required. | Point the linked repo at a branch named for the environment, or relink the correct branch from the Blocks portal. |
50
+ | `build_wait_timeout` | Only with `--wait`: no terminal build status was seen before `--timeout` elapsed. | Check manually with `blocks release status <buildId>`. |
51
+
52
+ ### Optional flags
53
+
54
+ - **`--domain <domain>`** — before triggering the build, makes an extra call to set a custom deployment domain for this repo/environment.
55
+ - **`--wait`** — after triggering, polls the build status (by the returned `buildId`) every `--poll-interval` seconds until the status matches a terminal pattern (succeeded/success/completed/failed/error/cancelled/aborted/done, case-insensitive) or `--timeout` elapses (then throws `build_wait_timeout`).
56
+ - **`--poll-interval <seconds>`** — polling interval for `--wait`, default `10`.
57
+ - **`--timeout <seconds>`** — max time to wait for `--wait`, default `900`.
58
+
59
+ `--dry-run` prints the resolved `repoId`, `branch`, `environment`, `projectKey`, and (if given) `domain` — it does **not** build a request body from any local file, since none exists. The real request when not a dry run is simply `{ repoId }`. Always show the `--dry-run` output and get explicit approval before re-running with `--yes` — never skip straight to `--yes`.
60
+
61
+ ## Gotchas
62
+
63
+ - **No SDK path, ever.** If asked "how do I trigger a deploy from my app," the answer is: you don't — this is a CLI-only, human/CI-operated action, not something to wire into frontend code.
64
+ - **No artifact upload.** `release deploy` triggers a *configured* pipeline/repository build — it does not accept or upload a build artifact you hand it. If a user asks to "upload my build and deploy it," that capability doesn't exist in this CLI; say so rather than inventing an upload flag.
65
+ - **`release builds get` and `release status` are the same command.** Don't treat them as returning different data or document them separately — the CLI's own source has `builds get` call `release status` directly.
66
+ - **Release commands are project-scoped, not account-level.** `deploy`, `status`, and `builds list` all run on an impersonated project token, and `deploy`/`builds list` both resolve which project's linked assets to use from whichever project is currently selected via `blocks use`. Behavior changes if the selected project changes; there is no account-level/project-independent mode here.
67
+ - **`deploy` never takes a repo id from the user** — it's always auto-resolved from the project's linked assets, with a real branch/environment safety check before it will build. Don't offer or accept a `--repo-id` flag on `deploy`.
68
+ - **`builds list --repo-id` is optional, not required** — it falls back to the same auto-resolve logic as `deploy`, but that fallback can hit an interactive prompt if multiple repos are linked. Pass `--repo-id` explicitly in any non-interactive/agent context to avoid the hang.
69
+ - **`buildId` for `status`/`builds get` is always required**, never guessed — ask the user rather than assuming a value.
70
+ - **`--dry-run` before `--yes`, always** — same discipline as every other mutating `blocks` command in this pack.
71
+
72
+ ## Example trigger prompts
73
+
74
+ - "Deploy this project's configured release."
75
+ - "Trigger a build for the linked repo."
76
+ - "Check the status of build `<buildId>`."
77
+ - "Did my last deploy finish? Look up build `<buildId>`."
78
+ - "List the recent builds for this repo."
79
+ - "Deploy and wait until it finishes." → add `--wait` (optionally `--poll-interval`/`--timeout`).
80
+ - "Deploy this to a custom domain." → add `--domain <domain>`.
81
+ - "Can you upload my compiled artifact and deploy it?" → not supported; explain there's no artifact-upload path, only triggering the repo's configured pipeline.
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: blocks-secrets
3
+ description: "Save and retrieve arbitrary named secret values (e.g. captcha provider config, third-party API keys) for a SELISE Blocks project via the blocks CLI's `secrets get`/`secrets save` commands, project-scoped with an impersonated project token. CLI-only surface, no SDK equivalent by design. Storage is generic key/value — shape depends entirely on the secret key, not fixed per type. Use for saving/rotating a secret's key-value pairs or reading one back. `get`'s response is the raw, unredacted value — treat CLI output as sensitive."
4
+ ---
5
+
6
+ # Blocks Secrets
7
+
8
+ This skill manages **generic tenant secret storage** — arbitrary named secret values scoped to a project, via the `blocks secrets *` CLI. It is not tied to any one feature: a project can store a `captcha` secret, an `smtp` secret, or anything else under whatever `secretKey` name it chooses. The shape of the stored value is a flat, caller-defined JSON object (`--key-value-pairs`) — there is no fixed schema across secrets.
9
+
10
+ **CLI-only, no SDK path, by explicit design.** There is no `@seliseblocks/client` method anywhere for reading or writing tenant secrets (the SDK's only "secret" surfaces are unrelated: MFA enrollment secrets and OIDC `clientSecret`). If a user wants to store or fetch a project secret, `blocks secrets get`/`blocks secrets save` is the only path — don't suggest an SDK call for this.
11
+
12
+ **Prerequisite:** a project is selected (`blocks use <tenantId>`). If login/project state is unknown, run the blocks-onboarding skill first.
13
+
14
+ ## Command family
15
+
16
+ Both commands require an **impersonated project token** — there is no account-token path, consistent with `storage config *` and other project-scoped admin surfaces.
17
+
18
+ | Command | What it does |
19
+ |---|---|
20
+ | `blocks secrets get <secretKey>` | `<secretKey>` positional, or `--secret-key` (required if no positional). Also takes `--page-number` (default `0`) / `--page-size` (default `10`). Read-only. Response is untyped and printed as-is — **not redacted** (see Gotchas). |
21
+ | `blocks secrets save` | Upsert — create or update. Mutating; standard `--dry-run`/`--yes` discipline applies. |
22
+
23
+ ```bash
24
+ blocks secrets get captcha --json
25
+ blocks secrets get --secret-key captcha --page-size 25 --json
26
+ ```
27
+
28
+ The `secretKey` positional argument wins over `--secret-key` if both are somehow given; only one is required. The paging flags imply the response can be a paged list of items filed under that `secretKey`, not necessarily a single flat value — confirm actual shape from what the call returns rather than assuming a single-object response.
29
+
30
+ ## `secrets save` — fields
31
+
32
+ `save` builds its request body from `--body`/`--file` (a raw JSON object, applied first) merged with these convenience flags (applied second, so they win if both are given):
33
+
34
+ | Flag | Body field |
35
+ |---|---|
36
+ | `--secret-key` | `secretKey` |
37
+ | `--item-id` | `itemId` |
38
+ | `--key-value-pairs` | `keyValuePairs` |
39
+
40
+ `--key-value-pairs` takes a JSON **object** string (e.g. `'{"isEnable":"true"}'`) — the CLI rejects arrays or non-objects with `--key-value-pairs must be a JSON object`. Unset convenience flags are dropped, so they never overwrite a field already present in `--body`/`--file`.
41
+
42
+ ```bash
43
+ blocks secrets save --secret-key captcha \
44
+ --key-value-pairs '{"isEnable":"true","provider":"recaptcha","captchaKey":"...","captchaSecret":"..."}' \
45
+ --dry-run --json
46
+
47
+ blocks secrets save --secret-key captcha \
48
+ --key-value-pairs '{"isEnable":"true","provider":"recaptcha","captchaKey":"...","captchaSecret":"..."}' \
49
+ --yes --json
50
+
51
+ # Update an existing secret record
52
+ blocks secrets save --secret-key captcha --item-id <itemId> --key-value-pairs '{...}' --yes --json
53
+ ```
54
+
55
+ `save` is create-or-update in one command: omit `--item-id` to create, pass it to update. The captcha example above is only an illustration — `--key-value-pairs` accepts whatever fields the caller's `secretKey` namespace needs.
56
+
57
+ ## `--dry-run` before `--yes` — always
58
+
59
+ `save` follows the standard `blocks` mutation discipline: passing neither `--dry-run` nor `--yes` drops into an interactive "Type 'yes' to continue" prompt, which is not viable in a scripted/agent context — always pass one explicitly.
60
+
61
+ - `--dry-run` short-circuits **before** the confirmation prompt and **before any network call**: it prints the resolved request, with a redacted body, and returns.
62
+ - `--yes` skips the interactive prompt and sends the real request.
63
+
64
+ The dry-run preview's redaction is narrow: it walks `keyValuePairs` only, and replaces the *value* of any entry whose *key* matches a secret-shaped pattern (case-insensitive, e.g. ends in "key," or contains "secret"/"password") with `"***"`. It does **not** touch `secretKey`/`itemId` at the top level, and does **not** touch anything injected via `--body`/`--file` outside `keyValuePairs`. This redaction is preview-only — it never changes what is actually sent when `--yes` is used, and it has no effect on `secrets get`'s response or on the live response from `save` itself.
65
+
66
+ ## Gotchas (secret-handling — read before running either command)
67
+
68
+ - **`get`'s response is raw and completely unredacted.** The command applies zero masking — the result is passed straight through and printed verbatim. There is no masked/redacted variant of this command. Whatever is stored under that `secretKey` comes back in full, as-is. Treat the output as sensitive: don't repeat the value back to the user beyond what they explicitly asked for, don't paste it into chat/logs/tickets, and never write it into a file that could get committed.
69
+ - **`save`'s live response is also unredacted.** The dry-run preview masks secret-shaped `keyValuePairs` keys, but that's a preview-only convenience. The actual request always sends plaintext values, and whatever comes back is written unredacted too — if the API echoes the saved value back, handle that response with the same care as `get`'s.
70
+ - **This is generic storage, not a captcha-specific feature.** `--key-value-pairs` is a flat JSON object whose fields are entirely defined by whoever picked the `secretKey` — there's no schema registry. Don't assume `isEnable`/`provider`/`captchaKey`/`captchaSecret` apply to a secret that isn't actually a captcha config.
71
+ - **Impersonated project token only, no account-token path.** Both commands require a selected project (`blocks use <tenantId>`) first — same pattern as `storage config *`.
72
+ - **No SDK equivalent exists.** Don't reach for `@seliseblocks/client` for this; the CLI is the only surface, by design.
73
+ - **`save` is upsert, not two verbs.** Whether a call creates or updates is decided by the presence of `--item-id`, not by a different command name.
74
+
75
+ ## Example trigger prompts
76
+
77
+ - "Save our reCAPTCHA settings as a project secret." → `secrets save --secret-key captcha --key-value-pairs '{...}' --dry-run --json`, confirm, then re-run with `--yes`.
78
+ - "What's stored under the `captcha` secret?" → `secrets get captcha --json` — tell the user the raw stored value will be printed, and don't restate it beyond what they asked for.
79
+ - "Rotate the captcha secret key." → `secrets save --secret-key captcha --item-id <itemId> --key-value-pairs '{...}' --yes --json` (update path — need the existing `itemId`, typically from a prior `secrets get`).
80
+ - "Is there a way to list every secret in the project?" → there's no list-all; `secrets get` requires a `secretKey` and pages within it (`--page-number`/`--page-size`), it doesn't enumerate unknown keys.
81
+ - "Can I read this from my frontend app with the SDK?" → no — `blocks secrets *` is CLI/admin-only; don't scaffold an SDK call, and never put a secret value into frontend code or a committed `.env` file.
@@ -0,0 +1,93 @@
1
+ ---
2
+ name: blocks-storage-configuration
3
+ description: "Configure which storage provider (Azure Blob, S3, or local disk) backs a SELISE Blocks project's files: named configurations with host, port, credentials, region/endpoint or connection string, and strategy, via the blocks CLI ('storage config get/list/save/delete'), project-scoped with an impersonated project token. CLI-only admin surface, no SDK equivalent. Use for set up a storage provider, list/inspect storage configs, rotate storage credentials, switch to local storage, delete a config. Uploading/downloading files once configured is blocks-data-storage's job."
4
+ ---
5
+
6
+ # Blocks Storage — Configuration
7
+
8
+ This skill manages the **storage configuration record itself** — which cloud provider (or local disk) a named configuration points at, and the connection details needed to reach it. It does not upload, download, or browse files; that's a separate, project-scoped runtime concern handled by the sibling blocks-data-storage skill (`blocks data files *` CLI, or the SDK's `data.files`/`data.dms` at runtime).
9
+
10
+ **CLI-only, no SDK path.** There is no `@seliseblocks/client` method for reading or writing a storage configuration's own fields — the SDK's role in this area starts *after* a configuration exists (it takes a `configurationName` and uploads/downloads against whatever that config points at). If a user wants to set up, inspect, or change a storage provider, that's this skill's `blocks storage config *` commands; if they want to move bytes, hand off to blocks-data-storage.
11
+
12
+ **Prerequisite:** a project is selected (`blocks use <tenantId>`). If login/project state is unknown, run the blocks-onboarding skill first.
13
+
14
+ ## Command family
15
+
16
+ All four commands require an **impersonated project token** — there is no account-token path for this surface, consistent with other project-scoped admin commands (`secrets *`, `data config *`, etc.).
17
+
18
+ | Command | Notes |
19
+ |---|---|
20
+ | `blocks storage config list` | No parameters beyond the selected project. Read-only. |
21
+ | `blocks storage config get <name>` | `<name>` (positional) or `--name` (required if no positional arg). Read-only. |
22
+ | `blocks storage config save` | Upsert — create or update a configuration. Mutating. |
23
+ | `blocks storage config delete <name>` | `<name>` (positional) or `--name` (required if no positional arg). Mutating. |
24
+
25
+ ```bash
26
+ blocks storage config list --json
27
+ blocks storage config get Default --json
28
+ blocks storage config get --name Default --json
29
+ ```
30
+
31
+ ## `storage config save` — fields
32
+
33
+ `save` builds its request body from `--body`/`--file` (a raw JSON object, spread first) merged with these convenience flags (later, so they win if both are given):
34
+
35
+ | Flag | Body field |
36
+ |---|---|
37
+ | `--name` | `name` |
38
+ | `--item-id` | `itemId` |
39
+ | `--strategy` | `storageStrategy` |
40
+ | `--host` | `host` |
41
+ | `--port` | `port` |
42
+ | `--region-endpoint` | `cloudStorageRegionEndPoint` |
43
+ | `--connection-string` | `connectionString` |
44
+ | `--access-key` | `accessKey` |
45
+ | `--secret-key` | `secretKey` |
46
+ | `--username` | `userName` |
47
+ | `--password` | `password` |
48
+ | `--remote-base-path` | `remoteBasePath` |
49
+ | `--update` (boolean) | `updateRequest` |
50
+
51
+ Unset flags are dropped (`compact`), so they never overwrite fields already present in a `--body`/`--file` payload. `save` is a create-or-update in one command, not two separate verbs — pass `--item-id` (and typically `--update`) when modifying an existing configuration, omit it to create a new one.
52
+
53
+ ```bash
54
+ blocks storage config save --name Default --strategy AzureBlob \
55
+ --host mystorageaccount.blob.core.windows.net --region-endpoint eu-west-1 \
56
+ --access-key <key> --secret-key <secret> --dry-run --json
57
+ blocks storage config save --name Default --strategy AzureBlob \
58
+ --host mystorageaccount.blob.core.windows.net --region-endpoint eu-west-1 \
59
+ --access-key <key> --secret-key <secret> --yes --json
60
+
61
+ # Update an existing configuration
62
+ blocks storage config save --item-id <id> --update --connection-string "<new connection string>" --dry-run --json
63
+ blocks storage config save --item-id <id> --update --connection-string "<new connection string>" --yes --json
64
+ ```
65
+
66
+ ## `--dry-run` before `--yes` — always
67
+
68
+ Both mutating commands (`save`, `delete`) follow the standard `blocks` mutation discipline: `--dry-run` prints what would be sent and returns without calling the API; `--yes` skips the interactive confirmation prompt and sends the request for real. Omitting both drops into an interactive "Type 'yes' to continue" prompt — not viable in a scripted/agent context, so always pass one or the other explicitly.
69
+
70
+ ```bash
71
+ blocks storage config delete Default --dry-run --json
72
+ blocks storage config delete Default --yes --json
73
+ ```
74
+
75
+ `save`'s dry-run output redacts secret-shaped fields before printing (`accessKey`, `connectionString`, `password`, `secretKey` become `"***"`) — this redaction is **dry-run-preview only**, it does not change what's actually sent when you run with `--yes`, and it doesn't apply to `get`/`list` responses (see Gotchas).
76
+
77
+ ## Gotchas
78
+
79
+ - **`get`/`list` are not redacted.** Only `save --dry-run`'s own preview output redacts `accessKey`/`connectionString`/`password`/`secretKey`. If a `get`/`list` response ever echoes credential fields back, treat that output as sensitive — don't paste it into logs, tickets, or chat verbatim.
80
+ - **`save` is upsert, not separate create/update commands.** Whether a call creates or updates is determined by whether `--item-id` is present, not by a different command name.
81
+ - **This is provider configuration, not file operations.** `blocks storage config *` never touches an actual file's bytes. For "upload a file," "get a download link," "list a folder" — that's **blocks-data-storage** (`blocks data files *` or the SDK), using a `configurationName` that a `storage config` record already defines.
82
+ - **No positional-or-flag ambiguity trap:** `get`/`delete` accept the configuration name as either the first positional argument or `--name`; only one is required, not both.
83
+ - **Impersonated project token only.** Like `secrets *` and `data config *`, none of these four commands run against the account token — a project must be selected first (`blocks use <tenantId>`).
84
+
85
+ ## Example trigger prompts
86
+
87
+ - "Set up Azure Blob storage for this project." → `storage config save --strategy AzureBlob ...`.
88
+ - "What storage configurations exist on this project?" → `storage config list`.
89
+ - "Show me the `Default` storage configuration." → `storage config get Default`.
90
+ - "Rotate the access key on our storage config." → `storage config save --item-id <id> --update --access-key <new key> ...`.
91
+ - "Switch this project to local storage." → `storage config save --strategy <local strategy value> --host ... --port ...` (confirm the exact strategy value expected by the project rather than guessing).
92
+ - "Delete this storage configuration, we don't use it anymore." → `storage config delete <name>`.
93
+ - "How do I actually upload a file once storage is configured?" → hand off to **blocks-data-storage**, not this skill.