feat(cli): add sysinfo command to obtain actual version (#1413)

This commit is contained in:
David Duong
2025-07-17 10:06:53 +02:00
committed by GitHub
parent 9ce729a0fe
commit 78a15a1042
5 changed files with 103 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
---
"@langchain/langgraph-cli": patch
"@langchain/langgraph-api": patch
"@langchain/langgraph-ui": patch
---
feat(cli): add sysinfo command to obtain actual version
+1
View File
@@ -43,6 +43,7 @@
"extract-zip": "^2.0.1",
"langsmith": "^0.3.33",
"open": "^10.1.0",
"package-manager-detector": "^1.3.0",
"stacktrace-parser": "^0.1.10",
"tar": "^7.4.3",
"winston": "^3.17.0",
+1
View File
@@ -7,6 +7,7 @@ import "./dev.mjs";
import "./docker.mjs";
import "./build.mjs";
import "./up.mjs";
import "./sysinfo.mjs";
builder.exitOverride((error) => gracefulExit(error.exitCode));
asyncExitHook(() => flushAnalytics(), { wait: 2000 });
+86
View File
@@ -0,0 +1,86 @@
import { builder } from "./utils/builder.mjs";
import { detect } from "package-manager-detector";
import { $ } from "execa";
builder
.command("sysinfo")
.description("Print system information")
.action(async () => {
const manager = await detect();
if (!manager) throw new Error("No package manager detected");
console.log("Node version:", process.version);
console.log("Operating system:", process.platform, process.arch);
console.log("Package manager:", manager.name);
console.log("Package manager version:", manager.version);
console.log("-".repeat(20));
const output = await (async () => {
switch (manager.name) {
case "npm":
return await $`npm ls --depth=4`;
case "yarn":
if (manager.version === "berry") {
return await $`yarn info`;
}
return await $`yarn list --depth=4`;
case "pnpm":
return await $`pnpm ls --depth=4`;
case "bun":
return await $`bun pm ls`;
default:
return await $`npm ls`;
}
})();
const gatherMatch = (str: string, regex: RegExp) => {
return [...new Set(str.matchAll(regex).map((match) => match[0]))];
};
const packages = gatherMatch(
output.stdout,
/(@langchain\/[^\s@]+|langsmith|langchain)/g
);
async function getPackageInfo(packageName: string) {
switch (manager?.name) {
case "npm":
return (await $`npm explain ${packageName}`).stdout;
case "yarn":
return (await $`yarn why ${packageName}`).stdout;
case "pnpm":
return (await $`pnpm why ${packageName}`).stdout;
case "bun":
return (await $`bun why ${packageName}`).stdout;
default:
return null;
}
}
function escapeRegExp(text: string) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
for (const pkg of packages) {
const info = await getPackageInfo(pkg);
if (!info) continue;
const targetRegex = new RegExp(escapeRegExp(pkg) + "@[^\\s]*", "g");
console.log(
pkg,
"->",
gatherMatch(info, targetRegex)
.map((i) => i.slice(pkg.length))
.join(", ")
);
}
});
+8
View File
@@ -1955,6 +1955,7 @@ __metadata:
extract-zip: "npm:^2.0.1"
langsmith: "npm:^0.3.33"
open: "npm:^10.1.0"
package-manager-detector: "npm:^1.3.0"
prettier: "npm:^2.8.3"
stacktrace-parser: "npm:^0.1.10"
tar: "npm:^7.4.3"
@@ -11078,6 +11079,13 @@ __metadata:
languageName: node
linkType: hard
"package-manager-detector@npm:^1.3.0":
version: 1.3.0
resolution: "package-manager-detector@npm:1.3.0"
checksum: 10/b21155d53a8ab96d5be3bfae43cc1d397bf363782b922d1f6967d220d2a9f08234ebb76035318bf92822ce761d10451959f01019faebc08fdb4d4a8bc3103da6
languageName: node
linkType: hard
"pako@npm:~1.0.5":
version: 1.0.11
resolution: "pako@npm:1.0.11"