@smwb/onreel-git-mcp 0.2.1 → 0.4.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,7 @@
10
10
  - **жизненный цикл worktree** — замки, двухфазное создание и очистка, сверка при старте, свип и корзина —
11
11
  против портов хранения, которые реализует потребитель;
12
12
  - **адаптеры трекеров** — единая модель задач и пять адаптеров: GitHub, GitLab, Jira, SourceCraft и локальный
13
- трекер поверх хранилища потребителя;
13
+ трекер поверх хранилища потребителя; у GitHub, GitLab и SourceCraft есть раздел pull request-ов (D-005);
14
14
  - **MCP stdio-сервер** — JSON-RPC 2.0 поверх stdin/stdout, инструменты строятся из таблицы команд вызывающего.
15
15
 
16
16
  Пакет ESM, рантайм-зависимость одна — `zod`. Публичная поверхность держится документированной здесь:
@@ -243,7 +243,8 @@ const issue = await adapter.get('7');
243
243
  try {
244
244
  await adapter.update('7', { status: 'in_progress' });
245
245
  } catch (error) {
246
- if (error instanceof TrackerError) console.log(error.failure); // 'failed' | 'unknown_issue' | 'invalid_request'
246
+ // 'failed' | 'unknown_issue' | 'invalid_request' | 'not_found' | 'unsupported' | 'conflict' | 'rate_limited'
247
+ if (error instanceof TrackerError) console.log(error.failure);
247
248
  else throw error;
248
249
  }
