@harness-engineering/cli 1.25.6 → 1.25.7

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 (52) hide show
  1. package/dist/{agents-md-2PYJM2MK.js → agents-md-QPO3H5HX.js} +3 -3
  2. package/dist/{architecture-VCLB7A23.js → architecture-IJLXRHZA.js} +4 -4
  3. package/dist/{assess-project-64C6LIKN.js → assess-project-QU6XIVJK.js} +1 -1
  4. package/dist/bin/harness-mcp.js +15 -15
  5. package/dist/bin/harness.js +25 -25
  6. package/dist/{check-phase-gate-RT6PGEHY.js → check-phase-gate-TNY64AOS.js} +4 -4
  7. package/dist/{chunk-ZAKUCM7O.js → chunk-2DF6OZLG.js} +2 -2
  8. package/dist/{chunk-XLO4AXXM.js → chunk-AS5DQT4S.js} +9 -9
  9. package/dist/{chunk-CBZECDCW.js → chunk-D3XL2FLX.js} +5 -5
  10. package/dist/{chunk-R2BI5UPK.js → chunk-E5Z6NTTQ.js} +1 -1
  11. package/dist/{chunk-VELT5VAG.js → chunk-FRDS4XGD.js} +1 -1
  12. package/dist/{chunk-EY6F2QXW.js → chunk-G5SNXUIK.js} +1 -1
  13. package/dist/{chunk-KJC4SE7C.js → chunk-GVNT2YC7.js} +9 -9
  14. package/dist/{chunk-XMEEYMGE.js → chunk-IQO7IINR.js} +1 -1
  15. package/dist/{chunk-7BAGSY5Q.js → chunk-IT2KORSK.js} +1 -1
  16. package/dist/{chunk-43VBX44J.js → chunk-JJQ3TW2E.js} +97 -91
  17. package/dist/{chunk-SMY35HJM.js → chunk-JPZY7ZQX.js} +1 -1
  18. package/dist/{chunk-FL6A72LV.js → chunk-K35D7HF3.js} +1 -1
  19. package/dist/{chunk-BUJOMC3O.js → chunk-K533WNZG.js} +38 -2
  20. package/dist/{chunk-RKZW3FDF.js → chunk-KVJZQ2MV.js} +1 -1
  21. package/dist/{chunk-WEOGCL7B.js → chunk-LTCEV7VF.js} +3 -3
  22. package/dist/{chunk-Y5JA4J2M.js → chunk-LXPRO2FH.js} +2 -2
  23. package/dist/{chunk-U2OMWI7Z.js → chunk-MCDCZMKN.js} +1 -1
  24. package/dist/{chunk-4YEBV2FT.js → chunk-MLOGYWLY.js} +2 -2
  25. package/dist/{chunk-RDQGCHKD.js → chunk-NKQEMWGT.js} +83 -66
  26. package/dist/{chunk-X2JJ3CPG.js → chunk-PCOU2UXU.js} +8 -8
  27. package/dist/{chunk-R7P2FMJT.js → chunk-SZ3Q4XEO.js} +36 -34
  28. package/dist/{chunk-JUXFYB2K.js → chunk-TQRCODRJ.js} +1 -1
  29. package/dist/{chunk-SZZ5UQL7.js → chunk-XVJRFP7W.js} +6 -6
  30. package/dist/{chunk-JQCS75DY.js → chunk-YRBNAHH4.js} +4 -4
  31. package/dist/{chunk-42ZZLMYD.js → chunk-ZIYLIYN4.js} +1 -1
  32. package/dist/{ci-workflow-SZL3KVUK.js → ci-workflow-FJYRFZYQ.js} +3 -3
  33. package/dist/{dist-GRW3X2ZQ.js → dist-HPWNWCT6.js} +1 -1
  34. package/dist/{dist-T3DGV5UN.js → dist-ZV6GO6FA.js} +2 -2
  35. package/dist/{docs-WDLJORLK.js → docs-7DW3DI4Z.js} +4 -4
  36. package/dist/{engine-2YWYRCKK.js → engine-P7EE2IWO.js} +3 -3
  37. package/dist/{entropy-PJGTOORX.js → entropy-HCXRTDFU.js} +3 -3
  38. package/dist/{feedback-M5KCJKL2.js → feedback-Y4FYN3NR.js} +1 -1
  39. package/dist/{generate-agent-definitions-MFDW6LZT.js → generate-agent-definitions-3EHPIWBO.js} +4 -4
  40. package/dist/{graph-loader-QMKXT454.js → graph-loader-KXVS3YK3.js} +1 -1
  41. package/dist/index.d.ts +14 -8
  42. package/dist/index.js +25 -25
  43. package/dist/{loader-6O52FYHE.js → loader-SKHF3JVV.js} +3 -3
  44. package/dist/{mcp-GGNFWKVC.js → mcp-MWYIPDQU.js} +15 -15
  45. package/dist/{performance-337U5URQ.js → performance-ADWH5NJY.js} +4 -4
  46. package/dist/{review-pipeline-DB5RD4SN.js → review-pipeline-TLKE5OQD.js} +3 -3
  47. package/dist/{runtime-B74EN2WD.js → runtime-7LYAW7GU.js} +3 -3
  48. package/dist/{scan-DXQUHGTT.js → scan-BGJ7TLLV.js} +1 -1
  49. package/dist/{security-3AYN6FVU.js → security-5XWINYVB.js} +1 -1
  50. package/dist/{validate-35CD7VWN.js → validate-BFFHYHY7.js} +4 -4
  51. package/dist/{validate-cross-check-LJKXBQYH.js → validate-cross-check-GQX7OVCR.js} +3 -3
  52. package/package.json +4 -4
