@clarvis/agent-tools 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 (116) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/CODE_OF_CONDUCT.md +117 -0
  3. package/CONTRIBUTING.md +78 -0
  4. package/LICENSE +21 -0
  5. package/README.md +203 -0
  6. package/SECURITY.md +58 -0
  7. package/SPEC.md +266 -0
  8. package/dist/config.d.ts +29 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +145 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/core.d.ts +13 -0
  13. package/dist/core.d.ts.map +1 -0
  14. package/dist/core.js +43 -0
  15. package/dist/core.js.map +1 -0
  16. package/dist/errors.d.ts +9 -0
  17. package/dist/errors.d.ts.map +1 -0
  18. package/dist/errors.js +29 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/index.d.ts +20 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +17 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/lib/atomic.d.ts +11 -0
  25. package/dist/lib/atomic.d.ts.map +1 -0
  26. package/dist/lib/atomic.js +307 -0
  27. package/dist/lib/atomic.js.map +1 -0
  28. package/dist/lib/binary.d.ts +3 -0
  29. package/dist/lib/binary.d.ts.map +1 -0
  30. package/dist/lib/binary.js +20 -0
  31. package/dist/lib/binary.js.map +1 -0
  32. package/dist/lib/files.d.ts +9 -0
  33. package/dist/lib/files.d.ts.map +1 -0
  34. package/dist/lib/files.js +49 -0
  35. package/dist/lib/files.js.map +1 -0
  36. package/dist/lib/ignore.d.ts +5 -0
  37. package/dist/lib/ignore.d.ts.map +1 -0
  38. package/dist/lib/ignore.js +106 -0
  39. package/dist/lib/ignore.js.map +1 -0
  40. package/dist/lib/log.d.ts +4 -0
  41. package/dist/lib/log.d.ts.map +1 -0
  42. package/dist/lib/log.js +11 -0
  43. package/dist/lib/log.js.map +1 -0
  44. package/dist/lib/match-cascade.d.ts +10 -0
  45. package/dist/lib/match-cascade.d.ts.map +1 -0
  46. package/dist/lib/match-cascade.js +153 -0
  47. package/dist/lib/match-cascade.js.map +1 -0
  48. package/dist/lib/output.d.ts +8 -0
  49. package/dist/lib/output.d.ts.map +1 -0
  50. package/dist/lib/output.js +77 -0
  51. package/dist/lib/output.js.map +1 -0
  52. package/dist/lib/paths.d.ts +3 -0
  53. package/dist/lib/paths.d.ts.map +1 -0
  54. package/dist/lib/paths.js +46 -0
  55. package/dist/lib/paths.js.map +1 -0
  56. package/dist/lib/rg.d.ts +22 -0
  57. package/dist/lib/rg.d.ts.map +1 -0
  58. package/dist/lib/rg.js +285 -0
  59. package/dist/lib/rg.js.map +1 -0
  60. package/dist/lib/text.d.ts +18 -0
  61. package/dist/lib/text.d.ts.map +1 -0
  62. package/dist/lib/text.js +129 -0
  63. package/dist/lib/text.js.map +1 -0
  64. package/dist/lib/textfile.d.ts +4 -0
  65. package/dist/lib/textfile.d.ts.map +1 -0
  66. package/dist/lib/textfile.js +55 -0
  67. package/dist/lib/textfile.js.map +1 -0
  68. package/dist/lib/token.d.ts +2 -0
  69. package/dist/lib/token.d.ts.map +1 -0
  70. package/dist/lib/token.js +6 -0
  71. package/dist/lib/token.js.map +1 -0
  72. package/dist/tools/apply-patch.d.ts +3 -0
  73. package/dist/tools/apply-patch.d.ts.map +1 -0
  74. package/dist/tools/apply-patch.js +221 -0
  75. package/dist/tools/apply-patch.js.map +1 -0
  76. package/dist/tools/bash.d.ts +3 -0
  77. package/dist/tools/bash.d.ts.map +1 -0
  78. package/dist/tools/bash.js +179 -0
  79. package/dist/tools/bash.js.map +1 -0
  80. package/dist/tools/edit-file.d.ts +15 -0
  81. package/dist/tools/edit-file.d.ts.map +1 -0
  82. package/dist/tools/edit-file.js +163 -0
  83. package/dist/tools/edit-file.js.map +1 -0
  84. package/dist/tools/glob.d.ts +3 -0
  85. package/dist/tools/glob.d.ts.map +1 -0
  86. package/dist/tools/glob.js +64 -0
  87. package/dist/tools/glob.js.map +1 -0
  88. package/dist/tools/grep.d.ts +3 -0
  89. package/dist/tools/grep.d.ts.map +1 -0
  90. package/dist/tools/grep.js +201 -0
  91. package/dist/tools/grep.js.map +1 -0
  92. package/dist/tools/list-dir.d.ts +3 -0
  93. package/dist/tools/list-dir.d.ts.map +1 -0
  94. package/dist/tools/list-dir.js +59 -0
  95. package/dist/tools/list-dir.js.map +1 -0
  96. package/dist/tools/multi-edit.d.ts +3 -0
  97. package/dist/tools/multi-edit.d.ts.map +1 -0
  98. package/dist/tools/multi-edit.js +86 -0
  99. package/dist/tools/multi-edit.js.map +1 -0
  100. package/dist/tools/read-file.d.ts +3 -0
  101. package/dist/tools/read-file.d.ts.map +1 -0
  102. package/dist/tools/read-file.js +102 -0
  103. package/dist/tools/read-file.js.map +1 -0
  104. package/dist/tools/registry.d.ts +6 -0
  105. package/dist/tools/registry.d.ts.map +1 -0
  106. package/dist/tools/registry.js +28 -0
  107. package/dist/tools/registry.js.map +1 -0
  108. package/dist/tools/types.d.ts +9 -0
  109. package/dist/tools/types.d.ts.map +1 -0
  110. package/dist/tools/types.js +2 -0
  111. package/dist/tools/types.js.map +1 -0
  112. package/dist/tools/write-file.d.ts +3 -0
  113. package/dist/tools/write-file.d.ts.map +1 -0
  114. package/dist/tools/write-file.js +61 -0
  115. package/dist/tools/write-file.js.map +1 -0
  116. package/package.json +70 -0
