@smwb/onreel-git-mcp 0.1.0 → 0.2.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 (69) hide show
  1. package/dist/chunk-3YP22YLA.js +50 -0
  2. package/dist/chunk-3YP22YLA.js.map +1 -0
  3. package/dist/chunk-4ZGRXIVA.js +259 -0
  4. package/dist/chunk-4ZGRXIVA.js.map +1 -0
  5. package/dist/chunk-C6PHNSDC.js +112 -0
  6. package/dist/chunk-C6PHNSDC.js.map +1 -0
  7. package/dist/chunk-GPRMI4PG.js +421 -0
  8. package/dist/chunk-GPRMI4PG.js.map +1 -0
  9. package/dist/chunk-L7CPE2SO.js +166 -0
  10. package/dist/chunk-L7CPE2SO.js.map +1 -0
  11. package/dist/contract/contract.const.d.ts +190 -0
  12. package/dist/contract/contract.lib.d.ts +22 -0
  13. package/dist/contract/contract.schema.d.ts +279 -0
  14. package/dist/contract/contract.types.d.ts +23 -0
  15. package/dist/files/files.const.d.ts +6 -0
  16. package/dist/files/files.lib.d.ts +14 -0
  17. package/dist/files/files.types.d.ts +13 -0
  18. package/dist/files/index.d.ts +3 -0
  19. package/dist/files/index.js +163 -0
  20. package/dist/files/index.js.map +1 -0
  21. package/dist/git/git.const.d.ts +4 -0
  22. package/dist/git/git.lib.d.ts +90 -0
  23. package/dist/git/git.types.d.ts +33 -0
  24. package/dist/git/index.d.ts +7 -0
  25. package/dist/git/index.js +97 -0
  26. package/dist/git/index.js.map +1 -0
  27. package/dist/git/paths.const.d.ts +5 -0
  28. package/dist/git/paths.lib.d.ts +39 -0
  29. package/dist/index.d.ts +6 -1
  30. package/dist/index.js +113 -2
  31. package/dist/index.js.map +1 -1
  32. package/dist/kernel/log.types.d.ts +5 -0
  33. package/dist/kernel/redact.lib.d.ts +25 -0
  34. package/dist/kernel/store.types.d.ts +109 -0
  35. package/dist/kernel/umask.lib.d.ts +7 -0
  36. package/dist/mcp/args.lib.d.ts +17 -0
  37. package/dist/mcp/envelope.lib.d.ts +20 -0
  38. package/dist/mcp/index.d.ts +8 -0
  39. package/dist/mcp/index.js +744 -0
  40. package/dist/mcp/index.js.map +1 -0
  41. package/dist/mcp/mcp.const.d.ts +23 -0
  42. package/dist/mcp/mcp.schema.d.ts +64 -0
  43. package/dist/mcp/mcp.types.d.ts +125 -0
  44. package/dist/mcp/principal.lib.d.ts +22 -0
  45. package/dist/mcp/server.lib.d.ts +3 -0
  46. package/dist/mcp/tools.lib.d.ts +16 -0
  47. package/dist/tracker/builtin.lib.d.ts +1 -0
  48. package/dist/tracker/github.lib.d.ts +2 -0
  49. package/dist/tracker/gitlab.lib.d.ts +2 -0
  50. package/dist/tracker/http.lib.d.ts +4 -0
  51. package/dist/tracker/index.d.ts +15 -0
  52. package/dist/tracker/index.js +840 -0
  53. package/dist/tracker/index.js.map +1 -0
  54. package/dist/tracker/jira.lib.d.ts +2 -0
  55. package/dist/tracker/local.lib.d.ts +2 -0
  56. package/dist/tracker/mapping.const.d.ts +26 -0
  57. package/dist/tracker/registry.lib.d.ts +5 -0
  58. package/dist/tracker/secrets.lib.d.ts +7 -0
  59. package/dist/tracker/sourcecraft.lib.d.ts +2 -0
  60. package/dist/tracker/tracker.const.d.ts +10 -0
  61. package/dist/tracker/tracker.lib.d.ts +21 -0
  62. package/dist/tracker/tracker.types.d.ts +77 -0
  63. package/dist/worktree/index.d.ts +4 -0
  64. package/dist/worktree/index.js +203 -0
  65. package/dist/worktree/index.js.map +1 -0
  66. package/dist/worktree/lifecycle.const.d.ts +2 -0
  67. package/dist/worktree/lifecycle.lib.d.ts +30 -0
  68. package/dist/worktree/lifecycle.types.d.ts +14 -0
  69. package/package.json +1 -1
