svn-agent-mcp 1.0.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 (165) hide show
  1. package/.editorconfig +12 -0
  2. package/.gitattributes +7 -0
  3. package/.github/workflows/ci.yml +39 -0
  4. package/.svn-mcp-policy.json +9 -0
  5. package/CHANGELOG.md +248 -0
  6. package/CONTRIBUTING.md +49 -0
  7. package/LICENSE +201 -0
  8. package/README.md +143 -0
  9. package/SECURITY.md +21 -0
  10. package/THIRD_PARTY_CHECKSUMS.txt +52 -0
  11. package/THIRD_PARTY_NOTICES.md +46 -0
  12. package/bin/SlikSvn-DB44-20-x64.dll +0 -0
  13. package/bin/SlikSvn-libapr-1.dll +0 -0
  14. package/bin/SlikSvn-libaprutil-1.dll +0 -0
  15. package/bin/SlikSvn-libcrypto-3-x64.dll +0 -0
  16. package/bin/SlikSvn-libintl.dll +0 -0
  17. package/bin/SlikSvn-libsasl21.dll +0 -0
  18. package/bin/SlikSvn-libssl-3-x64.dll +0 -0
  19. package/bin/SlikSvn-libsvn_client-1.dll +0 -0
  20. package/bin/SlikSvn-libsvn_delta-1.dll +0 -0
  21. package/bin/SlikSvn-libsvn_diff-1.dll +0 -0
  22. package/bin/SlikSvn-libsvn_fs-1.dll +0 -0
  23. package/bin/SlikSvn-libsvn_fs_base-1.dll +0 -0
  24. package/bin/SlikSvn-libsvn_fs_fs-1.dll +0 -0
  25. package/bin/SlikSvn-libsvn_fs_util-1.dll +0 -0
  26. package/bin/SlikSvn-libsvn_fs_x-1.dll +0 -0
  27. package/bin/SlikSvn-libsvn_ra-1.dll +0 -0
  28. package/bin/SlikSvn-libsvn_repos-1.dll +0 -0
  29. package/bin/SlikSvn-libsvn_subr-1.dll +0 -0
  30. package/bin/SlikSvn-libsvn_wc-1.dll +0 -0
  31. package/bin/System64/concrt140.dll +0 -0
  32. package/bin/System64/msvcp140.dll +0 -0
  33. package/bin/System64/msvcp140_1.dll +0 -0
  34. package/bin/System64/msvcp140_2.dll +0 -0
  35. package/bin/System64/msvcp140_atomic_wait.dll +0 -0
  36. package/bin/System64/msvcp140_codecvt_ids.dll +0 -0
  37. package/bin/System64/vccorlib140.dll +0 -0
  38. package/bin/System64/vcruntime140.dll +0 -0
  39. package/bin/System64/vcruntime140_1.dll +0 -0
  40. package/bin/dos2unix.exe +0 -0
  41. package/bin/engines/capi.dll +0 -0
  42. package/bin/libsvnjavahl-1.dll +0 -0
  43. package/bin/mac2unix.exe +0 -0
  44. package/bin/svn-populate-node-origins-index.exe +0 -0
  45. package/bin/svn.exe +0 -0
  46. package/bin/svnadmin.exe +0 -0
  47. package/bin/svnauthz-validate.exe +0 -0
  48. package/bin/svnauthz.exe +0 -0
  49. package/bin/svnbench.exe +0 -0
  50. package/bin/svndumpfilter.exe +0 -0
  51. package/bin/svnfsfs.exe +0 -0
  52. package/bin/svnlook.exe +0 -0
  53. package/bin/svnmucc.exe +0 -0
  54. package/bin/svnrdump.exe +0 -0
  55. package/bin/svnserve.exe +0 -0
  56. package/bin/svnsync.exe +0 -0
  57. package/bin/svnversion.exe +0 -0
  58. package/bin/unix2dos.exe +0 -0
  59. package/bin/unix2mac.exe +0 -0
  60. package/dist/envelope.d.ts +39 -0
  61. package/dist/envelope.d.ts.map +1 -0
  62. package/dist/envelope.js +137 -0
  63. package/dist/envelope.js.map +1 -0
  64. package/dist/eol.d.ts +15 -0
  65. package/dist/eol.d.ts.map +1 -0
  66. package/dist/eol.js +119 -0
  67. package/dist/eol.js.map +1 -0
  68. package/dist/guards.d.ts +26 -0
  69. package/dist/guards.d.ts.map +1 -0
  70. package/dist/guards.js +306 -0
  71. package/dist/guards.js.map +1 -0
  72. package/dist/index.d.ts +8 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +221 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/parse/commitText.d.ts +2 -0
  77. package/dist/parse/commitText.d.ts.map +1 -0
  78. package/dist/parse/commitText.js +9 -0
  79. package/dist/parse/commitText.js.map +1 -0
  80. package/dist/parse/diffText.d.ts +7 -0
  81. package/dist/parse/diffText.d.ts.map +1 -0
  82. package/dist/parse/diffText.js +55 -0
  83. package/dist/parse/diffText.js.map +1 -0
  84. package/dist/parse/infoXml.d.ts +3 -0
  85. package/dist/parse/infoXml.d.ts.map +1 -0
  86. package/dist/parse/infoXml.js +35 -0
  87. package/dist/parse/infoXml.js.map +1 -0
  88. package/dist/parse/logXml.d.ts +10 -0
  89. package/dist/parse/logXml.d.ts.map +1 -0
  90. package/dist/parse/logXml.js +39 -0
  91. package/dist/parse/logXml.js.map +1 -0
  92. package/dist/parse/statusXml.d.ts +6 -0
  93. package/dist/parse/statusXml.d.ts.map +1 -0
  94. package/dist/parse/statusXml.js +64 -0
  95. package/dist/parse/statusXml.js.map +1 -0
  96. package/dist/parse/updateText.d.ts +6 -0
  97. package/dist/parse/updateText.d.ts.map +1 -0
  98. package/dist/parse/updateText.js +67 -0
  99. package/dist/parse/updateText.js.map +1 -0
  100. package/dist/runner.d.ts +41 -0
  101. package/dist/runner.d.ts.map +1 -0
  102. package/dist/runner.js +270 -0
  103. package/dist/runner.js.map +1 -0
  104. package/dist/tools/composite.d.ts +15 -0
  105. package/dist/tools/composite.d.ts.map +1 -0
  106. package/dist/tools/composite.js +238 -0
  107. package/dist/tools/composite.js.map +1 -0
  108. package/dist/tools/diagnose.d.ts +6 -0
  109. package/dist/tools/diagnose.d.ts.map +1 -0
  110. package/dist/tools/diagnose.js +131 -0
  111. package/dist/tools/diagnose.js.map +1 -0
  112. package/dist/tools/mutating.d.ts +80 -0
  113. package/dist/tools/mutating.d.ts.map +1 -0
  114. package/dist/tools/mutating.js +558 -0
  115. package/dist/tools/mutating.js.map +1 -0
  116. package/dist/tools/readonly.d.ts +52 -0
  117. package/dist/tools/readonly.d.ts.map +1 -0
  118. package/dist/tools/readonly.js +638 -0
  119. package/dist/tools/readonly.js.map +1 -0
  120. package/dist/tools/selfcheck.d.ts +5 -0
  121. package/dist/tools/selfcheck.d.ts.map +1 -0
  122. package/dist/tools/selfcheck.js +91 -0
  123. package/dist/tools/selfcheck.js.map +1 -0
  124. package/dist/types.d.ts +66 -0
  125. package/dist/types.d.ts.map +1 -0
  126. package/dist/types.js +2 -0
  127. package/dist/types.js.map +1 -0
  128. package/docs/README.md +11 -0
  129. package/docs/SPEC.md +964 -0
  130. package/docs/decisions/ADR-001-use-spec-v1-architecture.md +25 -0
  131. package/docs/decisions/ADR-002-use-capability-based-generic-svn-policy.md +31 -0
  132. package/docs/decisions/ADR-003-use-plug-and-play-global-registration.md +39 -0
  133. package/docs/decisions/ADR-004-borrow-diagnostics-not-external-mcp-surface.md +39 -0
  134. package/docs/svnrules.md +84 -0
  135. package/docs/toolrules.md +34 -0
  136. package/jest.config.cjs +14 -0
  137. package/package.json +51 -0
  138. package/scripts/clean.mjs +27 -0
  139. package/scripts/prepare-release.mjs +84 -0
  140. package/src/envelope.ts +182 -0
  141. package/src/eol.ts +137 -0
  142. package/src/guards.ts +362 -0
  143. package/src/index.ts +364 -0
  144. package/src/parse/commitText.ts +9 -0
  145. package/src/parse/diffText.ts +66 -0
  146. package/src/parse/infoXml.ts +51 -0
  147. package/src/parse/logXml.ts +64 -0
  148. package/src/parse/statusXml.ts +87 -0
  149. package/src/parse/updateText.ts +76 -0
  150. package/src/runner.ts +344 -0
  151. package/src/tools/composite.ts +289 -0
  152. package/src/tools/diagnose.ts +150 -0
  153. package/src/tools/mutating.ts +694 -0
  154. package/src/tools/readonly.ts +786 -0
  155. package/src/tools/selfcheck.ts +97 -0
  156. package/src/types.ts +76 -0
  157. package/tests/README.md +9 -0
  158. package/tests/diff-redaction.test.ts +146 -0
  159. package/tests/entrypoint.test.ts +49 -0
  160. package/tests/guards-eol.test.ts +170 -0
  161. package/tests/integration-svn.test.ts +709 -0
  162. package/tests/parsers.test.ts +119 -0
  163. package/tests/runner.test.ts +159 -0
  164. package/tests/selfcheck.test.ts +22 -0
  165. package/tsconfig.json +30 -0
