@justmpm/ai-tool 3.20.0 → 3.21.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.
@@ -20,7 +20,7 @@ import {
20
20
  readConfig,
21
21
  recoveryHint,
22
22
  simplifyType
23
- } from "./chunk-MEG5Q7XP.js";
23
+ } from "./chunk-RGRCXEIT.js";
24
24
 
25
25
  // src/commands/describe.ts
26
26
  var STOPWORDS = /* @__PURE__ */ new Set([
@@ -930,21 +930,30 @@ function collectRemainingIndexFiles(packagePath, existingFiles, results, maxFile
930
930
  import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
931
931
  import { dirname, join as join2, resolve as resolve2 } from "path";
932
932
  import { Project } from "ts-morph";
933
- function classifyFunctionKind(name, returnType) {
933
+
934
+ // src/ts/kind-resolvers.ts
935
+ var REACT_COMPONENT_FACTORIES = /* @__PURE__ */ new Set([
936
+ // React API principal
937
+ "memo",
938
+ "forwardRef",
939
+ "lazy",
940
+ "createContext",
941
+ "createElement",
942
+ "cloneElement",
943
+ "createFactory",
944
+ // Hooks que retornam componentes
945
+ "useCallback",
946
+ "useMemo",
947
+ // Suspense e ErrorBoundary
948
+ "Suspense",
949
+ "ErrorBoundary",
950
+ // Factory patterns
951
+ "createComponent",
952
+ "forwardRefLazy"
953
+ ]);
954
+ function isReactComponentFactory(name) {
934
955
  const cleanName = stripModulePrefix(name);
935
- if (cleanName.startsWith("use") && cleanName.length > 3 && cleanName[3] === cleanName[3].toUpperCase()) {
936
- return "hook";
937
- }
938
- if (/^[A-Z]/.test(cleanName)) {
939
- if (returnType) {
940
- const rt = returnType.toLowerCase();
941
- if (rt.includes("jsx.element") || rt.includes("reactelement") || rt.includes("reactnode") || rt.includes("react.fc") || rt.includes("elementtype")) {
942
- return "component";
943
- }
944
- }
945
- return "function";
946
- }
947
- return "function";
956
+ return REACT_COMPONENT_FACTORIES.has(cleanName);
948
957
  }
949
958
  function stripModulePrefix(name) {
950
959
  const dotIdx = name.indexOf(".");
@@ -958,6 +967,144 @@ function stripModulePrefix(name) {
958
967
  }
959
968
  return name;
960
969
  }
970
+ var defaultResolver = {
971
+ canHandle: () => true,
972
+ // Fallback - sempre se aplica
973
+ classifyFunction(name, returnType) {
974
+ const cleanName = stripModulePrefix(name);
975
+ if (cleanName.startsWith("use") && cleanName.length > 3 && cleanName[3] === cleanName[3].toUpperCase()) {
976
+ return "hook";
977
+ }
978
+ if (isReactComponentFactory(name)) {
979
+ return "component";
980
+ }
981
+ if (/^[A-Z]/.test(cleanName)) {
982
+ if (returnType) {
983
+ const rt = returnType.toLowerCase();
984
+ if (rt.includes("jsx.element") || rt.includes("reactelement") || rt.includes("reactnode") || rt.includes("react.fc") || rt.includes("elementtype") || rt.includes("react.componenttype") || rt.includes("fc<") || rt.includes(".element")) {
985
+ return "component";
986
+ }
987
+ }
988
+ return "function";
989
+ }
990
+ return "function";
991
+ },
992
+ classifyType(_name, kind) {
993
+ return kind;
994
+ }
995
+ };
996
+ var reactResolver = {
997
+ canHandle(packageName) {
998
+ return packageName === "react" || packageName === "@types/react" || packageName === "react-dom" || packageName === "@types/react-dom";
999
+ },
1000
+ classifyFunction(name, returnType) {
1001
+ const cleanName = stripModulePrefix(name);
1002
+ const reactHooks = /* @__PURE__ */ new Set([
1003
+ // Hooks basicos
1004
+ "useState",
1005
+ "useEffect",
1006
+ "useContext",
1007
+ "useReducer",
1008
+ "useCallback",
1009
+ "useMemo",
1010
+ "useRef",
1011
+ "useImperativeHandle",
1012
+ "useLayoutEffect",
1013
+ "useDebugValue",
1014
+ "useId",
1015
+ // Hooks adicionais
1016
+ "useTransition",
1017
+ "useDeferredValue",
1018
+ "useSyncExternalStore",
1019
+ "useInsertionEffect",
1020
+ "useFormStatus",
1021
+ "useActionState",
1022
+ "useOptimistic",
1023
+ "use"
1024
+ ]);
1025
+ if (reactHooks.has(cleanName)) {
1026
+ return "hook";
1027
+ }
1028
+ if (isReactComponentFactory(name)) {
1029
+ return "component";
1030
+ }
1031
+ if (cleanName.startsWith("use") && cleanName.length > 3 && cleanName[3] === cleanName[3].toUpperCase()) {
1032
+ return "hook";
1033
+ }
1034
+ if (/^[A-Z]/.test(cleanName)) {
1035
+ if (returnType) {
1036
+ const rt = returnType.toLowerCase();
1037
+ if (rt.includes("jsx.element") || rt.includes("reactelement") || rt.includes("reactnode") || rt.includes("react.fc") || rt.includes("elementtype") || rt.includes("react.componenttype") || rt.includes("fc<") || rt.includes(".element")) {
1038
+ return "component";
1039
+ }
1040
+ }
1041
+ return "function";
1042
+ }
1043
+ return "function";
1044
+ },
1045
+ classifyType(name, kind) {
1046
+ const cleanName = stripModulePrefix(name);
1047
+ const reactComponentInterfaces = /* @__PURE__ */ new Set([
1048
+ "FC",
1049
+ "FunctionComponent",
1050
+ "ComponentType",
1051
+ "ElementType",
1052
+ "Element",
1053
+ "ReactElement",
1054
+ "ReactNode",
1055
+ "Component",
1056
+ "PureComponent",
1057
+ "ForwardRefExoticComponent",
1058
+ "ExoticComponent"
1059
+ ]);
1060
+ if (reactComponentInterfaces.has(cleanName)) {
1061
+ return "component";
1062
+ }
1063
+ return kind;
1064
+ }
1065
+ };
1066
+ var resolvers = [
1067
+ reactResolver,
1068
+ defaultResolver
1069
+ // Fallback - deve ser o ultimo
1070
+ ];
1071
+ function getResolver(packageName) {
1072
+ for (const resolver of resolvers) {
1073
+ if (resolver.canHandle(packageName)) {
1074
+ return resolver;
1075
+ }
1076
+ }
1077
+ return defaultResolver;
1078
+ }
1079
+ function classifyFunctionKind(name, returnType, packageName) {
1080
+ const resolver = packageName ? getResolver(packageName) : defaultResolver;
1081
+ return resolver.classifyFunction(name, returnType);
1082
+ }
1083
+ function classifyTypeKind(name, kind, packageName) {
1084
+ const resolver = packageName ? getResolver(packageName) : defaultResolver;
1085
+ return resolver.classifyType(name, kind);
1086
+ }
1087
+ function classifySymbol(symbolKind, name, returnType, packageName) {
1088
+ if (symbolKind === "function") {
1089
+ return classifyFunctionKind(name, returnType, packageName);
1090
+ }
1091
+ if (symbolKind === "type" || symbolKind === "interface" || symbolKind === "enum") {
1092
+ return classifyTypeKind(name, symbolKind, packageName);
1093
+ }
1094
+ return "const";
1095
+ }
1096
+ function isSemanticKindMatch(actualKind, requestedKind) {
1097
+ if (actualKind === requestedKind) return true;
1098
+ if (requestedKind === "type") {
1099
+ return actualKind === "interface" || actualKind === "enum" || actualKind === "const";
1100
+ }
1101
+ if (requestedKind === "function") {
1102
+ return actualKind === "component" || actualKind === "hook";
1103
+ }
1104
+ return false;
1105
+ }
1106
+
1107
+ // src/ts/package-extractor.ts
961
1108
  var MAX_REEXPORT_DEPTH = 3;
962
1109
  var MAX_TOTAL_FILES = 1200;
963
1110
  var TYPE_DECLARATION_EXTENSIONS = [".d.ts", ".d.cts", ".d.mts", ".d.tsx"];
@@ -1284,7 +1431,7 @@ function extractPackageApiImpl(project, typeFiles, packagePath, limit, jsFallbac
1284
1431
  allFunctions.push({
1285
1432
  ...fn,
1286
1433
  sourceFile: relativeSource,
1287
- kind: classifyFunctionKind(fn.name, fn.returnType)
1434
+ kind: classifySymbol("function", fn.name, fn.returnType)
1288
1435
  });
1289
1436
  }
1290
1437
  }
@@ -1387,36 +1534,30 @@ function sortByRelevance(items, publicApiNames) {
1387
1534
  }
1388
1535
 
1389
1536
  // src/commands/deps.ts
1390
- function stripModulePrefix2(name) {
1391
- const dotIdx = name.indexOf(".");
1392
- if (dotIdx === -1) return name;
1393
- const prefix = name.slice(0, dotIdx);
1394
- if (prefix.startsWith('"') || prefix.startsWith("'")) {
1395
- return name.slice(dotIdx + 1);
1537
+ function normalizePath(p) {
1538
+ return p.replace(/\\/g, "/");
1539
+ }
1540
+ function computeAvailableKinds(extracted, requestedKind) {
1541
+ const kindCounts = /* @__PURE__ */ new Map();
1542
+ for (const fn of extracted.functions) {
1543
+ const kind = classifySymbol("function", fn.name, fn.returnType);
1544
+ if (isSemanticKindMatch(kind, requestedKind)) {
1545
+ kindCounts.set(kind, (kindCounts.get(kind) ?? 0) + 1);
1546
+ }
1396
1547
  }
1397
- if (/^[A-Za-z]+$/.test(prefix) && /^[A-Z]/.test(prefix)) {
1398
- return name.slice(dotIdx + 1);
1548
+ for (const t of extracted.types) {
1549
+ const kind = classifySymbol("type", t.name);
1550
+ if (isSemanticKindMatch(kind, requestedKind)) {
1551
+ kindCounts.set(kind, (kindCounts.get(kind) ?? 0) + 1);
1552
+ }
1399
1553
  }
1400
- return name;
1401
- }
1402
- function classifyFunctionKind2(name, returnType) {
1403
- const cleanName = stripModulePrefix2(name);
1404
- if (cleanName.startsWith("use") && cleanName.length > 3 && cleanName[3] === cleanName[3].toUpperCase()) {
1405
- return "hook";
1406
- }
1407
- if (/^[A-Z]/.test(cleanName)) {
1408
- if (returnType) {
1409
- const rt = returnType.toLowerCase();
1410
- if (rt.includes("jsx.element") || rt.includes("reactelement") || rt.includes("reactnode") || rt.includes("react.fc") || rt.includes("elementtype")) {
1411
- return "component";
1412
- }
1554
+ for (const c of extracted.constants) {
1555
+ const kind = classifySymbol("const", c.name);
1556
+ if (isSemanticKindMatch(kind, requestedKind)) {
1557
+ kindCounts.set(kind, (kindCounts.get(kind) ?? 0) + 1);
1413
1558
  }
1414
- return "function";
1415
1559
  }
1416
- return "function";
1417
- }
1418
- function normalizePath(p) {
1419
- return p.replace(/\\/g, "/");
1560
+ return Array.from(kindCounts.entries()).map(([kind, count]) => ({ kind, count })).sort((a, b) => b.count - a.count);
1420
1561
  }
1421
1562
  function relativeTypeFile(typeFiles, normalizedPkgPath, packageName, sourceFile) {
1422
1563
  if (sourceFile) {
@@ -1427,16 +1568,6 @@ function relativeTypeFile(typeFiles, normalizedPkgPath, packageName, sourceFile)
1427
1568
  }
1428
1569
  return normalizePath(typeFiles[0]).replace(normalizedPkgPath, packageName);
1429
1570
  }
1430
- function isKindMatch(actualKind, requestedKind) {
1431
- if (actualKind === requestedKind) return true;
1432
- if (requestedKind === "type") {
1433
- return actualKind === "interface" || actualKind === "enum" || actualKind === "const";
1434
- }
1435
- if (requestedKind === "function") {
1436
- return actualKind === "component" || actualKind === "hook";
1437
- }
1438
- return false;
1439
- }
1440
1571
  var TYPE_FILES_COMPACT_THRESHOLD = 10;
1441
1572
  var TYPE_FILES_PREVIEW_COUNT = 5;
1442
1573
  function buildTypeFilesMeta(typeFiles, pkgPath) {
@@ -1543,9 +1674,9 @@ async function depsApi(packageName, options = {}) {
1543
1674
  let filteredConstants = extracted.constants;
1544
1675
  if (options.kind) {
1545
1676
  const kind = options.kind;
1546
- filteredFunctions = extracted.functions.filter((fn) => classifyFunctionKind2(fn.name, fn.returnType) === kind);
1677
+ filteredFunctions = extracted.functions.filter((fn) => classifySymbol("function", fn.name, fn.returnType) === kind);
1547
1678
  filteredTypes = extracted.types.filter((t) => {
1548
- const resolvedKind = classifyFunctionKind2(t.name) === "hook" ? "hook" : t.kind;
1679
+ const resolvedKind = classifySymbol("type", t.name) === "hook" ? "hook" : t.kind;
1549
1680
  return resolvedKind === kind;
1550
1681
  });
1551
1682
  filteredConstants = extracted.constants.filter(() => kind === "const");
@@ -1554,6 +1685,7 @@ async function depsApi(packageName, options = {}) {
1554
1685
  filteredTypes = filteredTypes.slice(0, realLimit);
1555
1686
  filteredConstants = filteredConstants.slice(0, realLimit);
1556
1687
  }
1688
+ const availableKindsWhenFilteredEmpty = options.kind && filteredFunctions.length === 0 && filteredTypes.length === 0 ? computeAvailableKinds(extracted, options.kind) : void 0;
1557
1689
  const jsFallback = typeFiles.length > 0 && typeFiles.every(
1558
1690
  (f) => f.endsWith(".js") || f.endsWith(".mjs") || f.endsWith(".cjs")
1559
1691
  );
@@ -1575,6 +1707,7 @@ async function depsApi(packageName, options = {}) {
1575
1707
  totalTypes: filteredTypes.length,
1576
1708
  shown: Math.min(filteredFunctions.length, options.limit ?? 50)
1577
1709
  } : extracted.truncated,
1710
+ availableKindsWhenFilteredEmpty,
1578
1711
  typeFilesSummary: typeFilesMeta.summary,
1579
1712
  typeFilesPreview: typeFilesMeta.preview,
1580
1713
  jsFallback: jsFallback || void 0,
@@ -1739,20 +1872,20 @@ async function depsSearch(packageName, query, options = {}) {
1739
1872
  const filesSet = /* @__PURE__ */ new Set();
1740
1873
  const normalizedPkgPath = normalizePath(pkgPath);
1741
1874
  const useWildcard = hasWildcard(query);
1742
- const matchFn = useWildcard ? (name) => matchWithWildcard(name, query) || matchWithWildcard(stripModulePrefix2(name), query) : (name) => {
1875
+ const matchFn = useWildcard ? (name) => matchWithWildcard(name, query) || matchWithWildcard(stripModulePrefix(name), query) : (name) => {
1743
1876
  const n = name.toLowerCase();
1744
- const s = stripModulePrefix2(name).toLowerCase();
1877
+ const s = stripModulePrefix(name).toLowerCase();
1745
1878
  return n === queryLower || s === queryLower;
1746
1879
  };
1747
1880
  const scoreFn = useWildcard ? (name, kind, isExported) => calculateWildcardMatchScore(name, query, kind, isExported) : (name, kind, isExported) => calculateMatchScore(name, queryLower, kind, isExported);
1748
1881
  const fuzzyMatchFn = (name) => {
1749
1882
  const n = name.toLowerCase();
1750
- const s = stripModulePrefix2(name).toLowerCase();
1883
+ const s = stripModulePrefix(name).toLowerCase();
1751
1884
  return (n.includes(queryLower) || s.includes(queryLower)) && n !== queryLower && s !== queryLower;
1752
1885
  };
1753
1886
  for (const fn of extracted.functions) {
1754
1887
  if (matchFn(fn.name)) {
1755
- const kind = classifyFunctionKind2(fn.name, fn.returnType);
1888
+ const kind = classifySymbol("function", fn.name, fn.returnType, packageName);
1756
1889
  const score = scoreFn(fn.name, kind, fn.isExported);
1757
1890
  const params = fn.params.map((p) => `${p.name}: ${p.type}`).join(", ");
1758
1891
  const signature = `${fn.name}(${params}): ${fn.returnType}`;
@@ -1763,7 +1896,7 @@ async function depsSearch(packageName, query, options = {}) {
1763
1896
  }
1764
1897
  for (const t of extracted.types) {
1765
1898
  if (matchFn(t.name)) {
1766
- const kind = classifyFunctionKind2(t.name) === "hook" ? "hook" : t.kind;
1899
+ const kind = classifySymbol("type", t.name, void 0, packageName) === "hook" ? "hook" : t.kind;
1767
1900
  const score = scoreFn(t.name, kind, t.isExported);
1768
1901
  const file = relativeTypeFile(typeFiles, normalizedPkgPath, packageName, t.sourceFile);
1769
1902
  scored.push({ name: t.name, kind, file, signature: t.definition, _score: score });
@@ -1783,7 +1916,7 @@ async function depsSearch(packageName, query, options = {}) {
1783
1916
  const matchedNames = new Set(scored.map((m) => m.name));
1784
1917
  for (const fn of extracted.functions) {
1785
1918
  if (matchedNames.has(fn.name)) continue;
1786
- const kind = classifyFunctionKind2(fn.name, fn.returnType);
1919
+ const kind = classifySymbol("function", fn.name, fn.returnType, packageName);
1787
1920
  if (exactKinds.has(kind)) continue;
1788
1921
  if (!fuzzyMatchFn(fn.name)) continue;
1789
1922
  const score = scoreFn(fn.name, kind, fn.isExported);
@@ -1797,7 +1930,7 @@ async function depsSearch(packageName, query, options = {}) {
1797
1930
  }
1798
1931
  for (const t of extracted.types) {
1799
1932
  if (matchedNames.has(t.name)) continue;
1800
- const kind = classifyFunctionKind2(t.name) === "hook" ? "hook" : t.kind;
1933
+ const kind = classifySymbol("type", t.name, void 0, packageName) === "hook" ? "hook" : t.kind;
1801
1934
  if (exactKinds.has(kind)) continue;
1802
1935
  if (!fuzzyMatchFn(t.name)) continue;
1803
1936
  const score = scoreFn(t.name, kind, t.isExported);
@@ -1820,8 +1953,9 @@ async function depsSearch(packageName, query, options = {}) {
1820
1953
  }
1821
1954
  }
1822
1955
  scored.sort((a, b) => b._score - a._score);
1823
- const filtered = options.kind ? scored.filter((m) => isKindMatch(m.kind, options.kind)) : scored;
1956
+ const filtered = options.kind ? scored.filter((m) => isSemanticKindMatch(m.kind, options.kind)) : scored;
1824
1957
  const matches = filtered.slice(0, MAX_SEARCH_RESULTS).map(({ _score: _, ...match }) => match);
1958
+ const availableKindsWhenEmpty = options.kind && filtered.length === 0 && scored.length > 0 ? [...new Set(scored.map((m) => m.kind))] : void 0;
1825
1959
  const pkgVersion = readPackageJson(packageName, cwd).version;
1826
1960
  const result = {
1827
1961
  version: pkgVersion,
@@ -1833,6 +1967,7 @@ async function depsSearch(packageName, query, options = {}) {
1833
1967
  total: scored.length,
1834
1968
  files: filesSet.size
1835
1969
  },
1970
+ availableKindsWhenEmpty,
1836
1971
  jsFallback: jsFallback || void 0,
1837
1972
  typesSource: resolved.source,
1838
1973
  typesPackage: resolved.typesPackage
@@ -2337,6 +2337,16 @@ function formatDepsApiText(result, ctx = "cli") {
2337
2337
  `;
2338
2338
  }
2339
2339
  out += `Use ${hint("deps_search", ctx, { "<pacote>": result.package, "<termo>": "*Symbol*" })} para buscar simbolos especificos
2340
+ `;
2341
+ }
2342
+ if (result.availableKindsWhenFilteredEmpty && result.availableKindsWhenFilteredEmpty.length > 0) {
2343
+ const kinds = result.availableKindsWhenFilteredEmpty.map((k) => `${k.kind} (${k.count})`).join(", ");
2344
+ out += `
2345
+ Filtro --kind nao encontrou simbolos, mas ha outros tipos disponiveis:
2346
+ `;
2347
+ out += ` ${kinds}
2348
+ `;
2349
+ out += ` Use ${hint("deps_api", ctx, { "<pacote>": result.package })} sem filtro --kind para ver tudo
2340
2350
  `;
2341
2351
  }
2342
2352
  out += nextSteps("deps_api", ctx);
@@ -2364,6 +2374,16 @@ function formatDepsSearchText(result, ctx = "cli") {
2364
2374
  if (result.matches.length === 0) {
2365
2375
  out += `Nenhum simbolo encontrado para "${result.query}".
2366
2376
  `;
2377
+ if (result.availableKindsWhenEmpty && result.availableKindsWhenEmpty.length > 0) {
2378
+ const kinds = result.availableKindsWhenEmpty.map((k) => `"${k}"`).join(", ");
2379
+ out += `
2380
+ Simbolos encontrados, mas como tipo diferente:
2381
+ `;
2382
+ out += ` Kinds disponiveis: ${kinds}
2383
+ `;
2384
+ out += ` Tente: ${hint("deps_search", ctx, { "<pacote>": result.package, "<termo>": result.query })} sem filtro --kind
2385
+ `;
2386
+ }
2367
2387
  if (result.typesSource === void 0 && !result.jsFallback) {
2368
2388
  out += `
2369
2389
  Pacote "${result.package}" nao possui TypeScript declarations.
@@ -3885,7 +3905,7 @@ function cacheGraph(cwd, graph) {
3885
3905
  }
3886
3906
  function getCachedGraph(cwd) {
3887
3907
  const validationStatus = getCacheValidationStatus(cwd);
3888
- if (validationStatus === "invalid") {
3908
+ if (validationStatus !== "valid") {
3889
3909
  return null;
3890
3910
  }
3891
3911
  const cached = readCache(cwd, GRAPH_FILE);
@@ -3899,7 +3919,7 @@ function cacheMapResult(cwd, result) {
3899
3919
  }
3900
3920
  function getCachedMapResult(cwd) {
3901
3921
  const validationStatus = getCacheValidationStatus(cwd);
3902
- if (validationStatus === "invalid") {
3922
+ if (validationStatus !== "valid") {
3903
3923
  return null;
3904
3924
  }
3905
3925
  return readCache(cwd, MAP_FILE, mapResultSchema);
@@ -3909,7 +3929,7 @@ function cacheDeadResult(cwd, result) {
3909
3929
  }
3910
3930
  function getCachedDeadResult(cwd) {
3911
3931
  const validationStatus = getCacheValidationStatus(cwd);
3912
- if (validationStatus === "invalid") {
3932
+ if (validationStatus !== "valid") {
3913
3933
  return null;
3914
3934
  }
3915
3935
  return readCache(cwd, DEAD_FILE, deadResultSchema);
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  depsInfo,
5
5
  depsSearch,
6
6
  describe
7
- } from "./chunk-6COZBZSS.js";
7
+ } from "./chunk-KOMBNMGC.js";
8
8
  import {
9
9
  VERSION,
10
10
  area,
@@ -20,7 +20,7 @@ import {
20
20
  impact,
21
21
  map,
22
22
  suggest
23
- } from "./chunk-MEG5Q7XP.js";
23
+ } from "./chunk-RGRCXEIT.js";
24
24
 
25
25
  // src/cli.ts
26
26
  import { resolve } from "path";
@@ -131,7 +131,7 @@ async function main() {
131
131
  }
132
132
  }
133
133
  if (flags.mcp) {
134
- const { startMcpServer } = await import("./server-W7QUWBDG.js");
134
+ const { startMcpServer } = await import("./server-66R2Y3FA.js");
135
135
  await startMcpServer();
136
136
  return;
137
137
  }
package/dist/index.js CHANGED
@@ -47,7 +47,7 @@ import {
47
47
  setFileDescription,
48
48
  suggest,
49
49
  writeConfig
50
- } from "./chunk-MEG5Q7XP.js";
50
+ } from "./chunk-RGRCXEIT.js";
51
51
  export {
52
52
  VERSION,
53
53
  area,
@@ -3,7 +3,7 @@ import {
3
3
  depsInfo,
4
4
  depsSearch,
5
5
  describe
6
- } from "./chunk-6COZBZSS.js";
6
+ } from "./chunk-KOMBNMGC.js";
7
7
  import {
8
8
  VERSION,
9
9
  area,
@@ -19,7 +19,7 @@ import {
19
19
  map,
20
20
  recoveryHint,
21
21
  suggest
22
- } from "./chunk-MEG5Q7XP.js";
22
+ } from "./chunk-RGRCXEIT.js";
23
23
 
24
24
  // src/mcp/server.ts
25
25
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@justmpm/ai-tool",
3
- "version": "3.20.0",
3
+ "version": "3.21.0",
4
4
  "description": "Ferramenta de análise de dependências e impacto para projetos TypeScript/JavaScript. Usa Skott + Knip internamente. Inclui busca por descrição, integração Git e testes inteligentes.",
5
5
  "keywords": [
6
6
  "dependency-analysis",