@seliseblocks/cli-os 0.2.2 → 0.2.4

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 (33) hide show
  1. package/AI_USAGE_GUIDE.md +20 -15
  2. package/README.md +5 -5
  3. package/dist/commands/auth/idp/create.d.ts +7 -0
  4. package/dist/commands/auth/idp/create.js +22 -3
  5. package/dist/commands/auth/idp/update.d.ts +7 -0
  6. package/dist/commands/auth/idp/update.js +22 -3
  7. package/dist/commands/data/files/delete.js +5 -4
  8. package/dist/commands/data/files/get-many.js +1 -1
  9. package/dist/commands/data/files/get.js +1 -1
  10. package/dist/commands/data/files/info.js +1 -1
  11. package/dist/commands/data/files/object-tree.d.ts +23 -0
  12. package/dist/commands/data/files/object-tree.js +238 -0
  13. package/dist/commands/data/files/presigned-upload-url.js +9 -2
  14. package/dist/commands/data/files/update-additional-info.js +2 -2
  15. package/dist/commands/data/files/upload-to-local-storage.js +2 -2
  16. package/dist/commands/data/files/upload.d.ts +2 -4
  17. package/dist/commands/data/files/upload.js +14 -28
  18. package/dist/commands/new/web.js +4 -0
  19. package/dist/index.js +100 -42
  20. package/dist/skills/blocks-data-storage/SKILL.md +194 -102
  21. package/dist/skills/blocks-data-storage/flows/object-management.md +124 -0
  22. package/dist/skills/blocks-iam-sso-oidc-configuration/SKILL.md +25 -9
  23. package/dist/skills/blocks-onboarding/SKILL.md +2 -2
  24. package/dist/skills/blocks-storage-configuration/SKILL.md +93 -93
  25. package/package.json +1 -1
  26. package/dist/commands/data/files/create-folder.d.ts +0 -1
  27. package/dist/commands/data/files/create-folder.js +0 -34
  28. package/dist/commands/data/files/delete-folder.d.ts +0 -1
  29. package/dist/commands/data/files/delete-folder.js +0 -25
  30. package/dist/commands/data/files/dms-list.d.ts +0 -1
  31. package/dist/commands/data/files/dms-list.js +0 -27
  32. package/dist/commands/data/files/dms-upload.d.ts +0 -6
  33. package/dist/commands/data/files/dms-upload.js +0 -41