@@ -0,0 +1,307 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { ToolError } from "../errors.js";
4
+ import { uniqueToken } from "./token.js";
5
+ const locks = new Map();
6
+ export function withFileLock(absPath, fn) {
7
+ const prev = locks.get(absPath) ?? Promise.resolve();
8
+ const next = prev.then(fn, fn);
9
+ const tail = next
10
+ .catch(() => { })
11
+ .finally(() => {
12
+ if (locks.get(absPath) === tail)
13
+ locks.delete(absPath);
14
+ });
15
+ locks.set(absPath, tail);
16
+ return next;
17
+ }
18
+ export function withFileLocks(paths, fn) {
19
+ const sorted = [...new Set(paths)].sort();
20
+ return sorted.reduceRight((acc, p) => () => withFileLock(p, acc), fn)();
21
+ }
22
+ function tempPath(target) {
23
+ const dir = path.dirname(target);
24
+ return path.join(dir, `.clarvis-tmp-${uniqueToken()}`);
25
+ }
26
+ async function stage(target, content) {
27
+ const dir = path.dirname(target);
28
+ const createdDir = await fs.mkdir(dir, { recursive: true });
29
+ const tmp = tempPath(target);
30
+ const fh = await fs.open(tmp, "wx");
31
+ try {
32
+ await fh.writeFile(content, "utf8");
33
+ await fh.sync();
34
+ }
35
+ finally {
36
+ await fh.close();
37
+ }
38
+ return { tmp, createdDir };
39
+ }
40
+ async function removeCreatedDirs(dirs) {
41
+ for (const dir of dirs) {
42
+ if (dir !== undefined)
43
+ await fs.rm(dir, { recursive: true, force: true }).catch(() => { });
44
+ }
45
+ }
46
+ async function captureMode(target) {
47
+ try {
48
+ return (await fs.stat(target)).mode & 0o777;
49
+ }
50
+ catch {
51
+ return undefined;
52
+ }
53
+ }
54
+ async function assertNotSymlink(target) {
55
+ const lst = await fs.lstat(target).catch(() => null);
56
+ if (lst?.isSymbolicLink()) {
57
+ throw new ToolError("invalid_input", `Refusing to write through a symlink: ${target}`, {
58
+ path: target,
59
+ });
60
+ }
61
+ }
62
+ async function fsyncDir(dir) {
63
+ let dh;
64
+ try {
65
+ dh = await fs.open(dir, "r");
66
+ }
67
+ catch {
68
+ return;
69
+ }
70
+ try {
71
+ await dh.sync();
72
+ }
73
+ catch {
74
+ return;
75
+ }
76
+ finally {
77
+ await dh.close();
78
+ }
79
+ }
80
+ export async function writeAtomic(target, content) {
81
+ await assertNotSymlink(target);
82
+ const { tmp, createdDir } = await stage(target, content);
83
+ try {
84
+ const mode = await captureMode(target);
85
+ if (mode !== undefined)
86
+ await fs.chmod(tmp, mode);
87
+ await fs.rename(tmp, target);
88
+ }
89
+ catch (err) {
90
+ await fs.rm(tmp, { force: true });
91
+ await removeCreatedDirs([createdDir]);
92
+ throw err;
93
+ }
94
+ await fsyncDir(path.dirname(target));
95
+ }
96
+ async function cleanupStaged(staged) {
97
+ for (const tmp of staged.values())
98
+ await fs.rm(tmp, { force: true }).catch(() => { });
99
+ }
100
+ async function stageAll(ops, createdDirs) {
101
+ const staged = new Map();
102
+ try {
103
+ for (const op of ops) {
104
+ if (op.type === "create" || op.type === "modify") {
105
+ const { tmp, createdDir } = await stage(op.path, op.content ?? "");
106
+ staged.set(op.path, tmp);
107
+ createdDirs.push(createdDir);
108
+ }
109
+ else if (op.type === "rename") {
110
+ if (op.content !== undefined) {
111
+ const { tmp, createdDir } = await stage(op.path, op.content);
112
+ staged.set(op.path, tmp);
113
+ createdDirs.push(createdDir);
114
+ }
115
+ else {
116
+ createdDirs.push(await fs.mkdir(path.dirname(op.path), { recursive: true }));
117
+ }
118
+ }
119
+ }
120
+ }
121
+ catch (err) {
122
+ await cleanupStaged(staged);
123
+ throw err;
124
+ }
125
+ return staged;
126
+ }
127
+ async function validateTargets(ops) {
128
+ const modes = new Map();
129
+ for (const op of ops) {
130
+ if (op.type === "rename") {
131
+ const from = op.from;
132
+ const to = op.path;
133
+ await assertNotSymlink(from);
134
+ await assertNotSymlink(to);
135
+ let stFrom;
136
+ try {
137
+ stFrom = await fs.stat(from);
138
+ }
139
+ catch (err) {
140
+ if (err.code === "ENOENT") {
141
+ throw new ToolError("not_found", `Rename source does not exist: ${from}`, { path: from });
142
+ }
143
+ throw err;
144
+ }
145
+ if (stFrom.isDirectory()) {
146
+ throw new ToolError("not_a_file", `Rename source is a directory: ${from}`, { path: from });
147
+ }
148
+ let toExists = true;
149
+ try {
150
+ await fs.stat(to);
151
+ }
152
+ catch (err) {
153
+ if (err.code === "ENOENT")
154
+ toExists = false;
155
+ else
156
+ throw err;
157
+ }
158
+ if (toExists) {
159
+ throw new ToolError("invalid_input", `Rename destination already exists: ${to}`, {
160
+ path: to,
161
+ });
162
+ }
163
+ modes.set(to, stFrom.mode & 0o777);
164
+ continue;
165
+ }
166
+ await assertNotSymlink(op.path);
167
+ let st;
168
+ try {
169
+ st = await fs.stat(op.path);
170
+ }
171
+ catch (err) {
172
+ if (err.code !== "ENOENT")
173
+ throw err;
174
+ modes.set(op.path, undefined);
175
+ continue;
176
+ }
177
+ if (st.isDirectory()) {
178
+ throw new ToolError("not_a_file", `Path is a directory: ${op.path}`, { path: op.path });
179
+ }
180
+ modes.set(op.path, st.mode & 0o777);
181
+ }
182
+ return modes;
183
+ }
184
+ async function commitWithRollback(ops, staged, modes) {
185
+ const committed = [];
186
+ try {
187
+ for (const op of ops) {
188
+ if (op.type === "rename") {
189
+ const from = op.from;
190
+ const to = op.path;
191
+ const mode = modes.get(to);
192
+ const rec = { op, backup: undefined };
193
+ committed.push(rec);
194
+ const tmp = staged.get(to);
195
+ if (tmp !== undefined) {
196
+ const fromBkp = tempPath(from);
197
+ await fs.rename(from, fromBkp);
198
+ rec.fromBackup = fromBkp;
199
+ if (mode !== undefined)
200
+ await fs.chmod(tmp, mode);
201
+ await fs.rename(tmp, to);
202
+ }
203
+ else {
204
+ await fs.rename(from, to);
205
+ rec.renamed = true;
206
+ }
207
+ continue;
208
+ }
209
+ const mode = modes.get(op.path);
210
+ let backup;
211
+ const bkp = tempPath(op.path);
212
+ try {
213
+ await fs.rename(op.path, bkp);
214
+ backup = bkp;
215
+ }
216
+ catch (err) {
217
+ if (err.code !== "ENOENT")
218
+ throw err;
219
+ backup = undefined;
220
+ }
221
+ committed.push({ op, backup });
222
+ if (op.type !== "delete") {
223
+ const tmp = staged.get(op.path);
224
+ if (tmp === undefined)
225
+ throw new Error(`internal: no staged content for ${op.path}`);
226
+ if (mode !== undefined)
227
+ await fs.chmod(tmp, mode);
228
+ await fs.rename(tmp, op.path);
229
+ }
230
+ }
231
+ }
232
+ catch (err) {
233
+ const unrestored = [];
234
+ for (let i = committed.length - 1; i >= 0; i--) {
235
+ const rec = committed[i];
236
+ const { op, backup } = rec;
237
+ try {
238
+ if (op.type === "rename") {
239
+ const from = op.from;
240
+ const to = op.path;
241
+ if (rec.fromBackup !== undefined) {
242
+ await fs.rm(to, { force: true });
243
+ await fs.rename(rec.fromBackup, from);
244
+ }
245
+ else if (rec.renamed) {
246
+ await fs.rename(to, from);
247
+ }
248
+ continue;
249
+ }
250
+ if (op.type !== "delete")
251
+ await fs.rm(op.path, { force: true });
252
+ if (backup !== undefined)
253
+ await fs.rename(backup, op.path);
254
+ }
255
+ catch {
256
+ if (op.type === "rename" && rec.renamed && rec.fromBackup === undefined) {
257
+ unrestored.push(`${op.from} (original content preserved at ${op.path})`);
258
+ }
259
+ else {
260
+ unrestored.push(`${op.type === "rename" ? op.from : op.path} ` +
261
+ "(original content preserved in an adjacent .clarvis-tmp-* backup)");
262
+ }
263
+ }
264
+ }
265
+ await cleanupStaged(staged);
266
+ if (unrestored.length > 0) {
267
+ throw new ToolError("io_error", `${err.message}; rollback could not restore ${unrestored.join(", ")}`);
268
+ }
269
+ throw err;
270
+ }
271
+ return committed;
272
+ }
273
+ export async function applyOpsAtomic(ops) {
274
+ const createdDirs = [];
275
+ try {
276
+ const staged = await stageAll(ops, createdDirs);
277
+ let modes;
278
+ try {
279
+ modes = await validateTargets(ops);
280
+ }
281
+ catch (err) {
282
+ await cleanupStaged(staged);
283
+ throw err;
284
+ }
285
+ const committed = await commitWithRollback(ops, staged, modes);
286
+ const dirs = new Set();
287
+ for (const op of ops) {
288
+ dirs.add(path.dirname(op.path));
289
+ if (op.type === "rename" && op.from !== undefined)
290
+ dirs.add(path.dirname(op.from));
291
+ }
292
+ for (const dir of dirs) {
293
+ await fsyncDir(dir);
294
+ }
295
+ for (const { backup, fromBackup } of committed) {
296
+ if (backup !== undefined)
297
+ await fs.rm(backup, { force: true }).catch(() => { });
298
+ if (fromBackup !== undefined)
299
+ await fs.rm(fromBackup, { force: true }).catch(() => { });
300
+ }
301
+ }
302
+ catch (err) {
303
+ await removeCreatedDirs(createdDirs);
304
+ throw err;
305
+ }
306
+ }
307
+ //# sourceMappingURL=atomic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic.js","sourceRoot":"","sources":["../../src/lib/atomic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function isBinary(buf: Buffer): boolean;
2
+ export declare function isUtf16Bom(buf: Buffer): boolean;
3
+ //# sourceMappingURL=binary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../../src/lib/binary.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAW7C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAK/C"}
@@ -0,0 +1,20 @@
1
+ const SCAN_BYTES = 8000;
2
+ export function isBinary(buf) {
3
+ const head = Math.min(buf.length, SCAN_BYTES);
4
+ for (let i = 0; i < head; i++) {
5
+ if (buf[i] === 0)
6
+ return true;
7
+ }
8
+ if (buf.length > SCAN_BYTES) {
9
+ for (let i = Math.max(head, buf.length - SCAN_BYTES); i < buf.length; i++) {
10
+ if (buf[i] === 0)
11
+ return true;
12
+ }
13
+ }
14
+ return false;
15
+ }
16
+ export function isUtf16Bom(buf) {
17
+ return (buf.length >= 2 &&
18
+ ((buf[0] === 0xff && buf[1] === 0xfe) || (buf[0] === 0xfe && buf[1] === 0xff)));
19
+ }
20
+ //# sourceMappingURL=binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary.js","sourceRoot":"","sources":["../../src/lib/binary.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAChC,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1E,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,CACL,GAAG,CAAC,MAAM,IAAI,CAAC;QACf,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAC/E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type Stats } from "node:fs";
2
+ export declare const STAT_CONCURRENCY = 32;
3
+ export declare function statDirectory(absPath: string, relForError: string): Promise<Stats>;
4
+ export declare function mapLimit<T, R>(items: T[], limit: number, fn: (item: T) => Promise<R>): Promise<R[]>;
5
+ export declare function listFiles(base: string, workspaceRoot: string, opts: {
6
+ pattern: string;
7
+ respectGitignore: boolean;
8
+ }): Promise<string[]>;
9
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/lib/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAMrD,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAWxF;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,CAAC,EACjC,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,EAAE,CAAC,CAWd;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,GACnD,OAAO,CAAC,MAAM,EAAE,CAAC,CAenB"}
@@ -0,0 +1,49 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { glob as tinyglob } from "tinyglobby";
4
+ import { ToolError, fsError } from "../errors.js";
5
+ import { loadIgnore } from "./ignore.js";
6
+ export const STAT_CONCURRENCY = 32;
7
+ export async function statDirectory(absPath, relForError) {
8
+ let stat;
9
+ try {
10
+ stat = await fs.stat(absPath);
11
+ }
12
+ catch (err) {
13
+ throw fsError(err, relForError);
14
+ }
15
+ if (!stat.isDirectory()) {
16
+ throw new ToolError("not_a_file", `Not a directory: ${relForError}`, { path: relForError });
17
+ }
18
+ return stat;
19
+ }
20
+ export async function mapLimit(items, limit, fn) {
21
+ const results = new Array(items.length);
22
+ let next = 0;
23
+ async function worker() {
24
+ while (next < items.length) {
25
+ const idx = next++;
26
+ results[idx] = await fn(items[idx]);
27
+ }
28
+ }
29
+ await Promise.all(Array.from({ length: Math.min(limit, items.length) }, () => worker()));
30
+ return results;
31
+ }
32
+ export async function listFiles(base, workspaceRoot, opts) {
33
+ const rels = await tinyglob(opts.pattern, {
34
+ cwd: base,
35
+ dot: true,
36
+ onlyFiles: true,
37
+ absolute: false,
38
+ });
39
+ const ig = opts.respectGitignore ? loadIgnore(workspaceRoot) : null;
40
+ const kept = [];
41
+ for (const rel of rels) {
42
+ const abs = path.resolve(base, rel);
43
+ if (ig && ig.ignores(path.relative(workspaceRoot, abs)))
44
+ continue;
45
+ kept.push(abs);
46
+ }
47
+ return kept;
48
+ }
49
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/lib/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAc,MAAM,SAAS,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,WAAmB;IACtE,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,CAAC,GAA4B,EAAE,WAAW,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,YAAY,EAAE,oBAAoB,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAAU,EACV,KAAa,EACb,EAA2B;IAE3B,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,UAAU,MAAM;QACnB,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,aAAqB,EACrB,IAAoD;IAEpD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE;QACxC,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,IAAI;QACT,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAAE,SAAS;QAClE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface Matcher {
2
+ ignores(relPath: string): boolean;
3
+ }
4
+ export declare function loadIgnore(workspaceRoot: string): Matcher;
5
+ //# sourceMappingURL=ignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../../src/lib/ignore.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAgCD,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAoEzD"}
@@ -0,0 +1,106 @@
1
+ import { createRequire } from "node:module";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { warn } from "./log.js";
6
+ const makeIgnore = createRequire(import.meta.url)("ignore");
7
+ function readFileSafe(p) {
8
+ try {
9
+ return readFileSync(p, "utf8");
10
+ }
11
+ catch {
12
+ return undefined;
13
+ }
14
+ }
15
+ function findIgnoreRoot(start) {
16
+ let dir = start;
17
+ for (;;) {
18
+ if (existsSync(path.join(dir, ".git")))
19
+ return dir;
20
+ const parent = path.dirname(dir);
21
+ if (parent === dir)
22
+ return start;
23
+ dir = parent;
24
+ }
25
+ }
26
+ function globalExcludesPath() {
27
+ const xdg = process.env.XDG_CONFIG_HOME;
28
+ const candidate = xdg
29
+ ? path.join(xdg, "git", "ignore")
30
+ : path.join(os.homedir(), ".config", "git", "ignore");
31
+ return existsSync(candidate) ? candidate : undefined;
32
+ }
33
+ function toPosix(p) {
34
+ return p.split(path.sep).join("/");
35
+ }
36
+ export function loadIgnore(workspaceRoot) {
37
+ const ignoreRoot = findIgnoreRoot(workspaceRoot);
38
+ const base = makeIgnore();
39
+ base.add(".git\n.clarvis\n.clarvis-tmp-*");
40
+ const infoExclude = readFileSafe(path.join(ignoreRoot, ".git", "info", "exclude"));
41
+ if (infoExclude !== undefined)
42
+ base.add(infoExclude);
43
+ const globalPath = globalExcludesPath();
44
+ if (globalPath) {
45
+ const g = readFileSafe(globalPath);
46
+ if (g !== undefined)
47
+ base.add(g);
48
+ }
49
+ const perDir = new Map();
50
+ function dirMatcher(dir) {
51
+ const cached = perDir.get(dir);
52
+ if (cached !== undefined)
53
+ return cached;
54
+ const gitignorePath = path.join(dir, ".gitignore");
55
+ const content = readFileSafe(gitignorePath);
56
+ if (content === undefined && existsSync(gitignorePath)) {
57
+ warn(`clarvis-agent-tools: warning: cannot read ${gitignorePath}\n`);
58
+ }
59
+ const m = content !== undefined ? makeIgnore().add(content) : null;
60
+ perDir.set(dir, m);
61
+ return m;
62
+ }
63
+ function dirsFromRootTo(dir) {
64
+ const chain = [];
65
+ let cur = dir;
66
+ for (;;) {
67
+ chain.push(cur);
68
+ if (cur === ignoreRoot)
69
+ return chain.reverse();
70
+ const parent = path.dirname(cur);
71
+ if (parent === cur)
72
+ return [];
73
+ cur = parent;
74
+ }
75
+ }
76
+ function apply(m, rel, current) {
77
+ if (!rel || rel.startsWith("../"))
78
+ return current;
79
+ const r = m.test(rel);
80
+ if (r.ignored)
81
+ return true;
82
+ if (r.unignored)
83
+ return false;
84
+ return current;
85
+ }
86
+ return {
87
+ ignores(relPath) {
88
+ if (!relPath || relPath === ".")
89
+ return false;
90
+ const norm = toPosix(relPath);
91
+ if (norm.startsWith("../") || path.isAbsolute(norm))
92
+ return false;
93
+ const abs = path.resolve(workspaceRoot, relPath);
94
+ if (toPosix(path.relative(ignoreRoot, abs)).split("/").includes(".git"))
95
+ return true;
96
+ let decision = apply(base, toPosix(path.relative(ignoreRoot, abs)), undefined);
97
+ for (const dir of dirsFromRootTo(path.dirname(abs))) {
98
+ const m = dirMatcher(dir);
99
+ if (m)
100
+ decision = apply(m, toPosix(path.relative(dir, abs)), decision);
101
+ }
102
+ return decision === true;
103
+ },
104
+ };
105
+ }
106
+ //# sourceMappingURL=ignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/lib/ignore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type WarnSink = (message: string) => void;
2
+ export declare function warn(message: string): void;
3
+ export declare function setWarnSink(fn: WarnSink | null): void;
4
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAQjD,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAErD"}
@@ -0,0 +1,11 @@
1
+ const defaultSink = (message) => {
2
+ process.stderr.write(message);
3
+ };
4
+ let sink = defaultSink;
5
+ export function warn(message) {
6
+ sink(message);
7
+ }
8
+ export function setWarnSink(fn) {
9
+ sink = fn ?? defaultSink;
10
+ }
11
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAa,CAAC,OAAO,EAAE,EAAE;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,IAAI,IAAI,GAAa,WAAW,CAAC;AAEjC,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAmB;IAC7C,IAAI,GAAG,EAAE,IAAI,WAAW,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface Span {
2
+ start: number;
3
+ end: number;
4
+ }
5
+ export declare const trimEnds: (s: string) => string;
6
+ export declare function scanLineBlocks(hay: string[], need: string[], eq: (hayLine: string, needLine: string) => boolean, cap?: number): number[];
7
+ export declare function findCascadeMatch(text: string, oldString: string): {
8
+ spans: Span[];
9
+ } | null;
10
+ //# sourceMappingURL=match-cascade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-cascade.d.ts","sourceRoot":"","sources":["../../src/lib/match-cascade.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,KAAG,MAAyD,CAAC;AA0B/F,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,EAClD,GAAG,SAAW,GACb,MAAM,EAAE,CAiBV;AAkGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,GAAG,IAAI,CAyB1F"}