src / dependencyChecker.ts
src / dependencyChecker.ts
/**
* Dependency checker for Timbers Toolbox plugin health tools.
* Checks availability of optional dependencies and reports status.
*/
export type DependencyStatus = "available" | "unavailable" | "unknown";
interface DependencyMap {
[key: string]: DependencyStatus;
}
/**
* Check the availability of all plugin dependencies.
* Returns a map of dependency name → status.
*/
export async function checkDependencies(): Promise<DependencyMap> {
const deps: DependencyMap = {};
// Check optional npm packages by attempting to resolve them
const optionalDeps = [
"simple-git",
"better-sqlite3",
"pdf-parse",
"mammoth",
"duck-duck-scrape",
"html-to-text",
"cheerio",
"epub2",
"tesseract.js",
"node-notifier",
"open",
"puppeteer",
];
for (const dep of optionalDeps) {
try {
await require.resolve(dep);
deps[dep] = "available";
} catch {
deps[dep] = "unavailable";
}
}
// Check system tools
const systemTools = ["python", "git", "ffmpeg", "ffprobe", "deno", "gh"];
for (const tool of systemTools) {
try {
const { execSync } = require("child_process");
execSync(`${tool} --version`, { stdio: "ignore" });
deps[tool] = "available";
} catch {
deps[tool] = "unavailable";
}
}
return deps;
}
/**
* Format dependency status for display in plugin_status tool.
*/
export function formatDependencyStatus(deps: DependencyMap): string {
const available = Object.entries(deps)
.filter(([, status]) => status === "available")
.map(([name]) => name);
const unavailable = Object.entries(deps)
.filter(([, status]) => status === "unavailable")
.map(([name]) => name);
const lines: string[] = [];
if (available.length > 0) {
lines.push(`Available (${available.length}): ${available.join(", ")}`);
}
if (unavailable.length > 0) {
lines.push(`Unavailable (${unavailable.length}): ${unavailable.join(", ")}`);
}
return lines.join("\n") || "No dependencies to check.";
}
/**
* Dependency checker for Timbers Toolbox plugin health tools.
* Checks availability of optional dependencies and reports status.
*/
export type DependencyStatus = "available" | "unavailable" | "unknown";
interface DependencyMap {
[key: string]: DependencyStatus;
}
/**
* Check the availability of all plugin dependencies.
* Returns a map of dependency name → status.
*/
export async function checkDependencies(): Promise<DependencyMap> {
const deps: DependencyMap = {};
// Check optional npm packages by attempting to resolve them
const optionalDeps = [
"simple-git",
"better-sqlite3",
"pdf-parse",
"mammoth",
"duck-duck-scrape",
"html-to-text",
"cheerio",
"epub2",
"tesseract.js",
"node-notifier",
"open",
"puppeteer",
];
for (const dep of optionalDeps) {
try {
await require.resolve(dep);
deps[dep] = "available";
} catch {
deps[dep] = "unavailable";
}
}
// Check system tools
const systemTools = ["python", "git", "ffmpeg", "ffprobe", "deno", "gh"];
for (const tool of systemTools) {
try {
const { execSync } = require("child_process");
execSync(`${tool} --version`, { stdio: "ignore" });
deps[tool] = "available";
} catch {
deps[tool] = "unavailable";
}
}
return deps;
}
/**
* Format dependency status for display in plugin_status tool.
*/
export function formatDependencyStatus(deps: DependencyMap): string {
const available = Object.entries(deps)
.filter(([, status]) => status === "available")
.map(([name]) => name);
const unavailable = Object.entries(deps)
.filter(([, status]) => status === "unavailable")
.map(([name]) => name);
const lines: string[] = [];
if (available.length > 0) {
lines.push(`Available (${available.length}): ${available.join(", ")}`);
}
if (unavailable.length > 0) {
lines.push(`Unavailable (${unavailable.length}): ${unavailable.join(", ")}`);
}
return lines.join("\n") || "No dependencies to check.";
}