encore-go-bucket — скилл для Claude Code: бакеты в Encore Go
Скилл подсказывает агенту, как объявлять бакеты и работать с файлами в Encore Go: загрузка, выгрузка, подписанные ссылки.
npx skills add encoredev/skills --skill encore-go-bucket -a claude-code
npx skills add encoredev/skills --skill go-bucket -a claude-codeЧто делает encore-go-bucket
Скилл описывает работу с объектным хранилищем в сервисах на Encore Go. Бакет объявляется как переменная уровня пакета через objects.NewBucket из encore.dev/storage/objects. Хранилище под капотом поднимает сам Encore: S3 на AWS, GCS на GCP, а локально — в памяти.
Внутри — готовые шаблоны операций: Upload в потоковом режиме, Download, Exists, Attrs, List и Remove. Для публичных бакетов есть PublicURL, для приватных — SignedUploadURL и SignedDownloadURL с TTL, чтобы браузер грузил файлы напрямую, минуя ваш сервис. Отдельный раздел про BucketRef с наборами прав: Downloader, Uploader, Lister, Attrser, Remover и другими.
Скилл советует объявлять бакеты переменными уровня пакета и по умолчанию оставлять их приватными, включая Public: true только для ассетов, которые должны скачиваться без авторизации. Если передаёте доступ в код библиотеки, берите BucketRef — права тогда видны в типах, а не в комментариях. Это повод проверить свои бакеты: публичный по умолчанию бакет с пользовательскими файлами — дыра.
Какие задачи решает
- загрузить аватар пользователя в Encore-сервис
- отдать файл из бакета по временной ссылке
- перечислить объекты в бакете с размером каждого
- удалить документ по ключу
- передать доступ к бакету в библиотечный код с ограниченными правами
Примеры запросов агенту
- Добавь в сервис на Encore Go приватный бакет для загрузки аватаров
- Сделай эндпоинт, который выдаёт signed upload URL на 2 часа
- Покажи, как через BucketRef отдать хелперу только право на скачивание
Как установить encore-go-bucket
1Через Skills CLI (Vercel)
npx skills add encoredev/skills --skill encore-go-bucket -a claude-codenpx skills add encoredev/skills --skill go-bucket -a claude-code2Вручную: положить файлы
~/.claude/skills/go-bucket/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/go-bucket/
1Через Skills CLI (Vercel)
npx skills add encoredev/skills --skill go-bucket -a codex2Вручную: положить файлы
.agents/skills/go-bucket/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add encoredev/skills --skill go-bucket -a cursor2Вручную: положить файлы
.cursor/skills/go-bucket/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install encoredev/skills go-bucket2Вручную: положить файлы
.github/skills/go-bucket/SKILL.md1Через Skills CLI (Vercel)
npx skills add encoredev/skills --skill go-bucket -a gemini-cli2Командой платформы
gemini skills install https://github.com/encoredev/skills --path encore/go-bucketВручную: положить файлы
.devin/skills/go-bucket/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add encoredev/skills --skill go-bucket -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о encore-go-bucket
Как установить encore-go-bucket в Claude?
Выполните npx skills add encoredev/skills --skill encore-go-bucket -a claude-code. Скилл встанет в ~/.claude/skills/go-bucket/SKILL.md.
Что делает encore-go-bucket?
Учит агента объявлять бакеты в Encore Go и писать код для загрузки, скачивания, листинга и удаления файлов, включая подписанные ссылки и ссылки на бакеты с наборами прав.
Когда скилл включается?
На запросах про объектное хранилище, бакеты, S3, GCS, blob, загрузку картинок и файлов пользователей — то есть когда в сервисе на Encore Go нужно хранить неструктурированные данные.
Исходный текст
SKILL.md · Apache-2.0
---
name: encore-go-bucket
description: Store unstructured files in Encore Go using `objects.NewBucket` from `encore.dev/storage/objects` — uploads, images, documents, blobs.
when_to_use: >-
User wants to upload, download, list, or delete files from an Encore Go service — profile pictures, avatars, document uploads, image storage, media assets, generated reports, blob data. Covers public vs private buckets, signed upload/download URLs, bucket references with permission types (Uploader, Downloader, Lister, Attrser, Remover), and operations like `Upload`, `Download`, `List`, `SignedUploadURL`. Trigger phrases: "object storage", "bucket", "S3", "GCS", "blob", "user uploads", "profile picture", "image upload", "store a file", "file storage".
---
# Encore Go Object Storage
## Instructions
A `Bucket` is a logical store for files. Encore provisions the underlying object storage (S3 on AWS, GCS on GCP, in-memory locally). Declare buckets as package-level variables.
```go
package uploads
import "encore.dev/storage/objects"
// Private bucket (default)
var Uploads = objects.NewBucket("user-uploads", objects.BucketConfig{})
// Public bucket — files accessible via public URL
var PublicAssets = objects.NewBucket("public-assets", objects.BucketConfig{
Public: true,
})
```
## Operations
```go
import (
"fmt"
"io"
)
// Upload (streaming pattern)
writer := Uploads.Upload(ctx, "path/to/file.jpg")
_, err := io.Copy(writer, dataReader)
if err != nil {
writer.Abort()
return err
}
err = writer.Close()
// Download
reader := Uploads.Download(ctx, "path/to/file.jpg")
if err := reader.Err(); err != nil {
return err
}
defer reader.Close()
data, _ := io.ReadAll(reader)
// Existence check
exists, err := Uploads.Exists(ctx, "path/to/file.jpg")
// Attributes (size, content type, ETag)
attrs, err := Uploads.Attrs(ctx, "path/to/file.jpg")
// List
for err, entry := range Uploads.List(ctx, &objects.Query{}) {
if err != nil {
return err
}
fmt.Println(entry.Key, entry.Size)
}
// Delete
err := Uploads.Remove(ctx, "path/to/file.jpg")
// Public URL (only for public buckets)
url := PublicAssets.PublicURL("image.jpg")
```
## Signed URLs
Generate temporary URLs so clients can upload/download directly without going through your service:
```go
import "time"
// Signed upload URL (expires in 2 hours)
url, err := Uploads.SignedUploadURL(ctx, "user-uploads/avatar.jpg",
objects.WithTTL(time.Duration(7200)*time.Second))
// Signed download URL
url, err := Uploads.SignedDownloadURL(ctx, "documents/report.pdf",
objects.WithTTL(time.Duration(7200)*time.Second))
```
## Bucket References
Pass bucket access to library code with a specific permission set:
```go
// Create a reference with download permission only
ref := objects.BucketRef[objects.Downloader](Uploads)
// Combine permissions via an interface
type myPerms interface {
objects.Downloader
objects.Uploader
}
ref := objects.BucketRef[myPerms](Uploads)
// Permission types: Downloader, Uploader, Lister, Attrser, Remover,
// SignedDownloader, SignedUploader, ReadWriter
```
## Guidelines
- Declare buckets as package-level variables.
- Default to private buckets; opt into `Public: true` only for assets meant for unauthenticated download.
- Use signed URLs for browser uploads/downloads instead of streaming through your service.
- Use bucket references when passing access to helpers — they encode the permission contract in the type system.
© encoredev · Apache-2.0 · encoredev/skills