codepage-bridge-mcp 0.1.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 (97) hide show
  1. package/.claude-plugin/marketplace.json +19 -0
  2. package/.claude-plugin/plugin.json +15 -0
  3. package/.mcp.json +11 -0
  4. package/LICENSE +21 -0
  5. package/README.md +990 -0
  6. package/README_CN.md +781 -0
  7. package/dist/src/core.d.ts +56 -0
  8. package/dist/src/core.js +166 -0
  9. package/dist/src/core.js.map +1 -0
  10. package/dist/src/diff.d.ts +8 -0
  11. package/dist/src/diff.js +11 -0
  12. package/dist/src/diff.js.map +1 -0
  13. package/dist/src/encoding/codec.d.ts +5 -0
  14. package/dist/src/encoding/codec.js +75 -0
  15. package/dist/src/encoding/codec.js.map +1 -0
  16. package/dist/src/encoding/index.d.ts +3 -0
  17. package/dist/src/encoding/index.js +4 -0
  18. package/dist/src/encoding/index.js.map +1 -0
  19. package/dist/src/encoding/rules.d.ts +4 -0
  20. package/dist/src/encoding/rules.js +70 -0
  21. package/dist/src/encoding/rules.js.map +1 -0
  22. package/dist/src/encoding/types.d.ts +22 -0
  23. package/dist/src/encoding/types.js +2 -0
  24. package/dist/src/encoding/types.js.map +1 -0
  25. package/dist/src/filesystem/atomic.d.ts +6 -0
  26. package/dist/src/filesystem/atomic.js +91 -0
  27. package/dist/src/filesystem/atomic.js.map +1 -0
  28. package/dist/src/filesystem/cache.d.ts +21 -0
  29. package/dist/src/filesystem/cache.js +40 -0
  30. package/dist/src/filesystem/cache.js.map +1 -0
  31. package/dist/src/filesystem/index.d.ts +4 -0
  32. package/dist/src/filesystem/index.js +5 -0
  33. package/dist/src/filesystem/index.js.map +1 -0
  34. package/dist/src/filesystem/mutex.d.ts +5 -0
  35. package/dist/src/filesystem/mutex.js +23 -0
  36. package/dist/src/filesystem/mutex.js.map +1 -0
  37. package/dist/src/filesystem/path.d.ts +9 -0
  38. package/dist/src/filesystem/path.js +53 -0
  39. package/dist/src/filesystem/path.js.map +1 -0
  40. package/dist/src/media/errors.d.ts +14 -0
  41. package/dist/src/media/errors.js +29 -0
  42. package/dist/src/media/errors.js.map +1 -0
  43. package/dist/src/media/image.d.ts +11 -0
  44. package/dist/src/media/image.js +81 -0
  45. package/dist/src/media/image.js.map +1 -0
  46. package/dist/src/media/index.d.ts +5 -0
  47. package/dist/src/media/index.js +6 -0
  48. package/dist/src/media/index.js.map +1 -0
  49. package/dist/src/media/notebook.d.ts +47 -0
  50. package/dist/src/media/notebook.js +122 -0
  51. package/dist/src/media/notebook.js.map +1 -0
  52. package/dist/src/media/pdf.d.ts +25 -0
  53. package/dist/src/media/pdf.js +104 -0
  54. package/dist/src/media/pdf.js.map +1 -0
  55. package/dist/src/media/types.d.ts +14 -0
  56. package/dist/src/media/types.js +2 -0
  57. package/dist/src/media/types.js.map +1 -0
  58. package/dist/src/prompts.d.ts +8 -0
  59. package/dist/src/prompts.js +46 -0
  60. package/dist/src/prompts.js.map +1 -0
  61. package/dist/src/schemas.d.ts +138 -0
  62. package/dist/src/schemas.js +81 -0
  63. package/dist/src/schemas.js.map +1 -0
  64. package/dist/src/server.d.ts +159 -0
  65. package/dist/src/server.js +98 -0
  66. package/dist/src/server.js.map +1 -0
  67. package/dist/src/toolTypes.d.ts +31 -0
  68. package/dist/src/toolTypes.js +2 -0
  69. package/dist/src/toolTypes.js.map +1 -0
  70. package/dist/src/tools/edit.d.ts +3 -0
  71. package/dist/src/tools/edit.js +168 -0
  72. package/dist/src/tools/edit.js.map +1 -0
  73. package/dist/src/tools/grep.d.ts +21 -0
  74. package/dist/src/tools/grep.js +192 -0
  75. package/dist/src/tools/grep.js.map +1 -0
  76. package/dist/src/tools/read.d.ts +3 -0
  77. package/dist/src/tools/read.js +137 -0
  78. package/dist/src/tools/read.js.map +1 -0
  79. package/dist/src/tools/write.d.ts +3 -0
  80. package/dist/src/tools/write.js +80 -0
  81. package/dist/src/tools/write.js.map +1 -0
  82. package/dist/src/validation.d.ts +6 -0
  83. package/dist/src/validation.js +42 -0
  84. package/dist/src/validation.js.map +1 -0
  85. package/examples/claude-config/settings.fragment.json +17 -0
  86. package/examples/minimal-project/.encoding-rules +10 -0
  87. package/examples/minimal-project/.mcp.json +11 -0
  88. package/examples/minimal-project/CLAUDE.md +15 -0
  89. package/install/download-release-unix.sh +72 -0
  90. package/install/download-release-windows.ps1 +61 -0
  91. package/install/install-from-release-unix.sh +18 -0
  92. package/install/install-from-release-windows.ps1 +19 -0
  93. package/install/install-from-source-unix.sh +44 -0
  94. package/install/install-from-source-windows.ps1 +45 -0
  95. package/install/install-this-release-unix.sh +37 -0
  96. package/install/install-this-release-windows.ps1 +36 -0
  97. package/package.json +64 -0