@@ -16,7 +16,7 @@ export async function dataFilesUploadToLocalStorage(argv) {
16
16
  const name = stringFlag(flags, "name") || basename(filePath);
17
17
  const additionalPropertiesRaw = stringFlag(flags, "additional-properties");
18
18
  if (booleanFlag(flags, "dry-run")) {
19
- writeOutput({ dryRun: true, endpoint: "/data/v4/Files/UploadFileToLocalStorage", name, request: { file: filePath } }, flags);
19
+ writeOutput({ dryRun: true, endpoint: "/data/v4/files/upload-file-to-local-storage", name, request: { file: filePath } }, flags);
20
20
  return;
21
21
  }
22
22
  await confirmMutation(flags, `Upload '${filePath}' to local storage as '${name}'.`);
@@ -45,7 +45,7 @@ export async function dataFilesUploadToLocalStorage(argv) {
45
45
  form.set(`AdditionalProperties[${key}]`, value);
46
46
  }
47
47
  const projectKey = await selectedProject(flags);
48
- const result = await blocksRequest("/data/v4/Files/UploadFileToLocalStorage", {
48
+ const result = await blocksRequest("/data/v4/files/upload-file-to-local-storage", {
49
49
  body: form,
50
50
  impersonatedProjectAuth: true,
51
51
  ...requestContext(flags),
@@ -1,7 +1,5 @@
1
1
  /**
2
- * Composed upload: give it a local file, it runs the right sequence of API calls itself --
3
- * presign + PUT + DMS-register for cloud storage (--local-storage for the single-call
4
- * local-storage path) -- instead of you chaining presigned-upload-url/upload-to-url/dms-upload
5
- * (or upload-to-local-storage) by hand.
2
+ * Composed upload: create the file/version metadata and PUT cloud bytes, or use the
3
+ * one-call local-storage path. The upload is immediately part of the object tree.
6
4
  */
7
5
  export declare function dataFilesUpload(argv: string[]): Promise<void>;
@@ -3,7 +3,7 @@ import { basename, extname } from "node:path";
3
3
  import { booleanFlag, optionalIntegerFlag, stringFlag } from "../../../lib/args.js";
4
4
  import { blocksRequest } from "../../../lib/api.js";
5
5
  import { confirmMutation } from "../../../lib/confirm.js";
6
- import { compact, listFlag } from "../../../lib/json-flag.js";
6
+ import { compact } from "../../../lib/json-flag.js";
7
7
  import { writeOutput } from "../../../lib/output.js";
8
8
  import { requestContext } from "../../../lib/request-context.js";
9
9
  import { parseCommand, selectedProject } from "../../../lib/workspace.js";
@@ -25,10 +25,8 @@ const CONTENT_TYPES = {
25
25
  ".zip": "application/zip"
26
26
  };
27
27
  /**
28
- * Composed upload: give it a local file, it runs the right sequence of API calls itself --
29
- * presign + PUT + DMS-register for cloud storage (--local-storage for the single-call
30
- * local-storage path) -- instead of you chaining presigned-upload-url/upload-to-url/dms-upload
31
- * (or upload-to-local-storage) by hand.
28
+ * Composed upload: create the file/version metadata and PUT cloud bytes, or use the
29
+ * one-call local-storage path. The upload is immediately part of the object tree.
32
30
  */
33
31
  export async function dataFilesUpload(argv) {
34
32
  const { flags } = parseCommand(argv);
@@ -43,7 +41,7 @@ export async function dataFilesUpload(argv) {
43
41
  async function uploadToLocalStorage(filePath, name, flags) {
44
42
  const parentDirectoryId = stringFlag(flags, "parent-id") || stringFlag(flags, "parent-directory-id");
45
43
  if (booleanFlag(flags, "dry-run")) {
46
- writeOutput({ dryRun: true, endpoint: "/data/v4/Files/UploadFileToLocalStorage", file: filePath, name }, flags);
44
+ writeOutput({ dryRun: true, endpoint: "/data/v4/files/upload-file-to-local-storage", file: filePath, name }, flags);
47
45
  return;
48
46
  }
49
47
  await confirmMutation(flags, `Upload '${filePath}' to local storage as '${name}'.`);
@@ -52,6 +50,9 @@ async function uploadToLocalStorage(filePath, name, flags) {
52
50
  form.set("Name", name);
53
51
  if (parentDirectoryId)
54
52
  form.set("ParentDirectoryId", parentDirectoryId);
53
+ const itemId = stringFlag(flags, "item-id");
54
+ if (itemId)
55
+ form.set("ItemId", itemId);
55
56
  const tags = stringFlag(flags, "tags");
56
57
  if (tags)
57
58
  form.set("Tags", tags);
@@ -62,7 +63,7 @@ async function uploadToLocalStorage(filePath, name, flags) {
62
63
  if (configurationName)
63
64
  form.set("ConfigurationName", configurationName);
64
65
  const projectKey = await selectedProject(flags);
65
- const result = await blocksRequest("/data/v4/Files/UploadFileToLocalStorage", {
66
+ const result = await blocksRequest("/data/v4/files/upload-file-to-local-storage", {
66
67
  body: form,
67
68
  impersonatedProjectAuth: true,
68
69
  ...requestContext(flags),
@@ -77,6 +78,7 @@ async function uploadViaPresignedUrl(filePath, name, flags) {
77
78
  const presignBody = compact({
78
79
  accessModifier: stringFlag(flags, "access-modifier") || undefined,
79
80
  configurationName: stringFlag(flags, "configuration-name") || undefined,
81
+ itemId: stringFlag(flags, "item-id") || undefined,
80
82
  metaData: stringFlag(flags, "meta-data") || undefined,
81
83
  moduleName: optionalIntegerFlag(flags, "module-name"),
82
84
  name,
@@ -87,16 +89,15 @@ async function uploadViaPresignedUrl(filePath, name, flags) {
87
89
  writeOutput({
88
90
  dryRun: true,
89
91
  steps: [
90
- { body: presignBody, endpoint: "/data/v4/Files/GetPreSignedUrlForUpload" },
91
- { contentType, endpoint: "PUT <uploadUrl>", file: filePath },
92
- { endpoint: "/data/v4/Files/UploadFile" }
92
+ { body: presignBody, endpoint: "/data/v4/files/get-pre-signed-url-for-upload" },
93
+ { contentType, endpoint: "PUT <uploadUrl>", file: filePath }
93
94
  ]
94
95
  }, flags);
95
96
  return;
96
97
  }
97
- await confirmMutation(flags, `Upload '${filePath}' as '${name}' (presign + PUT + DMS register).`);
98
+ await confirmMutation(flags, `Upload '${filePath}' as '${name}' (create metadata + PUT bytes).`);
98
99
  const projectKey = await selectedProject(flags);
99
- const presigned = await blocksRequest("/data/v4/Files/GetPreSignedUrlForUpload", {
100
+ const presigned = await blocksRequest("/data/v4/files/get-pre-signed-url-for-upload", {
100
101
  body: presignBody,
101
102
  impersonatedProjectAuth: true,
102
103
  ...requestContext(flags),
@@ -118,22 +119,7 @@ async function uploadViaPresignedUrl(filePath, name, flags) {
118
119
  if (!putResponse.ok) {
119
120
  throw new Error(`Upload PUT ${putResponse.status} ${putResponse.statusText}: ${await putResponse.text().catch(() => "")}`);
120
121
  }
121
- const registered = await blocksRequest("/data/v4/Files/UploadFile", {
122
- body: {
123
- upload: [
124
- compact({
125
- artifactName: name,
126
- fileStorageId: fileId,
127
- parentId: parentDirectoryId || undefined,
128
- tags: listFlag(flags, "tags")
129
- })
130
- ]
131
- },
132
- impersonatedProjectAuth: true,
133
- ...requestContext(flags),
134
- projectTenantId: projectKey
135
- });
136
- writeOutput({ fileId, registered, uploadUrl }, flags);
122
+ writeOutput({ fileId, uploadUrl, uploaded: true }, flags);
137
123
  }
138
124
  function firstString(record, keys) {
139
125
  for (const key of keys) {
@@ -132,8 +132,12 @@ async function createOidcClientInteractively(tenantId, appDomain, appName, flags
132
132
  const defaultRedirect = `https://${appDomain}/login/callback`;
133
133
  const displayName = (await promptText(`OIDC client display name [${appName}]: `)) || appName;
134
134
  const redirectUri = (await promptText(`Redirect URI [${defaultRedirect}]: `)) || defaultRedirect;
135
+ // clientType drives IAM's tokenEndpointAuthMethod: omitting it stores this browser
136
+ // app as confidential ("client_secret_post") and lets it request client_credentials.
137
+ // The scaffold only ever produces a PKCE SPA, so it is always "public".
135
138
  const body = {
136
139
  clientDisplayName: displayName,
140
+ clientType: "public",
137
141
  isActive: true,
138
142
  redirectUris: [redirectUri],
139
143
  registerAsIdentityProvider: true,
package/dist/index.js CHANGED
@@ -31,11 +31,7 @@ import { dataValidationDelete } from "./commands/data/validation/delete.js";
31
31
  import { dataValidationGet } from "./commands/data/validation/get.js";
32
32
  import { dataValidationList } from "./commands/data/validation/list.js";
33
33
  import { dataValidationSave } from "./commands/data/validation/save.js";
34
- import { dataFilesCreateFolder } from "./commands/data/files/create-folder.js";
35
34
  import { dataFilesDelete } from "./commands/data/files/delete.js";
36
- import { dataFilesDeleteFolder } from "./commands/data/files/delete-folder.js";
37
- import { dataFilesDmsList } from "./commands/data/files/dms-list.js";
38
- import { dataFilesDmsUpload } from "./commands/data/files/dms-upload.js";
39
35
  import { dataFilesGet } from "./commands/data/files/get.js";
40
36
  import { dataFilesGetMany } from "./commands/data/files/get-many.js";
41
37
  import { dataFilesInfo } from "./commands/data/files/info.js";
@@ -44,6 +40,7 @@ import { dataFilesUpdateAdditionalInfo } from "./commands/data/files/update-addi
44
40
  import { dataFilesUpload } from "./commands/data/files/upload.js";
45
41
  import { dataFilesUploadToLocalStorage } from "./commands/data/files/upload-to-local-storage.js";
46
42
  import { dataFilesUploadToUrl } from "./commands/data/files/upload-to-url.js";
43
+ import { dataFilesAccessGrant, dataFilesAccessList, dataFilesAccessResolve, dataFilesAccessRevoke, dataFilesAccessUpdate, dataFilesCopy, dataFilesCreateVersion, dataFilesDirectoryCreate, dataFilesDirectoryDelete, dataFilesDirectoryGet, dataFilesDirectoryMove, dataFilesDirectoryUpdate, dataFilesInheritance, dataFilesList, dataFilesMove, dataFilesPurge, dataFilesRename, dataFilesRestore, dataFilesSearch, dataFilesShare, dataFilesShared, dataFilesTrash, dataFilesVersions } from "./commands/data/files/object-tree.js";
47
44
  import { iamMe } from "./commands/iam/me.js";
48
45
  import { init } from "./commands/init.js";
49
46
  import { localizationAssistantTranslationSuggestion } from "./commands/localization/assistant/translation-suggestion.js";
@@ -243,10 +240,29 @@ const commands = {
243
240
  "data:files:upload-to-local-storage": dataFilesUploadToLocalStorage,
244
241
  "data:files:update-additional-info": dataFilesUpdateAdditionalInfo,
245
242
  "data:files:delete": dataFilesDelete,
246
- "data:files:dms-list": dataFilesDmsList,
247
- "data:files:dms-upload": dataFilesDmsUpload,
248
- "data:files:create-folder": dataFilesCreateFolder,
249
- "data:files:delete-folder": dataFilesDeleteFolder,
243
+ "data:files:list": dataFilesList,
244
+ "data:files:search": dataFilesSearch,
245
+ "data:files:trash": dataFilesTrash,
246
+ "data:files:shared": dataFilesShared,
247
+ "data:files:restore": dataFilesRestore,
248
+ "data:files:purge": dataFilesPurge,
249
+ "data:files:directory-create": dataFilesDirectoryCreate,
250
+ "data:files:directory-get": dataFilesDirectoryGet,
251
+ "data:files:directory-update": dataFilesDirectoryUpdate,
252
+ "data:files:directory-delete": dataFilesDirectoryDelete,
253
+ "data:files:directory-move": dataFilesDirectoryMove,
254
+ "data:files:versions": dataFilesVersions,
255
+ "data:files:create-version": dataFilesCreateVersion,
256
+ "data:files:copy": dataFilesCopy,
257
+ "data:files:move": dataFilesMove,
258
+ "data:files:rename": dataFilesRename,
259
+ "data:files:access-list": dataFilesAccessList,
260
+ "data:files:access-grant": dataFilesAccessGrant,
261
+ "data:files:access-update": dataFilesAccessUpdate,
262
+ "data:files:access-revoke": dataFilesAccessRevoke,
263
+ "data:files:access-resolve": dataFilesAccessResolve,
264
+ "data:files:inheritance": dataFilesInheritance,
265
+ "data:files:share": dataFilesShare,
250
266
  "localization:validate": localizationValidate,
251
267
  "localization:push": localizationPush,
252
268
  "localization:pull": localizationPull,
@@ -753,12 +769,24 @@ Auth Admin (/iam/v4/auth/identity-providers*, /config, /client-credentials, /oid
753
769
  blocks auth idp create --provider <p> --provider-type <t> --protocol <proto>
754
770
  --client-id <id> [--client-secret] [--display-name] [--issuer]
755
771
  [--scope] [--redirect-uris a,b] [--active]
772
+ [--authorization-url] [--token-url] [--user-info-url]
773
+ [--jwks-uri] [--well-known-url] [--response-type]
774
+ [--grant-types a,b] [--require-pkce]
775
+ [--token-endpoint-auth-method] [--initial-roles a,b]
776
+ [--initial-permissions a,b] [--icon]
756
777
  [--body '<json>'|--file <path>] [--dry-run] [--yes] [--json]
757
- Rich provider configs (JWKS, private keys, initial roles, etc.) go in --body/--file;
758
- the flags above cover the common OAuth/OIDC fields.
778
+ Apple-specific fields (teamId, keyId, privateKey, appleAudience) go in --body/--file
779
+ so no private key lands in shell history.
780
+ IAM's create endpoint stores issuer/jwksUri/wellKnownUrl but drops
781
+ authorizationUrl/tokenUrl/userInfoUrl -- set those with 'idp update' afterward.
759
782
  blocks auth idp update <id> [same flags as create, all optional] [--dry-run] [--yes] [--json]
760
783
  provider/providerType/protocol/clientId are immutable: omit them, or echo the
761
784
  existing values exactly if you also pass --body/--file.
785
+ The only endpoint that persists authorizationUrl/tokenUrl/userInfoUrl -- create accepts
786
+ and drops them, and update never re-runs discovery, so values set here stick. Use it to
787
+ repair a provider whose authorizationUrl came back null: '/idp/initiate' builds its
788
+ redirect from that field, so hosted login goes nowhere without it. Read the endpoint
789
+ values from the tenant's discovery document rather than composing them by hand.
762
790
  blocks auth idp delete <id> [--dry-run] [--yes] [--json]
763
791
  Irreversible; also deletes the related OIDC client registration.
764
792
  blocks auth idp status <id> --active|--active=false [--dry-run] [--yes] [--json]
@@ -795,6 +823,14 @@ Auth Admin (/iam/v4/auth/identity-providers*, /config, /client-credentials, /oid
795
823
  [--body '<json>'|--file <path>] [--dry-run] [--yes] [--json]
796
824
  Upsert: omit --item-id to register a new client, pass it to update an existing one.
797
825
  The response's client_secret is shown once and is not retrievable again afterward.
826
+ --client-type is not optional in practice: IAM derives tokenEndpointAuthMethod from it,
827
+ so omitting it stores a browser/SPA client as confidential ("client_secret_post") and
828
+ lets it request the client_credentials grant. Pass --client-type public for any
829
+ PKCE/browser client.
830
+ --register-as-identity-provider creates the linked identity provider in the same call.
831
+ Its authorize/token/userinfo/jwks/issuer values are filled from the discovery document
832
+ at --external-discovery-endpoint; with no discovery endpoint they are left null and the
833
+ provider's scope is replaced with "openid profile email". Verify with 'auth idp list'.
798
834
  blocks auth oidc-clients delete <clientId> [--dry-run] [--yes] [--json]
799
835
  Irreversible; revokes all tokens issued to the client.
800
836
  blocks auth oidc-clients rotate-secret <clientId> [--dry-run] [--yes] [--json]
@@ -890,26 +926,22 @@ Data:
890
926
  Upsert: omit --item-id to create, pass it to update.
891
927
  blocks data validation delete <validationId> [--dry-run] [--yes] [--json]
892
928
 
893
- Files / DMS (/data/v4/Files/* - storage and document management; no SDK required, but see
894
- the blocks-data-storage skill if writing this into app code instead of scripting it):
929
+ Storage object tree (files, directories, discovery, trash, versions, and access):
895
930
  blocks data files get <fileId> [--version] [--configuration-name] [--json]
896
931
  blocks data files get-many <fileId...>|--file-ids a,b [--configuration-name] [--json]
897
932
  blocks data files info [--name] [--tenant-id] [--page] [--page-size] [--sort-by]
898
933
  [--sort-desc] [--json]
899
- blocks data files upload --file <localPath> [--name] [--parent-id] [--tags]
934
+ blocks data files upload --file <localPath> [--name] [--item-id] [--parent-id] [--tags]
900
935
  [--access-modifier Public|Private] [--content-type]
901
936
  [--configuration-name] [--module-name <1-11>] [--local-storage]
902
937
  [--dry-run] [--yes] [--json]
903
- Composed flow: presigned-upload-url -> PUT the file -> dms-upload, threading the
904
- returned uploadUrl/fileId automatically (content-type is inferred from the file
905
- extension if omitted). Pass --local-storage to use the one-call
906
- upload-to-local-storage path instead, for local-storage-backed projects.
907
- blocks data files presigned-upload-url --name <fileName> [--parent-directory-id]
938
+ Cloud: create file/version metadata, then PUT bytes to the returned URL. Local:
939
+ one multipart request. The file appears in the object tree without registration.
940
+ blocks data files presigned-upload-url --name <fileName> [--item-id] [--parent-directory-id]
908
941
  [--access-modifier Public|Private] [--configuration-name]
909
942
  [--module-name <1-11>] [--meta-data] [--tags]
910
- [--body '<json>'|--file <path>] [--json]
911
- Cloud-storage upload, step 1 of 2. Returns an uploadUrl and fileId; PUT the bytes next
912
- with data files upload-to-url.
943
+ [--body '<json>'|--file <path>] [--dry-run] [--yes] [--json]
944
+ Mutating cloud step 1: creates metadata/version and returns uploadUrl/fileId.
913
945
  blocks data files upload-to-url --url <presignedUrl> --file <localPath>
914
946
  --content-type <type> [--blob-type BlockBlob] [--no-blob-type-header]
915
947
  [--dry-run] [--yes] [--json]
@@ -922,18 +954,44 @@ Data:
922
954
  blocks data files update-additional-info <itemId> --additional-properties '<json>'
923
955
  [--dry-run] [--yes] [--json]
924
956
  blocks data files delete <fileId> [--configuration-name] [--event-queue-name]
957
+ [--permanent]
958
+ [--dry-run] [--yes] [--json]
959
+ Defaults to moving the file to trash; --permanent removes bytes and metadata.
960
+ blocks data files list [--parent-id] [--module-name <1-11>] [--type directory|file]
961
+ [--search] [--cursor] [--limit 1-200] [--json]
962
+ blocks data files search <query> [--directory-id] [--type directory|file]
963
+ [--cursor] [--limit 1-200] [--json]
964
+ blocks data files trash|shared [--type directory|file] [--cursor] [--limit] [--json]
965
+ blocks data files restore <resourceId> [--dry-run] [--yes] [--json]
966
+ blocks data files purge <resourceId> [--dry-run] [--yes] [--json]
967
+ blocks data files directory-create <name> [--parent-id] [--module-name]
968
+ [--description] [--allowed-extensions pdf,docx]
969
+ [--dry-run] [--yes] [--json]
970
+ blocks data files directory-get <directoryId> [--json]
971
+ blocks data files directory-update <directoryId> [--name] [--description]
972
+ [--dry-run] [--yes] [--json]
973
+ blocks data files directory-delete <directoryId> [--permanent]
974
+ [--dry-run] [--yes] [--json]
975
+ blocks data files directory-move <directoryId> [--target-directory-id]
976
+ [--dry-run] [--yes] [--json]
977
+ blocks data files versions <fileId> [--cursor] [--limit 1-100] [--json]
978
+ blocks data files create-version <fileId> [--configuration-name]
979
+ [--dry-run] [--yes] [--json]
980
+ blocks data files copy <fileId> --target-directory-id <id> [--copy-access-policies]
925
981
  [--dry-run] [--yes] [--json]
926
- blocks data files dms-list [--parent-id] [--search] [--configuration-name] [--take]
927
- [--skip] [--json]
928
- Combined folder+file listing for a DMS parent ("" = root).
929
- blocks data files dms-upload --file-storage-id <id> --artifact-name <name>
930
- [--parent-id] [--tags a,b] [--body '<json>'|--file <path>]
982
+ blocks data files move <fileId> --target-directory-id <id> [--dry-run] [--yes] [--json]
983
+ blocks data files rename <fileId> --name <name> [--dry-run] [--yes] [--json]
984
+ blocks data files access-list|access-resolve <resourceId> [--json]
985
+ blocks data files access-grant <resourceId> --resource-type Directory|File
986
+ --principal-type User|Role|Everyone|Organization
987
+ [--principal-id] --permission View|Download|Edit|Delete|Manage|Owner
988
+ [--effect Allow|Deny] [--priority] [--expires-at]
931
989
  [--dry-run] [--yes] [--json]
932
- Registers an uploaded file (fileId from presigned-upload-url/upload-to-local-storage)
933
- so it appears in a DMS folder. Upload alone does not make a file visible in a folder.
934
- blocks data files create-folder <name> [--parent-id] [--description] [--tags a,b]
935
- [--configuration-name] [--dry-run] [--yes] [--json]
936
- blocks data files delete-folder <folderId> [--configuration-name]
990
+ blocks data files access-update <resourceId> --policy-id <id> <same policy flags>
991
+ blocks data files access-revoke <resourceId> --policy-id <id> [--dry-run] [--yes] [--json]
992
+ blocks data files inheritance <resourceId> --enabled=true|false [--dry-run] [--yes] [--json]
993
+ blocks data files share <resourceId> --resource-type <type> --principal-type <type>
994
+ [--principal-id] --permission <permission> [--expires-at]
937
995
  [--dry-run] [--yes] [--json]
938
996
 
939
997
  Localization:
@@ -1089,11 +1147,11 @@ Scaffold:
1089
1147
  name + redirect URI, active, registered as a Blocks OIDC identity
1090
1148
  provider) on the spot, or skip and register one later from the portal or
1091
1149
  'auth oidc-clients save'.
1092
- If --blocks-api-url is omitted, it is derived from the app domain:
1093
- https://blocksapi.<registrable-domain> (for example, app domain
1094
- https://dqrsf.slsblx.com uses https://blocksapi.slsblx.com). Pass a
1095
- different Data/IAM/Localization/OS gateway URL explicitly only if your
1096
- project uses a non-default one.
1150
+ If --blocks-api-url is omitted, it is derived from the app domain:
1151
+ https://blocksapi.<registrable-domain> (for example, app domain
1152
+ https://dqrsf.slsblx.com uses https://blocksapi.slsblx.com). Pass a
1153
+ different Data/IAM/Localization/OS gateway URL explicitly only if your
1154
+ project uses a non-default one.
1097
1155
  --oidc-url defaults to https://iam.seliseblocks.com.
1098
1156
 
1099
1157
  Skills:
@@ -1111,12 +1169,12 @@ Skills:
1111
1169
  SDK:
1112
1170
  blocks sdk client [--app-domain <domain>] [--client-id <oidcClientId>]
1113
1171
  [--x-blocks-key <tenantId>] [--blocks-api-url <url>] [--oidc-url <url>] [--json]
1114
- Read-only: "I want to use the Blocks SDK -- show me the client." Resolves this
1115
- project's @seliseblocks/client config using the selected project unless
1116
- --x-blocks-key overrides it, and the project's registered domain/OIDC client
1117
- when --app-domain/--client-id are omitted. Its API URL defaults to
1118
- https://api.seliseblocks.com unless --blocks-api-url is passed.
1119
- Prints a ready-to-paste createBlocksClient(...) snippet.
1172
+ Read-only: "I want to use the Blocks SDK -- show me the client." Resolves this
1173
+ project's @seliseblocks/client config using the selected project unless
1174
+ --x-blocks-key overrides it, and the project's registered domain/OIDC client
1175
+ when --app-domain/--client-id are omitted. Its API URL defaults to
1176
+ https://api.seliseblocks.com unless --blocks-api-url is passed.
1177
+ Prints a ready-to-paste createBlocksClient(...) snippet.
1120
1178
  Passing both --app-domain and --client-id skips the project lookup entirely
1121
1179
  (no login required). Never writes a file; to scaffold a new app use 'new web'.
1122
1180
  `);