ucn 3.7.13 → 3.7.14

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.
@@ -1 +1 @@
1
- ghu_OKOjTMtrqEazgazx9Dj0l0z6irgt8R3KXKET
1
+ ghu_k0bpQ4IVOHqywvBi3Q437S5YCpLbSA0Laxm6
@@ -1 +1 @@
1
- {"token":"eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJtY3AtcmVnaXN0cnkiLCJleHAiOjE3NzIwMDg1ODksIm5iZiI6MTc3MjAwODI4OSwiaWF0IjoxNzcyMDA4Mjg5LCJhdXRoX21ldGhvZCI6ImdpdGh1Yi1hdCIsImF1dGhfbWV0aG9kX3N1YiI6Im1sZW9jYSIsInBlcm1pc3Npb25zIjpbeyJhY3Rpb24iOiJwdWJsaXNoIiwicmVzb3VyY2UiOiJpby5naXRodWIubWxlb2NhLyoifV19.VANcz6OV-uLS8b-UAAEu1aX4HRO4FcTO2c3Ub9r4_8dfRjh5dGQlHddmnOLUBBTf8UwWu0Ap2m4PCQSUvcvfAg","expires_at":1772008589}
1
+ {"token":"eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJtY3AtcmVnaXN0cnkiLCJleHAiOjE3NzIwMTAwNjAsIm5iZiI6MTc3MjAwOTc2MCwiaWF0IjoxNzcyMDA5NzYwLCJhdXRoX21ldGhvZCI6ImdpdGh1Yi1hdCIsImF1dGhfbWV0aG9kX3N1YiI6Im1sZW9jYSIsInBlcm1pc3Npb25zIjpbeyJhY3Rpb24iOiJwdWJsaXNoIiwicmVzb3VyY2UiOiJpby5naXRodWIubWxlb2NhLyoifV19.hVf316b7GiborTKy9ZVvcnNEJyNHjIEE7zAC876XjNuyLXCUeV7OGHI8i9ZTPP9U2v8yEk9_awczj0Ziy6xrBQ","expires_at":1772010060}
package/core/output.js CHANGED
@@ -1924,20 +1924,25 @@ function formatGraph(graph, options = {}) {
1924
1924
  * Format search command output
1925
1925
  */
1926
1926
  function formatSearch(results, term) {
1927
+ const meta = results.meta;
1928
+ const fallbackNote = meta && meta.regexFallback
1929
+ ? `\nNote: Invalid regex (${meta.regexFallback}). Fell back to plain text search.`
1930
+ : '';
1931
+
1927
1932
  const totalMatches = results.reduce((sum, r) => sum + r.matches.length, 0);
1928
1933
  if (totalMatches === 0) {
1929
- const meta = results.meta;
1930
1934
  if (meta) {
1931
1935
  const scope = meta.filesSkipped > 0
1932
1936
  ? `Searched ${meta.filesScanned} of ${meta.totalFiles} files (${meta.filesSkipped} excluded by filters).`
1933
1937
  : `Searched ${meta.filesScanned} files.`;
1934
- return `No matches found for "${term}". ${scope}`;
1938
+ return `No matches found for "${term}". ${scope}${fallbackNote}`;
1935
1939
  }
1936
- return `No matches found for "${term}"`;
1940
+ return `No matches found for "${term}"${fallbackNote}`;
1937
1941
  }
1938
1942
 
1939
1943
  const lines = [];
1940
1944
  lines.push(`Found ${totalMatches} matches for "${term}" in ${results.length} files:`);
1945
+ if (fallbackNote) lines.push(fallbackNote.trim());
1941
1946
  lines.push('═'.repeat(60));
1942
1947
 
1943
1948
  for (const result of results) {
package/core/project.js CHANGED
@@ -4444,12 +4444,14 @@ class ProjectIndex {
4444
4444
  const regexFlags = options.caseSensitive ? 'g' : 'gi';
4445
4445
  const useRegex = options.regex !== false; // Default: regex ON
4446
4446
  let regex;
4447
+ let regexFallback = false;
4447
4448
  if (useRegex) {
4448
4449
  try {
4449
4450
  regex = new RegExp(term, regexFlags);
4450
4451
  } catch (e) {
4451
4452
  // Invalid regex — fall back to plain text
4452
4453
  regex = new RegExp(escapeRegExp(term), regexFlags);
4454
+ regexFallback = e.message;
4453
4455
  }
4454
4456
  } else {
4455
4457
  regex = new RegExp(escapeRegExp(term), regexFlags);
@@ -4556,7 +4558,7 @@ class ProjectIndex {
4556
4558
  }
4557
4559
  }
4558
4560
 
4559
- results.meta = { filesScanned, filesSkipped, totalFiles: this.files.size };
4561
+ results.meta = { filesScanned, filesSkipped, totalFiles: this.files.size, regexFallback };
4560
4562
  return results;
4561
4563
  } finally { this._endOp(); }
4562
4564
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ucn",
3
- "version": "3.7.13",
3
+ "version": "3.7.14",
4
4
  "mcpName": "io.github.mleoca/ucn",
5
5
  "description": "Universal Code Navigator — AST-based call graph analysis for AI agents. Find callers, trace impact, detect dead code across JS/TS, Python, Go, Rust, Java, and HTML. CLI, MCP server, and agent skill.",
6
6
  "main": "index.js",