@@ -0,0 +1,56 @@
1
+ import { type DecodedText, type EncodingRules } from './encoding/index.js';
2
+ export interface ProjectFileContext {
3
+ absolutePath: string;
4
+ root: string;
5
+ rules: EncodingRules;
6
+ encoding: string;
7
+ }
8
+ export interface ReadSnapshot {
9
+ absolutePath: string;
10
+ root: string;
11
+ encoding: string;
12
+ text: string;
13
+ bom: DecodedText['bom'];
14
+ newline: DecodedText['newline'];
15
+ mtimeMs: number;
16
+ size: number;
17
+ hash: string;
18
+ complete: boolean;
19
+ offset?: number;
20
+ limit?: number;
21
+ }
22
+ export declare function getProjectFileContext(filePath: string): Promise<ProjectFileContext>;
23
+ export declare function readDecodedFile(context: ProjectFileContext): Promise<ReadSnapshot>;
24
+ export declare function encodeSnapshotText(snapshot: ReadSnapshot, text: string, preserveNewline?: boolean): Buffer;
25
+ export declare class ReadRegistry {
26
+ private readonly snapshots;
27
+ private readonly coverage;
28
+ private readonly ranges;
29
+ get(filePath: string): ReadSnapshot | undefined;
30
+ clear(filePath?: string): void;
31
+ remember(snapshot: ReadSnapshot, range: {
32
+ startLine: number;
33
+ endLine: number;
34
+ totalLines: number;
35
+ }): void;
36
+ authorizeEdit(filePath: string, currentHash: string, requiredRanges: Array<{
37
+ startLine: number;
38
+ endLine: number;
39
+ }>): {
40
+ status: 'authorized';
41
+ snapshot: ReadSnapshot;
42
+ } | {
43
+ status: 'unread';
44
+ } | {
45
+ status: 'changed';
46
+ } | {
47
+ status: 'uncovered';
48
+ missing: Array<{
49
+ startLine: number;
50
+ endLine: number;
51
+ }>;
52
+ };
53
+ isUnchanged(filePath: string, offset?: number, limit?: number): Promise<boolean>;
54
+ updateAfterWrite(snapshot: ReadSnapshot, text: string, buffer: Buffer, mtimeMs: number): void;
55
+ }
56
+ export declare const readRegistry: ReadRegistry;
@@ -0,0 +1,166 @@
1
+ import { createHash } from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { decodeText, encodeText, findEncodingRules, resolveEncoding, } from './encoding/index.js';
4
+ import { fileStateCache, resolveProjectPath } from './filesystem/index.js';
5
+ function digest(buffer) {
6
+ return createHash('sha256').update(buffer).digest('hex');
7
+ }
8
+ export async function getProjectFileContext(filePath) {
9
+ if (filePath.includes('\0'))
10
+ throw new Error('file_path must not contain NUL bytes');
11
+ if (/^[/\\]{2}/.test(filePath) || /^\\\\[?.]\\/.test(filePath)) {
12
+ throw new Error('UNC and device paths are not allowed');
13
+ }
14
+ if (!path.isAbsolute(filePath))
15
+ throw new Error('file_path must be an absolute path');
16
+ const absolutePath = path.resolve(filePath);
17
+ const rules = await findEncodingRules(path.dirname(absolutePath));
18
+ if (rules.file === null) {
19
+ throw new Error(`No .encoding-rules found for ${filePath}`);
20
+ }
21
+ resolveProjectPath(rules.root, absolutePath);
22
+ return {
23
+ absolutePath,
24
+ root: rules.root,
25
+ rules,
26
+ encoding: resolveEncoding(absolutePath, rules),
27
+ };
28
+ }
29
+ export async function readDecodedFile(context) {
30
+ const state = await fileStateCache.read(context.root, context.absolutePath);
31
+ const decoded = decodeText(state.buffer, context.encoding);
32
+ return {
33
+ absolutePath: context.absolutePath,
34
+ root: context.root,
35
+ encoding: decoded.encoding,
36
+ text: decoded.text.replaceAll('\r\n', '\n').replaceAll('\r', '\n'),
37
+ bom: decoded.bom,
38
+ newline: decoded.newline,
39
+ mtimeMs: state.mtimeMs,
40
+ size: state.size,
41
+ hash: state.hash,
42
+ complete: true,
43
+ };
44
+ }
45
+ export function encodeSnapshotText(snapshot, text, preserveNewline = true) {
46
+ return encodeText(text, snapshot.encoding, {
47
+ bom: snapshot.bom,
48
+ newline: preserveNewline ? snapshot.newline : null,
49
+ });
50
+ }
51
+ function mergeIntervals(intervals, next) {
52
+ if (next.end < next.start)
53
+ return intervals;
54
+ const merged = [];
55
+ let current = next;
56
+ for (const interval of [...intervals, next].sort((left, right) => left.start - right.start)) {
57
+ if (interval === next)
58
+ continue;
59
+ if (interval.end + 1 < current.start)
60
+ merged.push(interval);
61
+ else if (current.end + 1 < interval.start) {
62
+ merged.push(current);
63
+ current = interval;
64
+ }
65
+ else {
66
+ current = {
67
+ start: Math.min(current.start, interval.start),
68
+ end: Math.max(current.end, interval.end),
69
+ };
70
+ }
71
+ }
72
+ merged.push(current);
73
+ return merged.sort((left, right) => left.start - right.start);
74
+ }
75
+ export class ReadRegistry {
76
+ snapshots = new Map();
77
+ coverage = new Map();
78
+ ranges = new Map();
79
+ get(filePath) {
80
+ return this.snapshots.get(path.resolve(filePath));
81
+ }
82
+ clear(filePath) {
83
+ if (filePath === undefined) {
84
+ this.snapshots.clear();
85
+ this.coverage.clear();
86
+ this.ranges.clear();
87
+ return;
88
+ }
89
+ const absolutePath = path.resolve(filePath);
90
+ this.snapshots.delete(absolutePath);
91
+ this.coverage.delete(absolutePath);
92
+ this.ranges.delete(absolutePath);
93
+ }
94
+ remember(snapshot, range) {
95
+ const key = snapshot.absolutePath;
96
+ const existing = this.coverage.get(key);
97
+ const sameVersion = existing?.snapshot.hash === snapshot.hash
98
+ && existing.snapshot.mtimeMs === snapshot.mtimeMs;
99
+ const intervals = sameVersion ? existing.intervals : [];
100
+ const merged = mergeIntervals(intervals, {
101
+ start: Math.max(1, range.startLine),
102
+ end: Math.min(range.totalLines, range.endLine),
103
+ });
104
+ const complete = merged.length === 1
105
+ && merged[0]?.start === 1
106
+ && merged[0].end >= range.totalLines;
107
+ const remembered = { ...snapshot, complete };
108
+ this.coverage.set(key, {
109
+ snapshot: remembered,
110
+ totalLines: range.totalLines,
111
+ intervals: merged,
112
+ });
113
+ if (complete)
114
+ this.snapshots.set(key, remembered);
115
+ else
116
+ this.snapshots.delete(key);
117
+ this.ranges.set(key, {
118
+ mtimeMs: snapshot.mtimeMs,
119
+ hash: snapshot.hash,
120
+ ...(snapshot.offset === undefined ? {} : { offset: snapshot.offset }),
121
+ ...(snapshot.limit === undefined ? {} : { limit: snapshot.limit }),
122
+ });
123
+ }
124
+ authorizeEdit(filePath, currentHash, requiredRanges) {
125
+ const entry = this.coverage.get(path.resolve(filePath));
126
+ if (!entry)
127
+ return { status: 'unread' };
128
+ if (entry.snapshot.hash !== currentHash)
129
+ return { status: 'changed' };
130
+ const missing = requiredRanges.filter(required => !entry.intervals.some(interval => interval.start <= required.startLine && interval.end >= required.endLine));
131
+ if (missing.length > 0)
132
+ return { status: 'uncovered', missing };
133
+ return { status: 'authorized', snapshot: entry.snapshot };
134
+ }
135
+ async isUnchanged(filePath, offset, limit) {
136
+ const absolutePath = path.resolve(filePath);
137
+ const previous = this.ranges.get(absolutePath);
138
+ if (!previous || previous.offset !== offset || previous.limit !== limit)
139
+ return false;
140
+ const context = await getProjectFileContext(absolutePath);
141
+ const current = await fileStateCache.read(context.root, absolutePath);
142
+ return current.mtimeMs === previous.mtimeMs && current.hash === previous.hash;
143
+ }
144
+ updateAfterWrite(snapshot, text, buffer, mtimeMs) {
145
+ const { offset: _offset, limit: _limit, ...base } = snapshot;
146
+ const hash = digest(buffer);
147
+ const next = {
148
+ ...base,
149
+ text,
150
+ size: buffer.length,
151
+ hash,
152
+ mtimeMs,
153
+ complete: true,
154
+ };
155
+ const totalLines = text.split('\n').length;
156
+ this.snapshots.set(snapshot.absolutePath, next);
157
+ this.coverage.set(snapshot.absolutePath, {
158
+ snapshot: next,
159
+ totalLines,
160
+ intervals: [{ start: 1, end: totalLines }],
161
+ });
162
+ this.ranges.set(snapshot.absolutePath, { mtimeMs, hash });
163
+ }
164
+ }
165
+ export const readRegistry = new ReadRegistry();
166
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface PatchHunk {
2
+ oldStart: number;
3
+ oldLines: number;
4
+ newStart: number;
5
+ newLines: number;
6
+ lines: string[];
7
+ }
8
+ export declare function createStructuredPatch(filePath: string, before: string, after: string): PatchHunk[];
@@ -0,0 +1,11 @@
1
+ import { structuredPatch } from 'diff';
2
+ export function createStructuredPatch(filePath, before, after) {
3
+ return structuredPatch(filePath, filePath, before, after, '', '').hunks.map(hunk => ({
4
+ oldStart: hunk.oldStart,
5
+ oldLines: hunk.oldLines,
6
+ newStart: hunk.newStart,
7
+ newLines: hunk.newLines,
8
+ lines: hunk.lines,
9
+ }));
10
+ }
11
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAUtC,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,MAAc,EAAE,KAAa;IACnF,OAAO,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC,CAAA;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DecodedText, EncodeTextOptions, NewlineKind } from "./types.js";
2
+ export declare function normalizeEncoding(label: string): string;
3
+ export declare function detectDominantNewline(text: string): NewlineKind;
4
+ export declare function decodeText(buffer: Buffer, requestedEncoding?: string): DecodedText;
5
+ export declare function encodeText(text: string, requestedEncoding?: string, options?: EncodeTextOptions): Buffer;
@@ -0,0 +1,75 @@
1
+ import { TextDecoder } from "node:util";
2
+ import iconv from "iconv-lite";
3
+ const BOMS = [
4
+ ["utf-8", Buffer.from([0xef, 0xbb, 0xbf])],
5
+ ["utf-16le", Buffer.from([0xff, 0xfe])],
6
+ ["utf-16be", Buffer.from([0xfe, 0xff])],
7
+ ];
8
+ export function normalizeEncoding(label) {
9
+ try {
10
+ return new TextDecoder(label).encoding;
11
+ }
12
+ catch {
13
+ throw new Error(`Unsupported encoding: ${label}`);
14
+ }
15
+ }
16
+ function detectBom(buffer) {
17
+ for (const [kind, bytes] of BOMS) {
18
+ if (buffer.subarray(0, bytes.length).equals(bytes))
19
+ return [kind, bytes.length];
20
+ }
21
+ return [null, 0];
22
+ }
23
+ export function detectDominantNewline(text) {
24
+ let crlf = 0;
25
+ let lf = 0;
26
+ let cr = 0;
27
+ for (let index = 0; index < text.length; index += 1) {
28
+ if (text[index] === "\r" && text[index + 1] === "\n") {
29
+ crlf += 1;
30
+ index += 1;
31
+ }
32
+ else if (text[index] === "\n")
33
+ lf += 1;
34
+ else if (text[index] === "\r")
35
+ cr += 1;
36
+ }
37
+ const maximum = Math.max(crlf, lf, cr);
38
+ if (maximum === 0)
39
+ return null;
40
+ if (crlf === maximum)
41
+ return "\r\n";
42
+ if (lf === maximum)
43
+ return "\n";
44
+ return "\r";
45
+ }
46
+ export function decodeText(buffer, requestedEncoding = "utf-8") {
47
+ const encoding = normalizeEncoding(requestedEncoding);
48
+ const [bom, bomLength] = detectBom(buffer);
49
+ const bytes = buffer.subarray(bomLength);
50
+ let text;
51
+ try {
52
+ text = new TextDecoder(encoding, { fatal: true }).decode(bytes);
53
+ }
54
+ catch (error) {
55
+ throw new Error(`Invalid byte sequence for ${encoding}`, { cause: error });
56
+ }
57
+ return { text, encoding, bom, newline: detectDominantNewline(text) };
58
+ }
59
+ function applyNewline(text, newline) {
60
+ return newline === null ? text : text.replace(/\r\n|\r|\n/g, newline);
61
+ }
62
+ export function encodeText(text, requestedEncoding = "utf-8", options = {}) {
63
+ const encoding = normalizeEncoding(requestedEncoding);
64
+ const normalizedText = applyNewline(text, options.newline ?? null);
65
+ if (!iconv.encodingExists(encoding))
66
+ throw new Error(`Encoding cannot be written: ${encoding}`);
67
+ const encoded = iconv.encode(normalizedText, encoding);
68
+ const roundTrip = new TextDecoder(encoding, { fatal: true }).decode(encoded);
69
+ if (roundTrip !== normalizedText) {
70
+ throw new Error(`Text contains characters not representable in ${encoding}`);
71
+ }
72
+ const prefix = BOMS.find(([kind]) => kind === (options.bom ?? null))?.[1];
73
+ return prefix ? Buffer.concat([prefix, encoded]) : encoded;
74
+ }
75
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../src/encoding/codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./codec.js";
2
+ export * from "./rules.js";
3
+ export * from "./types.js";
@@ -0,0 +1,4 @@
1
+ export * from "./codec.js";
2
+ export * from "./rules.js";
3
+ export * from "./types.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/encoding/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { EncodingRules } from "./types.js";
2
+ export declare function findEncodingRules(startPath: string, boundary?: string): Promise<EncodingRules>;
3
+ export declare function parseEncodingRules(source: string, root: string, file?: string | null): EncodingRules;
4
+ export declare function resolveEncoding(filePath: string, rules: EncodingRules): string;
@@ -0,0 +1,70 @@
1
+ import { access, readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import picomatch from "picomatch";
4
+ const RULES_FILE = ".encoding-rules";
5
+ function isWithin(candidate, boundary) {
6
+ const relative = path.relative(boundary, candidate);
7
+ return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== "..");
8
+ }
9
+ export async function findEncodingRules(startPath, boundary) {
10
+ const resolvedBoundary = path.resolve(boundary ?? path.parse(path.resolve(startPath)).root);
11
+ let directory = path.resolve(startPath);
12
+ if (!isWithin(directory, resolvedBoundary)) {
13
+ throw new Error(`Path is outside the rules boundary: ${startPath}`);
14
+ }
15
+ while (isWithin(directory, resolvedBoundary)) {
16
+ const rulesFile = path.join(directory, RULES_FILE);
17
+ try {
18
+ await access(rulesFile);
19
+ return parseEncodingRules(await readFile(rulesFile, "utf8"), directory, rulesFile);
20
+ }
21
+ catch (error) {
22
+ const code = error.code;
23
+ if (code !== "ENOENT" && code !== "ENOTDIR")
24
+ throw error;
25
+ }
26
+ if (directory === resolvedBoundary)
27
+ break;
28
+ const parent = path.dirname(directory);
29
+ if (parent === directory)
30
+ break;
31
+ directory = parent;
32
+ }
33
+ return { root: resolvedBoundary, file: null, rules: [] };
34
+ }
35
+ export function parseEncodingRules(source, root, file = null) {
36
+ const rules = [];
37
+ for (const [index, rawLine] of source.split(/\r\n|\n|\r/).entries()) {
38
+ const line = rawLine.trim();
39
+ if (!line || line.startsWith("#"))
40
+ continue;
41
+ const separator = line.search(/\s/);
42
+ const rawPattern = separator < 0 ? line : line.slice(0, separator);
43
+ const rawEncoding = separator < 0 ? "" : line.slice(separator).trim().split(/\s+/)[0] ?? "";
44
+ const cancelled = rawPattern.startsWith("!");
45
+ const pattern = cancelled ? rawPattern.slice(1) : rawPattern;
46
+ if (!pattern)
47
+ throw new Error(`Invalid empty pattern at ${file ?? RULES_FILE}:${index + 1}`);
48
+ if (!cancelled && !rawEncoding) {
49
+ throw new Error(`Missing encoding at ${file ?? RULES_FILE}:${index + 1}`);
50
+ }
51
+ rules.push({ pattern, encoding: cancelled ? null : rawEncoding, line: index + 1 });
52
+ }
53
+ return { root: path.resolve(root), file, rules };
54
+ }
55
+ export function resolveEncoding(filePath, rules) {
56
+ const absolute = path.resolve(filePath);
57
+ if (!isWithin(absolute, rules.root))
58
+ throw new Error(`Path is outside project root: ${filePath}`);
59
+ const relative = path.relative(rules.root, absolute).split(path.sep).join("/");
60
+ let encoding = "utf-8";
61
+ for (const rule of rules.rules) {
62
+ const pattern = rule.pattern.split("\\").join("/");
63
+ const basename = !pattern.includes("/");
64
+ if (picomatch.isMatch(relative, pattern, { dot: true, basename })) {
65
+ encoding = rule.encoding ?? "utf-8";
66
+ }
67
+ }
68
+ return encoding;
69
+ }
70
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/encoding/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface EncodingRule {
2
+ pattern: string;
3
+ encoding: string | null;
4
+ line: number;
5
+ }
6
+ export interface EncodingRules {
7
+ root: string;
8
+ file: string | null;
9
+ rules: readonly EncodingRule[];
10
+ }
11
+ export type BomKind = "utf-8" | "utf-16le" | "utf-16be" | null;
12
+ export type NewlineKind = "\r\n" | "\n" | "\r" | null;
13
+ export interface DecodedText {
14
+ text: string;
15
+ encoding: string;
16
+ bom: BomKind;
17
+ newline: NewlineKind;
18
+ }
19
+ export interface EncodeTextOptions {
20
+ bom?: BomKind;
21
+ newline?: NewlineKind;
22
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/encoding/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { type FileVersion } from "./cache.js";
2
+ export interface AtomicWriteOptions {
3
+ mode?: number;
4
+ expected?: Pick<FileVersion, "mtimeMs" | "hash">;
5
+ }
6
+ export declare function atomicWriteBuffer(root: string, input: string, buffer: Buffer, options?: AtomicWriteOptions): Promise<void>;
@@ -0,0 +1,91 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { chmod, open, rename, rm, stat } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { fileStateCache } from "./cache.js";
5
+ import { pathMutex } from "./mutex.js";
6
+ import { inspectProjectPath } from "./path.js";
7
+ function temporaryName(target, suffix) {
8
+ return path.join(path.dirname(target), `.${path.basename(target)}.${process.pid}.${randomBytes(6).toString("hex")}.${suffix}`);
9
+ }
10
+ async function flushDirectory(directory) {
11
+ try {
12
+ const handle = await open(directory, "r");
13
+ try {
14
+ await handle.sync();
15
+ }
16
+ finally {
17
+ await handle.close();
18
+ }
19
+ }
20
+ catch (error) {
21
+ if (process.platform !== "win32")
22
+ throw error;
23
+ }
24
+ }
25
+ async function replaceFile(temp, target) {
26
+ const attempts = process.platform === "win32" ? 4 : 1;
27
+ let lastError;
28
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
29
+ try {
30
+ await rename(temp, target);
31
+ return;
32
+ }
33
+ catch (error) {
34
+ lastError = error;
35
+ const code = error.code;
36
+ if (process.platform !== "win32" || (code !== "EPERM" && code !== "EACCES" && code !== "EEXIST")) {
37
+ throw error;
38
+ }
39
+ if (attempt + 1 < attempts) {
40
+ await new Promise(resolve => setTimeout(resolve, 25 * (attempt + 1)));
41
+ }
42
+ }
43
+ }
44
+ throw lastError;
45
+ }
46
+ async function assertExpected(root, input, expected) {
47
+ const current = await fileStateCache.read(root, input);
48
+ if (current.mtimeMs !== expected.mtimeMs || current.hash !== expected.hash) {
49
+ throw new Error(`File changed since it was read: ${input}`);
50
+ }
51
+ }
52
+ export async function atomicWriteBuffer(root, input, buffer, options = {}) {
53
+ const initial = await inspectProjectPath(root, input, true);
54
+ const key = process.platform === "win32" ? initial.target.toLowerCase() : initial.target;
55
+ await pathMutex.runExclusive(key, async () => {
56
+ const safe = await inspectProjectPath(root, input, true);
57
+ if (options.expected)
58
+ await assertExpected(root, input, options.expected);
59
+ let mode = options.mode;
60
+ if (mode === undefined) {
61
+ try {
62
+ mode = (await stat(safe.target)).mode;
63
+ }
64
+ catch (error) {
65
+ if (error.code !== "ENOENT")
66
+ throw error;
67
+ mode = 0o666;
68
+ }
69
+ }
70
+ const temp = temporaryName(safe.target, "tmp");
71
+ let handle;
72
+ try {
73
+ handle = await open(temp, "wx", mode);
74
+ await handle.writeFile(buffer);
75
+ await handle.sync();
76
+ await handle.close();
77
+ handle = undefined;
78
+ await chmod(temp, mode);
79
+ await replaceFile(temp, safe.target);
80
+ await flushDirectory(path.dirname(safe.target));
81
+ fileStateCache.clear(safe.target);
82
+ }
83
+ catch (error) {
84
+ if (handle)
85
+ await handle.close().catch(() => undefined);
86
+ await rm(temp, { force: true }).catch(() => undefined);
87
+ throw error;
88
+ }
89
+ });
90
+ }
91
+ //# sourceMappingURL=atomic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic.js","sourceRoot":"","sources":["../../../src/filesystem/atomic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAO/C,SAAS,aAAa,CAAC,MAAc,EAAE,MAAc;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;AACjI,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,SAAiB;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,MAAM,KAAK,CAAC;IAChD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAClB,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;YACnD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACjG,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,OAAO,GAAG,CAAC,GAAG,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,KAAa,EAAE,QAA+C;IACxG,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvD,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,KAAa,EACb,MAAc,EACd,UAA8B,EAAE;IAEhC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACzF,MAAM,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,QAAQ;YAAE,MAAM,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1E,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACxB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,KAAK,CAAC;gBACpE,IAAI,GAAG,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC/B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,GAAG,SAAS,CAAC;YACnB,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxB,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAChD,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM;gBAAE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface FileVersion {
2
+ mtimeMs: number;
3
+ size: number;
4
+ hash: string;
5
+ }
6
+ export interface BufferReadState extends FileVersion {
7
+ buffer: Buffer;
8
+ partial: boolean;
9
+ offset: number;
10
+ totalSize: number;
11
+ }
12
+ export interface ReadBufferOptions {
13
+ offset?: number;
14
+ length?: number;
15
+ }
16
+ export declare class FileStateCache {
17
+ private readonly entries;
18
+ clear(filePath?: string): void;
19
+ read(root: string, input: string, options?: ReadBufferOptions): Promise<BufferReadState>;
20
+ }
21
+ export declare const fileStateCache: FileStateCache;
@@ -0,0 +1,40 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile, stat } from "node:fs/promises";
3
+ import { inspectProjectPath } from "./path.js";
4
+ function digest(buffer) {
5
+ return createHash("sha256").update(buffer).digest("hex");
6
+ }
7
+ export class FileStateCache {
8
+ entries = new Map();
9
+ clear(filePath) {
10
+ if (filePath === undefined)
11
+ this.entries.clear();
12
+ else
13
+ this.entries.delete(filePath);
14
+ }
15
+ async read(root, input, options = {}) {
16
+ const safe = await inspectProjectPath(root, input);
17
+ const info = await stat(safe.target);
18
+ const buffer = await readFile(safe.target);
19
+ const entry = { buffer, mtimeMs: info.mtimeMs, size: buffer.length, hash: digest(buffer) };
20
+ this.entries.set(safe.target, entry);
21
+ const offset = options.offset ?? 0;
22
+ const length = options.length ?? entry.buffer.length - offset;
23
+ if (!Number.isSafeInteger(offset) || offset < 0 || !Number.isSafeInteger(length) || length < 0) {
24
+ throw new Error("offset and length must be non-negative safe integers");
25
+ }
26
+ const end = Math.min(entry.buffer.length, offset + length);
27
+ const selectedBuffer = Buffer.from(entry.buffer.subarray(Math.min(offset, entry.buffer.length), end));
28
+ return {
29
+ buffer: selectedBuffer,
30
+ partial: offset !== 0 || end !== entry.buffer.length,
31
+ offset,
32
+ totalSize: entry.buffer.length,
33
+ mtimeMs: entry.mtimeMs,
34
+ size: entry.size,
35
+ hash: entry.hash,
36
+ };
37
+ }
38
+ }
39
+ export const fileStateCache = new FileStateCache();
40
+ //# sourceMappingURL=cache.js.map