К основному содержанию
скилл CX Codex

tigris-snapshots-forking — скилл для Claude Code: обзор

Учит агента делать моментальные снимки бакетов Tigris и клонировать их через механизм copy-on-write для тестов, бэкапов и песочниц.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add tigrisdata/skills --skill tigris-snapshots-forking -a claude-code
Открыть на GitHub

Что делает tigris-snapshots-forking

Скилл обучает ассистента управлять снимками состояния и изолированными копиями объектных хранилищ Tigris через библиотеку @tigrisdata/storage. В отличие от поэлементного версионирования S3, здесь создаётся снимок всего бакета на заданную точку во времени одной командой.

Форки работают по принципу copy-on-write на основе неизменяемых объектов с обратным порядком меток времени. Дочерний бакет читает данные родительского снимка без физического копирования файлов, поэтому клонирование даже больших объёмов выполняется сразу. Удаление или изменение файлов внутри форка не затрагивает исходный бакет.

Для работы требуется глобально установленный @tigrisdata/cli. Главное ограничение: создавать снимки получится только для тех бакетов, у которых при создании был включён флаг enableSnapshot: true.

Какие задачи решает

  • создать изолированную песочницу с боевыми данными для разработчика
  • сделать полный снимок бакета перед накатом миграции
  • развернуть окружение для ИИ-агента с готовыми весами и конфигами
  • восстановить состояние хранилища на нужный момент времени

Примеры запросов агенту

  • Сделай снимок бакета production с именем before-migration
  • Создай изолированный форк бакета agent-seed из последнего снапшота
  • Прочитай файл config.json из снапшота версии 1751631910169675092

Как установить tigris-snapshots-forking

1Через Skills CLI (Vercel)

npx skills add tigrisdata/skills --skill tigris-snapshots-forking -a claude-code

2Вручную: положить файлы

~/.claude/skills/tigris-snapshots-forking/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/tigris-snapshots-forking/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о tigris-snapshots-forking

Как установить tigris-snapshots-forking в Claude Code?

Выполните команду npx skills add tigrisdata/skills --skill tigris-snapshots-forking -a claude-code. Ассистент также ожидает установленный инструмент @tigrisdata/cli.

Что делает скилл tigris-snapshots-forking?

Он даёт модели готовые инструкции и код на TypeScript для создания снимков бакетов Tigris и их мгновенного клонирования. Это позволяет поднимать тестовые копии хранилища без дублирования данных.

Что нужно настроить в бакете перед созданием снимков?

Бакет должен быть изначально создан с параметром enableSnapshot: true. Без этой настройки сделать снимок через SDK @tigrisdata/storage не выйдет.

Исходный текст

SKILL.md · MIT
---
name: tigris-snapshots-forking
description: Use when needing point-in-time recovery, version control for object storage, or creating isolated bucket copies for testing/experimentation
---

# Tigris Snapshots and Forking

## Prerequisites

**Before doing anything else**, install the Tigris CLI if it's not already available:

```bash
tigris help || npm install -g @tigrisdata/cli
```

If you need to install it, tell the user: "I'm installing the Tigris CLI (`@tigrisdata/cli`) so we can work with Tigris object storage."

## Overview

**Snapshots** capture your entire bucket at a point in time. **Forking** creates instant, isolated copies from snapshots using copy-on-write.

**Core principle:** Snapshots and forks protect your data from deletion. Even if you delete everything in a fork, the source bucket data remains intact.

## Why Snapshots Matter

Object storage serves as the primary data store for many systems. It needs safety features:

- **Point-in-time recovery** - Restore after accidental deletion or corruption
- **Version control** - Tag meaningful states like releases
- **Reproducibility** - Recreate exact environments for debugging or testing
- **Deletion protection** - Forks can be destroyed without affecting source

Traditional object versioning only works per-object. To restore a bucket to a point in time, you must check and restore each object individually. Tigris snapshots capture the entire bucket state instantly.

## Why Forking Matters

Forking creates isolated bucket copies instantly - even for terabytes of data:

- **Developer sandboxes** - Test with real production data safely
- **AI agent environments** - Spin up agents with pre-loaded dependencies
- **Load testing** - Use production data without risk
- **Feature branch testing** - Parallel environments for experiments
- **Training experiments** - Fork datasets to test without affecting source

**How it works:** Tigris uses immutable objects with backwards-ordered timestamps. Forks read from the parent snapshot until new data overwrites. This makes forking essentially free - no data copying required.

## Quick Reference

