@smwb/onreel-git-mcp 0.8.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`. Публичная поверхность держится документированной здесь:
@@ -227,8 +228,8 @@ import {
227
228
  registerBuiltinTrackers();
228
229
  console.log(findTracker('github')?.descriptor.title); // 'GitHub'; реестр пуст без этого вызова
229
230
 
230
- const fetch: TrackerFetch = (input, init) =>
231
- Promise.resolve(new Response(JSON.stringify({ number: 7, title: 'Падает сборка', state: 'open', labels: [] }), { status: 200 }));
231
+ // Обёртка передаёт init целиком: redirect: 'manual' от библиотеки должен дойти до fetch (раздел «Безопасность»).
232
+ const fetch: TrackerFetch = (input, init) => globalThis.fetch(input, init);
232
233
 
233
234
  const context: AdapterContext = {
234
235
  projectId: 'p1',
@@ -262,6 +263,12 @@ try {
262
263
  429 и 403, который выглядит лимитом частоты (`x-ratelimit-remaining: 0` или `retry-after`) — `rate_limited`
263
264
  (подробнее — в подразделе ниже).
264
265
 
266
+ Origin API подключения отдаёт необязательная функция определения `origin(connection)`: у `sourcecraftTracker()`,
267
+ `githubTracker()`, `gitlabTracker()` и `jiraTracker()` она есть, у `localTracker()` — нет (сети и токена у него
268
+ нет). `requestJson` и `requestText` принимают `origin` в запросе и сами проходят редиректы, не больше
269
+ `TRACKER_REDIRECT_MAX` (5), поэтому обёртка `fetch` потребителя передаёт `init.redirect` дальше; подробнее — в
270
+ разделе «Безопасность».
271
+
265
272
  ### Фильтры, сортировка и страницы
266
273
 
267
274
  `IssueQuery` — `PageQuery` плюс необязательные фильтры (D-004): `status` (категории статуса), `labels`
@@ -560,6 +567,65 @@ for (;;) {
560
567
  (дочитывание по курсору), `keep: { bytes, from: 'head' | 'tail' }` удерживает окно кольцевым буфером,
561
568
  `readMax` и `timeoutMs` перекрывают потолки по умолчанию. Модель лога — запись D-006.
562
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
+
563
629
  ## mcp
564
630
 
565
631
  `serveMcp` — построчный JSON-RPC 2.0 на stdio, только инструменты: `initialize`, `ping`, `tools/list`,
@@ -705,6 +771,22 @@ console.log(manifest.name, manifest.version);
705
771
  `rename`, одиночная запись сериализуется очередью, чтобы два подключения не затерли друг друга. `deleteTrackerToken`
706
772
  и пустая строка убирают значение. Наружу из хранилища выходит только признак «токен есть» (`hasTrackerToken`),
707
773
  а при чтении и записи значение регистрируется в приёмнике секретов.
774
+ - **Токен — только своему origin.** `origin(connection)` в `TrackerDefinition` — origin API, куда адаптер (и его
775
+ разделы `pulls`, `ci` и `repo`) ходит с токеном: `https://api.github.com`, `https://gitlab.com`,
776
+ `https://api.sourcecraft.tech` по умолчанию, иначе origin `url` подключения; у Jira `url` обязателен. Потребитель
777
+ привязывает к нему введённый токен: после правки `url` на другой origin токен спрашивают заново. Неверное
778
+ подключение — `TrackerError('invalid_request')`, как у `create`. Встроенные адаптеры передают этот origin в
779
+ `requestJson` и `requestText` (поле `origin` у `JsonRequest` и `TextRequest`; нет — origin самого адреса): адрес
780
+ вне него — `invalid_request` до сети. Редиректы (301, 302, 303, 307, 308 с `location`) проходит библиотека, а не
781
+ `fetch` контекста: тот получает `redirect: 'manual'`, поэтому обёртка потребителя передаёт `redirect` в свой `fetch`.
782
+ Ответ, за которым `fetch` пошёл сам (`redirected`, адрес ответа на другом origin или `opaqueredirect`), —
783
+ `failed` с подсказкой про `init.redirect`, а не данные: запрос туда уже ушёл, но потеря `redirect` в обёртке
784
+ видна сразу, а не утечкой токена.
785
+ Метод меняется как в спецификации fetch (303 и 301/302 после POST — GET без тела). На чужой origin — и на всё
786
+ после него, даже обратно — уходит только GET и только с `accept`: без `Authorization`, `private-token` и других
787
+ заголовков запроса; иной метод — `failed` без перехода. Так 302 GitHub на подписанный адрес лога не уносит
788
+ токен, какой бы `fetch` ни пришёл в контексте. Больше `TRACKER_REDIRECT_MAX` переходов подряд и редирект не на
789
+ http/https — `failed`.
708
790
  - **Маскирование секретов.** `redactSecretText` и `SecretSink` (по умолчанию `defaultSecretSink`) — один redactor
709
791
  на библиотеку: его применяют `GitError` (D-272), `requestJson` (тексты отказов трекера) и внутренний отказ
710
792
  `serveMcp`. Свой журнал потребителя подключают приёмником `SecretSink`; известные значения добавляют до
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.8.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.8.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;
@@ -5,7 +5,7 @@ export declare function requestJson(url: string, request: JsonRequest): Promise<
5
5
  * поток отменяется, как только окно набрано; tail — последние keep.bytes в кольцевом буфере. Чтение обрывается
6
6
  * на readMax байт тела. Границы окна сдвигаются к целым символам UTF-8: начало — вперёд, конец — назад (и у тела,
7
7
  * оборванного посреди символа). Отказ — как у requestJson: missing, rate_limited, failed с телом без секретов.
8
- * fetch следует редиректам (302 GitHub на подписанный адрес); по спецификации fetch Authorization на чужой origin не уходит.
8
+ * Origin и редиректы — как у requestJson: 302 GitHub на подписанный адрес лога уходит GET без Authorization.
9
9
  */
10
10
  export declare function requestText(url: string, request: TextRequest): Promise<TextResponse>;
11
11
  /** Базовый адрес без хвостовых слэшей; не http и не https — отказ подключения. */
@@ -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';