@smwb/onreel-git-mcp 0.11.0 → 0.12.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.
Files changed (38) hide show
  1. package/README.md +113 -6
  2. package/dist/{chunk-3YP22YLA.js → chunk-33ISKIW7.js} +2 -2
  3. package/dist/{chunk-6VQURMRA.js → chunk-AJOAZMU4.js} +2 -1
  4. package/dist/{chunk-4ZGRXIVA.js → chunk-D5QUOIRC.js} +5 -1
  5. package/dist/{chunk-4ZGRXIVA.js.map → chunk-D5QUOIRC.js.map} +1 -1
  6. package/dist/{chunk-VLTG7OKJ.js → chunk-OWLVTLYZ.js} +3 -3
  7. package/dist/contract/contract.schema.d.ts +12 -0
  8. package/dist/contract/contract.types.d.ts +2 -1
  9. package/dist/files/index.js +1 -1
  10. package/dist/git/index.js +4 -4
  11. package/dist/index.js +6 -3
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcp/index.js +3 -3
  14. package/dist/tracker/declarative/declarative-call.lib.d.ts +28 -0
  15. package/dist/tracker/declarative/declarative-capabilities.lib.d.ts +20 -0
  16. package/dist/tracker/declarative/declarative-ci.lib.d.ts +4 -0
  17. package/dist/tracker/declarative/declarative-hint.const.d.ts +4 -0
  18. package/dist/tracker/declarative/declarative-issues.lib.d.ts +5 -0
  19. package/dist/tracker/declarative/declarative-model.const.d.ts +40 -0
  20. package/dist/tracker/declarative/declarative-model.types.d.ts +87 -0
  21. package/dist/tracker/declarative/declarative-parse.lib.d.ts +7 -0
  22. package/dist/tracker/declarative/declarative-pull.lib.d.ts +4 -0
  23. package/dist/tracker/declarative/declarative-request.lib.d.ts +49 -0
  24. package/dist/tracker/declarative/declarative-result.lib.d.ts +11 -0
  25. package/dist/tracker/declarative/declarative-rules.lib.d.ts +4 -0
  26. package/dist/tracker/declarative/declarative.const.d.ts +10 -0
  27. package/dist/tracker/declarative/declarative.lib.d.ts +19 -0
  28. package/dist/tracker/declarative/declarative.schema.d.ts +1324 -0
  29. package/dist/tracker/declarative/declarative.types.d.ts +22 -0
  30. package/dist/tracker/index.d.ts +5 -0
  31. package/dist/tracker/index.js +1938 -21
  32. package/dist/tracker/index.js.map +1 -1
  33. package/dist/tracker/registry.lib.d.ts +8 -1
  34. package/dist/worktree/index.js +4 -4
  35. package/package.json +2 -1
  36. /package/dist/{chunk-3YP22YLA.js.map → chunk-33ISKIW7.js.map} +0 -0
  37. /package/dist/{chunk-6VQURMRA.js.map → chunk-AJOAZMU4.js.map} +0 -0
  38. /package/dist/{chunk-VLTG7OKJ.js.map → chunk-OWLVTLYZ.js.map} +0 -0
package/README.md CHANGED
@@ -11,11 +11,12 @@
11
11
  против портов хранения, которые реализует потребитель;
12
12
  - **адаптеры трекеров** — единая модель задач и пять адаптеров: GitHub, GitLab, Jira, SourceCraft и локальный
13
13
  трекер поверх хранилища потребителя; у GitHub, GitLab и SourceCraft есть разделы pull request-ов и CI (D-005)
14
- и раздел репозитория — карточка и ветки (D-008);
14
+ и раздел репозитория — карточка и ветки (D-008); свои трекеры пользователя — декларативным конфигом без кода
15
+ (D-010, D-015);
15
16
  - **MCP stdio-сервер** — JSON-RPC 2.0 поверх stdin/stdout, инструменты строятся из таблицы команд вызывающего.
16
17
 
17
- Пакет ESM, рантайм-зависимость одна — `zod`. Публичная поверхность держится документированной здесь:
18
- новый субпуть или публичный символ добавляют вместе с записью в этом README.
18
+ Пакет ESM, рантайм-зависимости — `zod` и `yaml` (разбор конфигов своих трекеров). Публичная поверхность
19
+ держится документированной здесь: новый субпуть или публичный символ добавляют вместе с записью в этом README.
19
20
 
20
21
  ## Установка
21
22
 
