engimcp 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 (134) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/LICENSE +21 -0
  3. package/README.md +345 -0
  4. package/dist/audit/auditLog.d.ts +9 -0
  5. package/dist/audit/auditLog.js +20 -0
  6. package/dist/audit/auditLog.js.map +1 -0
  7. package/dist/bom/bomService.d.ts +23 -0
  8. package/dist/bom/bomService.js +44 -0
  9. package/dist/bom/bomService.js.map +1 -0
  10. package/dist/config/projectConfig.d.ts +16 -0
  11. package/dist/config/projectConfig.js +16 -0
  12. package/dist/config/projectConfig.js.map +1 -0
  13. package/dist/config/schema.d.ts +16 -0
  14. package/dist/config/schema.js +21 -0
  15. package/dist/config/schema.js.map +1 -0
  16. package/dist/context/contextPack.d.ts +31 -0
  17. package/dist/context/contextPack.js +142 -0
  18. package/dist/context/contextPack.js.map +1 -0
  19. package/dist/context/tokenBudget.d.ts +1 -0
  20. package/dist/context/tokenBudget.js +4 -0
  21. package/dist/context/tokenBudget.js.map +1 -0
  22. package/dist/decisions/decisionService.d.ts +21 -0
  23. package/dist/decisions/decisionService.js +62 -0
  24. package/dist/decisions/decisionService.js.map +1 -0
  25. package/dist/dev/smokeProjectStatus.d.ts +1 -0
  26. package/dist/dev/smokeProjectStatus.js +9 -0
  27. package/dist/dev/smokeProjectStatus.js.map +1 -0
  28. package/dist/documents/documentService.d.ts +83 -0
  29. package/dist/documents/documentService.js +371 -0
  30. package/dist/documents/documentService.js.map +1 -0
  31. package/dist/documents/frontmatter.d.ts +14 -0
  32. package/dist/documents/frontmatter.js +30 -0
  33. package/dist/documents/frontmatter.js.map +1 -0
  34. package/dist/documents/headings.d.ts +6 -0
  35. package/dist/documents/headings.js +15 -0
  36. package/dist/documents/headings.js.map +1 -0
  37. package/dist/documents/markdownParser.d.ts +2 -0
  38. package/dist/documents/markdownParser.js +3 -0
  39. package/dist/documents/markdownParser.js.map +1 -0
  40. package/dist/documents/sectionPatch.d.ts +7 -0
  41. package/dist/documents/sectionPatch.js +73 -0
  42. package/dist/documents/sectionPatch.js.map +1 -0
  43. package/dist/documents/templates.d.ts +1 -0
  44. package/dist/documents/templates.js +62 -0
  45. package/dist/documents/templates.js.map +1 -0
  46. package/dist/filesystem/filesystemService.d.ts +168 -0
  47. package/dist/filesystem/filesystemService.js +606 -0
  48. package/dist/filesystem/filesystemService.js.map +1 -0
  49. package/dist/git/gitAdapter.d.ts +25 -0
  50. package/dist/git/gitAdapter.js +99 -0
  51. package/dist/git/gitAdapter.js.map +1 -0
  52. package/dist/graph/graphBuilder.d.ts +27 -0
  53. package/dist/graph/graphBuilder.js +126 -0
  54. package/dist/graph/graphBuilder.js.map +1 -0
  55. package/dist/graph/impact.d.ts +18 -0
  56. package/dist/graph/impact.js +53 -0
  57. package/dist/graph/impact.js.map +1 -0
  58. package/dist/graph/relations.d.ts +7 -0
  59. package/dist/graph/relations.js +28 -0
  60. package/dist/graph/relations.js.map +1 -0
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.js +16 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/mcp/errors.d.ts +5 -0
  65. package/dist/mcp/errors.js +11 -0
  66. package/dist/mcp/errors.js.map +1 -0
  67. package/dist/mcp/prompts.d.ts +2 -0
  68. package/dist/mcp/prompts.js +39 -0
  69. package/dist/mcp/prompts.js.map +1 -0
  70. package/dist/mcp/resources.d.ts +2 -0
  71. package/dist/mcp/resources.js +36 -0
  72. package/dist/mcp/resources.js.map +1 -0
  73. package/dist/mcp/tools.d.ts +2 -0
  74. package/dist/mcp/tools.js +431 -0
  75. package/dist/mcp/tools.js.map +1 -0
  76. package/dist/project/pathSafety.d.ts +6 -0
  77. package/dist/project/pathSafety.js +137 -0
  78. package/dist/project/pathSafety.js.map +1 -0
  79. package/dist/project/projectInit.d.ts +11 -0
  80. package/dist/project/projectInit.js +81 -0
  81. package/dist/project/projectInit.js.map +1 -0
  82. package/dist/project/projectService.d.ts +36 -0
  83. package/dist/project/projectService.js +60 -0
  84. package/dist/project/projectService.js.map +1 -0
  85. package/dist/project/writeGuards.d.ts +3 -0
  86. package/dist/project/writeGuards.js +46 -0
  87. package/dist/project/writeGuards.js.map +1 -0
  88. package/dist/requirements/requirementService.d.ts +19 -0
  89. package/dist/requirements/requirementService.js +72 -0
  90. package/dist/requirements/requirementService.js.map +1 -0
  91. package/dist/runtime/options.d.ts +7 -0
  92. package/dist/runtime/options.js +34 -0
  93. package/dist/runtime/options.js.map +1 -0
  94. package/dist/search/ftsIndex.d.ts +29 -0
  95. package/dist/search/ftsIndex.js +96 -0
  96. package/dist/search/ftsIndex.js.map +1 -0
  97. package/dist/search/searchService.d.ts +20 -0
  98. package/dist/search/searchService.js +17 -0
  99. package/dist/search/searchService.js.map +1 -0
  100. package/dist/server.d.ts +2 -0
  101. package/dist/server.js +16 -0
  102. package/dist/server.js.map +1 -0
  103. package/dist/storage/sqlite.d.ts +15 -0
  104. package/dist/storage/sqlite.js +80 -0
  105. package/dist/storage/sqlite.js.map +1 -0
  106. package/dist/tasks/taskService.d.ts +17 -0
  107. package/dist/tasks/taskService.js +57 -0
  108. package/dist/tasks/taskService.js.map +1 -0
  109. package/dist/utils/atomicWrite.d.ts +1 -0
  110. package/dist/utils/atomicWrite.js +10 -0
  111. package/dist/utils/atomicWrite.js.map +1 -0
  112. package/dist/utils/errors.d.ts +1 -0
  113. package/dist/utils/errors.js +2 -0
  114. package/dist/utils/errors.js.map +1 -0
  115. package/dist/utils/ids.d.ts +3 -0
  116. package/dist/utils/ids.js +25 -0
  117. package/dist/utils/ids.js.map +1 -0
  118. package/dist/validation/checks.d.ts +1 -0
  119. package/dist/validation/checks.js +2 -0
  120. package/dist/validation/checks.js.map +1 -0
  121. package/dist/validation/validator.d.ts +18 -0
  122. package/dist/validation/validator.js +131 -0
  123. package/dist/validation/validator.js.map +1 -0
  124. package/dist/verification/testReportService.d.ts +19 -0
  125. package/dist/verification/testReportService.js +42 -0
  126. package/dist/verification/testReportService.js.map +1 -0
  127. package/dist/version.d.ts +1 -0
  128. package/dist/version.js +2 -0
  129. package/dist/version.js.map +1 -0
  130. package/package.json +49 -0
  131. package/templates/design_doc.md +24 -0
  132. package/templates/edr.md +58 -0
  133. package/templates/requirement.md +30 -0
  134. package/templates/task.md +22 -0