249
250
  ```
@@ -256,7 +257,173 @@ try {
256
257
  для `WorktreeStore`, пишет потребитель; эталон в памяти — `test/helpers/tracker-fixtures.lib.ts`.
257
258
 
258
259
  Таймаут запроса к трекеру — `TRACKER_TIMEOUT_MS` (15 с), тело ответа ошибки обрезают до
259
- `TRACKER_ERROR_BODY_MAX` (300 символов) и маскируют; 404 с `missingIsIssue` — `unknown_issue`, а не «неверный адрес».
260
+ `TRACKER_ERROR_BODY_MAX` (300 символов) и маскируют; 404 с `missingIsIssue` — `unknown_issue`, а не «неверный
261
+ адрес». 404 с заданным `missing` отдаёт его код и текст (`not_found`), статус из `conflictOn` — `conflict`,
262
+ 429 и 403, который выглядит лимитом частоты (`x-ratelimit-remaining: 0` или `retry-after`) — `rate_limited`
263
+ (подробнее — в подразделе ниже).
264
+
265
+ ### Фильтры, сортировка и страницы
266
+
267
+ `IssueQuery` — `PageQuery` плюс необязательные фильтры (D-004): `status` (категории статуса), `labels`
268
+ (должны присутствовать все перечисленные), `assignee` (в том же виде, что в `Issue.assignee`; `null` — задачи
269
+ без исполнителя), `author` (логин или slug трекера), `search` (как ищет сам трекер: у SourceCraft — префикс
270
+ заголовка, у локального — подстрока заголовка и описания), `createdAfter`/`createdBefore`/`updatedAfter`/
271
+ `updatedBefore` (мс Unix epoch, границы включительно) и `sort` — `ListSort<IssueSortField>` (`{ field, direction? }`,
272
+ где `direction` — `SortDirection`). Без `sort` — прежний порядок трекера: GitHub, GitLab, Jira и локальный отдают
273
+ новые первыми, SourceCraft — свои (старые первыми). Без `direction` — `desc`.
274
+ `comments` принимает `CommentQuery`: `updatedAfter` (мс) и `order` — `SortDirection` (`asc` по умолчанию).
275
+ Трекеры ограничивают размер страницы (GitHub и GitLab — до 100): `limit` выше потолка вернёт страницу размером
276
+ потолка.
277
+
278
+ Что умеет каждый список, описывают `IssueCapabilities` в разделе `issues` определения трекера:
279
+ `{ list: ListCapabilities<IssueFilter, IssueSortField>, comments: CommentCapabilities }`. `ListCapabilities`
280
+ перечисляет `filters` — фильтры, которые адаптер применяет (любой другой — отказ `unsupported` **до запроса**),
281
+ `clientSide` — часть `filters`, которую адаптер проверяет по полученной странице: такая страница бывает короче
282
+ `limit` и даже пустой при живом `nextCursor`, и `sorts` — поля сортировки. `CommentCapabilities` описывает
283
+ список комментариев так же: `filters` и `clientSide` по `updatedAfter` и `order` вместо `sorts` — допустимые
284
+ порядки, первый из них по умолчанию. Возможности статичны и сериализуются в JSON.
285
+ У определения без раздела читаются `LEGACY_ISSUE_CAPABILITIES` — через `issueCapabilitiesOf(definition)`:
286
+
287
+ | Трекер | `list.filters` | `list.clientSide` | `list.sorts` | `comments` |
288
+ |---|---|---|---|---|
289
+ | GitHub | все `ISSUE_FILTERS` | `status` | `created`, `updated`, `comments` | `updatedAfter`; порядок `asc` |
290
+ | GitLab | все `ISSUE_FILTERS` | `status` | `created`, `updated`, `priority`, `title` | `updatedAfter` (на странице); `asc`, `desc` |
291
+ | Jira | все `ISSUE_FILTERS` | — | `created`, `updated`, `priority`, `title` | как у GitLab |
292
+ | SourceCraft | все `ISSUE_FILTERS` | `assignee` | `created`, `updated`, `priority`, `title` | как у GitLab |
293
+ | локальный | без `author` | без `status` | — | `updatedAfter` (на странице); `asc` |
294
+
295
+ У GitHub фильтры `search` и диапазоны `created*`/`updated*` идут через Search API (30 запросов/мин,
296
+ не больше 1000 результатов). Границы времени там — квалификаторы `q` без кавычек: одна граница —
297
+ `created:>=<ISO>` или `created:<=<ISO>`, обе границы одного поля — один диапазон `created:<ISO>..<ISO>`
298
+ (два отдельных квалификатора GitHub объединяет через OR, и вместо фильтра он отдал бы почти всё, а кавычки
299
+ в дате не читает вовсе — отдал бы пустой список). У SourceCraft статус уходит в QL-фильтр
300
+ (`SOURCECRAFT_STATUS_FILTER`), но всё равно перепроверяется на странице. Правила модели, которые держат тесты:
301
+
302
+ - **R1 — проверка до запроса.** Метод списка сначала зовёт `assertListQuery`/`assertCommentQuery`: фильтр
303
+ или сортировка вне возможностей — `TrackerError('unsupported')` без единого запроса, а неверное значение
304
+ (`limit` < 1, время не целое ≥ 0, пустая строка, метка с `,` там, где трекер ждёт CSV) — `invalid_request`.
305
+ - **R2 — время.** Время в мс Unix epoch, границы включительно; наверх уходят как `isoTime(ms)` (у Jira —
306
+ UTC с округлением минут наружу: `after` вниз, `before` вверх).
307
+ - **R3 — значения.** `labels` — все должны присутствовать; `assignee` — как в `Issue.assignee`, `null` —
308
+ без исполнителя; `author` — логин или slug трекера; `search` — как ищет сам трекер.
309
+ - **R4 — умолчания.** Без `sort` — прежний порядок трекера: GitHub, GitLab, Jira и локальный отдают новые
310
+ первыми, у SourceCraft — свой порядок по умолчанию (старые первыми); без `direction` — `desc`, у комментариев
311
+ без `order` — `asc`.
312
+ - **R5 — страницы.** `clientSide`-фильтр применяется к элементам каждой полученной страницы, `nextCursor` —
313
+ курсор трекера; страницы бывают короче `limit` и пустыми.
314
+ - **R6 — экранирование.** Каждое значение пользователя, попадающее в JQL, QL SourceCraft или `q` поиска GitHub,
315
+ проходит `quoted()` (`\` и `"` экранируются); свободный текст GitHub уходит одной фразой в кавычках, так что
316
+ `repo:чужой/репозиторий` из ввода не добавит чужой репозиторий в выдачу. Даты `isoTime(ms)` в `q` — исключение:
317
+ их кладут без кавычек (значение машинное, `[0-9TZ:.-]`), иначе GitHub не найдёт ни одной задачи.
318
+ - **R7 — прежние трекеры.** Определение без раздела `issues` читается как `LEGACY_ISSUE_CAPABILITIES`
319
+ через `issueCapabilitiesOf()` — свои трекеры потребителя продолжают работать без изменений.
320
+
321
+ Помощники фильтров — публичные символы субпути: `usedFilters` (имена заполненных фильтров в порядке
322
+ констант), `assertListQuery`/`assertCommentQuery` (проверка запроса по возможностям), `issueCapabilitiesOf`,
323
+ `isoTime` (мс → ISO 8601 UTC), `inTimeRange` (включительные границы, заданная граница и неизвестное время —
324
+ не проходит), `containsText` (подстрока без учёта регистра), `quoted` (экранирование для JQL/QL/`q`),
325
+ `keysFor` (обратный поиск по таблице сопоставления). Имена фильтров и полей сортировки — константы
326
+ `ISSUE_FILTERS`, `ISSUE_SORT_FIELDS`, `COMMENT_FILTERS` и выведенные из них типы `IssueFilter`,
327
+ `IssueSortField`, `CommentFilter`. За модель отвечают запись D-004 и правило R-002.
328
+
329
+ **Новые коды отказа.** `TrackerFailure` расширен четырьмя кодами; `requestJson` выставляет их по ответу,
330
+ а потребитель сопоставляет со своим контрактом:
331
+
332
+ | `TrackerFailure` | Когда возникает | Код контракта потребителя |
333
+ |---|---|---|
334
+ | `not_found` | 404 сущности, заданный через `missing` (PR, прогон, задание) | `not_found` |
335
+ | `unsupported` | фильтр/сортировка вне возможностей, неподдержанная операция | `capability_unsupported` |
336
+ | `conflict` | статус из `conflictOn` (405/409/422): переход сейчас невозможен | `lifecycle_conflict` |
337
+ | `rate_limited` | 429, 403 с `x-ratelimit-remaining: 0` и 403 с `retry-after` (вторичные лимиты GitHub: Search API — 30 запросов/мин); задержка — из `retry-after`, иначе `x-ratelimit-reset` (GitHub), иначе `ratelimit-reset` (GitLab) | `rate_limited` |
338
+
339
+ Все четыре кода уже есть в каталоге ошибок контракта (`errorCatalog`), срез контракта не меняется.
340
+ Исчерпывающий `switch` по `TrackerFailure` у потребителя после обновления нужно дополнить.
341
+
342
+ ### Pull request-ы
343
+
344
+ Pull request-ы — раздел `pulls` определения трекера (D-005), а не отдельный реестр и не новые методы
345
+ `TrackerAdapter`: адаптер PR живёт на том же подключении (`target`, `token`, `url`) и в том же `AdapterContext`,
346
+ что и задачи. Раздел ведут GitHub, GitLab и SourceCraft; у локального трекера и Jira его нет, и
347
+ `pullRequestAdapterOf(definition, context)` для них бросает `TrackerError('unsupported')`, не сделав ни одного
348
+ запроса. Фабрики разделов — `githubPulls()`, `gitlabPulls()` и `sourcecraftPulls()`: каждая возвращает
349
+ `PullRequestDefinition` (`capabilities` + `create(context)`), и определение трекера получает раздел полем `pulls`.
350
+
351
+ ```ts
352
+ import { findTracker, pullRequestAdapterOf } from '@smwb/onreel-git-mcp/tracker';
353
+
354
+ const definition = findTracker('github');
355
+ if (definition === undefined) throw new Error('Встроенные адаптеры не зарегистрированы');
356
+ const pulls = pullRequestAdapterOf(definition, context);
357
+
358
+ const page = await pulls.list({ limit: 50, status: ['open'], target: 'main', sort: { field: 'updated' } });
359
+ const pr = page.items[0];
360
+ if (pr !== undefined) await pulls.merge(pr.key, { method: 'squash', headSha: pr.headSha });
361
+ ```
362
+
363
+ `PullRequestAdapter` — семь методов: `list`, `get`, `create`, `update`, `merge`, `comments` и `comment`.
364
+ Список и комментарии листаются и фильтруются так же, как задачи (D-004, R-002): `PullRequestQuery` — это
365
+ `PageQuery` плюс необязательные `status`, `author`, `source`, `target`, `labels`, `search`,
366
+ `createdAfter`/`createdBefore`/`updatedAfter`/`updatedBefore` и `sort`; имена фильтров перечисляет
367
+ `pullRequestFilterSchema` (тип `PullRequestFilter`), сортировка — `ListSort<PullRequestSortField>` с полями
368
+ `created`, `updated`, `title` (`pullRequestSortFieldSchema`). `comments` принимает тот же `CommentQuery`, что и
369
+ адаптер задач.
370
+
371
+ Модель PR описывает `pullRequestSchema` (тип `PullRequest`): `key` — номер в своём трекере (GitHub number,
372
+ GitLab iid, SourceCraft slug), для клиента непрозрачная строка; `title`, необязательное `description`;
373
+ `status` — `{ category, name }`, где `category` из `pullRequestStatusCategorySchema` (`draft`, `open`, `merged`,
374
+ `closed`), а `name` — как состояние называет сам трекер; `author`; `source` и `target` — имена веток без
375
+ `refs/heads/`; `headSha` — голова источника; `labels`; необязательные `reviewers` (трекер их не отдаёт — поля
376
+ нет); `links` и времена `createdAt`/`updatedAt`/`mergedAt`/`closedAt`.
377
+
378
+ Что умеет менять адаптер, описывают `PullRequestCapabilities` — они статичны и сериализуются в JSON: `list` и
379
+ `comments` как у задач, плюс `create`, `createDraft`, `update` (поля, которые меняет `update`), `statuses`
380
+ (категории, в которые переводит `update({ status })`), `comment`, `merge` (способы слияния, пусто — `merge` не
381
+ поддерживается) и `deleteSourceOnMerge`. `merge` принимает `MergeInput`: `method` из `mergeMethodSchema`
382
+ (`merge`, `squash`, `rebase`), способ вне `capabilities.merge` — `unsupported` до запроса; без `method` способ по настройке репозитория (у GitHub это слияние коммитом `merge`, у GitLab при явном `method: 'merge'`
383
+ действует squash-настройка MR или проекта), `headSha` — голова, которую видел вызывающий (другая — отказ
384
+ `conflict`, слияния не будет), `message` — сообщение коммита слияния, `deleteSource` — удалить ветку-источник. `create` принимает
385
+ `NewPullRequestInput` (`title`, `source`, `target`, `description?`, `draft?`), `update` — `PullRequestPatchInput`
386
+ (`title?`, `description?`, `target?`, `status?` — в `merged` переводит только `merge`). Вне объявленных
387
+ возможностей — `unsupported` до запроса, как и у списков задач.
388
+
389
+ | Трекер | `list.clientSide` | `list.sorts` | `create` / `createDraft` | `update` | `statuses` | `merge` | `deleteSourceOnMerge` |
390
+ |---|---|---|---|---|---|---|---|
391
+ | GitHub | `status`, `author`, `labels`, `search`, `created*`/`updated*` | `created`, `updated` | `true` / `true` | `title`, `description`, `target` | `open`, `closed` | `merge`, `squash`, `rebase` | `false` |
392
+ | GitLab | `status` | `created`, `updated`, `title` | `true` / `true` | те же | `draft`, `open`, `closed` | `merge`, `squash` | `true` |
393
+ | SourceCraft | `labels`, `search`, `created*`/`updated*` | `created`, `updated`, `title` | `true` / `true` | те же | `draft`, `open`, `closed` | `merge`, `squash`, `rebase` | `true` |
394
+
395
+ У всех трёх `list.filters` — весь `pullRequestFilterSchema`. Комментарии: у GitHub `updatedAfter` фильтрует сам
396
+ трекер и порядок только `asc`; у GitLab и SourceCraft `updatedAfter` проверяется по странице, порядки `asc` и
397
+ `desc`. `comment` — `true` у всех.
398
+
399
+ Сопоставление состояний — открытые таблицы, как у задач: `GITLAB_MERGE_REQUEST_STATES` (`locked` — слияние идёт,
400
+ MR ещё открыт, поэтому `open`) и `SOURCECRAFT_PULL_STATUSES` (`merging` — `open` с именем `merging`, `discarded`
401
+ — `closed`). Черновик у GitLab — префикс заголовка, а не поле: его ставит и снимает адаптер
402
+ (`GITLAB_DRAFT_PREFIX` и все формы префикса — `GITLAB_DRAFT_PATTERN`). Слияние SourceCraft асинхронно: `merge` вернёт PR с категорией `open` (`status.name` `open` или `merging`) до
403
+ завершения операции, либо уже `merged`; операция, отклонённая трекером (`failed`/`cancel` в ответе 202), — отказ
404
+ `conflict`, и следующий `get` потребуется, только чтобы дождаться результата. `headSha` на всех трёх трекерах
405
+ защищает от слияния чужой головы: GitHub и GitLab сверяют его сервером (атомарно), у SourceCraft сверка идёт на
406
+ клиенте перед `POST /merge` — это лучшее старание, push между чтением и слиянием она не отсекает, поэтому
407
+ `headSha` передают полным и в нижнем регистре.
408
+
409
+ Фильтры списка работают по-разному, и это видно по пустым страницам. `search`: у GitHub — подстрока без учёта
410
+ регистра в заголовке и описании, проверяется на странице; у GitLab — серверный параметр `search` по заголовку
411
+ и описанию; у SourceCraft — подстрока на странице. У GitHub `source` уходит параметром `head=<владелец>:<ветка>`
412
+ с владельцем целевого репозитория, поэтому PR из форков этим фильтром не находятся; `author` и `labels` там же
413
+ сверяются точным совпадением на странице (регистр имеет значение). У GitLab `status: ['open']` шлёт
414
+ `state=opened` и потому не возвращает `locked` MR, хотя их категория — `open`. У SourceCraft неизвестный
415
+ `author` — 400 «user not found» от самого трекера, то есть `failed`, а не пустая страница. `status` из
416
+ неизвестной категории адаптер отклоняет `invalid_request` до запроса, пустой массив `status: []` равен его
417
+ отсутствию. Переход `update({ status })` «в то же состояние» ни у кого не пишет повторно: GitLab не шлёт
418
+ PUT, GitHub — PATCH, SourceCraft не дёргает эндпоинт состояния.
419
+
420
+ Публичные символы раздела — схемы `pullRequestSchema`, `pullRequestStatusCategorySchema`,
421
+ `pullRequestFilterSchema`, `pullRequestSortFieldSchema` и `mergeMethodSchema` с выведенными типами
422
+ `PullRequest`, `PullRequestStatusCategory`, `PullRequestFilter`, `PullRequestSortField` и `MergeMethod`; типы
423
+ `PullRequestQuery`, `NewPullRequestInput`, `PullRequestPatchInput`, `MergeInput`, `PullRequestAdapter`,
424
+ `PullRequestCapabilities` и `PullRequestDefinition`; помощник `pullRequestAdapterOf` и фабрики разделов
425
+ `githubPulls()`, `gitlabPulls()` и `sourcecraftPulls()`. Всё это выходит из субпути `…/tracker` — нового субпути
426
+ нет (D-001, D-005). За модель отвечают таблицы сопоставления и запись D-005, отказ до запроса — правило R-002.
260
427
 
