# Хранить свои данные (/ru/docs/build-own-data)

Вашему инструменту нужны таблицы, которыми пользуется только он: контрольная точка синхронизации, кэш, служебные данные
провайдера. Эта страница показывает, где они живут и как ссылаются на общее хранилище, чтобы cli-core мог менять свою
схему, не ломая ваш инструмент, и чтобы другие инструменты не начали зависеть от ваших внутренних таблиц.

## Правило [#правило]

* Таблица, нужная только вашему инструменту, живёт в **собственном файле SQLite вашего инструмента** рядом с общим
  хранилищем.
* Ваш инструмент сам выполняет миграции этого файла.
* Ваши таблицы ссылаются на общие записи **только по id**, например по id аккаунта или документа.
* Другие инструменты не открывают ваш файл, а ваш инструмент не открывает чужие.

Это правило [WC-DATA-1](https://github.com/WireCatLabs/cli-base/blob/main/docs/standards/data-model.md#wc-data-1--a-record-more-than-one-tool-needs-is-a-core-entity-in-cli-core-a-clis-own-tables-stay-private).
Если те же записи нужны второму инструменту, это общая сущность, и ей место в cli-core.

## Шаги [#шаги]

1. Найдите папку общего хранилища через `storePath` из `@wirecat/cli-core/store`. Она учитывает `MESSAGING_STORE`,
   поэтому тесты, которые переносят общее хранилище, переносят и ваш файл.
2. Откройте свой файл в этой папке через `openCache` из того же модуля. Он выбирает SQLite среды выполнения (Node или
   Bun) и ставит те же настройки, что у общего хранилища.
3. Создавайте и меняйте свои таблицы миграциями, которые идут только вперёд: добавлять, никогда не править и не
   пересоздавать ([WC-STORE-7](https://github.com/WireCatLabs/cli-base/blob/main/docs/standards/store.md#wc-store-7--migrations-only-go-forward-add-never-edit-or-rebuild)).

## Пример [#пример]

Инструмент `acme-cli` хранит одну контрольную точку синхронизации на аккаунт:

```ts
import { dirname, join } from "node:path"
import { openCache, storePath } from "@wirecat/cli-core/store"

const own = await openCache(join(dirname(storePath()), "acme-cli.db"))
own.exec(`CREATE TABLE IF NOT EXISTS sync_checkpoints (
  account_id INTEGER PRIMARY KEY,
  cursor TEXT NOT NULL,
  updated_at INTEGER NOT NULL
)`)
```

`account_id` — id строки аккаунта в общем хранилище. Контрольная точка не копирует имя или провайдера аккаунта; она
читает их из cli-core, когда они нужны.

## Скоро [#скоро]

Помощник в cli-core, который открывает собственный файл инструмента и выполняет его миграции, стоит в списке «позже».
Пока его нет, используйте `openCache`, как выше.

## Что сломается, если это пропустить [#что-сломается-если-это-пропустить]

Своя таблица внутри общего хранилища ломается при миграции cli-core, и её начинают читать другие инструменты. Копия
общего поля в вашей таблице устаревает, когда владелец меняет оригинал. Чужой инструмент, открывший ваш файл, ломается
при вашем следующем изменении.

Дальше: [Вход в сервис](/llms.mdx/docs/ru/build-sign-in/content.md).