@@ -0,0 +1,606 @@
1
+ import { cp, mkdir, readdir, readFile, rename, rm, stat, lstat } from "node:fs/promises";
2
+ import { constants } from "node:fs";
3
+ import path from "node:path";
4
+ import { access } from "node:fs/promises";
5
+ import { writeAuditLog } from "../audit/auditLog.js";
6
+ import { buildDocumentRegistry } from "../documents/documentService.js";
7
+ import { parseFrontmatter } from "../documents/frontmatter.js";
8
+ import { buildGraph } from "../graph/graphBuilder.js";
9
+ import { EngiMcpError } from "../mcp/errors.js";
10
+ import { assertAbsoluteRoot, isDeniedPathForRoot, resolveSafePath } from "../project/pathSafety.js";
11
+ import { assertNoGitConflictMarkers, assertPathHasNoGitConflictMarkers, assertProjectWritable } from "../project/writeGuards.js";
12
+ import { rebuildIndex } from "../storage/sqlite.js";
13
+ import { atomicWrite } from "../utils/atomicWrite.js";
14
+ import { validateProject } from "../validation/validator.js";
15
+ const defaultReadLimit = 200_000;
16
+ const treeLimit = 1_000;
17
+ export async function fsList(input) {
18
+ const root = assertAbsoluteRoot(input.root);
19
+ const base = await resolveSafePath(root, input.path ?? ".");
20
+ const baseStat = await stat(base);
21
+ if (!baseStat.isDirectory()) {
22
+ throw new EngiMcpError("NOT_DIRECTORY", `Path is not a directory: ${input.path ?? "."}`);
23
+ }
24
+ const items = await listDirectory(root, base, {
25
+ recursive: input.recursive ?? false,
26
+ includeHidden: input.include_hidden ?? false
27
+ });
28
+ return { items };
29
+ }
30
+ export async function fsTree(input) {
31
+ const root = assertAbsoluteRoot(input.root);
32
+ const startPath = input.path ?? ".";
33
+ const base = await resolveSafePath(root, startPath);
34
+ const maxDepth = input.max_depth ?? 4;
35
+ const includeFiles = input.include_files ?? true;
36
+ const includeDirs = input.include_dirs ?? true;
37
+ const items = [];
38
+ const warnings = [];
39
+ let truncated = false;
40
+ async function walk(directory, depth) {
41
+ if (truncated || depth > maxDepth) {
42
+ return;
43
+ }
44
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
45
+ const absolutePath = path.join(directory, entry.name);
46
+ const relativePath = normalizeRelative(root, absolutePath);
47
+ if (await isDeniedPathForRoot(root, relativePath)) {
48
+ continue;
49
+ }
50
+ if (items.length >= treeLimit) {
51
+ truncated = true;
52
+ warnings.push(`Tree output truncated at ${treeLimit} items.`);
53
+ return;
54
+ }
55
+ const entryStat = await lstat(absolutePath);
56
+ const type = entryType(entryStat);
57
+ if ((type === "dir" && includeDirs) || (type !== "dir" && includeFiles)) {
58
+ items.push(toEntry(root, absolutePath, entryStat));
59
+ }
60
+ if (type === "dir" && depth < maxDepth) {
61
+ await walk(absolutePath, depth + 1);
62
+ }
63
+ }
64
+ }
65
+ await walk(base, 1);
66
+ return {
67
+ root,
68
+ path: startPath,
69
+ items,
70
+ truncated,
71
+ warnings
72
+ };
73
+ }
74
+ export async function fsRead(input) {
75
+ const root = assertAbsoluteRoot(input.root);
76
+ const absolutePath = await resolveSafePath(root, input.path);
77
+ const fileStat = await stat(absolutePath);
78
+ const type = entryType(fileStat);
79
+ const maxBytes = input.max_bytes ?? defaultReadLimit;
80
+ if (!fileStat.isFile()) {
81
+ throw new EngiMcpError("NOT_FILE", `Path is not a file: ${input.path}`);
82
+ }
83
+ if (input.mode === "metadata_only") {
84
+ return {
85
+ path: normalizeRelative(root, absolutePath),
86
+ type,
87
+ encoding: "utf-8",
88
+ size: fileStat.size,
89
+ truncated: false
90
+ };
91
+ }
92
+ const buffer = await readFile(absolutePath);
93
+ const slice = sliceBuffer(buffer, {
94
+ mode: input.mode ?? "full",
95
+ maxBytes,
96
+ offset: input.offset,
97
+ length: input.length
98
+ });
99
+ return {
100
+ path: normalizeRelative(root, absolutePath),
101
+ type,
102
+ encoding: "utf-8",
103
+ content: slice.buffer.toString("utf8"),
104
+ size: fileStat.size,
105
+ truncated: slice.truncated
106
+ };
107
+ }
108
+ export async function fsWrite(input) {
109
+ const root = assertAbsoluteRoot(input.root);
110
+ await assertProjectWritable(root);
111
+ const absolutePath = await resolveSafePath(root, input.path);
112
+ const mode = input.mode ?? "create_new";
113
+ const createDirs = input.create_dirs ?? true;
114
+ const exists = await pathExists(absolutePath);
115
+ if (mode === "create_new" && exists) {
116
+ throw new EngiMcpError("ALREADY_EXISTS", `File already exists: ${input.path}`);
117
+ }
118
+ if (!createDirs && !(await pathExists(path.dirname(absolutePath)))) {
119
+ throw new EngiMcpError("PARENT_NOT_FOUND", `Parent directory does not exist: ${input.path}`);
120
+ }
121
+ const before = exists ? await readFile(absolutePath, "utf8") : "";
122
+ if (exists) {
123
+ assertNoGitConflictMarkers(before, normalizeRelative(root, absolutePath));
124
+ }
125
+ const nextContent = mode === "append" ? `${before}${input.content}` : input.content;
126
+ validateManagedMarkdown(nextContent, input.path);
127
+ const diffSummary = summarizeContentChange(before, nextContent, exists);
128
+ if (input.dry_run) {
129
+ return {
130
+ ok: true,
131
+ path: normalizeRelative(root, absolutePath),
132
+ created: !exists,
133
+ changed: before !== nextContent,
134
+ diff_summary: `dry run: ${diffSummary}`,
135
+ content: nextContent
136
+ };
137
+ }
138
+ if (createDirs) {
139
+ await mkdir(path.dirname(absolutePath), { recursive: true });
140
+ }
141
+ await atomicWrite(absolutePath, nextContent);
142
+ const auditId = await writeAuditLog({
143
+ root,
144
+ tool: "engi_fs_write",
145
+ target: normalizeRelative(root, absolutePath),
146
+ operation: mode,
147
+ result: "ok",
148
+ diff_summary: diffSummary
149
+ });
150
+ return {
151
+ ok: true,
152
+ path: normalizeRelative(root, absolutePath),
153
+ created: !exists,
154
+ changed: before !== nextContent,
155
+ diff_summary: diffSummary,
156
+ index: await rebuildIndex(root),
157
+ audit_id: auditId
158
+ };
159
+ }
160
+ export async function fsMkdir(input) {
161
+ const root = assertAbsoluteRoot(input.root);
162
+ await assertProjectWritable(root);
163
+ const absolutePath = await resolveSafePath(root, input.path);
164
+ const exists = await pathExists(absolutePath);
165
+ const relativePath = normalizeRelative(root, absolutePath);
166
+ if (input.dry_run) {
167
+ return { ok: true, created_paths: exists ? [] : [relativePath] };
168
+ }
169
+ await mkdir(absolutePath, { recursive: input.parents ?? true });
170
+ const auditId = await writeAuditLog({
171
+ root,
172
+ tool: "engi_fs_mkdir",
173
+ target: relativePath,
174
+ operation: "mkdir",
175
+ result: "ok",
176
+ diff_summary: exists ? "directory already exists" : "directory created"
177
+ });
178
+ return {
179
+ ok: true,
180
+ created_paths: exists ? [] : [relativePath],
181
+ index: await rebuildIndex(root),
182
+ audit_id: auditId
183
+ };
184
+ }
185
+ export async function fsMove(input) {
186
+ const root = assertAbsoluteRoot(input.root);
187
+ await assertProjectWritable(root);
188
+ const sourcePath = await resolveSafePath(root, input.source);
189
+ const targetPath = await resolveSafePath(root, input.target);
190
+ await ensureExists(sourcePath, input.source);
191
+ await ensureTargetPolicy(targetPath, input.target, input.overwrite ?? false);
192
+ if (input.overwrite) {
193
+ await assertPathHasNoGitConflictMarkers(targetPath, normalizeRelative(root, targetPath));
194
+ }
195
+ const warnings = await managedDocumentWarnings(root, sourcePath);
196
+ const moved = [
197
+ { from: normalizeRelative(root, sourcePath), to: normalizeRelative(root, targetPath) }
198
+ ];
199
+ const linkUpdatePreview = await updateMovedPathLinks(root, moved[0].from, moved[0].to, true);
200
+ if (input.update_links !== true && linkUpdatePreview.length > 0) {
201
+ warnings.push(`Manual link updates required in: ${linkUpdatePreview.join(", ")}`);
202
+ }
203
+ if (input.dry_run) {
204
+ return { ok: true, moved, links_updated: linkUpdatePreview, warnings };
205
+ }
206
+ await mkdir(path.dirname(targetPath), { recursive: true });
207
+ if (input.overwrite && (await pathExists(targetPath))) {
208
+ await rm(targetPath, { recursive: true, force: true });
209
+ }
210
+ await rename(sourcePath, targetPath);
211
+ const linksUpdated = input.update_links === true
212
+ ? await updateMovedPathLinks(root, moved[0].from, moved[0].to, false)
213
+ : [];
214
+ const auditId = await writeAuditLog({
215
+ root,
216
+ tool: "engi_fs_move",
217
+ target: `${moved[0].from} -> ${moved[0].to}`,
218
+ operation: "move",
219
+ result: "ok",
220
+ diff_summary: "moved 1 path"
221
+ });
222
+ return {
223
+ ok: true,
224
+ moved,
225
+ links_updated: linksUpdated,
226
+ warnings,
227
+ index: await rebuildIndex(root),
228
+ audit_id: auditId
229
+ };
230
+ }
231
+ export async function fsCopy(input) {
232
+ const root = assertAbsoluteRoot(input.root);
233
+ await assertProjectWritable(root);
234
+ const sourcePath = await resolveSafePath(root, input.source);
235
+ const targetPath = await resolveSafePath(root, input.target);
236
+ await ensureExists(sourcePath, input.source);
237
+ await ensureTargetPolicy(targetPath, input.target, input.overwrite ?? false);
238
+ if (input.overwrite) {
239
+ await assertPathHasNoGitConflictMarkers(targetPath, normalizeRelative(root, targetPath));
240
+ }
241
+ await assertNoDeniedDescendants(root, sourcePath);
242
+ const copied = [
243
+ { from: normalizeRelative(root, sourcePath), to: normalizeRelative(root, targetPath) }
244
+ ];
245
+ if (input.dry_run) {
246
+ return { ok: true, copied };
247
+ }
248
+ await mkdir(path.dirname(targetPath), { recursive: true });
249
+ await cp(sourcePath, targetPath, {
250
+ recursive: true,
251
+ force: input.overwrite ?? false,
252
+ errorOnExist: !(input.overwrite ?? false)
253
+ });
254
+ const auditId = await writeAuditLog({
255
+ root,
256
+ tool: "engi_fs_copy",
257
+ target: `${copied[0].from} -> ${copied[0].to}`,
258
+ operation: "copy",
259
+ result: "ok",
260
+ diff_summary: "copied 1 path"
261
+ });
262
+ return {
263
+ ok: true,
264
+ copied,
265
+ validation: await validateProject({ root }),
266
+ index: await rebuildIndex(root),
267
+ audit_id: auditId
268
+ };
269
+ }
270
+ export async function fsDelete(input) {
271
+ const root = assertAbsoluteRoot(input.root);
272
+ await assertProjectWritable(root);
273
+ const absolutePath = await resolveSafePath(root, input.path);
274
+ const sourceStat = await lstat(absolutePath);
275
+ const mode = input.mode ?? "trash";
276
+ if (mode !== "trash") {
277
+ throw new EngiMcpError("INVALID_DELETE_MODE", "Only trash delete is supported in the MVP.");
278
+ }
279
+ if (sourceStat.isDirectory() && !(input.recursive ?? false)) {
280
+ throw new EngiMcpError("RECURSIVE_DELETE_REQUIRED", "Directory delete requires recursive=true.");
281
+ }
282
+ const relativePath = normalizeRelative(root, absolutePath);
283
+ const linkImpact = await linkImpactForManagedDocument(root, absolutePath);
284
+ const brokenLinks = linkImpact.incoming;
285
+ const warnings = linkImpact.outgoing.length > 0
286
+ ? [`Deleted managed document had outgoing links to: ${linkImpact.outgoing.join(", ")}`]
287
+ : [];
288
+ if (brokenLinks.length > 0 && !(input.force ?? false)) {
289
+ throw new EngiMcpError("BROKEN_LINKS_WOULD_BE_CREATED", `Deleting ${relativePath} would break incoming links: ${brokenLinks.join(", ")}`);
290
+ }
291
+ const trashPath = path.join(".engimcp", "trash", new Date().toISOString().slice(0, 10), relativePath);
292
+ const absoluteTrashPath = await resolveSafePath(root, trashPath);
293
+ const deleted = [
294
+ { path: relativePath, mode, trash_path: normalizeRelative(root, absoluteTrashPath) }
295
+ ];
296
+ if (input.dry_run) {
297
+ return { ok: true, deleted, broken_links_created: brokenLinks, warnings };
298
+ }
299
+ await mkdir(path.dirname(absoluteTrashPath), { recursive: true });
300
+ await rename(absolutePath, absoluteTrashPath);
301
+ await appendTrashManifest(root, {
302
+ original_path: relativePath,
303
+ trash_path: normalizeRelative(root, absoluteTrashPath),
304
+ reason: input.reason
305
+ });
306
+ const auditId = await writeAuditLog({
307
+ root,
308
+ tool: "engi_fs_delete",
309
+ target: relativePath,
310
+ operation: "trash",
311
+ result: "ok",
312
+ diff_summary: `moved to ${normalizeRelative(root, absoluteTrashPath)}`
313
+ });
314
+ return {
315
+ ok: true,
316
+ deleted,
317
+ broken_links_created: brokenLinks,
318
+ warnings,
319
+ index: await rebuildIndex(root),
320
+ audit_id: auditId
321
+ };
322
+ }
323
+ export async function fsExists(input) {
324
+ const root = assertAbsoluteRoot(input.root);
325
+ const relative = normalizeInputPath(input.path);
326
+ if (await isDeniedPathForRoot(root, relative)) {
327
+ return { exists: false, allowed: false };
328
+ }
329
+ const absolutePath = await resolveSafePath(root, input.path);
330
+ try {
331
+ const fileStat = await lstat(absolutePath);
332
+ return { exists: true, type: entryType(fileStat), allowed: true };
333
+ }
334
+ catch {
335
+ return { exists: false, allowed: true };
336
+ }
337
+ }
338
+ export async function fsStat(input) {
339
+ const root = assertAbsoluteRoot(input.root);
340
+ const relative = normalizeInputPath(input.path);
341
+ const denied = await isDeniedPathForRoot(root, relative);
342
+ if (denied) {
343
+ return { path: relative, is_symlink: false, denied };
344
+ }
345
+ const absolutePath = await resolveSafePath(root, input.path);
346
+ const fileStat = await lstat(absolutePath);
347
+ return {
348
+ path: normalizeRelative(root, absolutePath),
349
+ type: entryType(fileStat),
350
+ size: fileStat.size,
351
+ modified: fileStat.mtime.toISOString(),
352
+ is_symlink: fileStat.isSymbolicLink(),
353
+ denied
354
+ };
355
+ }
356
+ export async function fsGlob(input) {
357
+ const root = assertAbsoluteRoot(input.root);
358
+ const limit = input.limit ?? 200;
359
+ const patterns = input.patterns.map(globToRegExp);
360
+ const exclude = (input.exclude ?? []).map(globToRegExp);
361
+ const matches = [];
362
+ let truncated = false;
363
+ async function walk(directory) {
364
+ if (truncated) {
365
+ return;
366
+ }
367
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
368
+ const absolutePath = path.join(directory, entry.name);
369
+ const relativePath = normalizeRelative(root, absolutePath);
370
+ if ((await isDeniedPathForRoot(root, relativePath)) ||
371
+ exclude.some((pattern) => pattern.test(relativePath))) {
372
+ continue;
373
+ }
374
+ const entryStat = await lstat(absolutePath);
375
+ if (entryStat.isDirectory()) {
376
+ await walk(absolutePath);
377
+ continue;
378
+ }
379
+ if (patterns.some((pattern) => pattern.test(relativePath))) {
380
+ if (matches.length >= limit) {
381
+ truncated = true;
382
+ return;
383
+ }
384
+ matches.push(relativePath);
385
+ }
386
+ }
387
+ }
388
+ await walk(root);
389
+ return { matches: matches.sort(), truncated };
390
+ }
391
+ async function listDirectory(root, directory, options) {
392
+ const items = [];
393
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
394
+ if (!options.includeHidden && entry.name.startsWith(".")) {
395
+ continue;
396
+ }
397
+ const absolutePath = path.join(directory, entry.name);
398
+ const relativePath = normalizeRelative(root, absolutePath);
399
+ if (await isDeniedPathForRoot(root, relativePath)) {
400
+ continue;
401
+ }
402
+ const entryStat = await lstat(absolutePath);
403
+ items.push(toEntry(root, absolutePath, entryStat));
404
+ if (options.recursive && entryStat.isDirectory()) {
405
+ items.push(...(await listDirectory(root, absolutePath, options)));
406
+ }
407
+ }
408
+ return items.sort((left, right) => left.path.localeCompare(right.path));
409
+ }
410
+ function sliceBuffer(buffer, input) {
411
+ if (input.mode === "head") {
412
+ return {
413
+ buffer: buffer.subarray(0, input.maxBytes),
414
+ truncated: buffer.length > input.maxBytes
415
+ };
416
+ }
417
+ if (input.mode === "tail") {
418
+ return {
419
+ buffer: buffer.subarray(Math.max(0, buffer.length - input.maxBytes)),
420
+ truncated: buffer.length > input.maxBytes
421
+ };
422
+ }
423
+ if (input.mode === "range") {
424
+ const offset = input.offset ?? 0;
425
+ const length = Math.min(input.length ?? input.maxBytes, input.maxBytes);
426
+ return {
427
+ buffer: buffer.subarray(offset, offset + length),
428
+ truncated: offset + length < buffer.length
429
+ };
430
+ }
431
+ return { buffer: buffer.subarray(0, input.maxBytes), truncated: buffer.length > input.maxBytes };
432
+ }
433
+ function validateManagedMarkdown(content, filePath) {
434
+ if (!filePath.endsWith(".md") || !content.startsWith("---\n")) {
435
+ return;
436
+ }
437
+ const parsed = parseFrontmatter(content);
438
+ if (parsed.error) {
439
+ throw new EngiMcpError("FRONTMATTER_INVALID_AFTER_WRITE", parsed.error);
440
+ }
441
+ }
442
+ async function managedDocumentWarnings(root, absolutePath) {
443
+ const linkImpact = await linkImpactForManagedDocument(root, absolutePath);
444
+ const warnings = [];
445
+ if (linkImpact.incoming.length > 0) {
446
+ warnings.push(`Managed document has incoming links from: ${linkImpact.incoming.join(", ")}`);
447
+ }
448
+ if (linkImpact.outgoing.length > 0) {
449
+ warnings.push(`Managed document has outgoing links to: ${linkImpact.outgoing.join(", ")}`);
450
+ }
451
+ return warnings;
452
+ }
453
+ async function updateMovedPathLinks(root, oldPath, newPath, dryRun) {
454
+ const registry = await buildDocumentRegistry(root);
455
+ const changedPaths = [];
456
+ for (const document of registry.documents) {
457
+ const content = await readFile(document.absolutePath, "utf8");
458
+ const nextContent = content
459
+ .replaceAll(`](${oldPath})`, `](${newPath})`)
460
+ .replaceAll(`](${oldPath}#`, `](${newPath}#`)
461
+ .replaceAll(`[[${oldPath}]]`, `[[${newPath}]]`)
462
+ .replaceAll(`[[${oldPath}|`, `[[${newPath}|`);
463
+ if (nextContent === content) {
464
+ continue;
465
+ }
466
+ changedPaths.push(document.path);
467
+ if (!dryRun) {
468
+ assertNoGitConflictMarkers(content, document.path);
469
+ await atomicWrite(document.absolutePath, nextContent);
470
+ }
471
+ }
472
+ return changedPaths.sort();
473
+ }
474
+ async function linkImpactForManagedDocument(root, absolutePath) {
475
+ if (!absolutePath.endsWith(".md")) {
476
+ return { incoming: [], outgoing: [] };
477
+ }
478
+ const registry = await buildDocumentRegistry(root);
479
+ const relativePath = normalizeRelative(root, absolutePath);
480
+ const document = registry.byPath.get(relativePath);
481
+ if (!document?.id) {
482
+ return { incoming: [], outgoing: [] };
483
+ }
484
+ const graph = await buildGraph(root);
485
+ return {
486
+ incoming: graph.edges
487
+ .filter((edge) => edge.target_id === document.id)
488
+ .map((edge) => edge.source_path)
489
+ .sort(),
490
+ outgoing: graph.edges
491
+ .filter((edge) => edge.source_id === document.id)
492
+ .map((edge) => `${edge.relation_type}:${edge.target_id}`)
493
+ .sort()
494
+ };
495
+ }
496
+ async function appendTrashManifest(root, input) {
497
+ const manifestPath = path.join(root, ".engimcp", "trash", new Date().toISOString().slice(0, 10), "manifest.jsonl");
498
+ const existing = (await pathExists(manifestPath)) ? await readFile(manifestPath, "utf8") : "";
499
+ const record = {
500
+ ts: new Date().toISOString(),
501
+ original_path: input.original_path,
502
+ trash_path: input.trash_path,
503
+ reason: input.reason
504
+ };
505
+ await atomicWrite(manifestPath, `${existing}${JSON.stringify(record)}\n`);
506
+ }
507
+ async function ensureExists(absolutePath, inputPath) {
508
+ if (!(await pathExists(absolutePath))) {
509
+ throw new EngiMcpError("NOT_FOUND", `Path not found: ${inputPath}`);
510
+ }
511
+ }
512
+ async function ensureTargetPolicy(targetPath, inputPath, overwrite) {
513
+ if (!overwrite && (await pathExists(targetPath))) {
514
+ throw new EngiMcpError("TARGET_EXISTS", `Target already exists: ${inputPath}`);
515
+ }
516
+ }
517
+ async function assertNoDeniedDescendants(root, absolutePath) {
518
+ const relativePath = normalizeRelative(root, absolutePath);
519
+ if (await isDeniedPathForRoot(root, relativePath)) {
520
+ throw new EngiMcpError("PATH_DENIED", `Path is denied by project safety rules: ${relativePath}`);
521
+ }
522
+ const fileStat = await lstat(absolutePath);
523
+ if (!fileStat.isDirectory()) {
524
+ return;
525
+ }
526
+ for (const entry of await readdir(absolutePath, { withFileTypes: true })) {
527
+ await assertNoDeniedDescendants(root, path.join(absolutePath, entry.name));
528
+ }
529
+ }
530
+ async function pathExists(absolutePath) {
531
+ try {
532
+ await access(absolutePath, constants.F_OK);
533
+ return true;
534
+ }
535
+ catch {
536
+ return false;
537
+ }
538
+ }
539
+ function toEntry(root, absolutePath, fileStat) {
540
+ return {
541
+ path: normalizeRelative(root, absolutePath),
542
+ type: entryType(fileStat),
543
+ size: Number(fileStat.size),
544
+ modified: fileStat.mtime.toISOString()
545
+ };
546
+ }
547
+ function entryType(fileStat) {
548
+ if (fileStat.isSymbolicLink()) {
549
+ return "symlink";
550
+ }
551
+ if (fileStat.isDirectory()) {
552
+ return "dir";
553
+ }
554
+ if (fileStat.isFile()) {
555
+ return "file";
556
+ }
557
+ return "other";
558
+ }
559
+ function normalizeInputPath(inputPath) {
560
+ return inputPath.split(path.sep).join("/").replace(/^\.\//, "") || ".";
561
+ }
562
+ function normalizeRelative(root, absolutePath) {
563
+ return path.relative(root, absolutePath).split(path.sep).join("/") || ".";
564
+ }
565
+ function summarizeContentChange(before, after, existed) {
566
+ if (!existed) {
567
+ return `new file, ${after.split(/\r?\n/).length} lines`;
568
+ }
569
+ if (before === after) {
570
+ return "no changes";
571
+ }
572
+ const delta = after.split(/\r?\n/).length - before.split(/\r?\n/).length;
573
+ return delta === 0 ? "content changed" : `${Math.abs(delta)} line count delta`;
574
+ }
575
+ function globToRegExp(pattern) {
576
+ const normalized = pattern.split(path.sep).join("/");
577
+ let output = "^";
578
+ for (let index = 0; index < normalized.length; index += 1) {
579
+ const char = normalized[index];
580
+ const next = normalized[index + 1];
581
+ if (char === "*" && next === "*") {
582
+ if (normalized[index + 2] === "/") {
583
+ output += "(?:.*/)?";
584
+ index += 2;
585
+ }
586
+ else {
587
+ output += ".*";
588
+ index += 1;
589
+ }
590
+ }
591
+ else if (char === "*") {
592
+ output += "[^/]*";
593
+ }
594
+ else if (char === "?") {
595
+ output += "[^/]";
596
+ }
597
+ else {
598
+ output += escapeRegExp(char ?? "");
599
+ }
600
+ }
601
+ return new RegExp(`${output}$`);
602
+ }
603
+ function escapeRegExp(value) {
604
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
605
+ }
606
+ //# sourceMappingURL=filesystemService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystemService.js","sourceRoot":"","sources":["../../src/filesystem/filesystemService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface GitStatusSummary {
2
+ is_git_repo: boolean;
3
+ dirty: boolean;
4
+ summary: string;
5
+ files?: GitStatusFile[];
6
+ diff_summary?: string;
7
+ }
8
+ export interface GitStatusFile {
9
+ path: string;
10
+ status: string;
11
+ }
12
+ export interface ProjectSnapshotResult {
13
+ ok: boolean;
14
+ path: string;
15
+ copied_paths: string[];
16
+ }
17
+ export interface GitCommitResult {
18
+ ok: boolean;
19
+ commit: string;
20
+ message: string;
21
+ files: GitStatusFile[];
22
+ }
23
+ export declare function getGitStatus(root: string): Promise<GitStatusSummary>;
24
+ export declare function createProjectSnapshot(rootInput: string): Promise<ProjectSnapshotResult>;
25
+ export declare function createGitCommit(rootInput: string, message: string): Promise<GitCommitResult>;