| Operation       | Function                                | Key Parameters                         |
| --------------- | --------------------------------------- | -------------------------------------- |
| Create snapshot | `createBucketSnapshot(options)`         | name, sourceBucketName                 |
| List snapshots  | `listBucketSnapshots(sourceBucketName)` | sourceBucketName                       |
| Create fork     | `createBucket(name, options)`           | sourceBucketName, sourceBucketSnapshot |

## Create Snapshot

```typescript
import { createBucketSnapshot } from "@tigrisdata/storage";

// Snapshot default bucket
const result = await createBucketSnapshot();
if (result.error) {
  console.error("Error:", result.error);
} else {
  console.log("Snapshot version:", result.data?.snapshotVersion);
  // Output: { snapshotVersion: "1751631910169675092" }
}

// Named snapshot for specific bucket
const result = await createBucketSnapshot("my-bucket", {
  name: "backup-before-migration",
});
if (result.error) {
  console.error("Error:", result.error);
} else {
  console.log("Named snapshot:", result.data?.snapshotVersion);
}
```

**Prerequisite:** Bucket must have `enableSnapshot: true` when created.

## List Snapshots

```typescript
import { listBucketSnapshots } from "@tigrisdata/storage";

// List snapshots for default bucket
const result = await listBucketSnapshots();
if (result.error) {
  console.error("Error:", result.error);
} else {
  console.log("Snapshots:", result.data);
  // [
  //   {
  //     name: "backup-before-migration",
  //     version: "1751631910169675092",
  //     creationDate: Date("2025-01-15T08:30:00Z")
  //   }
  // ]
}

// List snapshots for specific bucket
const result = await listBucketSnapshots("my-bucket");
```

## Create Fork from Snapshot

```typescript
import { createBucket, createBucketSnapshot } from "@tigrisdata/storage";

// First, create a snapshot
const snapshot = await createBucketSnapshot("agent-seed", {
  name: "agent-seed-v1",
});
const snapshotVersion = snapshot.data?.snapshotVersion;

// Fork from snapshot
const agentBucketName = `agent-${Date.now()}`;
const forkResult = await createBucket(agentBucketName, {
  sourceBucketName: "agent-seed",
  sourceBucketSnapshot: snapshotVersion,
});

if (forkResult.error) {
  console.error("Error:", forkResult.error);
} else {
  console.log("Forked bucket created");
  // agent-${timestamp} has all data from agent-seed at snapshot time
  // Can modify/delete freely - agent-seed is unaffected
}
```

## Read from Snapshot Version

Access historical data without forking:

```typescript
import { get, list } from "@tigrisdata/storage";

// Get object as it was at snapshot
const result = await get("config.json", "string", {
  snapshotVersion: "1751631910169675092",
});

// List objects as they were at snapshot
const result = await list({
  snapshotVersion: "1751631910169675092",
});
```

## Deletion Protection in Action

```typescript
import { remove, get } from "@tigrisdata/storage";

// In forked bucket, delete everything
await remove("hello.txt", { config: { bucket: "agent-fork" } });

// Fork appears empty
const forkResult = await get("hello.txt", "string", {
  config: { bucket: "agent-fork" },
});
// forkResult.error === "Not found"

// But source bucket still has data
const sourceResult = await get("hello.txt", "string", {
  config: { bucket: "agent-seed" },
});
// sourceResult.data === "Hello, world!"
```

The fork's deletion only affects the fork. Source data remains accessible in the parent bucket and all snapshots.

## Use Cases

### Developer Sandboxes

```typescript
// Create snapshot of production data
await createBucketSnapshot("production", {
  name: "dev-sandbox-seed",
});

// Fork for each developer
const devBucket = await createBucket(`dev-${developerName}`, {
  sourceBucketName: "production",
  sourceBucketSnapshot: "...",
});
// Developer can test and modify freely
```

### AI Agent Environments

```typescript
// Store agent dependencies in seed bucket
await put("model.bin", modelData);
await put("config.json", agentConfig);

// Snapshot the seed
const snapshot = await createBucketSnapshot("agent-seed", {
  name: "v1",
});

// Spin up new agent instance with fork
const agentBucket = `agent-${Date.now()}`;
await createBucket(agentBucket, {
  sourceBucketName: "agent-seed",
  sourceBucketSnapshot: snapshot.data?.snapshotVersion,
});

// Agent has everything and can modify freely
await startAgent(agentBucket);
```

### Pre-Migration Backups