@@ -0,0 +1,33 @@
1
+ import type { WorktreeChange, WorktreeFileSide } from '../contract/contract.types.ts';
2
+ export type GitRunOptions = {
3
+ timeoutMs?: number;
4
+ /** Коды выхода, которые для команды штатны (например, 1 — «нет такого ref»). */
5
+ okCodes?: readonly number[];
6
+ /** Дополнительные переменные окружения процесса git. */
7
+ env?: Record<string, string>;
8
+ };
9
+ export type GitRun = {
10
+ code: number;
11
+ stdout: string;
12
+ stderr: string;
13
+ };
14
+ export type CommitOutcome = {
15
+ committed: boolean;
16
+ headSha: string;
17
+ };
18
+ export type RebaseOutcome = {
19
+ kind: 'busy';
20
+ operation: string;
21
+ } | {
22
+ kind: 'dirty';
23
+ paths: string[];
24
+ } | {
25
+ kind: 'done';
26
+ conflict: boolean;
27
+ conflicts: string[];
28
+ headSha: string;
29
+ };
30
+ /** Изменённый файл отслеживаемого дерева против коммита (ревью, D-320): без неотслеживаемых. */
31
+ export type ChangedFile = Omit<WorktreeChange, 'untracked'>;
32
+ /** Одна сторона файла для ревью: размер, признак бинарного/усечённого, текст (D-320). */
33
+ export type FileSide = WorktreeFileSide;
@@ -0,0 +1,7 @@
1
+ export * from './git.const.ts';
2
+ export * from './git.types.ts';
3
+ export * from './git.lib.ts';
4
+ export * from './paths.const.ts';
5
+ export * from './paths.lib.ts';
6
+ export type { SecretSink } from '../kernel/log.types.ts';
7
+ export { defaultSecretSink, redactSecretText } from '../kernel/redact.lib.ts';
@@ -0,0 +1,97 @@
1
+ import {
2
+ GIT_CHECKOUT_TIMEOUT_MS,
3
+ GIT_TIMEOUT_MS,
4
+ GitError,
5
+ addWorktree,
6
+ branchSha,
7
+ changedFiles,
8
+ closeGitPool,
9
+ commitChanges,
10
+ currentBranch,
11
+ deleteBranch,
12
+ diffAgainst,
13
+ headOf,
14
+ isDirty,
15
+ isGitPoolClosed,
16
+ isValidBranchName,
17
+ operationInProgress,
18
+ pruneWorktrees,
19
+ readWorktreeFile,
20
+ rebaseOnto,
21
+ reopenGitPool,
22
+ repoToplevel,
23
+ resolveCommit,
24
+ runGit,
25
+ showBlob,
26
+ statusEntries,
27
+ untrackedFiles
28
+ } from "../chunk-GPRMI4PG.js";
29
+ import {
30
+ PROJECT_WORKTREE_SEGMENT,
31
+ PathEscapeError,
32
+ assertOutsideDataDir,
33
+ checkManagedPath,
34
+ checkRepoPath,
35
+ defaultBranchFor,
36
+ defaultProjectBranchFor,
37
+ isInside,
38
+ prepareWorktreeParent,
39
+ projectWorktreePathFor,
40
+ repoSlug,
41
+ safeComponent,
42
+ trashRoot,
43
+ workspacesRoot,
44
+ worktreePathFor
45
+ } from "../chunk-C6PHNSDC.js";
46
+ import "../chunk-3YP22YLA.js";
47
+ import "../chunk-4ZGRXIVA.js";
48
+ import {
49
+ defaultSecretSink,
50
+ redactSecretText
51
+ } from "../chunk-L7CPE2SO.js";
52
+ export {
53
+ GIT_CHECKOUT_TIMEOUT_MS,
54
+ GIT_TIMEOUT_MS,
55
+ GitError,
56
+ PROJECT_WORKTREE_SEGMENT,
57
+ PathEscapeError,
58
+ addWorktree,
59
+ assertOutsideDataDir,
60
+ branchSha,
61
+ changedFiles,
62
+ checkManagedPath,
63
+ checkRepoPath,
64
+ closeGitPool,
65
+ commitChanges,
66
+ currentBranch,
67
+ defaultBranchFor,
68
+ defaultProjectBranchFor,
69
+ defaultSecretSink,
70
+ deleteBranch,
71
+ diffAgainst,
72
+ headOf,
73
+ isDirty,
74
+ isGitPoolClosed,
75
+ isInside,
76
+ isValidBranchName,
77
+ operationInProgress,
78
+ prepareWorktreeParent,
79
+ projectWorktreePathFor,
80
+ pruneWorktrees,
81
+ readWorktreeFile,
82
+ rebaseOnto,
83
+ redactSecretText,
84
+ reopenGitPool,
85
+ repoSlug,
86
+ repoToplevel,
87
+ resolveCommit,
88
+ runGit,
89
+ safeComponent,
90
+ showBlob,
91
+ statusEntries,
92
+ trashRoot,
93
+ untrackedFiles,
94
+ workspacesRoot,
95
+ worktreePathFor
96
+ };
97
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Сегмент пути и ветки, под которым лежат worktree проектов без задачи (D-345). `safeComponent(id)` ему не
3
+ * равен: id начинается с буквы или цифры (`idPattern`), а `safeComponent` первый символ не меняет.
4
+ */
5
+ export declare const PROJECT_WORKTREE_SEGMENT = "_project";
@@ -0,0 +1,39 @@
1
+ /** Путь вне разрешённого корня или через симлинк: отказ `permission_denied`. */
2
+ export declare class PathEscapeError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /** candidate строго внутри root (лексически, оба пути уже нормализованы); сам root — не «внутри». */
6
+ export declare function isInside(root: string, candidate: string): boolean;
7
+ export declare function workspacesRoot(dataDir: string): string;
8
+ export declare function trashRoot(dataDir: string): string;
9
+ /** Компонента пути или ref из id: всё, кроме букв, цифр, `_` и `-`, заменяется на `-`. */
10
+ export declare function safeComponent(id: string): string;
11
+ /** Имя каталога репозитория в раскладке: базовое имя плюс хэш realpath — разные репозитории не сходятся. */
12
+ export declare function repoSlug(repoRealPath: string): string;
13
+ /** Каталог worktree: `<dataDir>/workspaces/<repo>/<run>/<task>` (§6.9). */
14
+ export declare function worktreePathFor(dataDir: string, repoRealPath: string, runId: string, taskId: string): string;
15
+ /** Каталог worktree проекта без задачи: `<dataDir>/workspaces/<repo>/_project/<name>` (D-345). */
16
+ export declare function projectWorktreePathFor(dataDir: string, repoRealPath: string, name: string): string;
17
+ /** Ветка worktree проекта по умолчанию: `onreel/_project/<name>` (D-345); n > 1 — `-2`, `-3`… при занятой. */
18
+ export declare function defaultProjectBranchFor(name: string, n?: number): string;
19
+ /** Ветка worktree по умолчанию: `onreel/<run>/<task>` (§6.9); n > 1 — следующий worktree той же Task. */
20
+ export declare function defaultBranchFor(runId: string, taskId: string, n?: number): string;
21
+ /**
22
+ * Проверяет repoPath клиента (D-077): абсолютный, существует, и ни сам путь, ни его realpath
23
+ * не лежат в каталоге данных host (там ledger, токены и worktree host): симлинк из каталога
24
+ * данных наружу тоже отказ. Возвращает realpath.
25
+ */
26
+ export declare function checkRepoPath(dataDir: string, repoPath: string): string;
27
+ /** Путь не внутри каталога данных host — ни как он записан, ни по realpath каталога. */
28
+ export declare function assertOutsideDataDir(dataDir: string, path: string): void;
29
+ /**
30
+ * Готовит родителя будущего каталога worktree: корень workspaces и промежуточные каталоги
31
+ * создаются по одному (0o700), каждый — настоящий каталог, не симлинк; realpath родителя
32
+ * обязан лежать внутри realpath корня. Сам target существовать не должен.
33
+ */
34
+ export declare function prepareWorktreeParent(dataDir: string, target: string): void;
35
+ /**
36
+ * Каталог worktree из ledger перед удалением: лексически и по realpath внутри корня workspaces,
37
+ * сам — не симлинк. Нет каталога — false (его убрали руками).
38
+ */
39
+ export declare function checkManagedPath(dataDir: string, path: string): boolean;
package/dist/index.d.ts CHANGED
@@ -1 +1,6 @@
1
- export declare const VERSION = "0.0.0";
1
+ export * from './contract/contract.const.ts';
2
+ export * from './contract/contract.schema.ts';
3
+ export * from './contract/contract.types.ts';
4
+ export * from './contract/contract.lib.ts';
5
+ /** Версия пакета; держится равной version в package.json (обновляется релизом changesets). */
6
+ export declare const VERSION = "0.1.0";
package/dist/index.js CHANGED
@@ -1,6 +1,117 @@
1
+ import {
2
+ clip,
3
+ contractError,
4
+ formatUmask,
5
+ formatVersion,
6
+ inheritSessionUmask,
7
+ parseUmask,
8
+ sessionUmask
9
+ } from "./chunk-3YP22YLA.js";
10
+ import {
11
+ CONTRACT_ERROR_MESSAGE_MAX,
12
+ CONTRACT_ERROR_NEXT_STEP_MAX,
13
+ DEFAULT_SESSION_UMASK,
14
+ ENV_DISPATCH_ID,
15
+ ENV_HOST_URL,
16
+ ENV_RUN_ID,
17
+ ENV_SESSION_UMASK,
18
+ ENV_TASK_ID,
19
+ ENV_TOKEN,
20
+ HOST_CONTRACT_VERSION,
21
+ HOST_DISCOVERY_FILE,
22
+ WORKTREE_FILES_MAX,
23
+ WORKTREE_FILES_REASONS,
24
+ contractErrorSchema,
25
+ contractVersionSchema,
26
+ entityIdSchema,
27
+ errorCatalog,
28
+ errorCodeSchema,
29
+ gitShaSchema,
30
+ issueCommentSchema,
31
+ issueKeySchema,
32
+ issueLinkSchema,
33
+ issuePrioritySchema,
34
+ issueSchema,
35
+ issueStatusCategorySchema,
36
+ projectIdSchema,
37
+ requestIdSchema,
38
+ reviewPathSchema,
39
+ taskIdSchema,
40
+ timestampSchema,
41
+ trackerDescriptorSchema,
42
+ trackerFeaturesSchema,
43
+ trackerFieldNameSchema,
44
+ trackerKindSchema,
45
+ wireErrorCodeSchema,
46
+ worktreeChangeSchema,
47
+ worktreeChangeStatusSchema,
48
+ worktreeDirPathSchema,
49
+ worktreeEntryKindSchema,
50
+ worktreeEntrySchema,
51
+ worktreeFileSideSchema,
52
+ worktreeIdSchema,
53
+ worktreeNameSchema,
54
+ worktreeSchema,
55
+ worktreeStatusEntrySchema,
56
+ worktreeStatusSchema
57
+ } from "./chunk-4ZGRXIVA.js";
58
+
1
59
  // src/index.ts