@@ -15,7 +15,7 @@ function evictIfNeeded() {
15
15
  }
16
16
  }
17
17
  async function doLoadGraphStore(projectRoot) {
18
- const { GraphStore } = await import("./dist-GRW3X2ZQ.js");
18
+ const { GraphStore } = await import("./dist-HPWNWCT6.js");
19
19
  const graphDir = path.join(projectRoot, ".harness", "graph");
20
20
  const store = new GraphStore();
21
21
  const loaded = await store.load(graphDir);
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KET4QQZB.js";
4
4
  import {
5
5
  init_dist
6
- } from "./chunk-42ZZLMYD.js";
6
+ } from "./chunk-ZIYLIYN4.js";
7
7
  import {
8
8
  Err,
9
9
  Ok
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-42ZZLMYD.js";
3
+ } from "./chunk-ZIYLIYN4.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -84,7 +84,33 @@ function mergePackageJson(base, overlay) {
84
84
  }
85
85
 
86
86
  // src/templates/engine.ts
87
- var NON_JSON_PACKAGE_CONFIGS = /* @__PURE__ */ new Set(["pyproject.toml", "go.mod", "Cargo.toml", "pom.xml"]);
87
+ var NON_JSON_PACKAGE_CONFIGS = /* @__PURE__ */ new Set([
88
+ "pyproject.toml",
89
+ "go.mod",
90
+ "Cargo.toml",
91
+ "pom.xml",
92
+ "build.gradle",
93
+ "build.gradle.kts"
94
+ ]);
95
+ var HARNESS_CONFIG_FILES = /* @__PURE__ */ new Set(["harness.config.json", "AGENTS.md", ".harness/.gitignore"]);
96
+ function isHarnessConfigFile(relativePath) {
97
+ return HARNESS_CONFIG_FILES.has(relativePath);
98
+ }
99
+ var PROJECT_MARKERS = [
100
+ "package.json",
101
+ "pom.xml",
102
+ "build.gradle",
103
+ "build.gradle.kts",
104
+ "pyproject.toml",
105
+ "setup.py",
106
+ "requirements.txt",
107
+ "Pipfile",
108
+ "go.mod",
109
+ "Cargo.toml",
110
+ "Makefile",
111
+ "CMakeLists.txt",
112
+ "meson.build"
113
+ ];
88
114
  function scoreDetectPatterns(targetDir, patterns) {
89
115
  let score = 0;
90
116
  for (const pattern of patterns) {
@@ -244,6 +270,9 @@ var TemplateEngine = class {
244
270
  for (const file of files.files) {
245
271
  const targetPath = path.join(targetDir, file.relativePath);
246
272
  const dir = path.dirname(targetPath);
273
+ if (!options.overwrite && options.existingProject && !isHarnessConfigFile(file.relativePath)) {
274
+ continue;
275
+ }
247
276
  if (!options.overwrite && isNonJsLanguage && NON_JSON_PACKAGE_CONFIGS.has(file.relativePath) && fs.existsSync(targetPath)) {
248
277
  skippedConfigs.push(file.relativePath);
249
278
  continue;
@@ -262,6 +291,13 @@ var TemplateEngine = class {
262
291
  );
263
292
  }
264
293
  }
294
+ /**
295
+ * Check whether the target directory already contains a project by looking for
296
+ * common build/package configuration files. Returns true if any marker is found.
297
+ */
298
+ isExistingProject(targetDir) {
299
+ return PROJECT_MARKERS.some((marker) => fs.existsSync(path.join(targetDir, marker)));
300
+ }
265
301
  detectFramework(targetDir) {
266
302
  try {
267
303
  const templatesResult = this.listTemplates();
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-42ZZLMYD.js";
3
+ } from "./chunk-ZIYLIYN4.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveProjectConfig
3
- } from "./chunk-XMEEYMGE.js";
3
+ } from "./chunk-IQO7IINR.js";
4
4
  import {
5
5
  sanitizePath
6
6
  } from "./chunk-W6Y7ZW3Y.js";
@@ -49,7 +49,7 @@ async function handleValidateProject(input) {
49
49
  checks.config = "pass";
50
50
  const config = configResult.value;
51
51
  try {
52
- const core = await import("./dist-T3DGV5UN.js");
52
+ const core = await import("./dist-ZV6GO6FA.js");
53
53
  if (typeof core.validateFileStructure === "function" && Array.isArray(config.conventions)) {
54
54
  const conventions = config.conventions;
55
55
  const structureResult = await core.validateFileStructure(projectPath, conventions);
@@ -68,7 +68,7 @@ async function handleValidateProject(input) {
68
68
  } catch {
69
69
  }
70
70
  try {
71
- const core = await import("./dist-T3DGV5UN.js");
71
+ const core = await import("./dist-ZV6GO6FA.js");
72
72
  if (typeof core.validateAgentsMap === "function") {
73
73
  const agentsMapPath = path.join(projectPath, "AGENTS.md");
74
74
  const agentsResult = await core.validateAgentsMap(agentsMapPath);
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  resolveConfig
3
- } from "./chunk-JUXFYB2K.js";
3
+ } from "./chunk-TQRCODRJ.js";
4
4
  import {
5
5
  init_dist
6
- } from "./chunk-42ZZLMYD.js";
6
+ } from "./chunk-ZIYLIYN4.js";
7
7
  import {
8
8
  Ok
9
9
  } from "./chunk-RL4VMEXL.js";
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  listPersonas,
6
6
  loadPersona
7
- } from "./chunk-VELT5VAG.js";
7
+ } from "./chunk-FRDS4XGD.js";
8
8
  import {
9
9
  GENERATED_HEADER_AGENT,
10
10
  VALID_PLATFORMS,
@@ -27,7 +27,7 @@ var runSecurityScanDefinition = {
27
27
  };
28
28
  async function handleRunSecurityScan(input) {
29
29
  try {
30
- const core = await import("./dist-T3DGV5UN.js");
30
+ const core = await import("./dist-ZV6GO6FA.js");
31
31
  const projectRoot = sanitizePath(input.path);
32
32
  let configData = {};
33
33
  try {
@@ -114,7 +114,7 @@ var getSecurityTrendsDefinition = {
114
114
  };
115
115
  async function handleGetSecurityTrends(input) {
116
116
  try {
117
- const core = await import("./dist-T3DGV5UN.js");
117
+ const core = await import("./dist-ZV6GO6FA.js");
118
118
  const projectRoot = sanitizePath(input.path);
119
119
  const manager = new core.SecurityTimelineManager(projectRoot);
120
120
  const trendOptions = {};
@@ -1334,7 +1334,17 @@ var init_dist = __esm({
1334
1334
  typescript: /(?:export\s+)?(?:const|let|var)\s+(\w+)/,
1335
1335
  javascript: /(?:export\s+)?(?:const|let|var)\s+(\w+)/
1336
1336
  };
1337
- SUPPORTED_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".rs", ".java"]);
1337
+ SUPPORTED_EXTENSIONS = /* @__PURE__ */ new Set([
1338
+ ".ts",
1339
+ ".tsx",
1340
+ ".js",
1341
+ ".jsx",
1342
+ ".py",
1343
+ ".go",
1344
+ ".rs",
1345
+ ".java",
1346
+ ".groovy"
1347
+ ]);
1338
1348
  SKIP_EXTENSIONS = /* @__PURE__ */ new Set([".d.ts"]);
1339
1349
  CodeIngestor = class {
1340
1350
  constructor(store) {
@@ -1348,23 +1358,34 @@ var init_dist = __esm({
1348
1358
  let edgesAdded = 0;
1349
1359
  const files = await this.findSourceFiles(rootDir);
1350
1360
  const nameToFiles = /* @__PURE__ */ new Map();
1351
- const fileContents = /* @__PURE__ */ new Map();
1352
1361
  for (const filePath of files) {
1353
1362
  try {
1354
- const result = await this.processFile(filePath, rootDir, nameToFiles, fileContents);
1363
+ const result = await this.processFile(filePath, rootDir, nameToFiles);
1355
1364
  nodesAdded += result.nodesAdded;
1356
1365
  edgesAdded += result.edgesAdded;
1357
1366
  } catch (err) {
1358
1367
  errors.push(`${filePath}: ${err instanceof Error ? err.message : String(err)}`);
1359
1368
  }
1360
1369
  }
1361
- const callsEdges = this.extractCallsEdges(nameToFiles, fileContents);
1362
- for (const edge of callsEdges) {
1363
- this.store.addEdge(edge);
1364
- edgesAdded++;
1370
+ for (const filePath of files) {
1371
+ try {
1372
+ const relativePath = path.relative(rootDir, filePath).replace(/\\/g, "/");
1373
+ const content = await fs.readFile(filePath, "utf-8");
1374
+ const callsEdges = this.extractCallsEdgesForFile(relativePath, content, nameToFiles);
1375
+ for (const edge of callsEdges) {
1376
+ this.store.addEdge(edge);
1377
+ edgesAdded++;
1378
+ }
1379
+ } catch {
1380
+ }
1381
+ }
1382
+ for (const filePath of files) {
1383
+ try {
1384
+ const content = await fs.readFile(filePath, "utf-8");
1385
+ edgesAdded += this.extractReqAnnotationsForFile(filePath, content, rootDir);
1386
+ } catch {
1387
+ }
1365
1388
  }
1366
- edgesAdded += this.extractReqAnnotations(fileContents, rootDir);
1367
- fileContents.clear();
1368
1389
  return {
1369
1390
  nodesAdded,
1370
1391
  nodesUpdated: 0,
@@ -1374,14 +1395,13 @@ var init_dist = __esm({
1374
1395
  durationMs: Date.now() - start
1375
1396
  };
1376
1397
  }
1377
- async processFile(filePath, rootDir, nameToFiles, fileContents) {
1398
+ async processFile(filePath, rootDir, nameToFiles) {
1378
1399
  let nodesAdded = 0;
1379
1400
  let edgesAdded = 0;
1380
1401
  const relativePath = path.relative(rootDir, filePath).replace(/\\/g, "/");
1381
1402
  const content = await fs.readFile(filePath, "utf-8");
1382
1403
  const stat2 = await fs.stat(filePath);
1383
1404
  const fileId = `file:${relativePath}`;
1384
- fileContents.set(relativePath, content);
1385
1405
  const fileNode = {
1386
1406
  id: fileId,
1387
1407
  type: "file",
@@ -1421,7 +1441,7 @@ var init_dist = __esm({
1421
1441
  const entries = await fs.readdir(dir, { withFileTypes: true });
1422
1442
  for (const entry of entries) {
1423
1443
  const fullPath = path.join(dir, entry.name);
1424
- if (entry.isDirectory() && entry.name !== "node_modules" && entry.name !== "dist") {
1444
+ if (entry.isDirectory() && entry.name !== "node_modules" && entry.name !== "dist" && entry.name !== "target" && entry.name !== "build" && entry.name !== ".git" && entry.name !== "__pycache__" && entry.name !== ".venv" && entry.name !== ".turbo" && entry.name !== ".harness" && entry.name !== ".next" && entry.name !== ".vscode" && entry.name !== ".idea" && entry.name !== "vendor" && entry.name !== "out" && entry.name !== ".gradle" && entry.name !== ".gradle-home" && entry.name !== "bin" && entry.name !== "obj" && entry.name !== "venv" && entry.name !== "_build" && entry.name !== "deps" && entry.name !== "coverage" && entry.name !== ".nyc_output") {
1425
1445
  results.push(...await this.findSourceFiles(fullPath));
1426
1446
  } else if (entry.isFile() && isSupportedSourceFile(entry.name)) {
1427
1447
  results.push(fullPath);
@@ -1700,33 +1720,31 @@ var init_dist = __esm({
1700
1720
  return false;
1701
1721
  }
1702
1722
  /**
1703
- * Second pass: scan each file for identifiers matching known callable names,
1723
+ * Scan a file for identifiers matching known callable names,
1704
1724
  * then create file-to-file "calls" edges. Uses regex heuristic (not AST).
1705
1725
  */
1706
- extractCallsEdges(nameToFiles, fileContents) {
1726
+ extractCallsEdgesForFile(relativePath, content, nameToFiles) {
1707
1727
  const edges = [];
1708
1728
  const seen = /* @__PURE__ */ new Set();
1709
- for (const [filePath, content] of fileContents) {
1710
- const callerFileId = `file:${filePath}`;
1711
- const callPattern = /\b([a-zA-Z_$][\w$]*)\s*\(/g;
1712
- let match;
1713
- while ((match = callPattern.exec(content)) !== null) {
1714
- const name = match[1];
1715
- const targetFiles = nameToFiles.get(name);
1716
- if (!targetFiles) continue;
1717
- for (const targetFile of targetFiles) {
1718
- if (targetFile === filePath) continue;
1719
- const targetFileId = `file:${targetFile}`;
1720
- const key = `${callerFileId}|${targetFileId}`;
1721
- if (seen.has(key)) continue;
1722
- seen.add(key);
1723
- edges.push({
1724
- from: callerFileId,
1725
- to: targetFileId,
1726
- type: "calls",
1727
- metadata: { confidence: "regex" }
1728
- });
1729
- }
1729
+ const callerFileId = `file:${relativePath}`;
1730
+ const callPattern = /\b([a-zA-Z_$][\w$]*)\s*\(/g;
1731
+ let match;
1732
+ while ((match = callPattern.exec(content)) !== null) {
1733
+ const name = match[1];
1734
+ const targetFiles = nameToFiles.get(name);
1735
+ if (!targetFiles) continue;
1736
+ for (const targetFile of targetFiles) {
1737
+ if (targetFile === relativePath) continue;
1738
+ const targetFileId = `file:${targetFile}`;
1739
+ const key = `${callerFileId}|${targetFileId}`;
1740
+ if (seen.has(key)) continue;
1741
+ seen.add(key);
1742
+ edges.push({
1743
+ from: callerFileId,
1744
+ to: targetFileId,
1745
+ type: "calls",
1746
+ metadata: { confidence: "regex" }
1747
+ });
1730
1748
  }
1731
1749
  }
1732
1750
  return edges;
@@ -1871,6 +1889,7 @@ var init_dist = __esm({
1871
1889
  if (/\.go$/.test(filePath)) return "go";
1872
1890
  if (/\.rs$/.test(filePath)) return "rust";
1873
1891
  if (/\.java$/.test(filePath)) return "java";
1892
+ if (/\.groovy$/.test(filePath)) return "java";
1874
1893
  return "unknown";
1875
1894
  }
1876
1895
  /**
@@ -1878,40 +1897,38 @@ var init_dist = __esm({
1878
1897
  * linking requirement nodes to the annotated files.
1879
1898
  * Format: // @req <feature-name>#<index>
1880
1899
  */
1881
- extractReqAnnotations(fileContents, rootDir) {
1900
+ extractReqAnnotationsForFile(filePath, content, rootDir) {
1882
1901
  const REQ_TAG = /(?:\/\/|#|\/\*)\s*@req\s+([\w-]+)#(\d+)/g;
1883
1902
  const reqNodes = this.store.findNodes({ type: "requirement" });
1884
1903
  let edgesAdded = 0;
1885
- for (const [filePath, content] of fileContents) {
1886
- let match;
1887
- REQ_TAG.lastIndex = 0;
1888
- while ((match = REQ_TAG.exec(content)) !== null) {
1889
- const featureName = match[1];
1890
- const reqIndex = parseInt(match[2], 10);
1891
- const reqNode = reqNodes.find(
1892
- (n) => n.metadata.featureName === featureName && n.metadata.index === reqIndex
1904
+ let match;
1905
+ REQ_TAG.lastIndex = 0;
1906
+ while ((match = REQ_TAG.exec(content)) !== null) {
1907
+ const featureName = match[1];
1908
+ const reqIndex = parseInt(match[2], 10);
1909
+ const reqNode = reqNodes.find(
1910
+ (n) => n.metadata.featureName === featureName && n.metadata.index === reqIndex
1911
+ );
1912
+ if (!reqNode) {
1913
+ console.warn(
1914
+ `@req annotation references non-existent requirement: ${featureName}#${reqIndex} in ${filePath}`
1893
1915
  );
1894
- if (!reqNode) {
1895
- console.warn(
1896
- `@req annotation references non-existent requirement: ${featureName}#${reqIndex} in ${filePath}`
1897
- );
1898
- continue;
1899
- }
1900
- const relPath = path.relative(rootDir, filePath).replace(/\\/g, "/");
1901
- const fileNodeId = `file:${relPath}`;
1902
- this.store.addEdge({
1903
- from: reqNode.id,
1904
- to: fileNodeId,
1905
- type: "verified_by",
1906
- confidence: 1,
1907
- metadata: {
1908
- method: "annotation",
1909
- tag: `@req ${featureName}#${reqIndex}`,
1910
- confidence: 1
1911
- }
1912
- });
1913
- edgesAdded++;
1916
+ continue;
1914
1917
  }
1918
+ const relPath = path.relative(rootDir, filePath).replace(/\\/g, "/");
1919
+ const fileNodeId = `file:${relPath}`;
1920
+ this.store.addEdge({
1921
+ from: reqNode.id,
1922
+ to: fileNodeId,
1923
+ type: "verified_by",
1924
+ confidence: 1,
1925
+ metadata: {
1926
+ method: "annotation",
1927
+ tag: `@req ${featureName}#${reqIndex}`,
1928
+ confidence: 1
1929
+ }
1930
+ });
1931
+ edgesAdded++;
1915
1932
  }
1916
1933
  return edgesAdded;
1917
1934
  }
@@ -2272,7 +2289,7 @@ var init_dist = __esm({
2272
2289
  const entries = await fs2.readdir(dir, { withFileTypes: true });
2273
2290
  for (const entry of entries) {
2274
2291
  const fullPath = path3.join(dir, entry.name);
2275
- if (entry.isDirectory()) {
2292
+ if (entry.isDirectory() && entry.name !== "node_modules" && entry.name !== "dist" && entry.name !== "target" && entry.name !== "build" && entry.name !== ".git" && entry.name !== ".gradle" && entry.name !== ".harness" && entry.name !== "vendor" && entry.name !== "bin" && entry.name !== "obj" && entry.name !== "venv" && entry.name !== "_build" && entry.name !== "deps" && entry.name !== "coverage") {
2276
2293
  results.push(...await this.findMarkdownFiles(fullPath));
2277
2294
  } else if (entry.isFile() && entry.name.endsWith(".md")) {
2278
2295
  results.push(fullPath);
@@ -2411,7 +2428,7 @@ var init_dist = __esm({
2411
2428
  const entries = await fs3.readdir(dir, { withFileTypes: true });
2412
2429
  for (const entry of entries) {
2413
2430
  const fullPath = path4.join(dir, entry.name);
2414
- if (entry.isDirectory()) {
2431
+ if (entry.isDirectory() && entry.name !== "node_modules" && entry.name !== "dist" && entry.name !== "target" && entry.name !== "build" && entry.name !== ".git" && entry.name !== ".gradle" && entry.name !== ".harness" && entry.name !== "vendor" && entry.name !== "bin" && entry.name !== "obj" && entry.name !== "venv" && entry.name !== "_build" && entry.name !== "deps" && entry.name !== "coverage") {
2415
2432
  results.push(...await this.findMarkdownFiles(fullPath));
2416
2433
  } else if (entry.isFile() && entry.name.endsWith(".md")) {
2417
2434
  results.push(fullPath);
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  findConfigFile,
9
9
  loadConfig
10
- } from "./chunk-JUXFYB2K.js";
10
+ } from "./chunk-TQRCODRJ.js";
11
11
  import {
12
12
  init_dist
13
- } from "./chunk-42ZZLMYD.js";
13
+ } from "./chunk-ZIYLIYN4.js";
14
14
  import {
15
15
  Ok
16
16
  } from "./chunk-RL4VMEXL.js";
@@ -35,7 +35,7 @@ var checkPerformanceDefinition = {
35
35
  };
36
36
  async function handleCheckPerformance(input) {
37
37
  try {
38
- const { EntropyAnalyzer } = await import("./dist-T3DGV5UN.js");
38
+ const { EntropyAnalyzer } = await import("./dist-ZV6GO6FA.js");
39
39
  const typeFilter = input.type ?? "all";
40
40
  const projectPath = sanitizePath(input.path);
41
41
  let entryPoints;
@@ -58,10 +58,10 @@ async function handleCheckPerformance(input) {
58
58
  });
59
59
  let graphOptions;
60
60
  try {
61
- const { loadGraphStore } = await import("./graph-loader-QMKXT454.js");
61
+ const { loadGraphStore } = await import("./graph-loader-KXVS3YK3.js");
62
62
  const store = await loadGraphStore(projectPath);
63
63
  if (store) {
64
- const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-GRW3X2ZQ.js");
64
+ const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-HPWNWCT6.js");
65
65
  const complexityAdapter = new GraphComplexityAdapter(store);
66
66
  const couplingAdapter = new GraphCouplingAdapter(store);
67
67
  graphOptions = {
@@ -98,7 +98,7 @@ var getPerfBaselinesDefinition = {
98
98
  };
99
99
  async function handleGetPerfBaselines(input) {
100
100
  try {
101
- const { BaselineManager } = await import("./dist-T3DGV5UN.js");
101
+ const { BaselineManager } = await import("./dist-ZV6GO6FA.js");
102
102
  const manager = new BaselineManager(sanitizePath(input.path));
103
103
  const baselines = manager.load();
104
104
  return resultToMcpResponse(
@@ -146,7 +146,7 @@ var updatePerfBaselinesDefinition = {
146
146
  };
147
147
  async function handleUpdatePerfBaselines(input) {
148
148
  try {
149
- const { BaselineManager } = await import("./dist-T3DGV5UN.js");
149
+ const { BaselineManager } = await import("./dist-ZV6GO6FA.js");
150
150
  const manager = new BaselineManager(sanitizePath(input.path));
151
151
  manager.save(input.results, input.commitHash);
152
152
  const updated = manager.load();
@@ -176,7 +176,7 @@ var getCriticalPathsDefinition = {
176
176
  };
177
177
  async function handleGetCriticalPaths(input) {
178
178
  try {
179
- const { CriticalPathResolver } = await import("./dist-T3DGV5UN.js");
179
+ const { CriticalPathResolver } = await import("./dist-ZV6GO6FA.js");
180
180
  const resolver = new CriticalPathResolver(sanitizePath(input.path));
181
181
  const result = await resolver.resolve();
182
182
  return resultToMcpResponse(Ok(result));