@smwb/onreel-git-mcp 0.8.0 → 0.9.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 +24 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tracker/http.lib.d.ts +1 -1
- package/dist/tracker/index.js +202 -109
- package/dist/tracker/index.js.map +1 -1
- package/dist/tracker/tracker.const.d.ts +2 -0
- package/dist/tracker/tracker.types.d.ts +20 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -227,8 +227,8 @@ import {
|
|
|
227
227
|
registerBuiltinTrackers();
|
|
228
228
|
console.log(findTracker('github')?.descriptor.title); // 'GitHub'; реестр пуст без этого вызова
|
|
229
229
|
|
|
230
|
-
|
|
231
|
-
|
|
230
|
+
// Обёртка передаёт init целиком: redirect: 'manual' от библиотеки должен дойти до fetch (раздел «Безопасность»).
|
|
231
|
+
const fetch: TrackerFetch = (input, init) => globalThis.fetch(input, init);
|
|
232
232
|
|
|
233
233
|
const context: AdapterContext = {
|
|
234
234
|
projectId: 'p1',
|
|
@@ -262,6 +262,12 @@ try {
|
|
|
262
262
|
429 и 403, который выглядит лимитом частоты (`x-ratelimit-remaining: 0` или `retry-after`) — `rate_limited`
|
|
263
263
|
(подробнее — в подразделе ниже).
|
|
264
264
|
|
|
265
|
+
Origin API подключения отдаёт необязательная функция определения `origin(connection)`: у `sourcecraftTracker()`,
|
|
266
|
+
`githubTracker()`, `gitlabTracker()` и `jiraTracker()` она есть, у `localTracker()` — нет (сети и токена у него
|
|
267
|
+
нет). `requestJson` и `requestText` принимают `origin` в запросе и сами проходят редиректы, не больше
|
|
268
|
+
`TRACKER_REDIRECT_MAX` (5), поэтому обёртка `fetch` потребителя передаёт `init.redirect` дальше; подробнее — в
|
|
269
|
+
разделе «Безопасность».
|
|
270
|
+
|
|
265
271
|
### Фильтры, сортировка и страницы
|
|
266
272
|
|
|
267
273
|
`IssueQuery` — `PageQuery` плюс необязательные фильтры (D-004): `status` (категории статуса), `labels`
|
|
@@ -705,6 +711,22 @@ console.log(manifest.name, manifest.version);
|
|
|
705
711
|
`rename`, одиночная запись сериализуется очередью, чтобы два подключения не затерли друг друга. `deleteTrackerToken`
|
|
706
712
|
и пустая строка убирают значение. Наружу из хранилища выходит только признак «токен есть» (`hasTrackerToken`),
|
|
707
713
|
а при чтении и записи значение регистрируется в приёмнике секретов.
|
|
714
|
+
- **Токен — только своему origin.** `origin(connection)` в `TrackerDefinition` — origin API, куда адаптер (и его
|
|
715
|
+
разделы `pulls` и `ci`) ходит с токеном: `https://api.github.com`, `https://gitlab.com`,
|
|
716
|
+
`https://api.sourcecraft.tech` по умолчанию, иначе origin `url` подключения; у Jira `url` обязателен. Потребитель
|
|
717
|
+
привязывает к нему введённый токен: после правки `url` на другой origin токен спрашивают заново. Неверное
|
|
718
|
+
подключение — `TrackerError('invalid_request')`, как у `create`. Встроенные адаптеры передают этот origin в
|
|
719
|
+
`requestJson` и `requestText` (поле `origin` у `JsonRequest` и `TextRequest`; нет — origin самого адреса): адрес
|
|
720
|
+
вне него — `invalid_request` до сети. Редиректы (301, 302, 303, 307, 308 с `location`) проходит библиотека, а не
|
|
721
|
+
`fetch` контекста: тот получает `redirect: 'manual'`, поэтому обёртка потребителя передаёт `redirect` в свой `fetch`.
|
|
722
|
+
Ответ, за которым `fetch` пошёл сам (`redirected`, адрес ответа на другом origin или `opaqueredirect`), —
|
|
723
|
+
`failed` с подсказкой про `init.redirect`, а не данные: запрос туда уже ушёл, но потеря `redirect` в обёртке
|
|
724
|
+
видна сразу, а не утечкой токена.
|
|
725
|
+
Метод меняется как в спецификации fetch (303 и 301/302 после POST — GET без тела). На чужой origin — и на всё
|
|
726
|
+
после него, даже обратно — уходит только GET и только с `accept`: без `Authorization`, `private-token` и других
|
|
727
|
+
заголовков запроса; иной метод — `failed` без перехода. Так 302 GitHub на подписанный адрес лога не уносит
|
|
728
|
+
токен, какой бы `fetch` ни пришёл в контексте. Больше `TRACKER_REDIRECT_MAX` переходов подряд и редирект не на
|
|
729
|
+
http/https — `failed`.
|
|
708
730
|
- **Маскирование секретов.** `redactSecretText` и `SecretSink` (по умолчанию `defaultSecretSink`) — один redactor
|
|
709
731
|
на библиотеку: его применяют `GitError` (D-272), `requestJson` (тексты отказов трекера) и внутренний отказ
|
|
710
732
|
`serveMcp`. Свой журнал потребителя подключают приёмником `SecretSink`; известные значения добавляют до
|
package/dist/index.js
CHANGED
|
@@ -59,7 +59,7 @@ import {
|
|
|
59
59
|
// package.json
|
|
60
60
|
var package_default = {
|
|
61
61
|
name: "@smwb/onreel-git-mcp",
|
|
62
|
-
version: "0.
|
|
62
|
+
version: "0.9.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.9.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":[]}
|
|
@@ -5,7 +5,7 @@ export declare function requestJson(url: string, request: JsonRequest): Promise<
|
|
|
5
5
|
* поток отменяется, как только окно набрано; tail — последние keep.bytes в кольцевом буфере. Чтение обрывается
|
|
6
6
|
* на readMax байт тела. Границы окна сдвигаются к целым символам UTF-8: начало — вперёд, конец — назад (и у тела,
|
|
7
7
|
* оборванного посреди символа). Отказ — как у requestJson: missing, rate_limited, failed с телом без секретов.
|
|
8
|
-
*
|
|
8
|
+
* Origin и редиректы — как у requestJson: 302 GitHub на подписанный адрес лога уходит GET без Authorization.
|
|
9
9
|
*/
|
|
10
10
|
export declare function requestText(url: string, request: TextRequest): Promise<TextResponse>;
|
|
11
11
|
/** Базовый адрес без хвостовых слэшей; не http и не https — отказ подключения. */
|