@smwb/onreel-git-mcp 0.4.0 → 0.6.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
@@ -425,6 +425,141 @@ PUT, GitHub — PATCH, SourceCraft не дёргает эндпоинт сост
425
425
  `githubPulls()`, `gitlabPulls()` и `sourcecraftPulls()`. Всё это выходит из субпути `…/tracker` — нового субпути
426
426
  нет (D-001, D-005). За модель отвечают таблицы сопоставления и запись D-005, отказ до запроса — правило R-002.
427
427
 
428
+ ### CI
429
+
430
+ Прогоны CI — необязательный раздел `ci` того же `TrackerDefinition`, на том же подключении, что задачи (D-005):
431
+ возможности `CiCapabilities` плюс фабрика `create(context)` на том же `AdapterContext`. Раздел строят фабрики
432
+ `githubCi()`, `gitlabCi()` и `sourcecraftCi()`; у локального трекера и Jira раздела нет. Адаптер раздела —
433
+ `ciAdapterOf(definition, context)`; у трекера без `ci` это `TrackerError('unsupported', 'Трекер <title> не ведёт CI.')`.
434
+ `CiAdapter` умеет: `listWorkflows`, `listRuns`, `getRun`, `listJobs`, `getJob`, `log`, `trigger`, `rerun`,
435
+ `rerunJob`, `cancel`, `cancelJob`. Каждый возвращённый объект проходит parse своей схемы zod (`ciWorkflowSchema`,
436
+ `ciRunSchema`, `ciJobSchema`, `ciLogSchema`); состояние — категория `CiStatusCategory` (`queued`, `running`,
437
+ `waiting`, `success`, `failed`, `canceled`, `skipped`) плюс сырое имя трекера в `status.name`, событие —
438
+ категория `CiEventCategory` плюс сырое имя. Метод вне возможностей своего трекера — отказ `unsupported`
439
+ **до запроса**.
440
+
441
+ Сопоставление сырых статусов и событий с единой моделью — открытые таблицы, как у задач, чтобы потребитель
442
+ видел, во что именно преводится значение его трекера. Правила для неизвестного: статус → `running` (прогон
443
+ ещё не закончен, и тот, кто ждёт конца, продолжает опрос), законченный прогон GitHub с незнакомым
444
+ `conclusion` → `failed` (незнакомое заключение не бывает зелёным), событие → `other`.
445
+
446
+ GitHub Actions (`GITHUB_RUN_STATUSES` — `status`, пока он не `completed`; `GITHUB_RUN_CONCLUSIONS` —
447
+ `conclusion` при `status: completed`; `GITHUB_RUN_EVENTS` — `event` прогона):
448
+
449
+ - `queued`/`requested`/`pending` → `queued`, `waiting` → `waiting`, `in_progress` → `running`;
450
+ - `success`/`neutral` → `success`, `failure`/`timed_out`/`startup_failure` → `failed`,
451
+ `cancelled`/`stale` → `canceled`, `skipped` → `skipped`, `action_required` → `waiting`;
452
+ - `push` → `push`, `pull_request`/`pull_request_target`/`merge_group` → `pull_request`,
453
+ `workflow_dispatch` → `manual`, `schedule` → `schedule`,
454
+ `repository_dispatch`/`workflow_run`/`workflow_call` → `trigger`.
455
+
456
+ GitLab (`GITLAB_CI_STATUSES` — `status` пайплайна и задания; `GITLAB_PIPELINE_SOURCES` — `source` пайплайна):
457
+
458
+ - `created`/`waiting_for_resource`/`preparing`/`pending` → `queued`, `running`/`canceling` → `running`,
459
+ `waiting_for_callback`/`manual`/`scheduled` → `waiting`, `success`/`failed`/`canceled`/`skipped` →
460
+ одноимённые категории;
461
+ - `push` → `push`, `merge_request_event`/`external_pull_request_event` → `pull_request`,
462
+ `web`/`api`/`chat`/`webide` → `manual`, `schedule`/`pipeline_execution_policy_schedule` → `schedule`,
463
+ `trigger`/`pipeline`/`parent_pipeline` → `trigger`.
464
+
465
+ SourceCraft (`SOURCECRAFT_CI_STATUSES` — `status` прогона, workflow, задачи и куба; `SOURCECRAFT_RUN_EVENTS`
466
+ — `event_type` прогона):
467
+
468
+ - `created`/`prepared` → `queued`, `processing` → `running`, `awaiting_approval` → `waiting`,
469
+ `success`/`failed`/`skipped` → одноимённые, `timeout` → `failed`, `canceled`/`rejected` → `canceled`;
470
+ - `push` → `push`, `pr_update` → `pull_request`, `manual` → `manual`, `restart` → `retry`,
471
+ `schedule` → `schedule`, `repository_event` → `trigger`.
472
+
473
+ Что умеет каждый трекер, описывает раздел `ci` определения (R11 — все фильтры `ciRunFilterSchema`: `status`,
474
+ `ref`, `sha`, `event`, `workflow`, `actor`, `pullRequest`, `createdAfter`, `createdBefore`, `updatedAfter`,
475
+ `updatedBefore`):
476
+
477
+ | Поле | GitHub Actions | GitLab | SourceCraft |
478
+ |---|---|---|---|
479
+ | `workflows` | да (`listWorkflows`) | нет | нет |
480
+ | `runs.filters` | все | все | кроме `ref` и `sha` |
481
+ | `runs.clientSide` | `status`, `event`, `updatedAfter`, `updatedBefore` | `status`, `event` | все фильтры |
482
+ | `runs.sorts` | — | `created`, `updated` | — |
483
+ | `jobs` | фильтры `status`, `allAttempts`; `status` на странице | фильтры `status`, `allAttempts` | фильтр `status`; `status` на странице |
484
+ | `log` | `live: false`, курсор есть | `live: true`, курсор есть | `live: true`, курсор есть |
485
+ | `trigger` | ровно один workflow, `inputs`, теги | без workflow, `inputs`, теги | хотя бы один workflow, `inputs`, теги |
486
+ | `rerun` | всё, включая задание и `debug` | только `failedOnly` и задание | не поддерживается |
487
+ | `cancel` | прогон | прогон и задание | не поддерживается |
488
+
489
+ Запросы списков — `CiRunQuery` (`PageQuery` плюс фильтры из таблицы и `sort` по `created`/`updated`) и
490
+ `CiJobQuery` (`status`, `allAttempts` — задания прежних попыток); имена допустимых фильтров и полей сортировки
491
+ выведены в типы `CiRunFilter`, `CiRunSortField` и `CiJobFilter` из схем `ciRunFilterSchema`,
492
+ `ciRunSortFieldSchema` и `ciJobFilterSchema` — теми же перечислениями оперирует `CiCapabilities`. У GitLab
493
+ список прогонов с `pullRequest` идёт через пайплайны MR: остальные фильтры тогда проверяются по странице.
494
+ Запуск — `CiTriggerInput` (`ref`,
495
+ `refType`, `workflows`, `inputs`): у GitHub ровно один workflow (иначе `invalid_request`, входов не больше 25),
496
+ у GitLab `workflows` не задаётся (непустой — `unsupported`), у SourceCraft нужен хотя бы один workflow.
497
+ `rerun`/`rerunJob` возвращают свежее состояние прогона, `cancel`/`cancelJob` — свежее состояние (оно может быть
498
+ ещё `running`).
499
+
500
+ **Лог окном с курсором (D-006).** `log(jobKey, CiLogQuery)` читает лог задания окном: `maxBytes` от 1 до
501
+ `CI_LOG_MAX_BYTES` (1 МиБ), по умолчанию `CI_LOG_DEFAULT_BYTES` (16 КиБ) — конец лога, где обычно причина
502
+ падения; `from: 'head'` — начало. Тело читается потоком до `CI_LOG_READ_MAX_BYTES` (64 МиБ), удерживается
503
+ кольцевым буфером, таймаут загрузки — `CI_LOG_TIMEOUT_MS` (60 с). ANSI-последовательности и перерисовки
504
+ строки вычищаются (`cleanLogText`), если не `raw: true`; маскирование секретов идёт всегда. Ответ `CiLog`:
505
+ `text` (окно), `truncated`, `complete` (задание закончилось), `size` (если тело прочитано целиком) и
506
+ `nextCursor` — его нет, когда дальше не будет ни байта. Курсор — `c:<страница>:<байт>` (`logCursor`); страница
507
+ 0 у GitHub и GitLab, у SourceCraft — номер страницы его пагинации (за один вызов читается до
508
+ `CI_LOG_PAGES_MAX` страниц). Окно из запроса разбирает `logWindow(query)`, ответ собирает `logOf(...)`;
509
+ `isFinished(category)` — категория из `CI_FINISHED_STATUSES`.
510
+
511
+ **Края окна — по целым строкам.** Секрет или ANSI-последовательность, разрезанные краем окна, не узнаются ни в
512
+ одном из окон, а два склеенных ответа отдают их целиком — поэтому окно выравнивается по строкам внутри
513
+ `logOf`: окно с курсором кончается после последнего `\n` (курсор указывает на начало следующей строки), а окно
514
+ с отрезанным началом — флаг `startCut: true`, по умолчанию `truncated && !more` — начинается после первого
515
+ `\n`. Строка длиннее окна режется по слову: конец — перед последним словом вместе с ключом присваивания перед
516
+ ним, начало — после первого пробела; без пробелов окно режется по байту, и тогда откладываются незаконченная
517
+ ANSI-последовательность и `\r`. Отдельно добирается хвост приватного ключа: `logOf` маскирует строки тела PEM,
518
+ на которых окно начинается, и откладёт строку `-----BEGIN … PRIVATE KEY-----`, если парного `END` в этом окне
519
+ нет. Так замаскированный и очищенный текст склеенных окон совпадает с текстом лога, прочитанного целиком, а
520
+ `nextCursor` уходит на начало следующей строки — кроме случая, когда окно упёрлось в потолок `maxBytes`
521
+ посреди единственной строки длиннее окна либо в границу страницы SourceCraft.
522
+
523
+ Дочитывание лога идущего задания — поллинг по `nextCursor`:
524
+
525
+ ```ts
526
+ let cursor: string | undefined;
527
+ for (;;) {
528
+ const chunk = await ci.log(job.key, cursor === undefined ? {} : { cursor });
529
+ process.stdout.write(chunk.text);
530
+ cursor = chunk.nextCursor;
531
+ if (cursor === undefined) break;
532
+ await new Promise((resolve) => setTimeout(resolve, 5000));
533
+ }
534
+ ```
535
+
536
+ Пределы трекеров: у GitHub лог задания доступен **только после завершения** (`log.live: false`): идущему
537
+ заданию отвечают пустым текстом и курсором `c:0:0`, не скачивая ничего. Сам лог GitHub отдаёт 302 на
538
+ подписанный URL (живёт около минуты) — `fetch` в контексте должен следовать редиректам. У SourceCraft нет
539
+ перезапуска и отмены (`rerun`/`cancel` — `unsupported`), а `listJobs` стоит 1 + N запросов (прогон и каждый
540
+ его workflow); список прогонов не фильтрует сервером вообще — все фильтры на странице, листайте `nextCursor`.
541
+ Логи служебных кубов прогона (`#git-clone`, `#create-environment`) через API не читаются: слаг с `#`
542
+ площадка не принимает (400 на шаблон имени), а без `#` куб не находится, поэтому `log()` на таком задании —
543
+ `unsupported` **до запроса**; в `listJobs` эти кубы остаются. Хвост SourceCraft дочитывает не больше
544
+ `CI_LOG_PAGES_MAX` страниц за вызов: у более длинного лога это конец первой прочитанной пачки, а не всего
545
+ лога — остальное добирается по `nextCursor`.
546
+
547
+ Символы субпути: фабрики `githubCi()`, `gitlabCi()`, `sourcecraftCi()`, `ciAdapterOf`, типы `CiAdapter`,
548
+ `CiCapabilities`, `CiDefinition`, `CiWorkflow`, `CiRun`, `CiJob`, `CiLog`, `CiStatus`, `CiStatusCategory`,
549
+ `CiEventCategory`, `CiRunQuery`, `CiJobQuery`, `CiLogQuery`, `CiLogWindow`, `CiTriggerInput`,
550
+ `CiTriggerResult`, `CiRerunInput`, `CiJobRerunInput`, наборы значений запроса — типы `CiRunFilter`,
551
+ `CiRunSortField`, `CiJobFilter`, схемы `ciStatusCategorySchema`, `ciEventCategorySchema`,
552
+ `ciRunFilterSchema`, `ciRunSortFieldSchema`, `ciJobFilterSchema`, `ciStatusSchema`, `ciWorkflowSchema`,
553
+ `ciRunSchema`, `ciJobSchema`, `ciLogSchema`, помощники `logWindow`, `logCursor`, `logOf` (у его входа —
554
+ необязательное поле `startCut`: начало окна отрезано краем, первая неполная строка отбрасывается),
555
+ `cleanLogText`, `isFinished` и константы `CI_LOG_DEFAULT_BYTES`, `CI_LOG_MAX_BYTES`, `CI_LOG_READ_MAX_BYTES`,
556
+ `CI_LOG_TIMEOUT_MS`, `CI_LOG_PAGES_MAX`, `CI_FINISHED_STATUSES`. Таблицы сопоставления — `GITHUB_RUN_STATUSES`,
557
+ `GITHUB_RUN_CONCLUSIONS`, `GITHUB_RUN_EVENTS`, `GITLAB_CI_STATUSES`, `GITLAB_PIPELINE_SOURCES`,
558
+ `SOURCECRAFT_CI_STATUSES`, `SOURCECRAFT_RUN_EVENTS` (содержание — выше). Загрузку текста наружу держит
559
+ `requestText(url, TextRequest): TextResponse` — тело читается потоком, `skip` пропускает байты от начала
560
+ (дочитывание по курсору), `keep: { bytes, from: 'head' | 'tail' }` удерживает окно кольцевым буфером,
561
+ `readMax` и `timeoutMs` перекрывают потолки по умолчанию. Модель лога — запись D-006.
562
+
428
563
  ## mcp