2
- var VERSION = "0.0.0";
60
+ var VERSION = "0.1.0";
3
61
  export {
4
- VERSION
62
+ CONTRACT_ERROR_MESSAGE_MAX,
63
+ CONTRACT_ERROR_NEXT_STEP_MAX,
64
+ DEFAULT_SESSION_UMASK,
65
+ ENV_DISPATCH_ID,
66
+ ENV_HOST_URL,
67
+ ENV_RUN_ID,
68
+ ENV_SESSION_UMASK,
69
+ ENV_TASK_ID,
70
+ ENV_TOKEN,
71
+ HOST_CONTRACT_VERSION,
72
+ HOST_DISCOVERY_FILE,
73
+ VERSION,
74
+ WORKTREE_FILES_MAX,
75
+ WORKTREE_FILES_REASONS,
76
+ clip,
77
+ contractError,
78
+ contractErrorSchema,
79
+ contractVersionSchema,
80
+ entityIdSchema,
81
+ errorCatalog,
82
+ errorCodeSchema,
83
+ formatUmask,
84
+ formatVersion,
85
+ gitShaSchema,
86
+ inheritSessionUmask,
87
+ issueCommentSchema,
88
+ issueKeySchema,
89
+ issueLinkSchema,
90
+ issuePrioritySchema,
91
+ issueSchema,
92
+ issueStatusCategorySchema,
93
+ parseUmask,
94
+ projectIdSchema,
95
+ requestIdSchema,
96
+ reviewPathSchema,
97
+ sessionUmask,
98
+ taskIdSchema,
99
+ timestampSchema,
100
+ trackerDescriptorSchema,
101
+ trackerFeaturesSchema,
102
+ trackerFieldNameSchema,
103
+ trackerKindSchema,
104
+ wireErrorCodeSchema,
105
+ worktreeChangeSchema,
106
+ worktreeChangeStatusSchema,
107
+ worktreeDirPathSchema,
108
+ worktreeEntryKindSchema,
109
+ worktreeEntrySchema,
110
+ worktreeFileSideSchema,
111
+ worktreeIdSchema,
112
+ worktreeNameSchema,
113
+ worktreeSchema,
114
+ worktreeStatusEntrySchema,
115
+ worktreeStatusSchema
5
116
  };
