@justmpm/ai-tool 3.20.1 → 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-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
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
|
-
|
|
1398
|
-
|
|
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
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
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
|
|
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) =>
|
|
1677
|
+
filteredFunctions = extracted.functions.filter((fn) => classifySymbol("function", fn.name, fn.returnType) === kind);
|
|
1547
1678
|
filteredTypes = extracted.types.filter((t) => {
|
|
1548
|
-
const resolvedKind =
|
|
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(
|
|
1875
|
+
const matchFn = useWildcard ? (name) => matchWithWildcard(name, query) || matchWithWildcard(stripModulePrefix(name), query) : (name) => {
|
|
1743
1876
|
const n = name.toLowerCase();
|
|
1744
|
-
const s =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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) =>
|
|
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.
|
package/dist/cli.js
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
depsInfo,
|
|
5
5
|
depsSearch,
|
|
6
6
|
describe
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
134
|
+
const { startMcpServer } = await import("./server-66R2Y3FA.js");
|
|
135
135
|
await startMcpServer();
|
|
136
136
|
return;
|
|
137
137
|
}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
depsInfo,
|
|
4
4
|
depsSearch,
|
|
5
5
|
describe
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
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.
|
|
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",
|