package/dist/eol.js ADDED
@@ -0,0 +1,119 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { runDos2Unix } from "./runner.js";
4
+ const SNIFF_LIMIT_BYTES = 5 * 1024 * 1024;
5
+ const BINARY_SCAN_BYTES = 8 * 1024;
6
+ export async function sniffEol(filePath, limitBytes = SNIFF_LIMIT_BYTES) {
7
+ const stat = await fs.promises.stat(filePath);
8
+ if (!stat.isFile()) {
9
+ return {
10
+ path: filePath,
11
+ kind: "not-a-file",
12
+ has_bom: false,
13
+ size: stat.size,
14
+ sniff: "not-a-file"
15
+ };
16
+ }
17
+ if (stat.size > limitBytes) {
18
+ return {
19
+ path: filePath,
20
+ kind: "skipped-too-large",
21
+ has_bom: false,
22
+ size: stat.size,
23
+ sniff: "skipped-too-large"
24
+ };
25
+ }
26
+ const bytes = await fs.promises.readFile(filePath);
27
+ const hasBom = bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf;
28
+ if (bytes.subarray(0, Math.min(bytes.length, BINARY_SCAN_BYTES)).includes(0)) {
29
+ return {
30
+ path: filePath,
31
+ kind: "binary",
32
+ has_bom: hasBom,
33
+ size: stat.size,
34
+ sniff: "ok"
35
+ };
36
+ }
37
+ return {
38
+ path: filePath,
39
+ kind: classifyEol(bytes),
40
+ has_bom: hasBom,
41
+ size: stat.size,
42
+ sniff: "ok"
43
+ };
44
+ }
45
+ export async function makeEolCheck(filePath, eolStyle) {
46
+ const sniff = await sniffEol(filePath);
47
+ const isText = sniff.kind !== "binary" && sniff.kind !== "skipped-too-large" && sniff.kind !== "not-a-file";
48
+ const expected = expectedEolKind(eolStyle);
49
+ return {
50
+ ...sniff,
51
+ eol_style: eolStyle,
52
+ mismatch: isText && expected !== null && sniff.kind !== expected && sniff.kind !== "none"
53
+ };
54
+ }
55
+ export async function convertEol(input) {
56
+ const executable = converterForEolTarget(input.target);
57
+ const args = input.removeBom ? ["--remove-bom", "-q", input.filePath] : ["-q", input.filePath];
58
+ return runDos2Unix(executable, args, input.cwd);
59
+ }
60
+ export function normalizeEolTarget(value, eolStyle) {
61
+ return value ?? expectedEolKind(eolStyle) ?? platformNativeEolTarget();
62
+ }
63
+ export function converterForEolTarget(target) {
64
+ return target === "crlf" ? "unix2dos" : "dos2unix";
65
+ }
66
+ export function expectedEolKind(eolStyle) {
67
+ const normalized = eolStyle?.trim().toLowerCase();
68
+ if (!normalized) {
69
+ return null;
70
+ }
71
+ if (normalized === "native") {
72
+ return platformNativeEolTarget();
73
+ }
74
+ if (normalized === "lf") {
75
+ return "lf";
76
+ }
77
+ if (normalized === "crlf") {
78
+ return "crlf";
79
+ }
80
+ return null;
81
+ }
82
+ function platformNativeEolTarget() {
83
+ return process.platform === "win32" ? "crlf" : "lf";
84
+ }
85
+ export function isBinaryKind(kind) {
86
+ return kind === "binary";
87
+ }
88
+ export function displayPath(filePath, cwd) {
89
+ const relative = path.relative(cwd, filePath);
90
+ return relative || ".";
91
+ }
92
+ function classifyEol(bytes) {
93
+ let crlf = 0;
94
+ let lf = 0;
95
+ let crOnly = 0;
96
+ for (let index = 0; index < bytes.length; index += 1) {
97
+ if (bytes[index] === 0x0d) {
98
+ if (bytes[index + 1] === 0x0a) {
99
+ crlf += 1;
100
+ index += 1;
101
+ }
102
+ else {
103
+ crOnly += 1;
104
+ }
105
+ }
106
+ else if (bytes[index] === 0x0a) {
107
+ lf += 1;
108
+ }
109
+ }
110
+ const kinds = [crlf > 0, lf > 0, crOnly > 0].filter(Boolean).length;
111
+ if (kinds === 0) {
112
+ return "none";
113
+ }
114
+ if (kinds > 1 || crOnly > 0) {
115
+ return "mixed";
116
+ }
117
+ return crlf > 0 ? "crlf" : "lf";
118
+ }
119
+ //# sourceMappingURL=eol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eol.js","sourceRoot":"","sources":["../src/eol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { ChangedPath, WcInfo } from "./types.js";
2
+ export declare const neverCommitGlobs: string[];
3
+ export declare function readonlyMode(): boolean;
4
+ export declare function resolveCwd(cwd?: string): string;
5
+ export declare function requireExplicitPaths(paths: string[] | undefined): string | null;
6
+ export declare function validatePropertyName(name: string): string | null;
7
+ export declare function resolveTargetsInsideWc(cwd: string, wcRoot: string, paths: string[]): {
8
+ ok: true;
9
+ paths: string[];
10
+ } | {
11
+ ok: false;
12
+ note: string;
13
+ };
14
+ export declare function realPathOfNearestExisting(target: string): string;
15
+ export declare function assertExistingTargets(paths: string[]): string | null;
16
+ export declare function isInsideOrEqual(candidate: string, root: string): boolean;
17
+ export declare function repoRelativePath(absPath: string, wcRoot: string): string;
18
+ export declare function slash(value: string): string;
19
+ export declare function neverCommitHit(absPath: string, wcRoot: string): string | null;
20
+ export declare function neverCommitNote(hit: string, absPath: string, wcRoot: string): string;
21
+ export declare function riskySignals(absPaths: string[], wcRoot: string, statusByPath?: Map<string, string>): string[];
22
+ export declare function isBuildSystemFile(relativePath: string): boolean;
23
+ export declare function statusMap(changedPaths: ChangedPath[], cwd: string): Map<string, string>;
24
+ export declare function wcRootFromInfo(info: WcInfo[]): string | null;
25
+ export declare function messageFormatWarning(message: string): string | null;
26
+ //# sourceMappingURL=guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../src/guards.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEtD,eAAO,MAAM,gBAAgB,UAqB5B,CAAC;AA8BF,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAK/E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKhE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAoBhJ;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBhE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAOpE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAIxE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyB7E;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIpF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAwB7G;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAU/D;AAED,wBAAgB,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMvF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAE5D;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOnE"}
package/dist/guards.js ADDED
@@ -0,0 +1,306 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export const neverCommitGlobs = [
4
+ "**/bin/**",
5
+ "**/dist/**",
6
+ "**/node_modules/**",
7
+ "**/coverage/**",
8
+ "**/obj/**",
9
+ "**/.vs/**",
10
+ "**/.cache/**",
11
+ "**/*.db",
12
+ "**/*.tsbuildinfo",
13
+ "scratch/**",
14
+ "packages/**",
15
+ "tags/**",
16
+ ".graphify/**",
17
+ "graphify-out/**",
18
+ "**/*.pfx",
19
+ "**/*.key",
20
+ "**/*.pem",
21
+ "**/*.p12",
22
+ "**/*.snk",
23
+ "**/.env*"
24
+ ];
25
+ const MAX_POLICY_GLOBS = 128;
26
+ const MAX_POLICY_GLOB_LENGTH = 256;
27
+ const MAX_POLICY_DOUBLESTAR_SEGMENTS = 4;
28
+ const MAX_POLICY_GLOB_WILDCARDS = 8;
29
+ const policyCache = new Map();
30
+ const buildSystemNames = new Set([
31
+ "directory.build.props",
32
+ "directory.build.targets",
33
+ "packages.config"
34
+ ]);
35
+ export function readonlyMode() {
36
+ return process.env.SVN_AGENT_READONLY === "1" || process.argv.includes("--readonly");
37
+ }
38
+ export function resolveCwd(cwd) {
39
+ return realPathOfNearestExisting(cwd ?? process.cwd());
40
+ }
41
+ export function requireExplicitPaths(paths) {
42
+ if (!paths || paths.length === 0) {
43
+ return "explicit paths required";
44
+ }
45
+ return null;
46
+ }
47
+ export function validatePropertyName(name) {
48
+ if (!/^[A-Za-z_][A-Za-z0-9_.:-]{0,127}$/.test(name)) {
49
+ return "invalid property name";
50
+ }
51
+ return null;
52
+ }
53
+ export function resolveTargetsInsideWc(cwd, wcRoot, paths) {
54
+ const resolved = paths.map((target) => path.resolve(cwd, target));
55
+ const realRoot = realPathOfNearestExisting(wcRoot);
56
+ const canonical = resolved.map((target) => realPathOfNearestExisting(target));
57
+ for (const [index, target] of resolved.entries()) {
58
+ const realTarget = canonical[index];
59
+ if (!realTarget) {
60
+ return { ok: false, note: `path outside working copy: ${target}` };
61
+ }
62
+ if (!isInsideOrEqual(target, wcRoot) && !isInsideOrEqual(realTarget, realRoot)) {
63
+ return { ok: false, note: `path outside working copy: ${target}` };
64
+ }
65
+ // A short-name, case-shifted, junction, or symlink path can lexically pass
66
+ // or fail differently from SVN's canonical spelling; use the physical path
67
+ // both for containment and for the command arguments returned to callers.
68
+ if (!isInsideOrEqual(realTarget, realRoot)) {
69
+ return { ok: false, note: `path resolves outside working copy: ${target}` };
70
+ }
71
+ }
72
+ return { ok: true, paths: canonical };
73
+ }
74
+ export function realPathOfNearestExisting(target) {
75
+ let current = path.resolve(target);
76
+ const suffix = [];
77
+ while (!fs.existsSync(current)) {
78
+ const parent = path.dirname(current);
79
+ if (parent === current) {
80
+ return path.resolve(target);
81
+ }
82
+ suffix.unshift(path.basename(current));
83
+ current = parent;
84
+ }
85
+ try {
86
+ return path.join(fs.realpathSync.native(current), ...suffix);
87
+ }
88
+ catch {
89
+ return path.resolve(target);
90
+ }
91
+ }
92
+ export function assertExistingTargets(paths) {
93
+ for (const target of paths) {
94
+ if (!fs.existsSync(target)) {
95
+ return `path does not exist: ${target}`;
96
+ }
97
+ }
98
+ return null;
99
+ }
100
+ export function isInsideOrEqual(candidate, root) {
101
+ const normalizedRoot = path.resolve(root).toLowerCase();
102
+ const normalizedCandidate = path.resolve(candidate).toLowerCase();
103
+ return normalizedCandidate === normalizedRoot || normalizedCandidate.startsWith(normalizedRoot + path.sep);
104
+ }
105
+ export function repoRelativePath(absPath, wcRoot) {
106
+ const relative = path.relative(wcRoot, absPath);
107
+ return relative ? slash(relative) : ".";
108
+ }
109
+ export function slash(value) {
110
+ return value.replace(/\\/g, "/");
111
+ }
112
+ export function neverCommitHit(absPath, wcRoot) {
113
+ const relative = repoRelativePath(absPath, wcRoot).toLowerCase();
114
+ const policy = loadNeverCommitPolicy(wcRoot);
115
+ if (policy.invalid) {
116
+ return policy.invalid;
117
+ }
118
+ for (const glob of policy.deny) {
119
+ if (matchesGlob(relative, glob)) {
120
+ return glob;
121
+ }
122
+ }
123
+ for (const glob of policy.allow) {
124
+ if (matchesGlob(relative, glob)) {
125
+ return null;
126
+ }
127
+ }
128
+ for (const glob of neverCommitGlobs) {
129
+ if (matchesGlob(relative, glob)) {
130
+ return glob;
131
+ }
132
+ }
133
+ return null;
134
+ }
135
+ export function neverCommitNote(hit, absPath, wcRoot) {
136
+ return hit.startsWith("policy-error:")
137
+ ? hit
138
+ : `never-commit path matches ${hit}: ${repoRelativePath(absPath, wcRoot)}`;
139
+ }
140
+ export function riskySignals(absPaths, wcRoot, statusByPath) {
141
+ const signals = new Set();
142
+ if (absPaths.length > 8) {
143
+ signals.add("more than 8 paths");
144
+ }
145
+ for (const absPath of absPaths) {
146
+ const relative = repoRelativePath(absPath, wcRoot).toLowerCase();
147
+ const basename = path.basename(relative).toLowerCase();
148
+ const status = statusByPath?.get(absPath.toLowerCase());
149
+ if (status === "D") {
150
+ signals.add("delete-scheduled path");
151
+ }
152
+ if (basename === "version.ver") {
153
+ signals.add("version file touched");
154
+ }
155
+ if (isBuildSystemFile(relative)) {
156
+ signals.add("build-system file touched");
157
+ }
158
+ }
159
+ return [...signals];
160
+ }
161
+ export function isBuildSystemFile(relativePath) {
162
+ const lower = slash(relativePath).toLowerCase();
163
+ const basename = path.posix.basename(lower);
164
+ return (buildSystemNames.has(basename) ||
165
+ lower.endsWith(".sln") ||
166
+ lower.endsWith(".csproj") ||
167
+ lower.endsWith(".props") ||
168
+ lower.endsWith(".targets"));
169
+ }
170
+ export function statusMap(changedPaths, cwd) {
171
+ const map = new Map();
172
+ for (const changedPath of changedPaths) {
173
+ map.set(path.resolve(cwd, changedPath.path).toLowerCase(), changedPath.status);
174
+ }
175
+ return map;
176
+ }
177
+ export function wcRootFromInfo(info) {
178
+ return info.find((entry) => entry.wc_root)?.wc_root ?? null;
179
+ }
180
+ export function messageFormatWarning(message) {
181
+ const normalized = message.replace(/\r\n/g, "\n").trimEnd();
182
+ const lines = normalized.split("\n");
183
+ const hasSummary = Boolean(lines[0]?.trim());
184
+ const hasBlankSecondLine = lines.length > 1 && lines[1] === "";
185
+ const hasBullet = lines.some((line, index) => index >= 2 && line.startsWith("- "));
186
+ return hasSummary && hasBlankSecondLine && hasBullet ? null : "commit message format warning";
187
+ }
188
+ function matchesGlob(relative, glob) {
189
+ const lowerRelative = slash(relative).toLowerCase();
190
+ const lowerGlob = slash(glob).toLowerCase();
191
+ if (lowerGlob.endsWith("/**")) {
192
+ const directory = lowerGlob.slice(0, -3);
193
+ return globToRegExp(directory).test(lowerRelative) || globToRegExp(lowerGlob).test(lowerRelative);
194
+ }
195
+ return globToRegExp(lowerGlob).test(lowerRelative);
196
+ }
197
+ function loadNeverCommitPolicy(wcRoot) {
198
+ const policyPath = path.join(wcRoot, ".svn-mcp-policy.json");
199
+ const cacheKey = path.resolve(wcRoot).toLowerCase();
200
+ const stat = safePolicyStat(policyPath);
201
+ const cached = policyCache.get(cacheKey);
202
+ if (cached && cached.exists === stat.exists && cached.mtimeMs === stat.mtimeMs && cached.size === stat.size) {
203
+ return cached;
204
+ }
205
+ if (!stat.exists) {
206
+ const empty = { allow: [], deny: [], exists: false, mtimeMs: 0, size: 0 };
207
+ policyCache.set(cacheKey, empty);
208
+ return empty;
209
+ }
210
+ try {
211
+ const parsed = JSON.parse(fs.readFileSync(policyPath, "utf8"));
212
+ const allow = stringArray(parsed.neverCommit?.allow);
213
+ const deny = stringArray(parsed.neverCommit?.deny);
214
+ const invalid = validatePolicyGlobs([...allow, ...deny]);
215
+ const loaded = {
216
+ allow,
217
+ deny,
218
+ ...(invalid ? { invalid } : {}),
219
+ exists: true,
220
+ mtimeMs: stat.mtimeMs,
221
+ size: stat.size
222
+ };
223
+ policyCache.set(cacheKey, loaded);
224
+ return loaded;
225
+ }
226
+ catch {
227
+ const invalid = {
228
+ allow: [],
229
+ deny: [],
230
+ invalid: "policy-error: invalid .svn-mcp-policy.json",
231
+ exists: true,
232
+ mtimeMs: stat.mtimeMs,
233
+ size: stat.size
234
+ };
235
+ policyCache.set(cacheKey, invalid);
236
+ return invalid;
237
+ }
238
+ }
239
+ function stringArray(value) {
240
+ return Array.isArray(value) ? value
241
+ .filter((entry) => typeof entry === "string" && entry.trim().length > 0)
242
+ .map((entry) => entry.trim()) : [];
243
+ }
244
+ function validatePolicyGlobs(globs) {
245
+ if (globs.length > MAX_POLICY_GLOBS) {
246
+ return `policy-error: .svn-mcp-policy.json has too many neverCommit globs (max ${MAX_POLICY_GLOBS})`;
247
+ }
248
+ for (const glob of globs) {
249
+ if (glob.length > MAX_POLICY_GLOB_LENGTH) {
250
+ return `policy-error: .svn-mcp-policy.json glob is too long (max ${MAX_POLICY_GLOB_LENGTH})`;
251
+ }
252
+ const doublestarCount = (glob.match(/\*\*/g) ?? []).length;
253
+ if (doublestarCount > MAX_POLICY_DOUBLESTAR_SEGMENTS) {
254
+ return `policy-error: .svn-mcp-policy.json glob has too many ** segments (max ${MAX_POLICY_DOUBLESTAR_SEGMENTS})`;
255
+ }
256
+ const wildcardCount = (glob.match(/\*/g) ?? []).length;
257
+ if (wildcardCount > MAX_POLICY_GLOB_WILDCARDS) {
258
+ return `policy-error: .svn-mcp-policy.json glob has too many wildcards (max ${MAX_POLICY_GLOB_WILDCARDS})`;
259
+ }
260
+ if (glob.includes("\0")) {
261
+ return "policy-error: .svn-mcp-policy.json glob contains an invalid null byte";
262
+ }
263
+ }
264
+ return undefined;
265
+ }
266
+ function safePolicyStat(policyPath) {
267
+ try {
268
+ const stat = fs.statSync(policyPath);
269
+ return { exists: stat.isFile(), mtimeMs: stat.mtimeMs, size: stat.size };
270
+ }
271
+ catch {
272
+ return { exists: false, mtimeMs: 0, size: 0 };
273
+ }
274
+ }
275
+ function globToRegExp(glob) {
276
+ let source = "^";
277
+ for (let index = 0; index < glob.length; index += 1) {
278
+ const char = glob[index];
279
+ const next = glob[index + 1];
280
+ const afterNext = glob[index + 2];
281
+ if (char === "*" && next === "*" && afterNext === "/") {
282
+ source += "(?:.*/)?";
283
+ index += 2;
284
+ continue;
285
+ }
286
+ if (char === "*" && next === "*") {
287
+ source += ".*";
288
+ index += 1;
289
+ continue;
290
+ }
291
+ if (char === "*") {
292
+ source += "[^/]*";
293
+ continue;
294
+ }
295
+ if (char === "?") {
296
+ source += "[^/]";
297
+ continue;
298
+ }
299
+ source += escapeRegExp(char ?? "");
300
+ }
301
+ return new RegExp(`${source}$`);
302
+ }
303
+ function escapeRegExp(value) {
304
+ return value.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
305
+ }
306
+ //# sourceMappingURL=guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.js","sourceRoot":"","sources":["../src/guards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ export declare const serverName = "svn";
4
+ export declare const serverVersion = "1.0.0";
5
+ export declare const readonlyMode: boolean;
6
+ export declare function createServer(): McpServer;
7
+ export declare function main(): Promise<void>;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4BpE,eAAO,MAAM,UAAU,QAAQ,CAAC;AAChC,eAAO,MAAM,aAAa,UAAU,CAAC;AACrC,eAAO,MAAM,YAAY,SAAmB,CAAC;AAE7C,wBAAgB,YAAY,IAAI,SAAS,CAuRxC;AAYD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAY1C"}