2.15.0-beta.13). Features may change before the next stable release.Switch to stable →Skills
Use the ak:storage S3-compatible integration
Configure and invoke the uniquely named ak-storage integration for reviewed object upload, download, listing, deletion, existence checks, URL construction, and folder sync.
The ak-storage export owns the unique runtime identity ak:storage. Use it to
work with marketing assets through an S3-compatible client after reviewing the
credentials, local paths, object keys, provider effects, and dependency change.
The separate ak-ckm-storage export now owns ak:ckm-storage and remains a
router with its own operation contract.
Invoke the integration by its canonical name
Use /ak:storage in Claude Code or Cursor and $ak:storage in Codex. Do not
substitute ak:ckm-storage: that name selects the separate router, not this
integration Skill.
Choose ak:storage for the client integration
Supported integration scope
- Upload one local file to a chosen object key.
- Download one object to an approved local path.
- List objects under an optional prefix.
- Remove one object or check whether an object exists.
- Construct an object URL from configuration.
- Preview or perform a recursive local-folder sync.
Choose another workflow when
- You specifically need the
list,sync,upload, orurlsubcommand grammar of theak:ckm-storagerouter. - You need bucket creation, bucket policy changes, signed URLs, versioning, lifecycle rules, migration orchestration, retries, or transactional rollback.
- You need provider-specific support guarantees. Named providers describe compatibility intent, not verified current service behavior.
Prepare credentials and the dependency deliberately
| Variable | Requirement |
|---|---|
S3_ENDPOINT | Required service endpoint |
S3_ACCESS_KEY_ID | Required access-key identifier |
S3_SECRET_ACCESS_KEY | Required secret access key |
S3_BUCKET | Required bucket name |
S3_REGION | Optional; defaults to auto |
S3_PUBLIC_URL | Optional public base URL or custom domain |
Keep credentials in an ignored local environment file, use a bucket-scoped least-privilege credential, and never paste or print secret values in the Skill prompt or output.
The integration lazy-loads @aws-sdk/client-s3. Installing it with
npm install @aws-sdk/client-s3 changes the current project's dependencies and
lockfile, so review and approve that mutation separately from storage access.
isConfigured() checks only whether the four required variables are present;
it does not verify SDK availability, credential validity, connectivity, bucket
access, or provider health. Provider-backed operations fail closed when client
creation cannot proceed and generally report S3 not configured. That shared
message does not distinguish a missing SDK from missing configuration.
getPublicUrl() still constructs a string without the SDK or a provider
request, while sync dry run can scan and map files when required configuration
is present because it does not upload.
Runtime identity status
| Runtime | Invocation | Current boundary |
|---|---|---|
| Claude Code | /ak:storage ... | Selects the ak-storage integration with the unique ak:storage identity. |
| Cursor | /ak:storage ... | Selects the same canonical integration; available filesystem and network access remains environment-specific. |
| Codex | $ak:storage ... | Uses the same integration identity through Codex invocation syntax. |
/ak:storage "Preview syncing ./approved-assets to campaign/launch, show every object key, and wait for approval before any upload"/ak:storage "Preview syncing ./approved-assets to campaign/launch, show every object key, and wait for approval before any upload"$ak:storage "Preview syncing ./approved-assets to campaign/launch, show every object key, and wait for approval before any upload"The Skill source does not define router-style positional subcommands. State the
operation, local path, object key or prefix, and approval boundary in the
request. Use ak:ckm-storage only when you intend to use that router's distinct
argument contract.
Review the client operation contract
| Client operation | Local effect | Provider effect |
|---|---|---|
upload(localPath, remotePath, options) | Reads the entire local file | Sends PutObject with inferred or supplied content type and optional metadata |
download(remotePath, localPath) | Creates parent directories and writes downloaded bytes | Sends GetObject |
list(prefix, maxKeys) | None | Sends ListObjectsV2; the default is 1000 objects and continuation-token pagination is not implemented |
remove(remotePath) | None | Sends DeleteObject for exactly one key |
exists(remotePath) | None | Sends HeadObject |
getPublicUrl(remotePath) | None | Sends no request; constructs a string from endpoint, bucket, or S3_PUBLIC_URL configuration |
sync(localFolder, remotePrefix, options) | Recursively scans a local folder | Uploads matching files sequentially unless dry run is enabled |
These are integration client functions, not the ak:ckm-storage router's
user-facing subcommands. Upload and sync infer common content types; unknown
extensions use application/octet-stream.
Understand the integration stages
- Read configuration from environment variables without logging secret values.
- Lazy-load the AWS S3 SDK and create a path-style client for the configured endpoint.
- Validate enough local state for the selected operation.
- Send the corresponding provider request, or construct a URL without a request.
- Return the operation-specific result: structured result objects for provider
operations, an existence result for
exists(), or a URL string forgetPublicUrl(). Live sync uploads files one at a time and preserves a result for each file.
Cloudflare R2, AWS S3, MinIO, Backblaze B2, and DigitalOcean Spaces are named as compatible examples. Endpoint shape, authentication, public access, availability, pricing, and billing effects still require current verification with the selected provider.
Keep approval and external effects explicit
Credentials do not authorize storage effects
Approve the exact provider, bucket, prefix, object keys, local paths, and data classification before a read or write. Storage requests can create or delete provider-side data, transfer local content, generate network traffic, and incur cost.
- Approve dependency installation separately from credential use and storage access.
- Treat download destinations and sync source folders as workspace mutation or data-disclosure boundaries.
- Preview the complete file-to-object mapping before recursive sync. A dry run scans the local folder but does not upload.
- Treat
removeas destructive. Require the exact key and explicit approval; the client has no recycle bin or built-in recovery step. - A URL from
getPublicUrlis not proof that the object exists or is public. URL construction does not change bucket policy. - The client provides no retries, transaction, rollback, or cross-file atomicity. A failed sync can leave earlier files uploaded successfully.
Verify operation evidence
A reviewed integration call should report:
- the selected operation, bucket, endpoint host, local path, and object key or prefix without credential values;
- a preview mapping before recursive sync;
- structured success or failure per object;
- the exact local file written by download, or the key submitted to
DeleteObjectand its returned result; - uploaded and failed counts for sync, including partial failures;
- a manual recovery path for any non-atomic result.
Troubleshoot safely
| Symptom | Safe next step |
|---|---|
/ak:storage or $ak:storage is not discovered | Confirm the installed ak-storage export declares name: ak:storage; do not switch to the router unless you want its contract. |
Every operation reports S3 not configured | Check SDK presence and required variables without printing secrets; the message covers both failure classes. |
| A list omits expected objects | Check the prefix and 1000-object default limit; the client does not follow continuation tokens. |
| A returned URL fails | Verify object existence, endpoint shape, bucket policy, and S3_PUBLIC_URL; construction performs no request. |
exists() returns exists: false | Inspect the accompanying error. The result can mean absence or another HeadObject failure such as authorization or network failure. |
| A sync partly fails | Preserve per-file results; successful earlier uploads are not rolled back. |
| A delete targets the wrong key | Stop before the request and require the exact approved key; there is no built-in recovery. |
Continue with the Marketing Kit overview, Installing kits, or Runtime adapters.
Know the current limits
ak:storageidentifies the integration;ak:ckm-storageidentifies the separate router that depends on this client.- The integration exposes client operations but no unique positional argument grammar, so requests must state operation and boundaries explicitly.
- Listing is one request without continuation-token pagination.
- Sync is sequential and non-atomic, with no rollback for completed uploads.
- Provider compatibility is shipped intent, not a guarantee of current support, public access, availability, pricing, or billing behavior.
Use the ak:ckm-storage router
Route list, sync, upload, and URL operations through the ak-ckm-storage export.
Preview files and generate visuals with ak:preview
View project content or create Markdown and HTML explanations while controlling file writes, browser launches, local servers, network exposure, and Git reads.