@smwb/onreel-git-mcp 0.3.0 → 0.5.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 +222 -1
- package/dist/{chunk-L7CPE2SO.js → chunk-AGGJK2XZ.js} +2 -1
- package/dist/{chunk-GPRMI4PG.js → chunk-ZTME4HFD.js} +2 -2
- package/dist/git/index.js +3 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.js +3 -3
- package/dist/tracker/ci.lib.d.ts +36 -0
- package/dist/tracker/ci.schema.d.ts +162 -0
- package/dist/tracker/ci.types.d.ts +117 -0
- package/dist/tracker/github-ci.lib.d.ts +2 -0
- package/dist/tracker/github-pull.lib.d.ts +2 -0
- package/dist/tracker/gitlab-ci.lib.d.ts +2 -0
- package/dist/tracker/gitlab-pull.lib.d.ts +2 -0
- package/dist/tracker/http.lib.d.ts +9 -1
- package/dist/tracker/index.d.ts +12 -0
- package/dist/tracker/index.js +1986 -90
- package/dist/tracker/index.js.map +1 -1
- package/dist/tracker/mapping.const.d.ts +24 -0
- package/dist/tracker/pull.lib.d.ts +4 -0
- package/dist/tracker/pull.schema.d.ts +63 -0
- package/dist/tracker/pull.types.d.ts +74 -0
- package/dist/tracker/sourcecraft-ci.lib.d.ts +2 -0
- package/dist/tracker/sourcecraft-pull.lib.d.ts +2 -0
- package/dist/tracker/tracker.const.d.ts +12 -0
- package/dist/tracker/tracker.types.d.ts +37 -0
- package/dist/worktree/index.js +2 -2
- package/package.json +1 -1
- /package/dist/{chunk-L7CPE2SO.js.map → chunk-AGGJK2XZ.js.map} +0 -0
- /package/dist/{chunk-GPRMI4PG.js.map → chunk-ZTME4HFD.js.map} +0 -0
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
- **жизненный цикл worktree** — замки, двухфазное создание и очистка, сверка при старте, свип и корзина —
|
|
11
11
|
против портов хранения, которые реализует потребитель;
|
|
12
12
|
- **адаптеры трекеров** — единая модель задач и пять адаптеров: GitHub, GitLab, Jira, SourceCraft и локальный
|
|
13
|
-
трекер поверх хранилища потребителя;
|
|
13
|
+
трекер поверх хранилища потребителя; у GitHub, GitLab и SourceCraft есть раздел pull request-ов (D-005);
|
|
14
14
|
- **MCP stdio-сервер** — JSON-RPC 2.0 поверх stdin/stdout, инструменты строятся из таблицы команд вызывающего.
|
|
15
15
|
|
|
16
16
|
Пакет ESM, рантайм-зависимость одна — `zod`. Публичная поверхность держится документированной здесь:
|
|
@@ -339,6 +339,227 @@ try {
|
|
|
339
339
|
Все четыре кода уже есть в каталоге ошибок контракта (`errorCatalog`), срез контракта не меняется.
|
|
340
340
|
Исчерпывающий `switch` по `TrackerFailure` у потребителя после обновления нужно дополнить.
|
|
341
341
|
|
|
342
|
+
### Pull request-ы
|
|
343
|
+
|
|
344
|
+
Pull request-ы — раздел `pulls` определения трекера (D-005), а не отдельный реестр и не новые методы
|
|
345
|
+
`TrackerAdapter`: адаптер PR живёт на том же подключении (`target`, `token`, `url`) и в том же `AdapterContext`,
|
|
346
|
+
что и задачи. Раздел ведут GitHub, GitLab и SourceCraft; у локального трекера и Jira его нет, и
|
|
347
|
+
`pullRequestAdapterOf(definition, context)` для них бросает `TrackerError('unsupported')`, не сделав ни одного
|
|
348
|
+
запроса. Фабрики разделов — `githubPulls()`, `gitlabPulls()` и `sourcecraftPulls()`: каждая возвращает
|
|
349
|
+
`PullRequestDefinition` (`capabilities` + `create(context)`), и определение трекера получает раздел полем `pulls`.
|
|
350
|
+
|
|
351
|
+
```ts
|
|
352
|
+
import { findTracker, pullRequestAdapterOf } from '@smwb/onreel-git-mcp/tracker';
|
|
353
|
+
|
|
354
|
+
const definition = findTracker('github');
|
|
355
|
+
if (definition === undefined) throw new Error('Встроенные адаптеры не зарегистрированы');
|
|
356
|
+
const pulls = pullRequestAdapterOf(definition, context);
|
|
357
|
+
|
|
358
|
+
const page = await pulls.list({ limit: 50, status: ['open'], target: 'main', sort: { field: 'updated' } });
|
|
359
|
+
const pr = page.items[0];
|
|
360
|
+
if (pr !== undefined) await pulls.merge(pr.key, { method: 'squash', headSha: pr.headSha });
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
`PullRequestAdapter` — семь методов: `list`, `get`, `create`, `update`, `merge`, `comments` и `comment`.
|
|
364
|
+
Список и комментарии листаются и фильтруются так же, как задачи (D-004, R-002): `PullRequestQuery` — это
|
|
365
|
+
`PageQuery` плюс необязательные `status`, `author`, `source`, `target`, `labels`, `search`,
|
|
366
|
+
`createdAfter`/`createdBefore`/`updatedAfter`/`updatedBefore` и `sort`; имена фильтров перечисляет
|
|
367
|
+
`pullRequestFilterSchema` (тип `PullRequestFilter`), сортировка — `ListSort<PullRequestSortField>` с полями
|
|
368
|
+
`created`, `updated`, `title` (`pullRequestSortFieldSchema`). `comments` принимает тот же `CommentQuery`, что и
|
|
369
|
+
адаптер задач.
|
|
370
|
+
|
|
371
|
+
Модель PR описывает `pullRequestSchema` (тип `PullRequest`): `key` — номер в своём трекере (GitHub number,
|
|
372
|
+
GitLab iid, SourceCraft slug), для клиента непрозрачная строка; `title`, необязательное `description`;
|
|
373
|
+
`status` — `{ category, name }`, где `category` из `pullRequestStatusCategorySchema` (`draft`, `open`, `merged`,
|
|
374
|
+
`closed`), а `name` — как состояние называет сам трекер; `author`; `source` и `target` — имена веток без
|
|
375
|
+
`refs/heads/`; `headSha` — голова источника; `labels`; необязательные `reviewers` (трекер их не отдаёт — поля
|
|
376
|
+
нет); `links` и времена `createdAt`/`updatedAt`/`mergedAt`/`closedAt`.
|
|
377
|
+
|
|
378
|
+
Что умеет менять адаптер, описывают `PullRequestCapabilities` — они статичны и сериализуются в JSON: `list` и
|
|
379
|
+
`comments` как у задач, плюс `create`, `createDraft`, `update` (поля, которые меняет `update`), `statuses`
|
|
380
|
+
(категории, в которые переводит `update({ status })`), `comment`, `merge` (способы слияния, пусто — `merge` не
|
|
381
|
+
поддерживается) и `deleteSourceOnMerge`. `merge` принимает `MergeInput`: `method` из `mergeMethodSchema`
|
|
382
|
+
(`merge`, `squash`, `rebase`), способ вне `capabilities.merge` — `unsupported` до запроса; без `method` способ по настройке репозитория (у GitHub это слияние коммитом `merge`, у GitLab при явном `method: 'merge'`
|
|
383
|
+
действует squash-настройка MR или проекта), `headSha` — голова, которую видел вызывающий (другая — отказ
|
|
384
|
+
`conflict`, слияния не будет), `message` — сообщение коммита слияния, `deleteSource` — удалить ветку-источник. `create` принимает
|
|
385
|
+
`NewPullRequestInput` (`title`, `source`, `target`, `description?`, `draft?`), `update` — `PullRequestPatchInput`
|
|
386
|
+
(`title?`, `description?`, `target?`, `status?` — в `merged` переводит только `merge`). Вне объявленных
|
|
387
|
+
возможностей — `unsupported` до запроса, как и у списков задач.
|
|
388
|
+
|
|
389
|
+
| Трекер | `list.clientSide` | `list.sorts` | `create` / `createDraft` | `update` | `statuses` | `merge` | `deleteSourceOnMerge` |
|
|
390
|
+
|---|---|---|---|---|---|---|---|
|
|
391
|
+
| GitHub | `status`, `author`, `labels`, `search`, `created*`/`updated*` | `created`, `updated` | `true` / `true` | `title`, `description`, `target` | `open`, `closed` | `merge`, `squash`, `rebase` | `false` |
|
|
392
|
+
| GitLab | `status` | `created`, `updated`, `title` | `true` / `true` | те же | `draft`, `open`, `closed` | `merge`, `squash` | `true` |
|
|
393
|
+
| SourceCraft | `labels`, `search`, `created*`/`updated*` | `created`, `updated`, `title` | `true` / `true` | те же | `draft`, `open`, `closed` | `merge`, `squash`, `rebase` | `true` |
|
|
394
|
+
|
|
395
|
+
У всех трёх `list.filters` — весь `pullRequestFilterSchema`. Комментарии: у GitHub `updatedAfter` фильтрует сам
|
|
396
|
+
трекер и порядок только `asc`; у GitLab и SourceCraft `updatedAfter` проверяется по странице, порядки `asc` и
|
|
397
|
+
`desc`. `comment` — `true` у всех.
|
|
398
|
+
|
|
399
|
+
Сопоставление состояний — открытые таблицы, как у задач: `GITLAB_MERGE_REQUEST_STATES` (`locked` — слияние идёт,
|
|
400
|
+
MR ещё открыт, поэтому `open`) и `SOURCECRAFT_PULL_STATUSES` (`merging` — `open` с именем `merging`, `discarded`
|
|
401
|
+
— `closed`). Черновик у GitLab — префикс заголовка, а не поле: его ставит и снимает адаптер
|
|
402
|
+
(`GITLAB_DRAFT_PREFIX` и все формы префикса — `GITLAB_DRAFT_PATTERN`). Слияние SourceCraft асинхронно: `merge` вернёт PR с категорией `open` (`status.name` `open` или `merging`) до
|
|
403
|
+
завершения операции, либо уже `merged`; операция, отклонённая трекером (`failed`/`cancel` в ответе 202), — отказ
|
|
404
|
+
`conflict`, и следующий `get` потребуется, только чтобы дождаться результата. `headSha` на всех трёх трекерах
|
|
405
|
+
защищает от слияния чужой головы: GitHub и GitLab сверяют его сервером (атомарно), у SourceCraft сверка идёт на
|
|
406
|
+
клиенте перед `POST /merge` — это лучшее старание, push между чтением и слиянием она не отсекает, поэтому
|
|
407
|
+
`headSha` передают полным и в нижнем регистре.
|
|
408
|
+
|
|
409
|
+
Фильтры списка работают по-разному, и это видно по пустым страницам. `search`: у GitHub — подстрока без учёта
|
|
410
|
+
регистра в заголовке и описании, проверяется на странице; у GitLab — серверный параметр `search` по заголовку
|
|
411
|
+
и описанию; у SourceCraft — подстрока на странице. У GitHub `source` уходит параметром `head=<владелец>:<ветка>`
|
|
412
|
+
с владельцем целевого репозитория, поэтому PR из форков этим фильтром не находятся; `author` и `labels` там же
|
|
413
|
+
сверяются точным совпадением на странице (регистр имеет значение). У GitLab `status: ['open']` шлёт
|
|
414
|
+
`state=opened` и потому не возвращает `locked` MR, хотя их категория — `open`. У SourceCraft неизвестный
|
|
415
|
+
`author` — 400 «user not found» от самого трекера, то есть `failed`, а не пустая страница. `status` из
|
|
416
|
+
неизвестной категории адаптер отклоняет `invalid_request` до запроса, пустой массив `status: []` равен его
|
|
417
|
+
отсутствию. Переход `update({ status })` «в то же состояние» ни у кого не пишет повторно: GitLab не шлёт
|
|
418
|
+
PUT, GitHub — PATCH, SourceCraft не дёргает эндпоинт состояния.
|
|
419
|
+
|
|
420
|
+
Публичные символы раздела — схемы `pullRequestSchema`, `pullRequestStatusCategorySchema`,
|
|
421
|
+
`pullRequestFilterSchema`, `pullRequestSortFieldSchema` и `mergeMethodSchema` с выведенными типами
|
|
422
|
+
`PullRequest`, `PullRequestStatusCategory`, `PullRequestFilter`, `PullRequestSortField` и `MergeMethod`; типы
|
|
423
|
+
`PullRequestQuery`, `NewPullRequestInput`, `PullRequestPatchInput`, `MergeInput`, `PullRequestAdapter`,
|
|
424
|
+
`PullRequestCapabilities` и `PullRequestDefinition`; помощник `pullRequestAdapterOf` и фабрики разделов
|
|
425
|
+
`githubPulls()`, `gitlabPulls()` и `sourcecraftPulls()`. Всё это выходит из субпути `…/tracker` — нового субпути
|
|
426
|
+
нет (D-001, D-005). За модель отвечают таблицы сопоставления и запись D-005, отказ до запроса — правило R-002.
|
|
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
|
+
|
|
342
563
|
## mcp
|
|
343
564
|
|
|
344
565
|
`serveMcp` — построчный JSON-RPC 2.0 на stdio, только инструменты: `initialize`, `ping`, `tools/list`,
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from "./chunk-3YP22YLA.js";
|
|
8
8
|
import {
|
|
9
9
|
redactSecretText
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
28
|
+
} from "../chunk-ZTME4HFD.js";
|
|
29
29
|
import {
|
|
30
30
|
PROJECT_WORKTREE_SEGMENT,
|
|
31
31
|
PathEscapeError,
|
|
@@ -44,11 +44,11 @@ import {
|
|
|
44
44
|
worktreePathFor
|
|
45
45
|
} from "../chunk-C6PHNSDC.js";
|
|
46
46
|
import "../chunk-3YP22YLA.js";
|
|
47
|
-
import "../chunk-4ZGRXIVA.js";
|
|
48
47
|
import {
|
|
49
48
|
defaultSecretSink,
|
|
50
49
|
redactSecretText
|
|
51
|
-
} from "../chunk-
|
|
50
|
+
} from "../chunk-AGGJK2XZ.js";
|
|
51
|
+
import "../chunk-4ZGRXIVA.js";
|
|
52
52
|
export {
|
|
53
53
|
GIT_CHECKOUT_TIMEOUT_MS,
|
|
54
54
|
GIT_TIMEOUT_MS,
|
package/dist/index.js
CHANGED
|
@@ -59,7 +59,7 @@ import {
|
|
|
59
59
|
// package.json
|
|
60
60
|
var package_default = {
|
|
61
61
|
name: "@smwb/onreel-git-mcp",
|
|
62
|
-
version: "0.
|
|
62
|
+
version: "0.5.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.
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@smwb/onreel-git-mcp\",\n \"version\": \"0.5.0\",\n \"description\": \"Библиотека модулей, выделенных из onreel: git-операции и безопасные пути, список файлов worktree, жизненный цикл worktree против порта WorktreeStore, адаптеры трекеров GitHub/GitLab/Jira/SourceCraft/локального и MCP-сервер на stdio\",\n \"keywords\": [\n \"git\",\n \"worktree\",\n \"mcp\",\n \"issue-tracker\",\n \"github\",\n \"gitlab\",\n \"jira\",\n \"sourcecraft\",\n \"onreel\",\n \"typescript\"\n ],\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=24\"\n },\n \"files\": [\n \"dist\"\n ],\n \"sideEffects\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://git.sourcecraft.dev/elfenmail/onreel-git-mcp.git\"\n },\n \"homepage\": \"https://git.sourcecraft.dev/elfenmail/onreel-git-mcp\",\n \"license\": \"MIT\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./git\": {\n \"types\": \"./dist/git/index.d.ts\",\n \"import\": \"./dist/git/index.js\",\n \"default\": \"./dist/git/index.js\"\n },\n \"./files\": {\n \"types\": \"./dist/files/index.d.ts\",\n \"import\": \"./dist/files/index.js\",\n \"default\": \"./dist/files/index.js\"\n },\n \"./worktree\": {\n \"types\": \"./dist/worktree/index.d.ts\",\n \"import\": \"./dist/worktree/index.js\",\n \"default\": \"./dist/worktree/index.js\"\n },\n \"./tracker\": {\n \"types\": \"./dist/tracker/index.d.ts\",\n \"import\": \"./dist/tracker/index.js\",\n \"default\": \"./dist/tracker/index.js\"\n },\n \"./mcp\": {\n \"types\": \"./dist/mcp/index.d.ts\",\n \"import\": \"./dist/mcp/index.js\",\n \"default\": \"./dist/mcp/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"build\": \"tsup && tsc -p tsconfig.build.json\",\n \"typecheck\": \"tsc -p tsconfig.json && tsc -p tsconfig.examples.json\",\n \"lint\": \"oxlint --type-aware\",\n \"test\": \"node --test \\\"test/**/*.test.ts\\\"\",\n \"changeset\": \"changeset\",\n \"version\": \"changeset version\",\n \"release\": \"npm run build && changeset publish\"\n },\n \"dependencies\": {\n \"zod\": \"^4.6.5\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"2.29.2\",\n \"@types/node\": \"24.19.1\",\n \"oxlint\": \"1.87.0\",\n \"oxlint-tsgolint\": \"7.0.2003\",\n \"tsup\": \"8.5.1\",\n \"typescript\": \"7.0.2\"\n }\n}\n","// Корневой подпуть пакета @smwb/onreel-git-mcp: срез контракта (константы, схемы, типы, чистые\n// функции) и версия пакета. Всё без побочных эффектов при импорте (R-001). Швы ядра\n// (SecretSink, WorktreeStore, LocalIssueStore) и модули git/files/worktree/tracker/mcp\n// экспортируют свои подпути — см. exports в package.json и README.\nimport pkg from '../package.json' with { type: 'json' };\n\nexport * from './contract/contract.const.ts';\nexport * from './contract/contract.schema.ts';\nexport * from './contract/contract.types.ts';\nexport * from './contract/contract.lib.ts';\n\n// Версия пакета — из version в package.json: статический импорт JSON, его значение tsup подставляет\n// в бандл на сборке, поэтому VERSION не расходится с релизом changesets (тот правит только version).\nexport const VERSION: string = pkg.version;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AAAA,EACR,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,OAAS;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAe;AAAA,EACf,eAAiB;AAAA,IACf,QAAU;AAAA,IACV,UAAY;AAAA,EACd;AAAA,EACA,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,UAAY;AAAA,EACZ,SAAW;AAAA,EACX,SAAW;AAAA,IACT,KAAK;AAAA,MACH,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,SAAS;AAAA,MACP,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,WAAW;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,aAAa;AAAA,MACX,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,SAAS;AAAA,MACP,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,IACA,kBAAkB;AAAA,EACpB;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,EACb;AAAA,EACA,cAAgB;AAAA,IACd,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,MAAQ;AAAA,IACR,YAAc;AAAA,EAChB;AACF;;;AC1EO,IAAM,UAAkB,gBAAI;","names":[]}
|
package/dist/mcp/index.js
CHANGED
|
@@ -2,6 +2,9 @@ import {
|
|
|
2
2
|
contractError,
|
|
3
3
|
formatVersion
|
|
4
4
|
} from "../chunk-3YP22YLA.js";
|
|
5
|
+
import {
|
|
6
|
+
redactSecretText
|
|
7
|
+
} from "../chunk-AGGJK2XZ.js";
|
|
5
8
|
import {
|
|
6
9
|
ENV_DISPATCH_ID,
|
|
7
10
|
ENV_HOST_URL,
|
|
@@ -13,9 +16,6 @@ import {
|
|
|
13
16
|
contractErrorSchema,
|
|
14
17
|
requestIdSchema
|
|
15
18
|
} from "../chunk-4ZGRXIVA.js";
|
|
16
|
-
import {
|
|
17
|
-
redactSecretText
|
|
18
|
-
} from "../chunk-L7CPE2SO.js";
|
|
19
19
|
|
|
20
20
|
// src/mcp/mcp.const.ts
|
|
21
21
|
var MCP_PROTOCOL_VERSIONS = ["2025-11-25", "2025-06-18", "2025-03-26", "2024-11-05"];
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { CiLog, CiStatusCategory } from './ci.schema.ts';
|
|
2
|
+
import type { CiAdapter, CiLogQuery, CiLogWindow } from './ci.types.ts';
|
|
3
|
+
import type { AdapterContext, TrackerDefinition } from './tracker.types.ts';
|
|
4
|
+
/** Адаптер CI трекера (D-005); трекер без раздела ci — TrackerError('unsupported', 'Трекер <title> не ведёт CI.'). */
|
|
5
|
+
export declare function ciAdapterOf(definition: TrackerDefinition, context: AdapterContext): CiAdapter;
|
|
6
|
+
/**
|
|
7
|
+
* Окно лога из запроса (D-006): maxBytes 1..CI_LOG_MAX_BYTES (по умолчанию CI_LOG_DEFAULT_BYTES), from по умолчанию tail,
|
|
8
|
+
* курсор `c:<страница>:<байт>` — в resume; иначе TrackerError('invalid_request').
|
|
9
|
+
*/
|
|
10
|
+
export declare function logWindow(query: CiLogQuery): CiLogWindow;
|
|
11
|
+
/** Курсор дочитывания с места (страница, байт в ней): `c:<page>:<offset>`. */
|
|
12
|
+
export declare function logCursor(page: number, offset: number): string;
|
|
13
|
+
/**
|
|
14
|
+
* Лог единой модели из прочитанного окна: окно выравнивается по целым строкам (lineWindow), затем cleanLogText
|
|
15
|
+
* (если не raw), хвост приватного ключа из прошлого окна и redactSecretText — всегда. nextCursor = logCursor(page, end)
|
|
16
|
+
* со сдвигом end назад на отложенный конец окна, если задание не закончилось или окно head оборвалось раньше конца
|
|
17
|
+
* тела; иначе курсора нет. Окно, которое не сдвинулось (пусто при more: потолок чтения, символ шире окна), у законченного
|
|
18
|
+
* задания курсора не даёт — тот же курсор зациклил бы дочитывание. startCut — начало окна отрезано (хвост лога): первая
|
|
19
|
+
* неполная строка отбрасывается; по умолчанию truncated && !more — окно усечено, а дальше читать нечего.
|
|
20
|
+
* end — байт за окном на странице page; на эту страницу приходятся не больше end последних байт окна.
|
|
21
|
+
*/
|
|
22
|
+
export declare function logOf(input: {
|
|
23
|
+
text: string;
|
|
24
|
+
truncated: boolean;
|
|
25
|
+
complete: boolean;
|
|
26
|
+
page: number;
|
|
27
|
+
end: number;
|
|
28
|
+
more: boolean;
|
|
29
|
+
size?: number | undefined;
|
|
30
|
+
raw: boolean;
|
|
31
|
+
startCut?: boolean | undefined;
|
|
32
|
+
}): CiLog;
|
|
33
|
+
/** Текст лога без ANSI-последовательностей (CSI, OSC), перерисовок строки через \r и маркеров section_start/section_end GitLab. */
|
|
34
|
+
export declare function cleanLogText(text: string): string;
|
|
35
|
+
/** Категория законченного состояния: success, failed, canceled, skipped. */
|
|
36
|
+
export declare function isFinished(category: CiStatusCategory): boolean;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Категория состояния прогона, задания и шага CI единой модели (D-006); своё имя трекер отдаёт в status.name. */
|
|
3
|
+
export declare const ciStatusCategorySchema: z.ZodEnum<{
|
|
4
|
+
canceled: "canceled";
|
|
5
|
+
failed: "failed";
|
|
6
|
+
queued: "queued";
|
|
7
|
+
running: "running";
|
|
8
|
+
skipped: "skipped";
|
|
9
|
+
success: "success";
|
|
10
|
+
waiting: "waiting";
|
|
11
|
+
}>;
|
|
12
|
+
/** Что запустило прогон; своё имя события трекер отдаёт в event.name. */
|
|
13
|
+
export declare const ciEventCategorySchema: z.ZodEnum<{
|
|
14
|
+
manual: "manual";
|
|
15
|
+
other: "other";
|
|
16
|
+
pull_request: "pull_request";
|
|
17
|
+
push: "push";
|
|
18
|
+
retry: "retry";
|
|
19
|
+
schedule: "schedule";
|
|
20
|
+
trigger: "trigger";
|
|
21
|
+
}>;
|
|
22
|
+
export declare const ciRunFilterSchema: z.ZodEnum<{
|
|
23
|
+
actor: "actor";
|
|
24
|
+
createdAfter: "createdAfter";
|
|
25
|
+
createdBefore: "createdBefore";
|
|
26
|
+
event: "event";
|
|
27
|
+
pullRequest: "pullRequest";
|
|
28
|
+
ref: "ref";
|
|
29
|
+
sha: "sha";
|
|
30
|
+
status: "status";
|
|
31
|
+
updatedAfter: "updatedAfter";
|
|
32
|
+
updatedBefore: "updatedBefore";
|
|
33
|
+
workflow: "workflow";
|
|
34
|
+
}>;
|
|
35
|
+
export declare const ciRunSortFieldSchema: z.ZodEnum<{
|
|
36
|
+
created: "created";
|
|
37
|
+
updated: "updated";
|
|
38
|
+
}>;
|
|
39
|
+
export declare const ciJobFilterSchema: z.ZodEnum<{
|
|
40
|
+
allAttempts: "allAttempts";
|
|
41
|
+
status: "status";
|
|
42
|
+
}>;
|
|
43
|
+
export declare const ciStatusSchema: z.ZodObject<{
|
|
44
|
+
category: z.ZodEnum<{
|
|
45
|
+
canceled: "canceled";
|
|
46
|
+
failed: "failed";
|
|
47
|
+
queued: "queued";
|
|
48
|
+
running: "running";
|
|
49
|
+
skipped: "skipped";
|
|
50
|
+
success: "success";
|
|
51
|
+
waiting: "waiting";
|
|
52
|
+
}>;
|
|
53
|
+
name: z.ZodString;
|
|
54
|
+
}, z.core.$strip>;
|
|
55
|
+
export declare const ciWorkflowSchema: z.ZodObject<{
|
|
56
|
+
key: z.ZodString;
|
|
57
|
+
name: z.ZodString;
|
|
58
|
+
path: z.ZodOptional<z.ZodString>;
|
|
59
|
+
enabled: z.ZodBoolean;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
export declare const ciRunSchema: z.ZodObject<{
|
|
62
|
+
key: z.ZodString;
|
|
63
|
+
number: z.ZodOptional<z.ZodNumber>;
|
|
64
|
+
workflows: z.ZodArray<z.ZodString>;
|
|
65
|
+
status: z.ZodObject<{
|
|
66
|
+
category: z.ZodEnum<{
|
|
67
|
+
canceled: "canceled";
|
|
68
|
+
failed: "failed";
|
|
69
|
+
queued: "queued";
|
|
70
|
+
running: "running";
|
|
71
|
+
skipped: "skipped";
|
|
72
|
+
success: "success";
|
|
73
|
+
waiting: "waiting";
|
|
74
|
+
}>;
|
|
75
|
+
name: z.ZodString;
|
|
76
|
+
}, z.core.$strip>;
|
|
77
|
+
event: z.ZodOptional<z.ZodObject<{
|
|
78
|
+
category: z.ZodEnum<{
|
|
79
|
+
manual: "manual";
|
|
80
|
+
other: "other";
|
|
81
|
+
pull_request: "pull_request";
|
|
82
|
+
push: "push";
|
|
83
|
+
retry: "retry";
|
|
84
|
+
schedule: "schedule";
|
|
85
|
+
trigger: "trigger";
|
|
86
|
+
}>;
|
|
87
|
+
name: z.ZodString;
|
|
88
|
+
}, z.core.$strip>>;
|
|
89
|
+
ref: z.ZodOptional<z.ZodString>;
|
|
90
|
+
sha: z.ZodOptional<z.ZodString>;
|
|
91
|
+
actor: z.ZodOptional<z.ZodString>;
|
|
92
|
+
pullRequest: z.ZodOptional<z.ZodString>;
|
|
93
|
+
attempt: z.ZodOptional<z.ZodNumber>;
|
|
94
|
+
errors: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
95
|
+
links: z.ZodArray<z.ZodObject<{
|
|
96
|
+
url: z.ZodString;
|
|
97
|
+
title: z.ZodOptional<z.ZodString>;
|
|
98
|
+
}, z.core.$strip>>;
|
|
99
|
+
createdAt: z.ZodOptional<z.ZodNumber>;
|
|
100
|
+
startedAt: z.ZodOptional<z.ZodNumber>;
|
|
101
|
+
finishedAt: z.ZodOptional<z.ZodNumber>;
|
|
102
|
+
updatedAt: z.ZodOptional<z.ZodNumber>;
|
|
103
|
+
}, z.core.$strip>;
|
|
104
|
+
export declare const ciJobSchema: z.ZodObject<{
|
|
105
|
+
key: z.ZodString;
|
|
106
|
+
runKey: z.ZodString;
|
|
107
|
+
name: z.ZodString;
|
|
108
|
+
stage: z.ZodOptional<z.ZodString>;
|
|
109
|
+
status: z.ZodObject<{
|
|
110
|
+
category: z.ZodEnum<{
|
|
111
|
+
canceled: "canceled";
|
|
112
|
+
failed: "failed";
|
|
113
|
+
queued: "queued";
|
|
114
|
+
running: "running";
|
|
115
|
+
skipped: "skipped";
|
|
116
|
+
success: "success";
|
|
117
|
+
waiting: "waiting";
|
|
118
|
+
}>;
|
|
119
|
+
name: z.ZodString;
|
|
120
|
+
}, z.core.$strip>;
|
|
121
|
+
steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
122
|
+
number: z.ZodNumber;
|
|
123
|
+
name: z.ZodString;
|
|
124
|
+
status: z.ZodObject<{
|
|
125
|
+
category: z.ZodEnum<{
|
|
126
|
+
canceled: "canceled";
|
|
127
|
+
failed: "failed";
|
|
128
|
+
queued: "queued";
|
|
129
|
+
running: "running";
|
|
130
|
+
skipped: "skipped";
|
|
131
|
+
success: "success";
|
|
132
|
+
waiting: "waiting";
|
|
133
|
+
}>;
|
|
134
|
+
name: z.ZodString;
|
|
135
|
+
}, z.core.$strip>;
|
|
136
|
+
}, z.core.$strip>>>;
|
|
137
|
+
attempt: z.ZodOptional<z.ZodNumber>;
|
|
138
|
+
links: z.ZodArray<z.ZodObject<{
|
|
139
|
+
url: z.ZodString;
|
|
140
|
+
title: z.ZodOptional<z.ZodString>;
|
|
141
|
+
}, z.core.$strip>>;
|
|
142
|
+
createdAt: z.ZodOptional<z.ZodNumber>;
|
|
143
|
+
startedAt: z.ZodOptional<z.ZodNumber>;
|
|
144
|
+
finishedAt: z.ZodOptional<z.ZodNumber>;
|
|
145
|
+
}, z.core.$strip>;
|
|
146
|
+
export declare const ciLogSchema: z.ZodObject<{
|
|
147
|
+
text: z.ZodString;
|
|
148
|
+
truncated: z.ZodBoolean;
|
|
149
|
+
complete: z.ZodBoolean;
|
|
150
|
+
nextCursor: z.ZodOptional<z.ZodString>;
|
|
151
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
152
|
+
}, z.core.$strip>;
|
|
153
|
+
export type CiStatusCategory = z.infer<typeof ciStatusCategorySchema>;
|
|
154
|
+
export type CiEventCategory = z.infer<typeof ciEventCategorySchema>;
|
|
155
|
+
export type CiRunFilter = z.infer<typeof ciRunFilterSchema>;
|
|
156
|
+
export type CiRunSortField = z.infer<typeof ciRunSortFieldSchema>;
|
|
157
|
+
export type CiJobFilter = z.infer<typeof ciJobFilterSchema>;
|
|
158
|
+
export type CiStatus = z.infer<typeof ciStatusSchema>;
|
|
159
|
+
export type CiWorkflow = z.infer<typeof ciWorkflowSchema>;
|
|
160
|
+
export type CiRun = z.infer<typeof ciRunSchema>;
|
|
161
|
+
export type CiJob = z.infer<typeof ciJobSchema>;
|
|
162
|
+
export type CiLog = z.infer<typeof ciLogSchema>;
|