429
564
 
430
565
  `serveMcp` — построчный JSON-RPC 2.0 на stdio, только инструменты: `initialize`, `ping`, `tools/list`,
@@ -474,7 +609,8 @@ await serveMcp({
474
609
  });
475
610
  ```
476
611
 
477
- Сервер отвечает `serverInfo` с `name: 'onreel'` и версией контракта host; согласовывает любую из
612
+ Сервер отвечает `serverInfo` с `name: 'onreel'` и версией: `serverVersion` вызывающего — например, версия его
613
+ CLI, — а без неё `formatVersion(HOST_CONTRACT_VERSION)`, версия контракта host. Согласовывает любую из
478
614
  `MCP_PROTOCOL_VERSIONS` (`2025-11-25` … `2024-11-05`) и отдаёт `structuredContent` от `2025-06-18`. Прочее:
479
615
  `notifications/progress` каждые `MCP_PROGRESS_INTERVAL_MS` (15 с), если клиент прислал `progressToken`; строка
480
616
  длиннее `MCP_MAX_LINE_BYTES` (8 МиБ) отбрасывается с ошибкой парсинга; после конца stdin начатые вызовы живут
@@ -160,7 +160,8 @@ var defaultSecretSink = {
160
160
  };
161
161
 
162
162
  export {
163
+ REDACTED,
163
164
  redactSecretText,
164
165
  defaultSecretSink
165
166
  };
166
- //# sourceMappingURL=chunk-L7CPE2SO.js.map
167
+ //# sourceMappingURL=chunk-AGGJK2XZ.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-3YP22YLA.js";
8
8
  import {
9
9
  redactSecretText
10
- } from "./chunk-L7CPE2SO.js";
10
+ } from "./chunk-AGGJK2XZ.js";
11
11
 
12
12
  // src/git/git.const.ts
13
13
  var GIT_TIMEOUT_MS = 12e4;
@@ -418,4 +418,4 @@ export {
418
418
  showBlob,
419
419
  readWorktreeFile
420
420
  };
421
- //# sourceMappingURL=chunk-GPRMI4PG.js.map
421
+ //# sourceMappingURL=chunk-ZTME4HFD.js.map
package/dist/git/index.js CHANGED
@@ -25,7 +25,7 @@ import {
25
25
  showBlob,
26
26
  statusEntries,
27
27
  untrackedFiles
28
- } from "../chunk-GPRMI4PG.js";
28
+ } from "../chunk-ZTME4HFD.js";
29
29
  import {
30
30
  PROJECT_WORKTREE_SEGMENT,
31
31
  PathEscapeError,
@@ -47,7 +47,7 @@ import "../chunk-3YP22YLA.js";
47
47
  import {
48
48
  defaultSecretSink,
49
49
  redactSecretText
50
- } from "../chunk-L7CPE2SO.js";
50
+ } from "../chunk-AGGJK2XZ.js";
51
51
  import "../chunk-4ZGRXIVA.js";
52
52
  export {
53
53
  GIT_CHECKOUT_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.4.0",
62
+ version: "0.6.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.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":[]}
1
+ {"version":3,"sources":["../package.json","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@smwb/onreel-git-mcp\",\n \"version\": \"0.6.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
@@ -4,7 +4,7 @@ import {
4
4
  } from "../chunk-3YP22YLA.js";
5
5
  import {
6
6
  redactSecretText
7
- } from "../chunk-L7CPE2SO.js";
7
+ } from "../chunk-AGGJK2XZ.js";
8
8
  import {
9
9
  ENV_DISPATCH_ID,
10
10
  ENV_HOST_URL,
@@ -592,7 +592,11 @@ function serveMcp(options) {
592
592
  result: {
593
593
  protocolVersion,
594
594
  capabilities: { tools: { listChanged: false } },
595
- serverInfo: { name: MCP_SERVER_NAME, title: MCP_SERVER_TITLE, version: formatVersion(HOST_CONTRACT_VERSION) },
595
+ serverInfo: {
596
+ name: MCP_SERVER_NAME,
597
+ title: MCP_SERVER_TITLE,
598
+ version: options.serverVersion ?? formatVersion(HOST_CONTRACT_VERSION)
599
+ },
596
600
  instructions
597
601
  }
598
602
  });