@smwb/onreel-git-mcp 0.9.0 → 0.10.0

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`. Публичная поверхность держится документированной здесь:
@@ -566,6 +567,65 @@ for (;;) {
566
567
  (дочитывание по курсору), `keep: { bytes, from: 'head' | 'tail' }` удерживает окно кольцевым буфером,
567
568
  `readMax` и `timeoutMs` перекрывают потолки по умолчанию. Модель лога — запись D-006.
568
569
 
570
+ ### Репозиторий: карточка и ветки
571
+
572
+ Карточка репозитория и список веток — раздел `repo` того же `TrackerDefinition`, на том же подключении, что и
573
+ задачи (D-005, D-008): возможности `RepoCapabilities` плюс фабрика `create(context)` на том же `AdapterContext`.
574
+ Раздел строят фабрики `githubRepo()`, `gitlabRepo()` и `sourcecraftRepo()`; у локального трекера и Jira его нет,
575
+ и `repoAdapterOf(definition, context)` для них бросает `TrackerError('unsupported', 'Трекер <title> не ведёт
576
+ репозиторий.')`, не сделав ни одного запроса.
577
+
578
+ ```ts
579
+ import { findTracker, repoAdapterOf } from '@smwb/onreel-git-mcp/tracker';
580
+
581
+ const definition = findTracker('github');
582
+ if (definition === undefined) throw new Error('Встроенные адаптеры не зарегистрированы');
583
+ const repo = repoAdapterOf(definition, context);
584
+
585
+ const card = await repo.get(); // Repo: имя, ветка по умолчанию, описание, видимость, ссылки
586
+ console.log(card.name, card.defaultBranch ?? '—', card.visibility ?? '—');
587
+
588
+ // Ветки для диалога «Новый PR»: страница с курсором трекера и единственный фильтр search.
589
+ const page = await repo.branches({ limit: 50, search: 'onreel/' });
590
+ for (const branch of page.items) console.log(branch.name, branch.sha ?? '?', branch.protected === true);
591
+ ```
592
+
593
+ `RepoAdapter` — два метода. `get()` отдаёт карточку `Repo` (`repoSchema`): `name` — имя репозитория, как его
594
+ называет трекер (GitHub `name`, GitLab `name` проекта, SourceCraft `slug`), необязательные `defaultBranch`
595
+ (у пустого репозитория её нет), `description` и `visibility` (`repoVisibilitySchema` — `public`, `internal`,
596
+ `private`; значение трекера вне перечисления поле не заполняет), `links` — страница репозитория в трекере первой.
597
+ `branches(BranchQuery)` отдаёт страницу `Branch` (`branchSchema`): `name` — имя ветки без `refs/heads/`,
598
+ необязательные `sha` её головы, `protected` и `isDefault`.
599
+
600
+ Единственный фильтр списка — `search` (подстрока имени ветки), сортировки нет. Возможности описывает
601
+ `RepoCapabilities.branches` как у других списков (D-004): фильтр вне них — отказ `unsupported` до запроса
602
+ (R-002), `limit` вне целых от 1 и пустой `search` — `invalid_request` тоже до запроса. У GitHub параметра поиска
603
+ в `/branches` нет, поэтому `search` попадает в `clientSide` и проверяется по полученной странице: страница бывает
604
+ короче `limit` и пустой при живом `nextCursor`. GitLab и SourceCraft фильтруют сервером (параметр `search` и
605
+ `filter` соответственно), их `clientSide` пуст.
606
+
607
+ GitLab читает `^` в начале и `$` в конце `search` как якоря, а `*` — как шаблон, тогда как единая модель обещает
608
+ подстроку. Адаптер снимает эти якоря, и `search: '^rel'` уходит как `rel` — так же, как у GitHub и SourceCraft.
609
+ Экранировать якоря нельзя: `\^` GitLab ищет буквально и не находит ничего. `*` остаётся шаблоном GitLab — в имени
610
+ ветки git её не бывает.
611
+
612
+ | Трекер | Карточка | Ветки | `search` | Курсор страницы | `protected` | `isDefault` |
613
+ |---|---|---|---|---|---|---|
614
+ | GitHub | `GET /repos/{owner}/{repo}` | `GET /repos/{owner}/{repo}/branches` | на странице | номер страницы по `Link` | да | — |
615
+ | GitLab | `GET /api/v4/projects/{id}` | `GET /api/v4/projects/{id}/repository/branches` | параметр сервера, якоря снимаются | `x-next-page` | да | да (`default`) |
616
+ | SourceCraft | `GET /repos/{org}/{repo}` | `GET /repos/{org}/{repo}/branches` | параметр `filter` | `next_page_token` | — | — |
617
+
618
+ Список веток GitHub не отдаёт признак ветки по умолчанию, а список веток SourceCraft — ни его, ни признак
619
+ защиты: ветку по умолчанию потребитель читает из карточки (`Repo.defaultBranch`), а не из элементов списка.
620
+ Как и у других списков, `limit` выше потолка вернёт страницу размером потолка; потолок есть и у SourceCraft —
621
+ 100, но её `page_size` сверх него площадка отклоняет с 400, поэтому адаптер урезает его до потолка сам.
622
+
623
+ Публичные символы раздела — схемы `repoSchema`, `branchSchema`, `repoVisibilitySchema` и `branchFilterSchema`
624
+ с выведенными типами `Repo`, `Branch`, `RepoVisibility` и `BranchFilter`; типы `BranchQuery`, `RepoAdapter`,
625
+ `RepoCapabilities` и `RepoDefinition`; помощник `repoAdapterOf` и фабрики разделов `githubRepo()`,
626
+ `gitlabRepo()` и `sourcecraftRepo()`. Всё это выходит из субпути `…/tracker` — нового субпути нет (D-001, D-005).
627
+ За модель отвечает запись D-008, отказ до запроса — правило R-002.
628
+
569
629
  ## mcp
570
630
 
571
631
  `serveMcp` — построчный JSON-RPC 2.0 на stdio, только инструменты: `initialize`, `ping`, `tools/list`,
@@ -712,7 +772,7 @@ console.log(manifest.name, manifest.version);
712
772
  и пустая строка убирают значение. Наружу из хранилища выходит только признак «токен есть» (`hasTrackerToken`),
713
773
  а при чтении и записи значение регистрируется в приёмнике секретов.
714
774
  - **Токен — только своему origin.** `origin(connection)` в `TrackerDefinition` — origin API, куда адаптер (и его
715
- разделы `pulls` и `ci`) ходит с токеном: `https://api.github.com`, `https://gitlab.com`,
775
+ разделы `pulls`, `ci` и `repo`) ходит с токеном: `https://api.github.com`, `https://gitlab.com`,
716
776
  `https://api.sourcecraft.tech` по умолчанию, иначе origin `url` подключения; у Jira `url` обязателен. Потребитель
717
777
  привязывает к нему введённый токен: после правки `url` на другой origin токен спрашивают заново. Неверное
718
778
  подключение — `TrackerError('invalid_request')`, как у `create`. Встроенные адаптеры передают этот origin в
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.0",
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.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":[]}
@@ -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';