261
428
  ## mcp
262
429
 
package/dist/git/index.js CHANGED
@@ -44,11 +44,11 @@ import {
44
44
  worktreePathFor
45
45
  } from "../chunk-C6PHNSDC.js";
46
46
  import "../chunk-3YP22YLA.js";
47
- import "../chunk-4ZGRXIVA.js";
48
47
  import {
49
48
  defaultSecretSink,
50
49
  redactSecretText
51
50
  } from "../chunk-L7CPE2SO.js";
51
+ import "../chunk-4ZGRXIVA.js";
52
52
  export {
53
53
  GIT_CHECKOUT_TIMEOUT_MS,
54
54
  GIT_TIMEOUT_MS,
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.2.1",
62
+ version: "0.4.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.2.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
+ {"version":3,"sources":["../package.json","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@smwb/onreel-git-mcp\",\n \"version\": \"0.4.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":[]}
package/dist/mcp/index.js CHANGED
@@ -2,6 +2,9 @@ import {
2
2
  contractError,
3
3
  formatVersion
4
4
  } from "../chunk-3YP22YLA.js";
5
+ import {
6
+ redactSecretText
7
+ } from "../chunk-L7CPE2SO.js";
5
8
  import {
6
9
  ENV_DISPATCH_ID,
7
10
  ENV_HOST_URL,
@@ -13,9 +16,6 @@ import {
13
16
  contractErrorSchema,
14
17
  requestIdSchema
15
18
  } from "../chunk-4ZGRXIVA.js";
16
- import {
17
- redactSecretText
18
- } from "../chunk-L7CPE2SO.js";
19
19
 
20
20
  // src/mcp/mcp.const.ts
21
21
  var MCP_PROTOCOL_VERSIONS = ["2025-11-25", "2025-06-18", "2025-03-26", "2024-11-05"];
@@ -0,0 +1,2 @@
1
+ import type { PullRequestDefinition } from './pull.types.ts';
2
+ export declare function githubPulls(): PullRequestDefinition;
@@ -0,0 +1,2 @@
1
+ import type { PullRequestDefinition } from './pull.types.ts';
2
+ export declare function gitlabPulls(): PullRequestDefinition;
@@ -11,5 +11,11 @@ export * from './github.lib.ts';
11
11
  export * from './gitlab.lib.ts';
12
12
  export * from './jira.lib.ts';
13
13
  export * from './sourcecraft.lib.ts';
14
+ export * from './pull.schema.ts';
15
+ export * from './pull.types.ts';
16
+ export * from './pull.lib.ts';
17
+ export * from './github-pull.lib.ts';
18
+ export * from './gitlab-pull.lib.ts';
19
+ export * from './sourcecraft-pull.lib.ts';
14
20
  export type { ListLocalIssuesInput, LocalCommentRow, LocalIssuePatch, LocalIssueRow, LocalIssueStore, NewLocalIssue, Page, PageInput, WorktreeCleanupFlags, WorktreeCleanupInput, WorktreeStore, WorktreeTx, WorktreeWriteContext, } from '../kernel/store.types.ts';
15
21
  export type { SecretSink } from '../kernel/log.types.ts';