blocks-storage-configuration
Skill42 starsChanged 12 days agoMITView on GitHub
Configure which storage provider (Azure Blob, S3-compatible object storage, or local/SFTP storage) backs a SELISE Blocks project's file object tree: named configurations with host, port, credentials, region/endpoint or connection string, and strategy, via the blocks CLI ('storage config get/list/save/delete'). CLI-only, project-scoped admin surface. Use to create, inspect, rotate, switch, or delete provider configurations; file/directory/object operations belong to blocks-data-storage.
In this repository27 other files it gives its agents.
- AGENTS.mdAGENTS.md
- bootstrap/agents.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- blocks-bootstrapSkill
- blocks-captchaSkill
- blocks-data-gateway-configurationSkill
- blocks-data-gateway-crudSkill
- blocks-data-storageSkill
- blocks-frontend-local-httpsSkill
- blocks-functionsSkill
- blocks-iam-access-controlSkill
- blocks-iam-accountSkill
- blocks-iam-mfaSkill
- blocks-iam-organizationsSkill
- blocks-iam-sso-oidc-configurationSkill
- blocks-iam-sso-oidc-implementationSkill
- blocks-iam-usersSkill
- blocks-localization-configurationSkill
- blocks-localization-implementationSkill
- blocks-mailSkill
- blocks-notificationSkill
- blocks-notifierSkill
- blocks-proxySkill
- blocks-release-deploymentSkill
- blocks-secretsSkill
- blocksSkill
- blocks-workflowSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 0 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 6
When invoking a project-scoped blocks command, either use the resolved account's saved selection or pass --project <tenantId> for that one …
- Very specific: line 20
All four commands require an impersonated project token — there is no account-token path for this surface, consistent with other …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
When invoking a project-scoped blocks command, either use the resolved account's saved selection or pass --project <tenantId> for that one command without changing saved state. --project applies to CLI commands only, never SDK calls.
Blocks Storage — Configuration
Local snapshot: blocks/storage/ holds a read-only snapshot of the project's storage configs, written by blocks pull --only storage. Read it for context before listing things one by one; check its _meta.tenantId and _meta.pulledAt, and pull again if it's stale or after you change anything. Never edit it to change the project: editing does nothing, so use the commands below. Secret fields in it are ***.
This skill manages the storage configuration record itself — which cloud provider (or local/SFTP storage) a named configuration points at, and the connection details needed to reach it. It does not upload, download, browse, share, version, move, or trash objects; those runtime concerns belong to blocks-data-storage.
CLI-only, no SDK path. There is no @seliseblocks/client method for reading or writing a storage configuration's own fields. Runtime storage calls select an existing record by configurationName. If the user wants to manipulate a file/directory or its access policies, hand off to blocks-data-storage.
Prerequisite: a project is selected (blocks use <tenantId>). If login/project state is unknown, run the blocks-bootstrap skill first.
Command family
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.).
| Command | Notes |
blocks storage config list | No parameters beyond the selected project. Read-only. |
blocks storage config get <name> | <name> (positional) or --name (required if no positional arg). Read-only. |
blocks storage config save | Upsert — create or update a configuration. Mutating. |
blocks storage config delete <name> | <name> (positional) or --name (required if no positional arg). Mutating. |
blocks storage config list --json
blocks storage config get Default --json
blocks storage config get --name Default --jsonlist/get never return a secret value. Each secret has a status instead: connectionStringStatus, secretKeyStatus, accessKeyStatus, passwordStatus, sftpSecretKeyStatus, each one of none (not set for this provider), active, locked, archived, missing, unavailable. archived or missing means file calls on that configuration fail until it is deleted and created again with a new secret.
storage config save — fields
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):
| Flag | Body field |
--name | name |
--item-id | itemId |
--strategy | storageStrategy |
--host | host |
--port | port |
--region-endpoint | cloudStorageRegionEndPoint |
--connection-string | connectionString |
--access-key | accessKey |
--secret-key | secretKey |
--username | userName |
--password | password |
--remote-base-path | remoteBasePath |
--update (boolean) | updateRequest |
--upload-url-expiry-seconds | uploadUrlExpirySeconds (1–604800; blocks-data default 600) |
--download-url-expiry-seconds | downloadUrlExpirySeconds (1–604800; default 300) |
--max-file-size-bytes | maxFileSizeInBytes (at most 50 MB; default 5 MiB) |
--upload-completion-required-for Public,Private | uploadCompletionRequiredFor — uploads with these access modifiers land in quarantine until data files complete-upload verifies them; --upload-completion-required-for= clears it |
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 with --update when modifying an existing configuration, omit both to create a new one.
Once a configuration exists, only the four upload settings can change. The provider identity and credentials (--strategy, --connection-string, --access-key, --secret-key, --host, --port, --username, --password, --region-endpoint, --remote-base-path) are fixed at create: blocks-os drops them on an update and still answers success, so the CLI refuses them on --update. To change provider or rotate its credentials, delete the configuration and create it again. An update reads the stored record and carries the upload settings you don't pass, because the server resets any that are left out. A create whose --name is already taken is refused (by the CLI on the live run, and by blocks-os); use --update --item-id <id> instead.
blocks storage config save --name Default --strategy AzureBlob \
--host mystorageaccount.blob.core.windows.net --region-endpoint eu-west-1 \
--access-key <key> --secret-key <secret> --dry-run --json
blocks storage config save --name Default --strategy AzureBlob \
--host mystorageaccount.blob.core.windows.net --region-endpoint eu-west-1 \
--access-key <key> --secret-key <secret> --yes --json
# Change an existing configuration's upload settings (the only fields an update can change)
blocks storage config save --item-id <id> --update --max-file-size-bytes 10485760 \
--upload-completion-required-for Public,Private --dry-run --json
blocks storage config save --item-id <id> --update --max-file-size-bytes 10485760 \
--upload-completion-required-for Public,Private --yes --json--dry-run before --yes — always
Both mutating commands (save, delete) follow the standard blocks mutation discipline: --dry-run prints what would be sent and returns without mutating anything (an --update dry-run still reads the stored record so it can show the merged body, and reports target: "update"); --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.
blocks storage config delete Default --dry-run --json
blocks storage config delete Default --yes --jsonsave'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, get/list output is redacted the same way (see Gotchas).
Gotchas
get/listshow secret status, not secrets. blocks-os never returns a secret value; the CLI still redactsaccessKey/connectionString/password/secretKey/sftpSecretKeyif an older server sends one.saveis upsert, not separate create/update commands. Whether a call creates or updates is determined by--update --item-id, not by a different command name.- Credentials cannot be rotated in place. An update changes only the upload settings; see above.
- This is provider configuration, not object management.
blocks storage config *never touches file bytes, directory hierarchy, versions, trash, sharing, or ACLs. Those belong to blocks-data-storage, using aconfigurationNamethat a storage config already defines. - No positional-or-flag ambiguity trap:
get/deleteaccept the configuration name as either the first positional argument or--name; only one is required, not both. - Impersonated project token only. Like
secrets *anddata config *, none of these four commands run against the account token — a project must be selected first (blocks use <tenantId>).
Example trigger prompts
- "Set up Azure Blob storage for this project." →
storage config save --strategy AzureBlob .... - "What storage configurations exist on this project?" →
storage config list. - "Show me the
Defaultstorage configuration." →storage config get Default. - "Rotate the access key on our storage config." → not possible in place: the provider and credentials are fixed once created. Confirm with the user, then
storage config delete <name>andstorage config saveagain with the new key. - "Cap uploads at 10 MB and verify every upload." →
storage config save --item-id <id> --update --max-file-size-bytes 10485760 --upload-completion-required-for Public,Private. - "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). - "Delete this storage configuration, we don't use it anymore." →
storage config delete <name>. - "How do I actually upload a file once storage is configured?" → hand off to blocks-data-storage, not this skill.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

