@smwb/onreel-git-mcp 0.9.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,7 +10,8 @@
10
10
  - **жизненный цикл worktree** — замки, двухфазное создание и очистка, сверка при старте, свип и корзина —
11
11
  против портов хранения, которые реализует потребитель;
12
12
  - **адаптеры трекеров** — единая модель задач и пять адаптеров: GitHub, GitLab, Jira, SourceCraft и локальный
13
- трекер поверх хранилища потребителя; у GitHub, GitLab и SourceCraft есть раздел pull request-ов (D-005);
13
+ трекер поверх хранилища потребителя; у GitHub, GitLab и SourceCraft есть разделы pull request-ов и CI (D-005)
14
+ и раздел репозитория — карточка и ветки (D-008);
14
15
  - **MCP stdio-сервер** — JSON-RPC 2.0 поверх stdin/stdout, инструменты строятся из таблицы команд вызывающего.
15
16
 
16
17
  Пакет ESM, рантайм-зависимость одна — `zod`. Публичная поверхность держится документированной здесь:
@@ -203,7 +204,13 @@ await withWorktreeLock('wt-9', async () => {
203
204
  все переходы (`markWorktreeReady`, `markWorktreeFailed`, `requestWorktreeCleanup`, `completeWorktreeCleanup`);
204
205
  вложенность и асинхронные обратные вызовы не поддерживаются. **Эталон реализации — `test/helpers/memory-store.lib.ts`
205
206
  в тестовом дереве пакета** (D-003): он же образец семантики для потребителей, включая копию-на-коммит в
206
- `inTransaction` и отказ броска как откат.
207
+ `inTransaction` и отказ броска как откат. Свои переходы библиотека пишет с `actor: 'host'` — процесс, который её
208
+ держит (D-012); реализация порта отображает это значение в лексику потребителя.
209
+
210
+ Замки worktree — одна таблица на процесс. Субпуть, которому нужны замки, импортирует модуль жизненного цикла
211
+ напрямую: модуль двух и более точек входа tsup выносит в общий chunk, поэтому определение таблицы в собранном
212
+ пакете остаётся одно (D-013). Инвариант держит `test/worktree/locks-bundle.test.ts` — он собирает пакет
213
+ конфигурацией проекта во временный каталог и требует ровно одного определения.
207
214
 
208
215
  ## tracker
209
216
 
@@ -254,7 +261,13 @@ try {
254
261
  `GITHUB_PRIORITY_LABELS`, `GITLAB_PRIORITY_LABELS`, …), чтобы потребитель видел, во что именно преводится его
255
262
  статус. Свои трекеры добавляют в реестр явным `registerTracker(definition)`; повторный `kind` — исключение, а не
256
263
  молчаливая замена. Типы порта `LocalIssueStore` (и его строк) реэкспортированы из `…/tracker` — реализацию, как и
257
- для `WorktreeStore`, пишет потребитель; эталон в памяти — `test/helpers/tracker-fixtures.lib.ts`.
264
+ для `WorktreeStore`, пишет потребитель; эталон в памяти — `test/helpers/tracker-fixtures.lib.ts`. Порт требует:
265
+ комментарий — только к существующей задаче, иначе отказ с кодом `unknown_issue` (сиротских комментариев хранилище
266
+ не держит, D-011); `limit` страницы — целое от 1 до 500, по умолчанию 100, значение вне диапазона прижимается
267
+ к границам; снятый исполнитель (`assignee: null`) убирает ключ из строки задачи, а не оставляет его со значением
268
+ `undefined`. Нецелый `limit` до хранилища не доходит: адаптер отказывает `invalid_request` ещё в проверке запроса,
269
+ а чем на него отвечает сама реализация порта, не предписано — эталон в памяти отвечает `invalid_request`, ledger
270
+ падает ошибкой SQLite.
258
271
 
259
272
  Таймаут запроса к трекеру — `TRACKER_TIMEOUT_MS` (15 с), тело ответа ошибки обрезают до
260
273
  `TRACKER_ERROR_BODY_MAX` (300 символов) и маскируют; 404 с `missingIsIssue` — `unknown_issue`, а не «неверный
@@ -566,6 +579,65 @@ for (;;) {
566
579
  (дочитывание по курсору), `keep: { bytes, from: 'head' | 'tail' }` удерживает окно кольцевым буфером,
567
580
  `readMax` и `timeoutMs` перекрывают потолки по умолчанию. Модель лога — запись D-006.
568
581
 
582
+ ### Репозиторий: карточка и ветки
583
+
584
+ Карточка репозитория и список веток — раздел `repo` того же `TrackerDefinition`, на том же подключении, что и
585
+ задачи (D-005, D-008): возможности `RepoCapabilities` плюс фабрика `create(context)` на том же `AdapterContext`.
586
+ Раздел строят фабрики `githubRepo()`, `gitlabRepo()` и `sourcecraftRepo()`; у локального трекера и Jira его нет,
587
+ и `repoAdapterOf(definition, context)` для них бросает `TrackerError('unsupported', 'Трекер <title> не ведёт
588
+ репозиторий.')`, не сделав ни одного запроса.
589
+
590
+ ```ts
591
+ import { findTracker, repoAdapterOf } from '@smwb/onreel-git-mcp/tracker';
592
+
593
+ const definition = findTracker('github');
594
+ if (definition === undefined) throw new Error('Встроенные адаптеры не зарегистрированы');
595
+ const repo = repoAdapterOf(definition, context);
596
+
597
+ const card = await repo.get(); // Repo: имя, ветка по умолчанию, описание, видимость, ссылки
598
+ console.log(card.name, card.defaultBranch ?? '—', card.visibility ?? '—');
599
+
600
+ // Ветки для диалога «Новый PR»: страница с курсором трекера и единственный фильтр search.
601
+ const page = await repo.branches({ limit: 50, search: 'onreel/' });
602
+ for (const branch of page.items) console.log(branch.name, branch.sha ?? '?', branch.protected === true);
603
+ ```
604
+
605
+ `RepoAdapter` — два метода. `get()` отдаёт карточку `Repo` (`repoSchema`): `name` — имя репозитория, как его
606
+ называет трекер (GitHub `name`, GitLab `name` проекта, SourceCraft `slug`), необязательные `defaultBranch`
607
+ (у пустого репозитория её нет), `description` и `visibility` (`repoVisibilitySchema` — `public`, `internal`,
608
+ `private`; значение трекера вне перечисления поле не заполняет), `links` — страница репозитория в трекере первой.
609
+ `branches(BranchQuery)` отдаёт страницу `Branch` (`branchSchema`): `name` — имя ветки без `refs/heads/`,
610
+ необязательные `sha` её головы, `protected` и `isDefault`.
611
+
612
+ Единственный фильтр списка — `search` (подстрока имени ветки), сортировки нет. Возможности описывает
613
+ `RepoCapabilities.branches` как у других списков (D-004): фильтр вне них — отказ `unsupported` до запроса
614
+ (R-002), `limit` вне целых от 1 и пустой `search` — `invalid_request` тоже до запроса. У GitHub параметра поиска
615
+ в `/branches` нет, поэтому `search` попадает в `clientSide` и проверяется по полученной странице: страница бывает
616
+ короче `limit` и пустой при живом `nextCursor`. GitLab и SourceCraft фильтруют сервером (параметр `search` и
617
+ `filter` соответственно), их `clientSide` пуст.
618
+
619
+ GitLab читает `^` в начале и `$` в конце `search` как якоря, а `*` — как шаблон, тогда как единая модель обещает
620
+ подстроку. Адаптер снимает эти якоря, и `search: '^rel'` уходит как `rel` — так же, как у GitHub и SourceCraft.
621
+ Экранировать якоря нельзя: `\^` GitLab ищет буквально и не находит ничего. `*` остаётся шаблоном GitLab — в имени
622
+ ветки git её не бывает.
623
+
624
+ | Трекер | Карточка | Ветки | `search` | Курсор страницы | `protected` | `isDefault` |
625
+ |---|---|---|---|---|---|---|
626
+ | GitHub | `GET /repos/{owner}/{repo}` | `GET /repos/{owner}/{repo}/branches` | на странице | номер страницы по `Link` | да | — |
627
+ | GitLab | `GET /api/v4/projects/{id}` | `GET /api/v4/projects/{id}/repository/branches` | параметр сервера, якоря снимаются | `x-next-page` | да | да (`default`) |
628
+ | SourceCraft | `GET /repos/{org}/{repo}` | `GET /repos/{org}/{repo}/branches` | параметр `filter` | `next_page_token` | — | — |
629
+
630
+ Список веток GitHub не отдаёт признак ветки по умолчанию, а список веток SourceCraft — ни его, ни признак
631
+ защиты: ветку по умолчанию потребитель читает из карточки (`Repo.defaultBranch`), а не из элементов списка.
632
+ Как и у других списков, `limit` выше потолка вернёт страницу размером потолка; потолок есть и у SourceCraft —
633
+ 100, но её `page_size` сверх него площадка отклоняет с 400, поэтому адаптер урезает его до потолка сам.
634
+
635
+ Публичные символы раздела — схемы `repoSchema`, `branchSchema`, `repoVisibilitySchema` и `branchFilterSchema`
636
+ с выведенными типами `Repo`, `Branch`, `RepoVisibility` и `BranchFilter`; типы `BranchQuery`, `RepoAdapter`,
637
+ `RepoCapabilities` и `RepoDefinition`; помощник `repoAdapterOf` и фабрики разделов `githubRepo()`,
638
+ `gitlabRepo()` и `sourcecraftRepo()`. Всё это выходит из субпути `…/tracker` — нового субпути нет (D-001, D-005).
639
+ За модель отвечает запись D-008, отказ до запроса — правило R-002.
640
+
569
641
  ## mcp
570
642
 
571
643
  `serveMcp` — построчный JSON-RPC 2.0 на stdio, только инструменты: `initialize`, `ping`, `tools/list`,
@@ -712,7 +784,7 @@ console.log(manifest.name, manifest.version);
712
784
  и пустая строка убирают значение. Наружу из хранилища выходит только признак «токен есть» (`hasTrackerToken`),
713
785
  а при чтении и записи значение регистрируется в приёмнике секретов.
714
786
  - **Токен — только своему origin.** `origin(connection)` в `TrackerDefinition` — origin API, куда адаптер (и его
715
- разделы `pulls` и `ci`) ходит с токеном: `https://api.github.com`, `https://gitlab.com`,
787
+ разделы `pulls`, `ci` и `repo`) ходит с токеном: `https://api.github.com`, `https://gitlab.com`,
716
788
  `https://api.sourcecraft.tech` по умолчанию, иначе origin `url` подключения; у Jira `url` обязателен. Потребитель
717
789
  привязывает к нему введённый токен: после правки `url` на другой origin токен спрашивают заново. Неверное
718
790
  подключение — `TrackerError('invalid_request')`, как у `create`. Встроенные адаптеры передают этот origin в
@@ -751,8 +823,10 @@ console.log(manifest.name, manifest.version);
751
823
  их не нужно править в потребителе.
752
824
  - `sideEffects: false`, один рантайм-зависимый пакет — `zod`.
753
825
  - Реестр трекеров, пул git, замки worktree и redactor — модульная глобальна на процесс: несколько независимых
754
- «хостов» в одном процессе делят их. Запросы к внешним API идут `fetch` из контекста; узлы без TLS-цепей
755
- внешнего трекера — задача вызывающего.
826
+ «хостов» в одном процессе делят их. Субпути пакета делят такое состояние, потому что модуль двух и более точек
827
+ входа tsup выносит в общий chunk; свою копию дал бы только бандл без splitting — инвариант одного определения
828
+ в собранном пакете держит проверка (D-013). Две независимо установленные копии пакета состояние не делят.
829
+ Запросы к внешним API идут `fetch` из контекста; узлы без TLS-цепей внешнего трекера — задача вызывающего.
756
830
  - Имена `ONREEL_*` и `HOST_CONTRACT_VERSION` (`1.14`) заморожены: они держат interop с onreel.
757
831
 
758
832
  ## Как внести изменение
package/dist/index.js CHANGED
@@ -59,7 +59,7 @@ import {
59
59
  // package.json
60
60
  var package_default = {
61
61
  name: "@smwb/onreel-git-mcp",
62
- version: "0.9.0",
62
+ version: "0.10.1",
63
63
  description: "\u0411\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u043C\u043E\u0434\u0443\u043B\u0435\u0439, \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u0438\u0437 onreel: git-\u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u044B\u0435 \u043F\u0443\u0442\u0438, \u0441\u043F\u0438\u0441\u043E\u043A \u0444\u0430\u0439\u043B\u043E\u0432 worktree, \u0436\u0438\u0437\u043D\u0435\u043D\u043D\u044B\u0439 \u0446\u0438\u043A\u043B worktree \u043F\u0440\u043E\u0442\u0438\u0432 \u043F\u043E\u0440\u0442\u0430 WorktreeStore, \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u044B \u0442\u0440\u0435\u043A\u0435\u0440\u043E\u0432 GitHub/GitLab/Jira/SourceCraft/\u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0438 MCP-\u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0430 stdio",
64
64
  keywords: [
65
65
  "git",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@smwb/onreel-git-mcp\",\n \"version\": \"0.9.0\",\n \"description\": \"Библиотека модулей, выделенных из onreel: git-операции и безопасные пути, список файлов worktree, жизненный цикл worktree против порта WorktreeStore, адаптеры трекеров GitHub/GitLab/Jira/SourceCraft/локального и MCP-сервер на stdio\",\n \"keywords\": [\n \"git\",\n \"worktree\",\n \"mcp\",\n \"issue-tracker\",\n \"github\",\n \"gitlab\",\n \"jira\",\n \"sourcecraft\",\n \"onreel\",\n \"typescript\"\n ],\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=24\"\n },\n \"files\": [\n \"dist\"\n ],\n \"sideEffects\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://git.sourcecraft.dev/elfenmail/onreel-git-mcp.git\"\n },\n \"homepage\": \"https://git.sourcecraft.dev/elfenmail/onreel-git-mcp\",\n \"license\": \"MIT\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./git\": {\n \"types\": \"./dist/git/index.d.ts\",\n \"import\": \"./dist/git/index.js\",\n \"default\": \"./dist/git/index.js\"\n },\n \"./files\": {\n \"types\": \"./dist/files/index.d.ts\",\n \"import\": \"./dist/files/index.js\",\n \"default\": \"./dist/files/index.js\"\n },\n \"./worktree\": {\n \"types\": \"./dist/worktree/index.d.ts\",\n \"import\": \"./dist/worktree/index.js\",\n \"default\": \"./dist/worktree/index.js\"\n },\n \"./tracker\": {\n \"types\": \"./dist/tracker/index.d.ts\",\n \"import\": \"./dist/tracker/index.js\",\n \"default\": \"./dist/tracker/index.js\"\n },\n \"./mcp\": {\n \"types\": \"./dist/mcp/index.d.ts\",\n \"import\": \"./dist/mcp/index.js\",\n \"default\": \"./dist/mcp/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"build\": \"tsup && tsc -p tsconfig.build.json\",\n \"typecheck\": \"tsc -p tsconfig.json && tsc -p tsconfig.examples.json\",\n \"lint\": \"oxlint --type-aware\",\n \"test\": \"node --test \\\"test/**/*.test.ts\\\"\",\n \"changeset\": \"changeset\",\n \"version\": \"changeset version\",\n \"release\": \"npm run build && changeset publish\"\n },\n \"dependencies\": {\n \"zod\": \"^4.6.5\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"2.29.2\",\n \"@types/node\": \"24.19.1\",\n \"oxlint\": \"1.87.0\",\n \"oxlint-tsgolint\": \"7.0.2003\",\n \"tsup\": \"8.5.1\",\n \"typescript\": \"7.0.2\"\n }\n}\n","// Корневой подпуть пакета @smwb/onreel-git-mcp: срез контракта (константы, схемы, типы, чистые\n// функции) и версия пакета. Всё без побочных эффектов при импорте (R-001). Швы ядра\n// (SecretSink, WorktreeStore, LocalIssueStore) и модули git/files/worktree/tracker/mcp\n// экспортируют свои подпути — см. exports в package.json и README.\nimport pkg from '../package.json' with { type: 'json' };\n\nexport * from './contract/contract.const.ts';\nexport * from './contract/contract.schema.ts';\nexport * from './contract/contract.types.ts';\nexport * from './contract/contract.lib.ts';\n\n// Версия пакета — из version в package.json: статический импорт JSON, его значение tsup подставляет\n// в бандл на сборке, поэтому VERSION не расходится с релизом changesets (тот правит только version).\nexport const VERSION: string = pkg.version;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AAAA,EACR,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,OAAS;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAe;AAAA,EACf,eAAiB;AAAA,IACf,QAAU;AAAA,IACV,UAAY;AAAA,EACd;AAAA,EACA,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,UAAY;AAAA,EACZ,SAAW;AAAA,EACX,SAAW;AAAA,IACT,KAAK;AAAA,MACH,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,SAAS;AAAA,MACP,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,WAAW;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,aAAa;AAAA,MACX,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,SAAS;AAAA,MACP,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,kBAAkB;AAAA,EACpB;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,EACb;AAAA,EACA,cAAgB;AAAA,IACd,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,MAAQ;AAAA,IACR,YAAc;AAAA,EAChB;AACF;;;AC1EO,IAAM,UAAkB,gBAAI;","names":[]}
1
+ {"version":3,"sources":["../package.json","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@smwb/onreel-git-mcp\",\n \"version\": \"0.10.1\",\n \"description\": \"Библиотека модулей, выделенных из onreel: git-операции и безопасные пути, список файлов worktree, жизненный цикл worktree против порта WorktreeStore, адаптеры трекеров GitHub/GitLab/Jira/SourceCraft/локального и MCP-сервер на stdio\",\n \"keywords\": [\n \"git\",\n \"worktree\",\n \"mcp\",\n \"issue-tracker\",\n \"github\",\n \"gitlab\",\n \"jira\",\n \"sourcecraft\",\n \"onreel\",\n \"typescript\"\n ],\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=24\"\n },\n \"files\": [\n \"dist\"\n ],\n \"sideEffects\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://git.sourcecraft.dev/elfenmail/onreel-git-mcp.git\"\n },\n \"homepage\": \"https://git.sourcecraft.dev/elfenmail/onreel-git-mcp\",\n \"license\": \"MIT\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./git\": {\n \"types\": \"./dist/git/index.d.ts\",\n \"import\": \"./dist/git/index.js\",\n \"default\": \"./dist/git/index.js\"\n },\n \"./files\": {\n \"types\": \"./dist/files/index.d.ts\",\n \"import\": \"./dist/files/index.js\",\n \"default\": \"./dist/files/index.js\"\n },\n \"./worktree\": {\n \"types\": \"./dist/worktree/index.d.ts\",\n \"import\": \"./dist/worktree/index.js\",\n \"default\": \"./dist/worktree/index.js\"\n },\n \"./tracker\": {\n \"types\": \"./dist/tracker/index.d.ts\",\n \"import\": \"./dist/tracker/index.js\",\n \"default\": \"./dist/tracker/index.js\"\n },\n \"./mcp\": {\n \"types\": \"./dist/mcp/index.d.ts\",\n \"import\": \"./dist/mcp/index.js\",\n \"default\": \"./dist/mcp/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"build\": \"tsup && tsc -p tsconfig.build.json\",\n \"typecheck\": \"tsc -p tsconfig.json && tsc -p tsconfig.examples.json\",\n \"lint\": \"oxlint --type-aware\",\n \"test\": \"node --test \\\"test/**/*.test.ts\\\"\",\n \"changeset\": \"changeset\",\n \"version\": \"changeset version\",\n \"release\": \"npm run build && changeset publish\"\n },\n \"dependencies\": {\n \"zod\": \"^4.6.5\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"2.29.2\",\n \"@types/node\": \"24.19.1\",\n \"oxlint\": \"1.87.0\",\n \"oxlint-tsgolint\": \"7.0.2003\",\n \"tsup\": \"8.5.1\",\n \"typescript\": \"7.0.2\"\n }\n}\n","// Корневой подпуть пакета @smwb/onreel-git-mcp: срез контракта (константы, схемы, типы, чистые\n// функции) и версия пакета. Всё без побочных эффектов при импорте (R-001). Швы ядра\n// (SecretSink, WorktreeStore, LocalIssueStore) и модули git/files/worktree/tracker/mcp\n// экспортируют свои подпути — см. exports в package.json и README.\nimport pkg from '../package.json' with { type: 'json' };\n\nexport * from './contract/contract.const.ts';\nexport * from './contract/contract.schema.ts';\nexport * from './contract/contract.types.ts';\nexport * from './contract/contract.lib.ts';\n\n// Версия пакета — из version в package.json: статический импорт JSON, его значение tsup подставляет\n// в бандл на сборке, поэтому VERSION не расходится с релизом changesets (тот правит только version).\nexport const VERSION: string = pkg.version;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AAAA,EACR,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,OAAS;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAe;AAAA,EACf,eAAiB;AAAA,IACf,QAAU;AAAA,IACV,UAAY;AAAA,EACd;AAAA,EACA,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,UAAY;AAAA,EACZ,SAAW;AAAA,EACX,SAAW;AAAA,IACT,KAAK;AAAA,MACH,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,SAAS;AAAA,MACP,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,WAAW;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,aAAa;AAAA,MACX,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,SAAS;AAAA,MACP,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,kBAAkB;AAAA,EACpB;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,EACb;AAAA,EACA,cAAgB;AAAA,IACd,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,MAAQ;AAAA,IACR,YAAc;AAAA,EAChB;AACF;;;AC1EO,IAAM,UAAkB,gBAAI;","names":[]}
@@ -1,6 +1,10 @@
1
1
  import type { IssuePriority, IssueStatusCategory, Worktree, WorktreeStatus } from '../contract/contract.types.ts';
2
2
  /** Контекст записи: кто и когда; без них реализация берёт текущее время и не пишет actor. */
3
3
  export type WorktreeWriteContext = {
4
+ /**
5
+ * Кто сделал переход. Собственные переходы библиотека пишет с actor `'host'` — процесс, который
6
+ * её держит (D-012); реализация потребителя отображает это значение в свою лексику.
7
+ */
4
8
  actor?: string | undefined;
5
9
  ts?: number | undefined;
6
10
  };
@@ -48,7 +52,13 @@ export type WorktreeStore = {
48
52
  /** Ready worktree терминальных задач без живых сессий — их чистит reconciler. */
49
53
  readyWorktreesOfSettledTasks(): Worktree[];
50
54
  };
51
- /** Пагинация списков: всё скоупится и листается страницами, без неограниченных выборок. */
55
+ /**
56
+ * Пагинация списков: всё скоупится и листается страницами, без неограниченных выборок.
57
+ * `limit` — целое от 1 до 500 (по умолчанию 100): значение вне диапазона реализация прижимает
58
+ * к границам. Нецелое значение до хранилища не доходит — адаптер отказывает `invalid_request`
59
+ * ещё в проверке запроса, поэтому код отказа реализации порта не предписан: эталон в памяти
60
+ * отвечает `invalid_request`, ledger падает ошибкой SQLite.
61
+ */
52
62
  export type PageInput = {
53
63
  limit?: number | undefined;
54
64
  cursor?: string | undefined;
@@ -102,8 +112,12 @@ export type LocalIssueStore = {
102
112
  createLocalIssue(projectId: string, input: NewLocalIssue, ts?: number): LocalIssueRow;
103
113
  getLocalIssue(projectId: string, number: number): LocalIssueRow | undefined;
104
114
  listLocalIssues(projectId: string, input?: ListLocalIssuesInput): Page<LocalIssueRow>;
105
- /** Нет задачи — undefined. */
115
+ /** Нет задачи — undefined. `assignee: null` снимает исполнителя и убирает ключ из строки. */
106
116
  updateLocalIssue(projectId: string, number: number, patch: LocalIssuePatch, ts?: number): LocalIssueRow | undefined;
117
+ /**
118
+ * Комментарий к существующей задаче: задачи нет — отказ с кодом `unknown_issue`, сиротных
119
+ * комментариев порт не хранит (D-011).
120
+ */
107
121
  addLocalComment(projectId: string, number: number, body: string, author?: string, ts?: number): LocalCommentRow;
108
122
  listLocalComments(projectId: string, number: number, input?: PageInput): Page<LocalCommentRow>;
109
123
  };
@@ -0,0 +1,2 @@
1
+ import type { RepoDefinition } from './repo.types.ts';
2
+ export declare function githubRepo(): RepoDefinition;
@@ -0,0 +1,2 @@
1
+ import type { RepoDefinition } from './repo.types.ts';
2
+ export declare function gitlabRepo(): RepoDefinition;
@@ -23,5 +23,11 @@ export * from './pull.lib.ts';
23
23
  export * from './github-pull.lib.ts';
24
24
  export * from './gitlab-pull.lib.ts';
25
25
  export * from './sourcecraft-pull.lib.ts';
26
+ export * from './repo.schema.ts';
27
+ export * from './repo.types.ts';
28
+ export * from './repo.lib.ts';
29
+ export * from './github-repo.lib.ts';
30
+ export * from './gitlab-repo.lib.ts';
31
+ export * from './sourcecraft-repo.lib.ts';
26
32
  export type { ListLocalIssuesInput, LocalCommentRow, LocalIssuePatch, LocalIssueRow, LocalIssueStore, NewLocalIssue, Page, PageInput, WorktreeCleanupFlags, WorktreeCleanupInput, WorktreeStore, WorktreeTx, WorktreeWriteContext, } from '../kernel/store.types.ts';
27
33
  export type { SecretSink } from '../kernel/log.types.ts';