6
117
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Версия пакета — единственный публичный символ корневого подпути на этапе каркаса.\n// Полный публичный API (contract/kernel) появится в следующих частях выделения.\nexport const VERSION = \"0.0.0\";\n"],"mappings":";AAEO,IAAM,UAAU;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Корневой подпуть пакета @smwb/onreel-git-mcp: срез контракта (константы, схемы, типы, чистые\n// функции) и версия пакета. Всё без побочных эффектов при импорте (R-001). Швы ядра\n// (SecretSink, WorktreeStore, LocalIssueStore) и модули git/files/worktree/tracker/mcp\n// экспортируют свои подпути — см. exports в package.json и README.\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 (обновляется релизом changesets). */\nexport const VERSION = '0.1.0';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUO,IAAM,UAAU;","names":[]}
@@ -0,0 +1,5 @@
1
+ /** Приёмник известных секретов: значение маскируется в текстах ошибок и журналов. */
2
+ export type SecretSink = {
3
+ /** Регистрирует значение секрета; значение короче 8 символов реализация игнорирует. */
4
+ register(secret: string): void;
5
+ };
@@ -0,0 +1,25 @@
1
+ import type { SecretSink } from './log.types.ts';
2
+ export declare const REDACTED = "***";
3
+ /** Имя ключа секретное, если после приведения к snake_case оно содержит одно из слов целиком. */
4
+ export declare const SECRET_KEY_PATTERN: RegExp;
5
+ /** Redactor журнала: маскирует свободный текст и структурные значения, принимает известные секреты. */
6
+ export type Redactor = {
7
+ /** Маскирует свободный текст: известные значения и шаблоны R1–R8. */
8
+ redactText(text: string): string;
9
+ /** Глубокая копия: ключи по isSecretKey → '***' (любое значение, кроме null и boolean); строки и сами имена ключей → redactText. */
10
+ redactValue(value: unknown): unknown;
11
+ /** Регистрирует известное значение секрета; короче 8 символов — игнорируется. */
12
+ addKnownSecret(value: string): void;
13
+ };
14
+ /** camelCase → snake, '-' и '.' → '_', нижний регистр, затем SECRET_KEY_PATTERN и окончания слитных имён. */
15
+ export declare function isSecretKey(key: string): boolean;
16
+ export declare function createRedactor(options?: {
17
+ knownSecrets?: readonly string[];
18
+ }): Redactor;
19
+ /** Свободный текст через redactor ядра: известные секреты (defaultSecretSink) и шаблоны R1–R8. */
20
+ export declare function redactSecretText(text: string): string;
21
+ /**
22
+ * Эталонный SecretSink библиотеки: регистрирует известные секреты в redactor ядра, которым
23
+ * маскирует redactSecretText. Потребитель со своим журналом может подменить шов своей реализацией.
24
+ */
25
+ export declare const defaultSecretSink: SecretSink;
@@ -0,0 +1,109 @@
1
+ import type { IssuePriority, IssueStatusCategory, Worktree, WorktreeStatus } from '../contract/contract.types.ts';
2
+ /** Контекст записи: кто и когда; без них реализация берёт текущее время и не пишет actor. */
3
+ export type WorktreeWriteContext = {
4
+ actor?: string | undefined;
5
+ ts?: number | undefined;
6
+ };
7
+ export type WorktreeCleanupFlags = {
8
+ /** Очистка выбрасывает незакоммиченные изменения: так решил вызывающий (worktree.remove force). */
9
+ discardChanges: boolean;
10
+ /** Ветку создал host: пустую (tip = база) очистка удаляет; чужую — никогда (onreel D-088). */
11
+ ownsBranch: boolean;
12
+ };
13
+ export type WorktreeCleanupInput = WorktreeWriteContext & {
14
+ /** Выбросить незакоммиченные изменения: решение вызывающего, запоминается до конца очистки. */
15
+ discardChanges?: boolean | undefined;
16
+ /** Ветка не host'а (существовала до создания): очистка её не удаляет. */
17
+ foreignBranch?: boolean | undefined;
18
+ /** Доказательство перехода: вывод git или пояснение host. */
19
+ evidence?: string | undefined;
20
+ };
21
+ /**
22
+ * Записи Worktree внутри открытой транзакции: последовательность вызовов применяется целиком
23
+ * или откатывается (единственный способ писать — через WorktreeStore.inTransaction).
24
+ */
25
+ export type WorktreeTx = {
26
+ /** Вторая фаза создания: git создал worktree — preparing → ready с HEAD. */
27
+ markWorktreeReady(id: string, headSha: string, context?: WorktreeWriteContext): void;
28
+ /** Переводит Worktree в failed с причиной: из preparing или cleaning (onreel D-050). */
29
+ markWorktreeFailed(id: string, reason: string, context?: WorktreeWriteContext): void;
30
+ /** Первая фаза очистки: ready или failed → cleaning; запоминает discardChanges/foreignBranch. */
31
+ requestWorktreeCleanup(id: string, input?: WorktreeCleanupInput): void;
32
+ /** Финал очистки: cleaning → cleaned с моментом очистки. */
33
+ completeWorktreeCleanup(id: string, context?: WorktreeWriteContext): void;
34
+ };
35
+ /** Порт состояния Worktree: чтения — на самом порте, записи — только внутри inTransaction. */
36
+ export type WorktreeStore = {
37
+ /**
38
+ * Единица работы (onreel inImmediateTransaction): fn выполняется в одной транзакции хранилища;
39
+ * исключение из fn откатывает все её записи. Вложенность и асинхронные fn не поддерживаются.
40
+ */
41
+ inTransaction<T>(fn: (tx: WorktreeTx) => T): T;
42
+ /** Запись Worktree по id; нет — undefined. */
43
+ getWorktree(id: string): Worktree | undefined;
44
+ /** Флаги очистки worktree; нет записи — оба флага false. */
45
+ worktreeCleanupFlags(id: string): WorktreeCleanupFlags;
46
+ /** Все Worktree в этих состояниях, порядок создания — для reconciler. */
47
+ worktreesInStatus(statuses: readonly WorktreeStatus[]): Worktree[];
48
+ /** Ready worktree терминальных задач без живых сессий — их чистит reconciler. */
49
+ readyWorktreesOfSettledTasks(): Worktree[];
50
+ };
51
+ /** Пагинация списков: всё скоупится и листается страницами, без неограниченных выборок. */
52
+ export type PageInput = {
53
+ limit?: number | undefined;
54
+ cursor?: string | undefined;
55
+ };
56
+ export type Page<T> = {
57
+ items: T[];
58
+ nextCursor?: string | undefined;
59
+ };
60
+ export type NewLocalIssue = {
61
+ title: string;
62
+ description?: string | undefined;
63
+ priority?: IssuePriority | undefined;
64
+ labels?: readonly string[] | undefined;
65
+ assignee?: string | undefined;
66
+ };
67
+ export type LocalIssuePatch = {
68
+ title?: string | undefined;
69
+ description?: string | undefined;
70
+ status?: IssueStatusCategory | undefined;
71
+ priority?: IssuePriority | undefined;
72
+ labels?: readonly string[] | undefined;
73
+ /** null снимает исполнителя. */
74
+ assignee?: string | null | undefined;
75
+ };
76
+ export type LocalIssueRow = {
77
+ number: number;
78
+ title: string;
79
+ description?: string | undefined;
80
+ status: IssueStatusCategory;
81
+ priority?: IssuePriority | undefined;
82
+ labels: string[];
83
+ assignee?: string | undefined;
84
+ createdAt: number;
85
+ updatedAt: number;
86
+ };
87
+ export type LocalCommentRow = {
88
+ id: number;
89
+ author?: string | undefined;
90
+ body: string;
91
+ createdAt: number;
92
+ };
93
+ export type ListLocalIssuesInput = PageInput & {
94
+ status?: readonly IssueStatusCategory[] | undefined;
95
+ };
96
+ /**
97
+ * Порт локального трекера: задачи проекта в хранилище потребителя, без внешних сервисов.
98
+ * Номер задачи выдаёт хранилище (монотонный в проекте); ts — для детерминированных тестов,
99
+ * по умолчанию текущее время.
100
+ */
101
+ export type LocalIssueStore = {
102
+ createLocalIssue(projectId: string, input: NewLocalIssue, ts?: number): LocalIssueRow;
103
+ getLocalIssue(projectId: string, number: number): LocalIssueRow | undefined;
104
+ listLocalIssues(projectId: string, input?: ListLocalIssuesInput): Page<LocalIssueRow>;
105
+ /** Нет задачи — undefined. */
106
+ updateLocalIssue(projectId: string, number: number, patch: LocalIssuePatch, ts?: number): LocalIssueRow | undefined;
107
+ addLocalComment(projectId: string, number: number, body: string, author?: string, ts?: number): LocalCommentRow;
108
+ listLocalComments(projectId: string, number: number, input?: PageInput): Page<LocalCommentRow>;
109
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Выполняет action под umask mask и возвращает прежний umask, даже если action бросил.
3
+ * Только для синхронных действий: асинхронная функция вернула бы управление до своего завершения,
4
+ * и umask восстановился бы раньше, чем отработал её код. В worker-потоках process.umask(mask)
5
+ * бросает ERR_WORKER_UNSUPPORTED_OPERATION: ptyd и host запускают процессы из главного потока.
6
+ */
7
+ export declare function withUmask<T>(mask: number, action: () => T): T;
@@ -0,0 +1,17 @@
1
+ import type { CommandSpec } from './mcp.types.ts';
2
+ /** Длительность `<n>ms|s|m|h`, голое число — миллисекунды; неверная запись — undefined. */
3
+ export declare function parseDuration(text: string): number | undefined;
4
+ /**
5
+ * Флаги, без которых вызов не пройдёт проверку обязательных: required, и поле флага не заполнит ни env, ни default
6
+ * (его или другого флага того же поля), ни другой флаг того же поля, заданный явно. Это обязательные свойства
7
+ * входной схемы инструмента MCP.
8
+ */
9
+ export declare function requiredFlagNames(spec: CommandSpec, env: NodeJS.ProcessEnv): string[];
10
+ /**
11
+ * Аргументы вызова инструмента MCP (объект JSON) → значения флагов команды: тот же разбор, шаблоны, env,
12
+ * default, конфликт полей и проверка обязательных, что у argv. Ошибка — invalid_request (origin local).
13
+ */
14
+ export declare function resolveJsonArguments(spec: CommandSpec, input: unknown, env: NodeJS.ProcessEnv, cwd: string): {
15
+ values: Readonly<Record<string, unknown>>;
16
+ requestId?: string;
17
+ };
@@ -0,0 +1,20 @@
1
+ import type { ContractError } from '../contract/contract.types.ts';
2
+ import type { CliOutput } from './mcp.schema.ts';
3
+ import type { CommandFailure, CommandOutcome } from './mcp.types.ts';
4
+ /** Ошибка вызова команды: контрактная ошибка, происхождение и requestId уже отправленного запроса. */
5
+ export declare class CommandError extends Error implements CommandFailure {
6
+ readonly error: ContractError;
7
+ readonly origin: 'local' | 'host';
8
+ readonly requestId: string | null;
9
+ constructor(error: ContractError, origin: 'local' | 'host', requestId?: string | null, options?: ErrorOptions);
10
+ }
11
+ /** Ошибка вызова: команда, флаг или значение; запрос не отправлен. */
12
+ export declare function usageError(message: string, nextSteps: [string, ...string[]], data?: Record<string, unknown>): CommandError;
13
+ /** Неожиданный сбой сервера; известная ошибка исполнителя проходит без изменений. */
14
+ export declare function internalError(cause: unknown): CommandError;
15
+ /** Прерывание SIGINT или отмена вызова во время ожидания; requestId — уже отправленного запроса, если он был. */
16
+ export declare function interruptedError(cause: unknown, requestId?: string | null): CommandError;
17
+ /** Конверт успеха `--json`: {ok: true, requestId, duplicate, result}. */
18
+ export declare function successEnvelope(outcome: CommandOutcome): CliOutput;
19
+ /** Конверт отказа `--json`: {ok: false, requestId, error}. */
20
+ export declare function failureEnvelope(error: CommandFailure): CliOutput;
@@ -0,0 +1,8 @@
1
+ export * from './mcp.const.ts';
2
+ export * from './mcp.schema.ts';
3
+ export * from './mcp.types.ts';
4
+ export * from './args.lib.ts';
5
+ export * from './envelope.lib.ts';
6
+ export * from './principal.lib.ts';
7
+ export * from './server.lib.ts';
8
+ export * from './tools.lib.ts';