@@ -37,7 +38,7 @@ CI и тесты идут на образе `node:24-bookworm`; в репози
37
38
  | `…/git` | `runGit`, `GitError`, управление пулом, операции над репозиторием и worktree, безопасные пути, маскирование секретов | [git](#git) |
38
39
  | `…/files` | `listWorktreeDir`, `DirRefusal` | [files](#files) |
39
40
  | `…/worktree` | замки, `finishPreparing`/`finishCleaning`, reconciler, корзина — против порта `WorktreeStore` | [worktree](#worktree) |
40
- | `…/tracker` | типы портов, реестр, `registerBuiltinTrackers()`, пять фабрик адаптеров, файловое хранилище токенов | [tracker](#tracker) |
41
+ | `…/tracker` | типы портов, реестр, `registerBuiltinTrackers()`, пять фабрик адаптеров, свои трекеры из конфига (`definitionFromConfig`, `setUserTrackers`), файловое хранилище токенов | [tracker](#tracker) |
41
42
  | `…/mcp` | `serveMcp`, `mcpToolSpecs`, сборщики инструментов, выбор принципала | [mcp](#mcp) |
42
43
  | `…/package.json` | манифест пакета | [package.json](#packagejson) |
43
44
 
@@ -279,7 +280,8 @@ try {
279
280
  Сопоставление статусов и приоритетов — открытые таблицы (`SOURCECRAFT_STATUSES`, `JIRA_PRIORITIES`,
280
281
  `GITHUB_PRIORITY_LABELS`, `GITLAB_PRIORITY_LABELS`, …), чтобы потребитель видел, во что именно преводится его
281
282
  статус. Свои трекеры добавляют в реестр явным `registerTracker(definition)`; повторный `kind` — исключение, а не
282
- молчаливая замена. Типы порта `LocalIssueStore` (и его строк) реэкспортированы из `…/tracker` — реализацию, как и
283
+ молчаливая замена. Трекеры пользователя из конфигов — отдельный заменяемый набор
284
+ `setUserTrackers(definitions)` (подраздел «Свои трекеры из конфига»). Типы порта `LocalIssueStore` (и его строк) реэкспортированы из `…/tracker` — реализацию, как и
283
285
  для `WorktreeStore`, пишет потребитель; эталон в памяти — `test/helpers/tracker-fixtures.lib.ts`. Порт требует:
284
286
  комментарий — только к существующей задаче, иначе отказ с кодом `unknown_issue` (сиротских комментариев хранилище
285
287
  не держит, D-011); `limit` страницы — целое от 1 до 500, по умолчанию 100, значение вне диапазона прижимается
@@ -657,6 +659,95 @@ GitLab читает `^` в начале и `$` в конце `search` как я
657
659
  `gitlabRepo()` и `sourcecraftRepo()`. Всё это выходит из субпути `…/tracker` — нового субпути нет (D-001, D-005).
658
660
  За модель отвечает запись D-008, отказ до запроса — правило R-002.
659
661
 
662
+ ### Свои трекеры из конфига
663
+
664
+ Свой трекер или git-хостинг (Gitea, Forgejo, самописный) подключают без кода и релиза: декларативный конфиг
665
+ `format: 1` — данные, а не код, их собирает в обычный `TrackerDefinition` один доверенный интерпретатор библиотеки
666
+ (D-010). Условий, скриптов и вычислений в конфиге нет: только шаблоны запросов, пути JSON и таблицы значений.
667
+
668
+ ```ts
669
+ import {
670
+ definitionFromConfig,
671
+ setUserTrackers,
672
+ TRACKER_CONFIG_HINT,
673
+ TrackerConfigError,
674
+ validateTrackerConfig,
675
+ } from '@smwb/onreel-git-mcp/tracker';
676
+
677
+ const check = validateTrackerConfig(yamlText); // текст YAML или уже разобранный объект
678
+ if (!check.ok) for (const issue of check.issues) console.log(`${issue.path}: ${issue.message}`); // 'issues.list.query.state: …'
679
+
680
+ try {
681
+ const shadowed = setUserTrackers([definitionFromConfig(yamlText)]); // набор своих целиком; пустой массив снимает
682
+ if (shadowed.length > 0) console.log(`конфиг не действует, вид занят встроенным трекером: ${shadowed.join(', ')}`);
683
+ } catch (error) {
684
+ if (error instanceof TrackerConfigError) console.log(error.issues, error.secret);
685
+ else throw error;
686
+ }
687
+ // Агенту, который пишет конфиг, отдают TRACKER_CONFIG_HINT: формат, правила безопасности и рабочий пример.
688
+ ```
689
+
690
+ - **Проверка.** `validateTrackerConfig(input): TrackerConfigCheck` — без побочных эффектов: `{ ok: true, config }`
691
+ или `{ ok: false, issues, secret }`, где `issues` — все ошибки сразу (не больше `TRACKER_CONFIG_ISSUES_MAX`, 100),
692
+ каждая `TrackerConfigIssue` — `{ path, message }` с путём поля через точку (`fields.0.secret`, пусто — весь
693
+ конфиг), а `secret` — среди ошибок секрет в тексте. Форму держит строгая схема `trackerConfigSchema` (неизвестное
694
+ поле — ошибка; типы `TrackerConfig`, `TrackerConfigInput`, `TrackerConfigOperation`, `TrackerConfigValue`,
695
+ `TrackerConfigBodyValue`, `TrackerConfigPagination`, `TrackerConfigAuth`, `TrackerConfigField`), сообщения — по-русски.
696
+ - **Интерпретатор.** `definitionFromConfig(input): TrackerDefinition` проверяет конфиг (неверный — `TrackerConfigError`
697
+ с `issues` и `secret`) и отдаёт определение с `descriptor.source: 'user'`, разделами `issues`, `pulls` и `ci`
698
+ (если они описаны) и `origin(connection)` — origin `http.base`. Возможности (`ListCapabilities`,
699
+ `PullRequestCapabilities`, `CiCapabilities`, `TrackerFeatures`) выводятся из операций: нет операции или входа в её
700
+ шаблонах — нет возможности, вызов отказывает `unsupported` до запроса. Фильтр списка есть, если его вход стоит в
701
+ шаблонах или `result` заполняет поля для проверки по странице (`clientSide`); вход через таблицу значений
702
+ проверяется и по странице. Каждый элемент ответа проходит схему единой модели (`issueSchema`,
703
+ `pullRequestSchema`, `ciRunSchema`, …): не легло — `failed` с операцией и полем.
704
+ - **Реестр (D-015).** `setUserTrackers(definitions): string[]` заменяет набор своих определений целиком. Определения из кода
705
+ (`registerTracker`, `registerBuiltinTrackers`) побеждают: `findTracker` и `listTrackers` отдают их, а затенённые
706
+ виды возвращаются вызывающему. Повтор `kind` внутри набора — исключение, прежний набор остаётся.
707
+ `TrackerDescriptor.source` — `'builtin' | 'user'` (`trackerSourceSchema`, тип `TrackerSource` корневого субпути);
708
+ нет поля — определение из кода.
709
+ - **Подсказка.** `TRACKER_CONFIG_HINT` — текст для агента (структура, операции и их входы, поля моделей, правила
710
+ безопасности) с рабочим примером `TRACKER_CONFIG_EXAMPLE` (задачи, PR и CI в стиле Gitea; пути — образец, их
711
+ сверяют с документацией своей версии сервиса). `BUILTIN_TRACKER_KINDS` — виды, которые конфиг не занимает.
712
+
713
+ Формат коротко (полностью — в подсказке):
714
+
715
+ ```yaml
716
+ format: 1
717
+ kind: gitea # слаг вида; title — имя в интерфейсе
718
+ title: Gitea
719
+ fields: # поля формы подключения: url, target, user, token (секретно — только token)
720
+ - { name: url, required: true, secret: false }
721
+ - { name: target, required: true, secret: false }
722
+ - { name: token, required: true, secret: true }
723
+ http:
724
+ base: "{{url}}/api/v1" # или https://api.example.test/v1; токен уходит только на этот origin
725
+ auth: { kind: bearer } # bearer | { kind: header, header, prefix } | basic | none
726
+ headers: { Accept: application/json }
727
+ pagination: { style: page, page: page, size: limit, next: link } # page | cursor | none
728
+ issues: # list и get обязательны; create, update, comments, comment — по желанию
729
+ list:
730
+ path: "/repos/{{target|path}}/issues"
731
+ query: { state: "{{status}}" }
732
+ inputs: { status: { open: open, in_progress: open, done: closed, declined: closed, "*": all } }
733
+ result: &issue { key: $.number, title: $.title, status.category: { path: $.state, map: { open: open, closed: done } } }
734
+ get: { path: "/repos/{{target|path}}/issues/{{key}}", result: *issue }
735
+ pulls: { … } # list, get; create, update, merge, comments, comment
736
+ ci: { … } # runs, run; workflows, jobs, job, log, trigger, rerun, rerunFailed, rerunJob, cancel, cancelJob
737
+ ```
738
+
739
+ Шаблоны подставляют только поля подключения `{{url}}`, `{{target}}`, `{{user}}` (объявленные в `fields`) и входы
740
+ операции (ветки PR — `{{sourceBranch}}` и `{{targetBranch}}`); `{{token}}` нет. В пути значение — один
741
+ percent-кодированный сегмент, `{{имя|path}}` — сегменты через «/» без пустых, «.» и «..»; «\» и управляющие
742
+ символы — отказ, а входу операции нельзя и «/» вне `|path`, и закодированного `%2F`/`%5C` (поле подключения в
743
+ простом плейсхолдере уходит с «/» как `%2F`, как проект `o%2Fr` у GitLab). Нет значения — параметр
744
+ query или поле тела пропускаются, в пути — отказ. Поле тела, равное одному плейсхолдеру, сохраняет тип. `inputs` —
745
+ таблицы «значение единой модели → значение API», ключ `"*"` у фильтров списков — «несколько сразу», `"null"` у
746
+ assignee. `result` — путь JSON (`$.a.b`, `$.items[0]`, `$.labels[*].name`), `{ path, map, default, exists }` или
747
+ цепочка звеньев. Пределы — `TRACKER_CONFIG_MAX_BYTES` (256 КиБ), `TRACKER_CONFIG_YAML_ALIAS_MAX` (не больше ~100
748
+ разворачиваний ссылок YAML с учётом вложенности: якорь считается тоже, поэтому сотня ссылок на один якорь — уже
749
+ отказ), `TRACKER_CONFIG_DEPTH_MAX` (16 уровней вложенности под корнем конфига). Правила безопасности — в разделе «Безопасность».
750
+
660
751
  ## mcp
661
752
 
662
753
  `serveMcp` — построчный JSON-RPC 2.0 на stdio, только инструменты: `initialize`, `ping`, `tools/list`,
@@ -819,6 +910,22 @@ console.log(manifest.name, manifest.version);
819
910
  заголовков запроса; иной метод — `failed` без перехода. Так 302 GitHub на подписанный адрес лога не уносит
820
911
  токен, какой бы `fetch` ни пришёл в контексте. Больше `TRACKER_REDIRECT_MAX` переходов подряд и редирект не на
821
912
  http/https — `failed`.
913
+ - **Конфиг своего трекера — данные.** `definitionFromConfig` не исполняет кода пользователя: шаблоны подставляют
914
+ только поля подключения и входы операции, плейсхолдера `{{token}}` нет — токен подставляет только `http.auth`, и
915
+ только для запросов на origin `http.base` (он же — `origin(connection)`; запросы идут через `requestJson` и
916
+ `requestText` с этим origin, редиректы — по правилам выше). Значения в пути кодируются как сегменты (`..`, `.`
917
+ и пустые сегменты — отказ), путь операции начинается с одного «/» и не содержит «?», «#», «%», «\» и сегментов
918
+ «.»/«..», а собранный адрес сверяется с origin и путём базы до сети. После `{{url}}` в базе — только путь.
919
+ Секретные заголовки в `http.headers` (Authorization, Cookie, X-Api-Key, *-Token…) и секретные параметры query
920
+ запрещены; текст, похожий на секрет (значения, ключи, комментарии YAML, адрес с паролем), — ошибка с признаком
921
+ `secret`. Конфиг не больше 256 КиБ, ссылки YAML и вложенность ограничены, ключи `__proto__`, `constructor` и
922
+ `prototype` запрещены. Каждый ответ API проходит схему единой модели, ссылки — только http(s).
923
+ Библиотека гарантирует «токен — только на origin `http.base`», но сам этот origin выбирает автор конфига: литеральная
924
+ `http.base` (`https://attacker.example`, `https://169.254.169.254/latest`) проходит проверку, и токен уйдёт туда, а
925
+ `result` вынесет агенту поля ответа внутреннего адреса. Поэтому потребитель, принимая конфиг (особенно написанный
926
+ агентом), показывает пользователю `definitionFromConfig(config).origin(connection)` и привязывает токен к этому
927
+ origin до первого запроса (как при правке `url`, см. «Токен — только своему origin»); политика исходящих запросов
928
+ (частные диапазоны, loopback, метаданные облака) — в `fetch`, который потребитель передаёт в контексте.
822
929
  - **Маскирование секретов.** `redactSecretText` и `SecretSink` (по умолчанию `defaultSecretSink`) — один redactor
823
930
  на библиотеку: его применяют `GitError` (D-272), `requestJson` (тексты отказов трекера) и внутренний отказ
824
931
  `serveMcp`. Свой журнал потребителя подключают приёмником `SecretSink`; известные значения добавляют до
@@ -845,7 +952,7 @@ console.log(manifest.name, manifest.version);
845
952
  - Node.js >= 24, Linux; macOS/Windows не тестируются (см. `/proc` и групповой `SIGKILL` выше).
846
953
  - Публикуется собранный ESM и `.d.ts` из `dist/` (D-002) — суффиксы `.ts` в импортах исходников стирает сборка,
847
954
  их не нужно править в потребителе.
848
- - `sideEffects: false`, один рантайм-зависимый пакет — `zod`.
955
+ - `sideEffects: false`, рантайм-зависимости — `zod` и `yaml`.
849
956
  - Реестр трекеров, пул git, замки worktree, redactor и приёмник секретов потребителя (`setSecretSink`) —
850
957
  модульная глобальна на процесс: несколько независимых «хостов» в одном процессе делят их. Субпути пакета
851
958
  делят такое состояние, потому что модуль двух и более точек входа tsup выносит в общий chunk; свою копию
@@ -4,7 +4,7 @@ import {
4
4
  DEFAULT_SESSION_UMASK,
5
5
  ENV_SESSION_UMASK,
6
6
  contractErrorSchema
7
- } from "./chunk-4ZGRXIVA.js";
7
+ } from "./chunk-D5QUOIRC.js";
8
8
 
9
9
  // src/contract/contract.lib.ts
10
10
  function clip(text, max) {
@@ -47,4 +47,4 @@ export {
47
47
  sessionUmask,
48
48
  inheritSessionUmask
49
49
  };
50
- //# sourceMappingURL=chunk-3YP22YLA.js.map
50
+ //# sourceMappingURL=chunk-33ISKIW7.js.map
@@ -184,8 +184,9 @@ var defaultSecretSink = {
184
184
 
185
185
  export {
186
186
  REDACTED,
187
+ isSecretKey,
187
188
  redactSecretText,
188
189
  setSecretSink,
189
190
  defaultSecretSink
190
191
  };
191
- //# sourceMappingURL=chunk-6VQURMRA.js.map
192
+ //# sourceMappingURL=chunk-AJOAZMU4.js.map
@@ -124,9 +124,12 @@ var trackerFeaturesSchema = z.object({
124
124
  /** Категории, в которые можно перевести задачу; пусто — статус не меняется. */
125
125
  statuses: z.array(issueStatusCategorySchema).max(4)
126
126
  });
127
+ var trackerSourceSchema = z.enum(["builtin", "user"]);
127
128
  var trackerDescriptorSchema = z.object({
128
129
  tracker: trackerKindSchema,
129
130
  title: z.string().min(1).max(100),
131
+ /** Нет поля — определение из кода (builtin). */
132
+ source: trackerSourceSchema.optional(),
130
133
  fields: z.array(z.object({ name: trackerFieldNameSchema, required: z.boolean(), secret: z.boolean() })).max(4),
131
134
  features: trackerFeaturesSchema
132
135
  });
@@ -241,6 +244,7 @@ export {
241
244
  issueCommentSchema,
242
245
  trackerFieldNameSchema,
243
246
  trackerFeaturesSchema,
247
+ trackerSourceSchema,
244
248
  trackerDescriptorSchema,
245
249
  worktreeIdSchema,
246
250
  worktreeNameSchema,
@@ -256,4 +260,4 @@ export {
256
260
  worktreeEntryKindSchema,
257
261
  worktreeEntrySchema
258
262
  };
259
- //# sourceMappingURL=chunk-4ZGRXIVA.js.map
263
+ //# sourceMappingURL=chunk-D5QUOIRC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/contract/contract.const.ts","../src/contract/contract.schema.ts"],"sourcesContent":["// Константы среза контракта onreel для библиотеки @smwb/onreel-git-mcp (заморожены в части B\n// выделения). Происхождение — onreel @ b73407be076a5df73931d1340f70910ca13c908d, дословные копии:\n// src/contract/discovery/discovery.const.ts — HOST_DISCOVERY_FILE, ENV_HOST_URL, ENV_TOKEN,\n// ENV_RUN_ID, ENV_TASK_ID, ENV_DISPATCH_ID;\n// src/contract/umask.const.ts — ENV_SESSION_UMASK, DEFAULT_SESSION_UMASK;\n// src/contract/errors.const.ts — errorCatalog, ErrorCode, CONTRACT_ERROR_*;\n// src/contract/version/version.const.ts — HOST_CONTRACT_VERSION;\n// src/contract/worktree-files.const.ts — WORKTREE_FILES_MAX, WORKTREE_FILES_REASONS.\n// Имена переменных ONREEL_* заморожены как есть: их смена ломает interop onreel ↔ библиотека.\nimport type { ContractVersion } from './contract.types.ts';\n\n/** Имя файла обнаружения host в каталоге данных (onreel D-046). */\nexport const HOST_DISCOVERY_FILE = 'host.json';\n\n/** Адрес host для процесса агента: агенты не читают host.json, а получают адрес и свой токен в env. */\nexport const ENV_HOST_URL = 'ONREEL_HOST_URL';\n/** Токен агента в env его процесса. */\nexport const ENV_TOKEN = 'ONREEL_TOKEN';\n/** Идентификаторы Run, Task и попытки в env процесса агента (onreel D-226): воркер отчитывается ими в worker_done. */\nexport const ENV_RUN_ID = 'ONREEL_RUN_ID';\nexport const ENV_TASK_ID = 'ONREEL_TASK_ID';\nexport const ENV_DISPATCH_ID = 'ONREEL_DISPATCH_ID';\n\n/** Переменная окружения: восьмеричная маска пользователя («0022»), её первым записывает самый ранний процесс цепочки. */\nexport const ENV_SESSION_UMASK = 'ONREEL_SESSION_UMASK';\n\n/** Маска сессий, если переменная не задана или не разобралась: обычный umask пользователя. */\nexport const DEFAULT_SESSION_UMASK = 0o022;\n\n/**\n * Версия контракта host onreel на момент выделения (1.14). Заморожена для межпроцессной\n * совместимости MCP-сервера с host onreel; история изменений — в onreel version.const.ts.\n */\nexport const HOST_CONTRACT_VERSION: Readonly<ContractVersion> = Object.freeze({ major: 1, minor: 14 });\n\n// Ошибки контракта (onreel D-053): стабильный код, сообщение и обязательные `nextSteps` — что делать\n// дальше. Каталог задаёт известные коды и HTTP-статус. На проводе код — открытая строка: клиент\n// версии N-1 не падает на коде, появившемся позже, а показывает `message` и `nextSteps`.\n// Копия дословная: урезание каталога рассинхронизировало бы коды с onreel.\n\nexport const errorCatalog = {\n // Общие.\n invalid_request: { status: 400, summary: 'Запрос не прошёл проверку схемы контракта.' },\n unauthorized: { status: 401, summary: 'Нет токена, или токен недействителен, истёк или отозван.' },\n permission_denied: { status: 403, summary: 'Запрос шире scope токена.' },\n not_found: { status: 404, summary: 'Сущность не найдена.' },\n contract_incompatible: { status: 426, summary: 'Версии контракта сторон несовместимы (разница major больше допустимой).' },\n capability_unsupported: { status: 400, summary: 'Глагол или значение требует capability, которой нет в согласованном наборе.' },\n request_id_reused: { status: 409, summary: 'Тот же requestId уже использован для другого запроса.' },\n rate_limited: { status: 429, summary: 'Слишком много запросов.' },\n internal: { status: 500, summary: 'Внутренняя ошибка.' },\n unavailable: { status: 503, summary: 'Сервис временно недоступен: host или ptyd не отвечает.' },\n // Оркестрация: переходы, отчёты, доставка, бюджеты.\n lifecycle_conflict: { status: 409, summary: 'Переход из текущего состояния сущности не разрешён.' },\n unknown_task: { status: 404, summary: 'Task не найден.' },\n unknown_dispatch: { status: 404, summary: 'Dispatch не найден.' },\n task_dispatch_mismatch: { status: 409, summary: 'Dispatch не принадлежит этой Task.' },\n stale_dispatch: { status: 409, summary: 'Попытка уже не авторитетна: у Task другой активный Dispatch.' },\n inactive_dispatch: { status: 409, summary: 'Dispatch уже settled.' },\n consumer_fenced: { status: 409, summary: 'Потребитель mailbox заменён: consumer_generation вырос.' },\n budget_exceeded: { status: 409, summary: 'Лимит бюджета исчерпан.' },\n // ptyd.\n unknown_session: { status: 404, summary: 'Сессия ptyd не найдена.' },\n session_exited: { status: 409, summary: 'Процесс сессии уже завершился.' },\n spawn_failed: { status: 422, summary: 'Процесс не запустился.' },\n // Liveness и lease: аренда владения Task и сессией (§6.8, D-008).\n lease_conflict: { status: 409, summary: 'Lease задачи держит другой исполнитель незавершённой попытки.' },\n lease_fenced: { status: 409, summary: 'Владелец lease не доказан: fencing-токен устарел или процесс не совпал с сессией ptyd.' },\n lease_expired: { status: 409, summary: 'Lease задачи закрыт: освобождён или попытка settled.' },\n // Резерв команд агентов (D-020, D-021): коды занимают сейчас, ядро команды — позже.\n claim_conflict: { status: 409, summary: 'Задачу уже взял другой участник.' },\n ownership_conflict: { status: 409, summary: 'Зона ответственности задачи пересекается с чужим claim.' },\n host_not_live: { status: 409, summary: 'Home Dispatch участника не live.' },\n claim_limit: { status: 409, summary: 'У участника уже максимум активных claims.' },\n not_assignee: { status: 403, summary: 'Задача назначена другому участнику.' },\n messaging_denied: { status: 403, summary: 'Политика команды запрещает это сообщение.' },\n plan_required: { status: 409, summary: 'Задача требует одобренного плана.' },\n member_name_taken: { status: 409, summary: 'Имя участника в Run занято.' },\n // Worktree и git-операции (задача worktree).\n git_failed: { status: 422, summary: 'Git-команда не выполнилась: репозиторий повреждён, ref не существует или команда отклонена.' },\n // Реестр проектов (D-343): подключение, показ и снятие.\n unknown_project: { status: 404, summary: 'Проект не найден в реестре.' },\n project_exists: { status: 409, summary: 'Путь или id уже заняты другим проектом.' },\n // Трекеры задач (D-353): отказ внешнего трекера и неизвестная задача.\n tracker_failed: { status: 502, summary: 'Внешний трекер отказал или не ответил: адрес, токен или права не подходят.' },\n unknown_issue: { status: 404, summary: 'Задача не найдена в трекере проекта.' },\n // Агенты (D-091): манифесты, probe, запуск через Executor.\n agent_unavailable: { status: 422, summary: 'Агент не установлен, probe не прошёл или fallback невозможен.' },\n agent_untrusted: { status: 403, summary: 'Манифест агента из репозитория проекта не доверен.' },\n sandbox_unavailable: { status: 422, summary: 'Запрошенный уровень песочницы на этой машине недоступен: нет механизма ОС.' },\n} as const satisfies Record<string, { status: number; summary: string }>;\n\nexport type ErrorCode = keyof typeof errorCatalog;\n\nexport const CONTRACT_ERROR_MESSAGE_MAX = 4000;\nexport const CONTRACT_ERROR_NEXT_STEP_MAX = 1000;\n\n/** Максимум записей каталога в ответе worktree.files; остальное отсекается с `truncated`. */\nexport const WORKTREE_FILES_MAX = 1000;\n\n/** Причины отказов worktree.files в `data.reason` (onreel D-367). */\nexport const WORKTREE_FILES_REASONS = ['outside_worktree', 'excluded', 'not_directory', 'unreadable', 'missing_on_disk', 'unsafe_path'] as const;\n\nexport type WorktreeFilesReason = (typeof WORKTREE_FILES_REASONS)[number];\n","// Схемы zod среза контракта onreel для библиотеки @smwb/onreel-git-mcp (заморожены в части B\n// выделения). Происхождение — onreel @ b73407be076a5df73931d1340f70910ca13c908d, дословные копии:\n// src/contract/ids.schema.ts — примитивы идентификаторов и времени;\n// src/contract/version/version.schema.ts — contractVersionSchema;\n// src/contract/errors.schema.ts — схемы ошибки контракта;\n// src/contract/tracker.schema.ts — единая модель задач трекеров (без trackerConnectionSchema:\n// подключения хранит потребитель, модули библиотеки эту схему не используют);\n// src/contract/worktree.schema.ts — запись Worktree и строка porcelain;\n// src/contract/review.schema.ts — reviewPathSchema и модель изменений (без замечаний ревью);\n// src/contract/worktree-files.schema.ts — записи каталога worktree.\n// Выведенные типы — в contract.types.ts (правило фасетов: schema — только схемы).\nimport { z } from 'zod';\nimport { CONTRACT_ERROR_MESSAGE_MAX, CONTRACT_ERROR_NEXT_STEP_MAX, errorCatalog, type ErrorCode } from './contract.const.ts';\n\n// Схемы объектов не строгие (`z.object` отбрасывает лишние поля): старый читатель не падает\n// на optional-поле новой версии (onreel D-011).\n\n// --- Идентификаторы и общие примитивы ---\n\nconst idPattern = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;\n\n/** Идентификатор сущности: Run, Task, Dispatch, письма, gate, сессии и т. п. */\nexport const entityIdSchema = z.string().regex(idPattern);\n\n/** Ключ идемпотентности запроса: его создаёт клиент, повтор с тем же ключом возвращает receipt. */\nexport const requestIdSchema = z.string().regex(idPattern);\n\nexport const projectIdSchema = entityIdSchema;\nexport const taskIdSchema = entityIdSchema;\n\n/** Время — миллисекунды Unix epoch, как INTEGER в хранилище. */\nexport const timestampSchema = z.number().int().nonnegative();\n\n// --- Версия контракта ---\n\nexport const contractVersionSchema = z.object({\n major: z.number().int().nonnegative().max(65535),\n minor: z.number().int().nonnegative().max(65535),\n});\n\n// --- Ошибка контракта ---\n\nexport const errorCodeSchema = z.enum(Object.keys(errorCatalog) as [ErrorCode, ...ErrorCode[]]);\n\n/** Код на проводе: известный код каталога или код более новой версии контракта. */\nexport const wireErrorCodeSchema = z.string().max(64).regex(/^[a-z][a-z0-9_]*$/);\n\nexport const contractErrorSchema = z.object({\n code: wireErrorCodeSchema,\n message: z.string().min(1).max(CONTRACT_ERROR_MESSAGE_MAX),\n /** Конкретные действия: команда CLI, глагол API или шаг для человека. Пустым не бывает. */\n nextSteps: z.array(z.string().min(1).max(CONTRACT_ERROR_NEXT_STEP_MAX)).min(1).max(20),\n data: z.record(z.string(), z.unknown()).optional(),\n});\n\n// --- Единая модель задач трекеров (onreel D-350, D-351) ---\n\n/** Вид трекера — открытый слаг: новый трекер добавляется подключением на host без правки контракта. */\nexport const trackerKindSchema = z.string().regex(/^[a-z][a-z0-9-]{0,31}$/);\n\n/** Ключ задачи в своём трекере: `76`, `PROJ-12`, `#5`; для клиента непрозрачная строка. */\nexport const issueKeySchema = z.string().min(1).max(200);\n\n/** Категория статуса единой модели; своё имя статуса трекер отдаёт отдельно, в `status.name`. */\nexport const issueStatusCategorySchema = z.enum(['open', 'in_progress', 'done', 'declined']);\n\n/** Приоритет единой модели; трекер без приоритетов не заполняет поле. */\nexport const issuePrioritySchema = z.enum(['trivial', 'minor', 'normal', 'critical', 'blocker']);\n\nexport const issueLinkSchema = z.object({\n url: z.string().min(1).max(2048),\n title: z.string().min(1).max(500).optional(),\n});\n\nexport const issueSchema = z.object({\n key: issueKeySchema,\n title: z.string().min(1).max(500),\n description: z.string().max(100_000).optional(),\n status: z.object({ category: issueStatusCategorySchema, name: z.string().min(1).max(200) }),\n priority: issuePrioritySchema.optional(),\n labels: z.array(z.string().min(1).max(200)).max(100),\n /** Исполнитель — отображаемое имя или логин трекера, не id пользователя onreel. */\n assignee: z.string().min(1).max(200).optional(),\n /** Ссылки: страница задачи в трекере (`url` первой) и связанные. */\n links: z.array(issueLinkSchema).max(100),\n createdAt: timestampSchema.optional(),\n updatedAt: timestampSchema.optional(),\n});\n\nexport const issueCommentSchema = z.object({\n id: z.string().min(1).max(200),\n author: z.string().min(1).max(200).optional(),\n body: z.string().max(100_000),\n createdAt: timestampSchema.optional(),\n});\n\n/** Поля подключения, которые descriptor может запросить у пользователя. */\nexport const trackerFieldNameSchema = z.enum(['url', 'target', 'user', 'token']);\n\n/** Что трекер умеет: клиент прячет недоступные действия, а host отказывает в них `invalid_request`. */\nexport const trackerFeaturesSchema = z.object({\n create: z.boolean(),\n update: z.boolean(),\n comment: z.boolean(),\n priority: z.boolean(),\n labels: z.boolean(),\n assignee: z.boolean(),\n /** Категории, в которые можно перевести задачу; пусто — статус не меняется. */\n statuses: z.array(issueStatusCategorySchema).max(4),\n});\n\nexport const trackerDescriptorSchema = z.object({\n tracker: trackerKindSchema,\n title: z.string().min(1).max(100),\n fields: z.array(z.object({ name: trackerFieldNameSchema, required: z.boolean(), secret: z.boolean() })).max(4),\n features: trackerFeaturesSchema,\n});\n\n// --- Worktree (onreel §6.9, D-050) ---\n\n/** Идентификатор Worktree: `wt-<uuid>`, как другие entityId контракта. */\nexport const worktreeIdSchema = entityIdSchema;\n\n/**\n * Имя worktree проекта без задачи (onreel D-345): часть каталога `<repo>/_project/<name>` и ветки\n * `onreel/_project/<name>`, поэтому только строчные латинские буквы, цифры и `-`; уникально среди\n * неочищенных worktree проекта.\n */\nexport const worktreeNameSchema = z.string().regex(/^[a-z0-9][a-z0-9-]{0,62}$/);\n\n/** Коммит git: 40 hex (SHA-1) или 64 hex (SHA-256 репозитории). */\nexport const gitShaSchema = z.string().regex(/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/);\n\n/** Состояние Worktree (onreel D-050): preparing — receipt принят, git ещё создаёт; ready — рабочий;\n * cleaning — очистка принята, диск ещё освобождается; cleaned — очищен (терминальное);\n * failed — создание или очистка не справились, причина в error, ждёт решения (worktree.remove). */\nexport const worktreeStatusSchema = z.enum(['preparing', 'ready', 'cleaning', 'cleaned', 'failed']);\n\n/** Запись Worktree в хранилище: привязка к Task или проекту плюс git-факты (ветка, база, пути, голова). */\nexport const worktreeSchema = z.object({\n id: worktreeIdSchema,\n /** Task worktree; у worktree проекта без задачи (D-345) поля нет. */\n taskId: taskIdSchema.optional(),\n /** Проект worktree: у worktree задачи — `projectId` её Run (мягкая ссылка, D-344), у worktree проекта — проект реестра. */\n projectId: projectIdSchema.optional(),\n /** Имя worktree проекта без задачи (D-345); у worktree задачи поля нет. */\n name: worktreeNameSchema.optional(),\n /** Ветка worktree: `onreel/<run>/<task>` (§6.9), `onreel/_project/<name>` (D-345) или заданная клиентом; не меняется. */\n branch: z.string().min(1).max(200),\n /** Базовый ref rebase по умолчанию: ветка репозитория при создании, а при detached HEAD — sha. */\n baseRef: z.string().min(1).max(300),\n /** Коммит базы на момент создания: от него создана ветка. */\n baseSha: gitShaSchema,\n /** Корень базового репозитория пользователя (realpath, D-077). */\n repoPath: z.string().min(1).max(2048),\n /** Путь самого worktree: `<dataDir>/workspaces/<repo>/<run>/<task>` (D-078) или `…/<repo>/_project/<name>` (D-345). */\n path: z.string().min(1).max(2048),\n status: worktreeStatusSchema,\n /** HEAD worktree после создания, коммита или rebase; нет — пока неизвестна. */\n headSha: gitShaSchema.optional(),\n /** Причина состояния failed: вывод git или пояснение host. */\n error: z.string().max(4000).optional(),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n /** Момент очистки; ставится на переходе cleaning → cleaned. */\n cleanedAt: timestampSchema.optional(),\n});\n\n/** Одна строка `git status --porcelain=v1`: две колонки XY и путь. */\nexport const worktreeStatusEntrySchema = z.object({\n path: z.string().min(1).max(2048),\n /** Состояние индекса (X из porcelain), пробел — чисто. */\n index: z.string().max(2),\n /** Состояние рабочего каталога (Y из porcelain), пробел — чисто. */\n worktree: z.string().max(2),\n});\n\n// --- Пути ревью и модель изменений (onreel #30) ---\n\nfunction isRelativePosixPath(path: string): boolean {\n if (path.includes('\\0') || path.includes('\\\\') || path.startsWith('/')) return false;\n return path.split('/').every((part) => part !== '' && part !== '..');\n}\n\n/** Путь внутри worktree: posix, относительный, без «..», NUL, обратных слэшей и ведущего «/». */\nexport const reviewPathSchema = z\n .string()\n .min(1)\n .max(4096)\n .refine(isRelativePosixPath, { message: 'путь должен быть относительным posix-путём без «..», пустых компонент и NUL' });\n\nexport const worktreeChangeStatusSchema = z.enum(['added', 'modified', 'deleted', 'renamed', 'copied', 'type_changed', 'conflicted']);\n\nexport const worktreeChangeSchema = z.object({\n path: reviewPathSchema,\n oldPath: reviewPathSchema.optional(),\n status: worktreeChangeStatusSchema,\n untracked: z.boolean().optional(),\n binary: z.boolean().optional(),\n additions: z.number().int().nonnegative().optional(),\n deletions: z.number().int().nonnegative().optional(),\n});\n\n/** Одна сторона файла; текста нет при `binary` или `truncated`. */\nexport const worktreeFileSideSchema = z.object({\n size: z.number().int().nonnegative(),\n binary: z.boolean(),\n truncated: z.boolean(),\n text: z.string().optional(),\n});\n\n// --- Список файлов worktree (onreel #64, D-367) ---\n\nfunction hasGitSegment(path: string): boolean {\n return path.split('/').some((part) => part.toLowerCase() === '.git');\n}\n\nfunction hasDotSegment(path: string): boolean {\n return path.split('/').includes('.');\n}\n\n/**\n * Путь worktree.files — каталога запроса и записи ответа: путь ревью (D-320) без компоненты `.git` в любом\n * регистре и без компоненты «.». У каждой записи одно написание пути: `./a` и `a` — не два файла.\n */\nexport const worktreeDirPathSchema = reviewPathSchema\n .refine((path) => !hasGitSegment(path), { message: 'служебный каталог .git не показывается' })\n .refine((path) => !hasDotSegment(path), { message: 'путь без компоненты «.»' });\n\n/** Вид записи: `dir` раскрывается, `file` и `symlink` открываются просмотром, `other` (fifo, сокет, устройство) — нет. */\nexport const worktreeEntryKindSchema = z.enum(['file', 'dir', 'symlink', 'other']);\n\nexport const worktreeEntrySchema = z.object({\n /** Имя записи в каталоге. */\n name: z\n .string()\n .min(1)\n .max(255)\n .refine((name) => !name.includes('/') && !name.includes('\\0'), { message: 'имя записи без «/» и NUL' }),\n /** Путь от корня worktree: клиент передаёт его обратно в worktree.files и worktree.file как есть. */\n path: worktreeDirPathSchema,\n kind: worktreeEntryKindSchema,\n /** Размер в байтах; только у `file`. */\n size: z.number().int().nonnegative().optional(),\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/contract/contract.const.ts","../src/contract/contract.schema.ts"],"sourcesContent":["// Константы среза контракта onreel для библиотеки @smwb/onreel-git-mcp (заморожены в части B\n// выделения). Происхождение — onreel @ b73407be076a5df73931d1340f70910ca13c908d, дословные копии:\n// src/contract/discovery/discovery.const.ts — HOST_DISCOVERY_FILE, ENV_HOST_URL, ENV_TOKEN,\n// ENV_RUN_ID, ENV_TASK_ID, ENV_DISPATCH_ID;\n// src/contract/umask.const.ts — ENV_SESSION_UMASK, DEFAULT_SESSION_UMASK;\n// src/contract/errors.const.ts — errorCatalog, ErrorCode, CONTRACT_ERROR_*;\n// src/contract/version/version.const.ts — HOST_CONTRACT_VERSION;\n// src/contract/worktree-files.const.ts — WORKTREE_FILES_MAX, WORKTREE_FILES_REASONS.\n// Имена переменных ONREEL_* заморожены как есть: их смена ломает interop onreel ↔ библиотека.\nimport type { ContractVersion } from './contract.types.ts';\n\n/** Имя файла обнаружения host в каталоге данных (onreel D-046). */\nexport const HOST_DISCOVERY_FILE = 'host.json';\n\n/** Адрес host для процесса агента: агенты не читают host.json, а получают адрес и свой токен в env. */\nexport const ENV_HOST_URL = 'ONREEL_HOST_URL';\n/** Токен агента в env его процесса. */\nexport const ENV_TOKEN = 'ONREEL_TOKEN';\n/** Идентификаторы Run, Task и попытки в env процесса агента (onreel D-226): воркер отчитывается ими в worker_done. */\nexport const ENV_RUN_ID = 'ONREEL_RUN_ID';\nexport const ENV_TASK_ID = 'ONREEL_TASK_ID';\nexport const ENV_DISPATCH_ID = 'ONREEL_DISPATCH_ID';\n\n/** Переменная окружения: восьмеричная маска пользователя («0022»), её первым записывает самый ранний процесс цепочки. */\nexport const ENV_SESSION_UMASK = 'ONREEL_SESSION_UMASK';\n\n/** Маска сессий, если переменная не задана или не разобралась: обычный umask пользователя. */\nexport const DEFAULT_SESSION_UMASK = 0o022;\n\n/**\n * Версия контракта host onreel на момент выделения (1.14). Заморожена для межпроцессной\n * совместимости MCP-сервера с host onreel; история изменений — в onreel version.const.ts.\n */\nexport const HOST_CONTRACT_VERSION: Readonly<ContractVersion> = Object.freeze({ major: 1, minor: 14 });\n\n// Ошибки контракта (onreel D-053): стабильный код, сообщение и обязательные `nextSteps` — что делать\n// дальше. Каталог задаёт известные коды и HTTP-статус. На проводе код — открытая строка: клиент\n// версии N-1 не падает на коде, появившемся позже, а показывает `message` и `nextSteps`.\n// Копия дословная: урезание каталога рассинхронизировало бы коды с onreel.\n\nexport const errorCatalog = {\n // Общие.\n invalid_request: { status: 400, summary: 'Запрос не прошёл проверку схемы контракта.' },\n unauthorized: { status: 401, summary: 'Нет токена, или токен недействителен, истёк или отозван.' },\n permission_denied: { status: 403, summary: 'Запрос шире scope токена.' },\n not_found: { status: 404, summary: 'Сущность не найдена.' },\n contract_incompatible: { status: 426, summary: 'Версии контракта сторон несовместимы (разница major больше допустимой).' },\n capability_unsupported: { status: 400, summary: 'Глагол или значение требует capability, которой нет в согласованном наборе.' },\n request_id_reused: { status: 409, summary: 'Тот же requestId уже использован для другого запроса.' },\n rate_limited: { status: 429, summary: 'Слишком много запросов.' },\n internal: { status: 500, summary: 'Внутренняя ошибка.' },\n unavailable: { status: 503, summary: 'Сервис временно недоступен: host или ptyd не отвечает.' },\n // Оркестрация: переходы, отчёты, доставка, бюджеты.\n lifecycle_conflict: { status: 409, summary: 'Переход из текущего состояния сущности не разрешён.' },\n unknown_task: { status: 404, summary: 'Task не найден.' },\n unknown_dispatch: { status: 404, summary: 'Dispatch не найден.' },\n task_dispatch_mismatch: { status: 409, summary: 'Dispatch не принадлежит этой Task.' },\n stale_dispatch: { status: 409, summary: 'Попытка уже не авторитетна: у Task другой активный Dispatch.' },\n inactive_dispatch: { status: 409, summary: 'Dispatch уже settled.' },\n consumer_fenced: { status: 409, summary: 'Потребитель mailbox заменён: consumer_generation вырос.' },\n budget_exceeded: { status: 409, summary: 'Лимит бюджета исчерпан.' },\n // ptyd.\n unknown_session: { status: 404, summary: 'Сессия ptyd не найдена.' },\n session_exited: { status: 409, summary: 'Процесс сессии уже завершился.' },\n spawn_failed: { status: 422, summary: 'Процесс не запустился.' },\n // Liveness и lease: аренда владения Task и сессией (§6.8, D-008).\n lease_conflict: { status: 409, summary: 'Lease задачи держит другой исполнитель незавершённой попытки.' },\n lease_fenced: { status: 409, summary: 'Владелец lease не доказан: fencing-токен устарел или процесс не совпал с сессией ptyd.' },\n lease_expired: { status: 409, summary: 'Lease задачи закрыт: освобождён или попытка settled.' },\n // Резерв команд агентов (D-020, D-021): коды занимают сейчас, ядро команды — позже.\n claim_conflict: { status: 409, summary: 'Задачу уже взял другой участник.' },\n ownership_conflict: { status: 409, summary: 'Зона ответственности задачи пересекается с чужим claim.' },\n host_not_live: { status: 409, summary: 'Home Dispatch участника не live.' },\n claim_limit: { status: 409, summary: 'У участника уже максимум активных claims.' },\n not_assignee: { status: 403, summary: 'Задача назначена другому участнику.' },\n messaging_denied: { status: 403, summary: 'Политика команды запрещает это сообщение.' },\n plan_required: { status: 409, summary: 'Задача требует одобренного плана.' },\n member_name_taken: { status: 409, summary: 'Имя участника в Run занято.' },\n // Worktree и git-операции (задача worktree).\n git_failed: { status: 422, summary: 'Git-команда не выполнилась: репозиторий повреждён, ref не существует или команда отклонена.' },\n // Реестр проектов (D-343): подключение, показ и снятие.\n unknown_project: { status: 404, summary: 'Проект не найден в реестре.' },\n project_exists: { status: 409, summary: 'Путь или id уже заняты другим проектом.' },\n // Трекеры задач (D-353): отказ внешнего трекера и неизвестная задача.\n tracker_failed: { status: 502, summary: 'Внешний трекер отказал или не ответил: адрес, токен или права не подходят.' },\n unknown_issue: { status: 404, summary: 'Задача не найдена в трекере проекта.' },\n // Агенты (D-091): манифесты, probe, запуск через Executor.\n agent_unavailable: { status: 422, summary: 'Агент не установлен, probe не прошёл или fallback невозможен.' },\n agent_untrusted: { status: 403, summary: 'Манифест агента из репозитория проекта не доверен.' },\n sandbox_unavailable: { status: 422, summary: 'Запрошенный уровень песочницы на этой машине недоступен: нет механизма ОС.' },\n} as const satisfies Record<string, { status: number; summary: string }>;\n\nexport type ErrorCode = keyof typeof errorCatalog;\n\nexport const CONTRACT_ERROR_MESSAGE_MAX = 4000;\nexport const CONTRACT_ERROR_NEXT_STEP_MAX = 1000;\n\n/** Максимум записей каталога в ответе worktree.files; остальное отсекается с `truncated`. */\nexport const WORKTREE_FILES_MAX = 1000;\n\n/** Причины отказов worktree.files в `data.reason` (onreel D-367). */\nexport const WORKTREE_FILES_REASONS = ['outside_worktree', 'excluded', 'not_directory', 'unreadable', 'missing_on_disk', 'unsafe_path'] as const;\n\nexport type WorktreeFilesReason = (typeof WORKTREE_FILES_REASONS)[number];\n","// Схемы zod среза контракта onreel для библиотеки @smwb/onreel-git-mcp (заморожены в части B\n// выделения). Происхождение — onreel @ b73407be076a5df73931d1340f70910ca13c908d, дословные копии:\n// src/contract/ids.schema.ts — примитивы идентификаторов и времени;\n// src/contract/version/version.schema.ts — contractVersionSchema;\n// src/contract/errors.schema.ts — схемы ошибки контракта;\n// src/contract/tracker.schema.ts — единая модель задач трекеров (без trackerConnectionSchema:\n// подключения хранит потребитель, модули библиотеки эту схему не используют);\n// src/contract/worktree.schema.ts — запись Worktree и строка porcelain;\n// src/contract/review.schema.ts — reviewPathSchema и модель изменений (без замечаний ревью);\n// src/contract/worktree-files.schema.ts — записи каталога worktree.\n// Выведенные типы — в contract.types.ts (правило фасетов: schema — только схемы).\nimport { z } from 'zod';\nimport { CONTRACT_ERROR_MESSAGE_MAX, CONTRACT_ERROR_NEXT_STEP_MAX, errorCatalog, type ErrorCode } from './contract.const.ts';\n\n// Схемы объектов не строгие (`z.object` отбрасывает лишние поля): старый читатель не падает\n// на optional-поле новой версии (onreel D-011).\n\n// --- Идентификаторы и общие примитивы ---\n\nconst idPattern = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;\n\n/** Идентификатор сущности: Run, Task, Dispatch, письма, gate, сессии и т. п. */\nexport const entityIdSchema = z.string().regex(idPattern);\n\n/** Ключ идемпотентности запроса: его создаёт клиент, повтор с тем же ключом возвращает receipt. */\nexport const requestIdSchema = z.string().regex(idPattern);\n\nexport const projectIdSchema = entityIdSchema;\nexport const taskIdSchema = entityIdSchema;\n\n/** Время — миллисекунды Unix epoch, как INTEGER в хранилище. */\nexport const timestampSchema = z.number().int().nonnegative();\n\n// --- Версия контракта ---\n\nexport const contractVersionSchema = z.object({\n major: z.number().int().nonnegative().max(65535),\n minor: z.number().int().nonnegative().max(65535),\n});\n\n// --- Ошибка контракта ---\n\nexport const errorCodeSchema = z.enum(Object.keys(errorCatalog) as [ErrorCode, ...ErrorCode[]]);\n\n/** Код на проводе: известный код каталога или код более новой версии контракта. */\nexport const wireErrorCodeSchema = z.string().max(64).regex(/^[a-z][a-z0-9_]*$/);\n\nexport const contractErrorSchema = z.object({\n code: wireErrorCodeSchema,\n message: z.string().min(1).max(CONTRACT_ERROR_MESSAGE_MAX),\n /** Конкретные действия: команда CLI, глагол API или шаг для человека. Пустым не бывает. */\n nextSteps: z.array(z.string().min(1).max(CONTRACT_ERROR_NEXT_STEP_MAX)).min(1).max(20),\n data: z.record(z.string(), z.unknown()).optional(),\n});\n\n// --- Единая модель задач трекеров (onreel D-350, D-351) ---\n\n/** Вид трекера — открытый слаг: новый трекер добавляется подключением на host без правки контракта. */\nexport const trackerKindSchema = z.string().regex(/^[a-z][a-z0-9-]{0,31}$/);\n\n/** Ключ задачи в своём трекере: `76`, `PROJ-12`, `#5`; для клиента непрозрачная строка. */\nexport const issueKeySchema = z.string().min(1).max(200);\n\n/** Категория статуса единой модели; своё имя статуса трекер отдаёт отдельно, в `status.name`. */\nexport const issueStatusCategorySchema = z.enum(['open', 'in_progress', 'done', 'declined']);\n\n/** Приоритет единой модели; трекер без приоритетов не заполняет поле. */\nexport const issuePrioritySchema = z.enum(['trivial', 'minor', 'normal', 'critical', 'blocker']);\n\nexport const issueLinkSchema = z.object({\n url: z.string().min(1).max(2048),\n title: z.string().min(1).max(500).optional(),\n});\n\nexport const issueSchema = z.object({\n key: issueKeySchema,\n title: z.string().min(1).max(500),\n description: z.string().max(100_000).optional(),\n status: z.object({ category: issueStatusCategorySchema, name: z.string().min(1).max(200) }),\n priority: issuePrioritySchema.optional(),\n labels: z.array(z.string().min(1).max(200)).max(100),\n /** Исполнитель — отображаемое имя или логин трекера, не id пользователя onreel. */\n assignee: z.string().min(1).max(200).optional(),\n /** Ссылки: страница задачи в трекере (`url` первой) и связанные. */\n links: z.array(issueLinkSchema).max(100),\n createdAt: timestampSchema.optional(),\n updatedAt: timestampSchema.optional(),\n});\n\nexport const issueCommentSchema = z.object({\n id: z.string().min(1).max(200),\n author: z.string().min(1).max(200).optional(),\n body: z.string().max(100_000),\n createdAt: timestampSchema.optional(),\n});\n\n/** Поля подключения, которые descriptor может запросить у пользователя. */\nexport const trackerFieldNameSchema = z.enum(['url', 'target', 'user', 'token']);\n\n/** Что трекер умеет: клиент прячет недоступные действия, а host отказывает в них `invalid_request`. */\nexport const trackerFeaturesSchema = z.object({\n create: z.boolean(),\n update: z.boolean(),\n comment: z.boolean(),\n priority: z.boolean(),\n labels: z.boolean(),\n assignee: z.boolean(),\n /** Категории, в которые можно перевести задачу; пусто — статус не меняется. */\n statuses: z.array(issueStatusCategorySchema).max(4),\n});\n\n/**\n * Откуда определение трекера: builtin — код библиотеки или потребителя, user — декларативный конфиг пользователя\n * (definitionFromConfig). Своё (#25): в срезе onreel 1.14 поля нет.\n */\nexport const trackerSourceSchema = z.enum(['builtin', 'user']);\n\nexport const trackerDescriptorSchema = z.object({\n tracker: trackerKindSchema,\n title: z.string().min(1).max(100),\n /** Нет поля — определение из кода (builtin). */\n source: trackerSourceSchema.optional(),\n fields: z.array(z.object({ name: trackerFieldNameSchema, required: z.boolean(), secret: z.boolean() })).max(4),\n features: trackerFeaturesSchema,\n});\n\n// --- Worktree (onreel §6.9, D-050) ---\n\n/** Идентификатор Worktree: `wt-<uuid>`, как другие entityId контракта. */\nexport const worktreeIdSchema = entityIdSchema;\n\n/**\n * Имя worktree проекта без задачи (onreel D-345): часть каталога `<repo>/_project/<name>` и ветки\n * `onreel/_project/<name>`, поэтому только строчные латинские буквы, цифры и `-`; уникально среди\n * неочищенных worktree проекта.\n */\nexport const worktreeNameSchema = z.string().regex(/^[a-z0-9][a-z0-9-]{0,62}$/);\n\n/** Коммит git: 40 hex (SHA-1) или 64 hex (SHA-256 репозитории). */\nexport const gitShaSchema = z.string().regex(/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/);\n\n/** Состояние Worktree (onreel D-050): preparing — receipt принят, git ещё создаёт; ready — рабочий;\n * cleaning — очистка принята, диск ещё освобождается; cleaned — очищен (терминальное);\n * failed — создание или очистка не справились, причина в error, ждёт решения (worktree.remove). */\nexport const worktreeStatusSchema = z.enum(['preparing', 'ready', 'cleaning', 'cleaned', 'failed']);\n\n/** Запись Worktree в хранилище: привязка к Task или проекту плюс git-факты (ветка, база, пути, голова). */\nexport const worktreeSchema = z.object({\n id: worktreeIdSchema,\n /** Task worktree; у worktree проекта без задачи (D-345) поля нет. */\n taskId: taskIdSchema.optional(),\n /** Проект worktree: у worktree задачи — `projectId` её Run (мягкая ссылка, D-344), у worktree проекта — проект реестра. */\n projectId: projectIdSchema.optional(),\n /** Имя worktree проекта без задачи (D-345); у worktree задачи поля нет. */\n name: worktreeNameSchema.optional(),\n /** Ветка worktree: `onreel/<run>/<task>` (§6.9), `onreel/_project/<name>` (D-345) или заданная клиентом; не меняется. */\n branch: z.string().min(1).max(200),\n /** Базовый ref rebase по умолчанию: ветка репозитория при создании, а при detached HEAD — sha. */\n baseRef: z.string().min(1).max(300),\n /** Коммит базы на момент создания: от него создана ветка. */\n baseSha: gitShaSchema,\n /** Корень базового репозитория пользователя (realpath, D-077). */\n repoPath: z.string().min(1).max(2048),\n /** Путь самого worktree: `<dataDir>/workspaces/<repo>/<run>/<task>` (D-078) или `…/<repo>/_project/<name>` (D-345). */\n path: z.string().min(1).max(2048),\n status: worktreeStatusSchema,\n /** HEAD worktree после создания, коммита или rebase; нет — пока неизвестна. */\n headSha: gitShaSchema.optional(),\n /** Причина состояния failed: вывод git или пояснение host. */\n error: z.string().max(4000).optional(),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n /** Момент очистки; ставится на переходе cleaning → cleaned. */\n cleanedAt: timestampSchema.optional(),\n});\n\n/** Одна строка `git status --porcelain=v1`: две колонки XY и путь. */\nexport const worktreeStatusEntrySchema = z.object({\n path: z.string().min(1).max(2048),\n /** Состояние индекса (X из porcelain), пробел — чисто. */\n index: z.string().max(2),\n /** Состояние рабочего каталога (Y из porcelain), пробел — чисто. */\n worktree: z.string().max(2),\n});\n\n// --- Пути ревью и модель изменений (onreel #30) ---\n\nfunction isRelativePosixPath(path: string): boolean {\n if (path.includes('\\0') || path.includes('\\\\') || path.startsWith('/')) return false;\n return path.split('/').every((part) => part !== '' && part !== '..');\n}\n\n/** Путь внутри worktree: posix, относительный, без «..», NUL, обратных слэшей и ведущего «/». */\nexport const reviewPathSchema = z\n .string()\n .min(1)\n .max(4096)\n .refine(isRelativePosixPath, { message: 'путь должен быть относительным posix-путём без «..», пустых компонент и NUL' });\n\nexport const worktreeChangeStatusSchema = z.enum(['added', 'modified', 'deleted', 'renamed', 'copied', 'type_changed', 'conflicted']);\n\nexport const worktreeChangeSchema = z.object({\n path: reviewPathSchema,\n oldPath: reviewPathSchema.optional(),\n status: worktreeChangeStatusSchema,\n untracked: z.boolean().optional(),\n binary: z.boolean().optional(),\n additions: z.number().int().nonnegative().optional(),\n deletions: z.number().int().nonnegative().optional(),\n});\n\n/** Одна сторона файла; текста нет при `binary` или `truncated`. */\nexport const worktreeFileSideSchema = z.object({\n size: z.number().int().nonnegative(),\n binary: z.boolean(),\n truncated: z.boolean(),\n text: z.string().optional(),\n});\n\n// --- Список файлов worktree (onreel #64, D-367) ---\n\nfunction hasGitSegment(path: string): boolean {\n return path.split('/').some((part) => part.toLowerCase() === '.git');\n}\n\nfunction hasDotSegment(path: string): boolean {\n return path.split('/').includes('.');\n}\n\n/**\n * Путь worktree.files — каталога запроса и записи ответа: путь ревью (D-320) без компоненты `.git` в любом\n * регистре и без компоненты «.». У каждой записи одно написание пути: `./a` и `a` — не два файла.\n */\nexport const worktreeDirPathSchema = reviewPathSchema\n .refine((path) => !hasGitSegment(path), { message: 'служебный каталог .git не показывается' })\n .refine((path) => !hasDotSegment(path), { message: 'путь без компоненты «.»' });\n\n/** Вид записи: `dir` раскрывается, `file` и `symlink` открываются просмотром, `other` (fifo, сокет, устройство) — нет. */\nexport const worktreeEntryKindSchema = z.enum(['file', 'dir', 'symlink', 'other']);\n\nexport const worktreeEntrySchema = z.object({\n /** Имя записи в каталоге. */\n name: z\n .string()\n .min(1)\n .max(255)\n .refine((name) => !name.includes('/') && !name.includes('\\0'), { message: 'имя записи без «/» и NUL' }),\n /** Путь от корня worktree: клиент передаёт его обратно в worktree.files и worktree.file как есть. */\n path: worktreeDirPathSchema,\n kind: worktreeEntryKindSchema,\n /** Размер в байтах; только у `file`. */\n size: z.number().int().nonnegative().optional(),\n});\n"],"mappings":"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","names":[]}
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-C6PHNSDC.js";
5
5
  import {
6
6
  sessionUmask
7
- } from "./chunk-3YP22YLA.js";
7
+ } from "./chunk-33ISKIW7.js";
8
8
  import {
9
9
  redactSecretText
10
- } from "./chunk-6VQURMRA.js";
10
+ } from "./chunk-AJOAZMU4.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-VLTG7OKJ.js.map
421
+ //# sourceMappingURL=chunk-OWLVTLYZ.js.map
@@ -141,9 +141,21 @@ export declare const trackerFeaturesSchema: z.ZodObject<{
141
141
  open: "open";
142
142
  }>>;
143
143
  }, z.core.$strip>;
144
+ /**
145
+ * Откуда определение трекера: builtin — код библиотеки или потребителя, user — декларативный конфиг пользователя
146
+ * (definitionFromConfig). Своё (#25): в срезе onreel 1.14 поля нет.
147
+ */
148
+ export declare const trackerSourceSchema: z.ZodEnum<{
149
+ builtin: "builtin";
150
+ user: "user";
151
+ }>;
144
152
  export declare const trackerDescriptorSchema: z.ZodObject<{
145
153
  tracker: z.ZodString;
146
154
  title: z.ZodString;
155
+ source: z.ZodOptional<z.ZodEnum<{
156
+ builtin: "builtin";
157
+ user: "user";
158
+ }>>;
147
159
  fields: z.ZodArray<z.ZodObject<{
148
160
  name: z.ZodEnum<{
149
161
  target: "target";
@@ -1,5 +1,5 @@
1
1
  import type { z } from 'zod';
2
- import type { contractErrorSchema, contractVersionSchema, entityIdSchema, issueCommentSchema, issueLinkSchema, issuePrioritySchema, issueSchema, issueStatusCategorySchema, requestIdSchema, timestampSchema, trackerDescriptorSchema, trackerFeaturesSchema, trackerKindSchema, worktreeChangeSchema, worktreeChangeStatusSchema, worktreeEntryKindSchema, worktreeEntrySchema, worktreeFileSideSchema, worktreeSchema, worktreeStatusEntrySchema, worktreeStatusSchema } from './contract.schema.ts';
2
+ import type { contractErrorSchema, contractVersionSchema, entityIdSchema, issueCommentSchema, issueLinkSchema, issuePrioritySchema, issueSchema, issueStatusCategorySchema, requestIdSchema, timestampSchema, trackerDescriptorSchema, trackerFeaturesSchema, trackerKindSchema, trackerSourceSchema, worktreeChangeSchema, worktreeChangeStatusSchema, worktreeEntryKindSchema, worktreeEntrySchema, worktreeFileSideSchema, worktreeSchema, worktreeStatusEntrySchema, worktreeStatusSchema } from './contract.schema.ts';
3
3
  export type EntityId = z.infer<typeof entityIdSchema>;
4
4
  export type RequestId = z.infer<typeof requestIdSchema>;
5
5
  export type Timestamp = z.infer<typeof timestampSchema>;
@@ -13,6 +13,7 @@ export type Issue = z.infer<typeof issueSchema>;
13
13
  export type IssueComment = z.infer<typeof issueCommentSchema>;
14
14
  export type TrackerFeatures = z.infer<typeof trackerFeaturesSchema>;
15
15
  export type TrackerDescriptor = z.infer<typeof trackerDescriptorSchema>;
16
+ export type TrackerSource = z.infer<typeof trackerSourceSchema>;
16
17
  export type Worktree = z.infer<typeof worktreeSchema>;
17
18
  export type WorktreeStatus = z.infer<typeof worktreeStatusSchema>;
18
19
  export type WorktreeStatusEntry = z.infer<typeof worktreeStatusEntrySchema>;
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  WORKTREE_FILES_MAX,
8
8
  worktreeEntrySchema
9
- } from "../chunk-4ZGRXIVA.js";
9
+ } from "../chunk-D5QUOIRC.js";
10
10
 
11
11
  // src/files/files.const.ts
12
12
  var WORKTREE_FILES_SCAN_MAX = 1e4;
package/dist/git/index.js CHANGED
@@ -25,7 +25,7 @@ import {
25
25
  showBlob,
26
26
  statusEntries,
27
27
  untrackedFiles
28
- } from "../chunk-VLTG7OKJ.js";
28
+ } from "../chunk-OWLVTLYZ.js";
29
29
  import {
30
30
  PROJECT_WORKTREE_SEGMENT,
31
31
  PathEscapeError,
@@ -43,13 +43,13 @@ import {
43
43
  workspacesRoot,
44
44
  worktreePathFor
45
45
  } from "../chunk-C6PHNSDC.js";
46
- import "../chunk-3YP22YLA.js";
46
+ import "../chunk-33ISKIW7.js";
47
47
  import {
48
48
  defaultSecretSink,
49
49
  redactSecretText,
50
50
  setSecretSink
51
- } from "../chunk-6VQURMRA.js";
52
- import "../chunk-4ZGRXIVA.js";
51
+ } from "../chunk-AJOAZMU4.js";
52
+ import "../chunk-D5QUOIRC.js";
53
53
  export {
54
54
  GIT_CHECKOUT_TIMEOUT_MS,
55
55
  GIT_TIMEOUT_MS,
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  inheritSessionUmask,
7
7
  parseUmask,
8
8
  sessionUmask
9
- } from "./chunk-3YP22YLA.js";
9
+ } from "./chunk-33ISKIW7.js";
10
10
  import {
11
11
  CONTRACT_ERROR_MESSAGE_MAX,
12
12
  CONTRACT_ERROR_NEXT_STEP_MAX,
@@ -42,6 +42,7 @@ import {
42
42
  trackerFeaturesSchema,
43
43
  trackerFieldNameSchema,
44
44
  trackerKindSchema,
45
+ trackerSourceSchema,
45
46
  wireErrorCodeSchema,
46
47
  worktreeChangeSchema,
47
48
  worktreeChangeStatusSchema,
@@ -54,12 +55,12 @@ import {
54
55
  worktreeSchema,
55
56
  worktreeStatusEntrySchema,
56
57
  worktreeStatusSchema
57
- } from "./chunk-4ZGRXIVA.js";
58
+ } from "./chunk-D5QUOIRC.js";
58
59
 
59
60
  // package.json
60
61
  var package_default = {
61
62
  name: "@smwb/onreel-git-mcp",
62
- version: "0.11.0",
63
+ version: "0.12.0",
63
64
  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
65
  keywords: [
65
66
  "git",
@@ -134,6 +135,7 @@ var package_default = {
134
135
  release: "npm run build && changeset publish"
135
136
  },
136
137
  dependencies: {
138
+ yaml: "^2.9.1",
137
139
  zod: "^4.6.5"
138
140
  },
139
141
  devDependencies: {
@@ -191,6 +193,7 @@ export {
191
193
  trackerFeaturesSchema,
192
194
  trackerFieldNameSchema,
193
195
  trackerKindSchema,
196
+ trackerSourceSchema,
194
197
  wireErrorCodeSchema,
195
198
  worktreeChangeSchema,
196
199
  worktreeChangeStatusSchema,
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.11.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.12.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 \"yaml\": \"^2.9.1\",\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,MAAQ;AAAA,IACR,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;;;AC3EO,IAAM,UAAkB,gBAAI;","names":[]}
package/dist/mcp/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  contractError,
3
3
  formatVersion
4
- } from "../chunk-3YP22YLA.js";
4
+ } from "../chunk-33ISKIW7.js";
5
5
  import {
6
6
  redactSecretText
7
- } from "../chunk-6VQURMRA.js";
7
+ } from "../chunk-AJOAZMU4.js";
8
8
  import {
9
9
  ENV_DISPATCH_ID,
10
10
  ENV_HOST_URL,
@@ -15,7 +15,7 @@ import {
15
15
  HOST_DISCOVERY_FILE,
16
16
  contractErrorSchema,
17
17
  requestIdSchema
18
- } from "../chunk-4ZGRXIVA.js";
18
+ } from "../chunk-D5QUOIRC.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,28 @@
1
+ import type { AdapterContext, JsonRequest, PageQuery, TrackerPage } from '../tracker.types.ts';
2
+ import type { TrackerConfig } from './declarative.schema.ts';
3
+ import type { ConfigCall, ConfigContext, ConfigSection, InputValues } from './declarative-model.types.ts';
4
+ /** Отказы по ответу: 404 сущности и статусы «переход сейчас невозможен». */
5
+ type CallOptions = Pick<JsonRequest, 'missing' | 'missingIsIssue' | 'conflictOn'>;
6
+ /** Контекст запросов адаптера: обязательные поля подключения заданы, адрес API разобран, заголовки собраны. */
7
+ export declare function contextOf(config: TrackerConfig, { connection, fetch }: AdapterContext): ConfigContext;
8
+ /** Операция раздела из конфига; нет — undefined. */
9
+ export declare function callOf(config: TrackerConfig, section: ConfigSection, name: string): ConfigCall | undefined;
10
+ /** Операция, которой может не быть: нет в конфиге — отказ unsupported с тем, чего трекер не умеет. */
11
+ export declare function requireCall(config: TrackerConfig, section: ConfigSection, name: string, what: string): ConfigCall;
12
+ /**
13
+ * Входы со значением, которых нет в шаблонах операции, — отказ unsupported до запроса: молча потерянная правка хуже
14
+ * отказа. false и пустой список не считаются значением: это «не просили» (черновик, удаление ветки, меток нет).
15
+ */
16
+ export declare function assertUsed(subject: string, call: ConfigCall, inputs: InputValues): void;
17
+ /** Мс единой модели → ISO 8601 для шаблона; нет — нет. */
18
+ export declare function isoOf(value: number | undefined): string | undefined;
19
+ /** Входы сортировки: поле и направление (по умолчанию desc); сортировки нет — нет и входов. */
20
+ export declare function sortInputs(sort: {
21
+ field: string;
22
+ direction?: 'asc' | 'desc' | undefined;
23
+ } | undefined): InputValues;
24
+ /** Операция с одним элементом результата. */
25
+ export declare function single<T>(context: ConfigContext, call: ConfigCall, inputs: InputValues, options?: CallOptions, defaults?: Readonly<Record<string, unknown>>): Promise<T>;
26
+ /** Операция-список: страница элементов единой модели (не больше limit) и курсор следующей. */
27
+ export declare function list<T>(context: ConfigContext, call: ConfigCall, inputs: InputValues, page: PageQuery, options?: CallOptions, defaults?: Readonly<Record<string, unknown>>): Promise<TrackerPage<T>>;
28
+ export {};