@smwb/onreel-git-mcp 0.1.0 → 0.2.1
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 +408 -0
- package/dist/chunk-3YP22YLA.js +50 -0
- package/dist/chunk-3YP22YLA.js.map +1 -0
- package/dist/chunk-4ZGRXIVA.js +259 -0
- package/dist/chunk-4ZGRXIVA.js.map +1 -0
- package/dist/chunk-C6PHNSDC.js +112 -0
- package/dist/chunk-C6PHNSDC.js.map +1 -0
- package/dist/chunk-GPRMI4PG.js +421 -0
- package/dist/chunk-GPRMI4PG.js.map +1 -0
- package/dist/chunk-L7CPE2SO.js +166 -0
- package/dist/chunk-L7CPE2SO.js.map +1 -0
- package/dist/contract/contract.const.d.ts +190 -0
- package/dist/contract/contract.lib.d.ts +22 -0
- package/dist/contract/contract.schema.d.ts +279 -0
- package/dist/contract/contract.types.d.ts +23 -0
- package/dist/files/files.const.d.ts +6 -0
- package/dist/files/files.lib.d.ts +14 -0
- package/dist/files/files.types.d.ts +13 -0
- package/dist/files/index.d.ts +3 -0
- package/dist/files/index.js +163 -0
- package/dist/files/index.js.map +1 -0
- package/dist/git/git.const.d.ts +4 -0
- package/dist/git/git.lib.d.ts +90 -0
- package/dist/git/git.types.d.ts +33 -0
- package/dist/git/index.d.ts +7 -0
- package/dist/git/index.js +97 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/paths.const.d.ts +5 -0
- package/dist/git/paths.lib.d.ts +39 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.js +203 -2
- package/dist/index.js.map +1 -1
- package/dist/kernel/log.types.d.ts +5 -0
- package/dist/kernel/redact.lib.d.ts +25 -0
- package/dist/kernel/store.types.d.ts +109 -0
- package/dist/kernel/umask.lib.d.ts +7 -0
- package/dist/mcp/args.lib.d.ts +17 -0
- package/dist/mcp/envelope.lib.d.ts +20 -0
- package/dist/mcp/index.d.ts +8 -0
- package/dist/mcp/index.js +744 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcp.const.d.ts +23 -0
- package/dist/mcp/mcp.schema.d.ts +64 -0
- package/dist/mcp/mcp.types.d.ts +125 -0
- package/dist/mcp/principal.lib.d.ts +22 -0
- package/dist/mcp/server.lib.d.ts +3 -0
- package/dist/mcp/tools.lib.d.ts +16 -0
- package/dist/tracker/builtin.lib.d.ts +1 -0
- package/dist/tracker/github.lib.d.ts +2 -0
- package/dist/tracker/gitlab.lib.d.ts +2 -0
- package/dist/tracker/http.lib.d.ts +4 -0
- package/dist/tracker/index.d.ts +15 -0
- package/dist/tracker/index.js +840 -0
- package/dist/tracker/index.js.map +1 -0
- package/dist/tracker/jira.lib.d.ts +2 -0
- package/dist/tracker/local.lib.d.ts +2 -0
- package/dist/tracker/mapping.const.d.ts +26 -0
- package/dist/tracker/registry.lib.d.ts +5 -0
- package/dist/tracker/secrets.lib.d.ts +7 -0
- package/dist/tracker/sourcecraft.lib.d.ts +2 -0
- package/dist/tracker/tracker.const.d.ts +10 -0
- package/dist/tracker/tracker.lib.d.ts +21 -0
- package/dist/tracker/tracker.types.d.ts +77 -0
- package/dist/worktree/index.d.ts +4 -0
- package/dist/worktree/index.js +203 -0
- package/dist/worktree/index.js.map +1 -0
- package/dist/worktree/lifecycle.const.d.ts +2 -0
- package/dist/worktree/lifecycle.lib.d.ts +30 -0
- package/dist/worktree/lifecycle.types.d.ts +14 -0
- package/package.json +15 -3
|
@@ -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
package/dist/index.js
CHANGED
|
@@ -1,6 +1,207 @@
|
|
|
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
|
+
|
|
59
|
+
// package.json
|
|
60
|
+
var package_default = {
|
|
61
|
+
name: "@smwb/onreel-git-mcp",
|
|
62
|
+
version: "0.2.1",
|
|
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
|
+
keywords: [
|
|
65
|
+
"git",
|
|
66
|
+
"worktree",
|
|
67
|
+
"mcp",
|
|
68
|
+
"issue-tracker",
|
|
69
|
+
"github",
|
|
70
|
+
"gitlab",
|
|
71
|
+
"jira",
|
|
72
|
+
"sourcecraft",
|
|
73
|
+
"onreel",
|
|
74
|
+
"typescript"
|
|
75
|
+
],
|
|
76
|
+
type: "module",
|
|
77
|
+
engines: {
|
|
78
|
+
node: ">=24"
|
|
79
|
+
},
|
|
80
|
+
files: [
|
|
81
|
+
"dist"
|
|
82
|
+
],
|
|
83
|
+
sideEffects: false,
|
|
84
|
+
publishConfig: {
|
|
85
|
+
access: "public",
|
|
86
|
+
registry: "https://registry.npmjs.org/"
|
|
87
|
+
},
|
|
88
|
+
repository: {
|
|
89
|
+
type: "git",
|
|
90
|
+
url: "git+https://git.sourcecraft.dev/elfenmail/onreel-git-mcp.git"
|
|
91
|
+
},
|
|
92
|
+
homepage: "https://git.sourcecraft.dev/elfenmail/onreel-git-mcp",
|
|
93
|
+
license: "MIT",
|
|
94
|
+
exports: {
|
|
95
|
+
".": {
|
|
96
|
+
types: "./dist/index.d.ts",
|
|
97
|
+
import: "./dist/index.js",
|
|
98
|
+
default: "./dist/index.js"
|
|
99
|
+
},
|
|
100
|
+
"./git": {
|
|
101
|
+
types: "./dist/git/index.d.ts",
|
|
102
|
+
import: "./dist/git/index.js",
|
|
103
|
+
default: "./dist/git/index.js"
|
|
104
|
+
},
|
|
105
|
+
"./files": {
|
|
106
|
+
types: "./dist/files/index.d.ts",
|
|
107
|
+
import: "./dist/files/index.js",
|
|
108
|
+
default: "./dist/files/index.js"
|
|
109
|
+
},
|
|
110
|
+
"./worktree": {
|
|
111
|
+
types: "./dist/worktree/index.d.ts",
|
|
112
|
+
import: "./dist/worktree/index.js",
|
|
113
|
+
default: "./dist/worktree/index.js"
|
|
114
|
+
},
|
|
115
|
+
"./tracker": {
|
|
116
|
+
types: "./dist/tracker/index.d.ts",
|
|
117
|
+
import: "./dist/tracker/index.js",
|
|
118
|
+
default: "./dist/tracker/index.js"
|
|
119
|
+
},
|
|
120
|
+
"./mcp": {
|
|
121
|
+
types: "./dist/mcp/index.d.ts",
|
|
122
|
+
import: "./dist/mcp/index.js",
|
|
123
|
+
default: "./dist/mcp/index.js"
|
|
124
|
+
},
|
|
125
|
+
"./package.json": "./package.json"
|
|
126
|
+
},
|
|
127
|
+
scripts: {
|
|
128
|
+
build: "tsup && tsc -p tsconfig.build.json",
|
|
129
|
+
typecheck: "tsc -p tsconfig.json && tsc -p tsconfig.examples.json",
|
|
130
|
+
lint: "oxlint --type-aware",
|
|
131
|
+
test: 'node --test "test/**/*.test.ts"',
|
|
132
|
+
changeset: "changeset",
|
|
133
|
+
version: "changeset version",
|
|
134
|
+
release: "npm run build && changeset publish"
|
|
135
|
+
},
|
|
136
|
+
dependencies: {
|
|
137
|
+
zod: "^4.6.5"
|
|
138
|
+
},
|
|
139
|
+
devDependencies: {
|
|
140
|
+
"@changesets/cli": "2.29.2",
|
|
141
|
+
"@types/node": "24.19.1",
|
|
142
|
+
oxlint: "1.87.0",
|
|
143
|
+
"oxlint-tsgolint": "7.0.2003",
|
|
144
|
+
tsup: "8.5.1",
|
|
145
|
+
typescript: "7.0.2"
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
|
|
1
149
|
// src/index.ts
|
|
2
|
-
var VERSION =
|
|
150
|
+
var VERSION = package_default.version;
|
|
3
151
|
export {
|
|
4
|
-
|
|
152
|
+
CONTRACT_ERROR_MESSAGE_MAX,
|
|
153
|
+
CONTRACT_ERROR_NEXT_STEP_MAX,
|
|
154
|
+
DEFAULT_SESSION_UMASK,
|
|
155
|
+
ENV_DISPATCH_ID,
|
|
156
|
+
ENV_HOST_URL,
|
|
157
|
+
ENV_RUN_ID,
|
|
158
|
+
ENV_SESSION_UMASK,
|
|
159
|
+
ENV_TASK_ID,
|
|
160
|
+
ENV_TOKEN,
|
|
161
|
+
HOST_CONTRACT_VERSION,
|
|
162
|
+
HOST_DISCOVERY_FILE,
|
|
163
|
+
VERSION,
|
|
164
|
+
WORKTREE_FILES_MAX,
|
|
165
|
+
WORKTREE_FILES_REASONS,
|
|
166
|
+
clip,
|
|
167
|
+
contractError,
|
|
168
|
+
contractErrorSchema,
|
|
169
|
+
contractVersionSchema,
|
|
170
|
+
entityIdSchema,
|
|
171
|
+
errorCatalog,
|
|
172
|
+
errorCodeSchema,
|
|
173
|
+
formatUmask,
|
|
174
|
+
formatVersion,
|
|
175
|
+
gitShaSchema,
|
|
176
|
+
inheritSessionUmask,
|
|
177
|
+
issueCommentSchema,
|
|
178
|
+
issueKeySchema,
|
|
179
|
+
issueLinkSchema,
|
|
180
|
+
issuePrioritySchema,
|
|
181
|
+
issueSchema,
|
|
182
|
+
issueStatusCategorySchema,
|
|
183
|
+
parseUmask,
|
|
184
|
+
projectIdSchema,
|
|
185
|
+
requestIdSchema,
|
|
186
|
+
reviewPathSchema,
|
|
187
|
+
sessionUmask,
|
|
188
|
+
taskIdSchema,
|
|
189
|
+
timestampSchema,
|
|
190
|
+
trackerDescriptorSchema,
|
|
191
|
+
trackerFeaturesSchema,
|
|
192
|
+
trackerFieldNameSchema,
|
|
193
|
+
trackerKindSchema,
|
|
194
|
+
wireErrorCodeSchema,
|
|
195
|
+
worktreeChangeSchema,
|
|
196
|
+
worktreeChangeStatusSchema,
|
|
197
|
+
worktreeDirPathSchema,
|
|
198
|
+
worktreeEntryKindSchema,
|
|
199
|
+
worktreeEntrySchema,
|
|
200
|
+
worktreeFileSideSchema,
|
|
201
|
+
worktreeIdSchema,
|
|
202
|
+
worktreeNameSchema,
|
|
203
|
+
worktreeSchema,
|
|
204
|
+
worktreeStatusEntrySchema,
|
|
205
|
+
worktreeStatusSchema
|
|
5
206
|
};
|
|
6
207
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@smwb/onreel-git-mcp\",\n \"version\": \"0.2.1\",\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":[]}
|
|
@@ -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';
|