```typescript
// Before risky operation
await createBucketSnapshot("production", {
  name: "before-migration-v2",
});

// Run migration
// If disaster strikes, fork from snapshot to recover
const rollback = await createBucket("production-restored", {
  sourceBucketName: "production",
  sourceBucketSnapshot: "...",
});
```

## Common Mistakes

| Mistake                                  | Fix                                          |
| ---------------------------------------- | -------------------------------------------- |
| Snapshotting non-snapshot-enabled bucket | Recreate bucket with `enableSnapshot: true`  |
| Expecting fork to affect source          | Forks are isolated - source remains unchanged|
| Not naming snapshots                     | Names make snapshots discoverable            |
| Using wrong storage tier                 | Snapshot buckets must use STANDARD tier      |

## Limitations

- Existing buckets cannot be snapshot-enabled (must create new bucket)
- Snapshot buckets require STANDARD storage tier
- Snapshot buckets don't support lifecycle transitions or TTL

## How It Works (Deep Dive)

A snapshot is a single 64-bit integer representing nanoseconds since Unix epoch. Tigris stores objects with reverse-ordered timestamps, so the most recent version sorts first. When you snapshot, Tigris records the current time. Reading from a snapshot queries for the newest object version before that timestamp.

Forking adds recursive indirection: child bucket objects override the parent, but missing objects recurse through the parent snapshot. This makes forking instant - no data copying, just metadata pointers.

© tigrisdata · MIT · tigrisdata/skills

Похожие скиллы

Все скиллы по теме «Облака: AWS, Azure, GCP» →
caveman-manage JuliusBrussee Проверяет состояние и результаты экспериментов Caveman Cloud, предлагает одно действие или блокирует рискованный запрос. Нужен перед запуском, одобрением, отменой или откатом. CX Codex +1 104 200установок workers-best-practices cloudflare Скилл настраивает ИИ на проверку продакшен-кода Cloudflare Workers по актуальным правилам рантайма, типам Wrangler и антипаттернам. CX Codex +1 126 100установок cloudflare-email-service cloudflare Скилл для работы с Cloudflare Email Sending и Email Routing: помогает настроить отправку и приём писем в Workers. CX Codex +1 102 300установок firebase-basics официальный google Скилл настраивает Firebase CLI, помогает войти в аккаунт, создать или выбрать проект и скачать конфигурацию Android или iOS. CX Codex 14 100установок cloudflare-one cloudflare Помогает агенту проектировать, настраивать и разбирать развёртывания Cloudflare One Zero Trust и SASE. Пригодится, когда нужно спланировать Access, Gateway или туннели без похода в документацию вручную. CX Codex +1 93 100установок cloudflare-one-migrations cloudflare Помогает спланировать переход с VPN, SWG или SASE на Cloudflare One: сопоставляет политики, находит пробелы и расписывает порядок выката. CX Codex +1 89 500установок

Из того же набора9

tigris-s3-migration Скилл ведёт миграцию объектного хранилища с AWS S3, GCS или Azure Blob на Tigris. Пригодится, когда нужно переключить бакет без остановки продакшена. CX Codex +1 3 100установок tigris-static-assets Настраивает выгрузку статики в хранилище Tigris с глобальной раздачей через CDN, заголовками Cache-Control и интеграцией с веб-фреймворками. CX Codex +1 3 100установок tigris-image-optimization Скилл для работы с картинками в Tigris: режет варианты при загрузке, отдаёт их через публичный бакет и подсказывает настройки под ваш фреймворк. CX Codex +1 3 100установок tigris-sdk-guide Подсказывает агенту, какой SDK или CLI выбрать для Tigris: родной для TypeScript, Go и Python, AWS-совместимый для Ruby и PHP. CX Codex +1 3 100установок file-storage Помогает настроить бакеты Tigris через консоль и встроить загрузку файлов в Node.js, Rails или Laravel. CX Codex +1 3 100установок tigris-security-access-control Скилл настраивает доступ к объектному хранилищу Tigris: ключи, роли, CORS и подписанные URL. Нужен при защите бакетов и проверке настроек доступа. CX Codex +1 3 100установок tigris-object-operations Скилл для загрузки, скачивания, удаления и листинга объектов в Tigris Storage прямо из агента, плюс presigned URL. CX Codex +1 3 200установок tigris-agent-kit Скилл для работы с объектным хранилищем Tigris: изолированные копии датасетов, бакеты под каждого агента, снапшоты и вебхуки. CX Codex +1 3 100установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой