34 lines
1.1 KiB
TypeScript
34 lines
1.1 KiB
TypeScript
/**
|
|
* Detect which SIBLINGS are installed by reading ~/.pi/agent/settings.json.
|
|
* Pure utility — no ExtensionAPI.
|
|
*/
|
|
|
|
import { existsSync, readFileSync } from "node:fs";
|
|
import { homedir } from "node:os";
|
|
import { join } from "node:path";
|
|
import { SIBLINGS, type SiblingPlugin } from "./siblings.js";
|
|
|
|
const PI_AGENT_SETTINGS = join(homedir(), ".pi", "agent", "settings.json");
|
|
|
|
function readInstalledPackages(): string[] {
|
|
if (!existsSync(PI_AGENT_SETTINGS)) return [];
|
|
try {
|
|
const raw = readFileSync(PI_AGENT_SETTINGS, "utf-8");
|
|
const settings = JSON.parse(raw) as { packages?: unknown };
|
|
if (!Array.isArray(settings.packages)) return [];
|
|
return settings.packages.filter((e): e is string => typeof e === "string");
|
|
} catch {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return the SIBLINGS not currently installed.
|
|
* Reads ~/.pi/agent/settings.json once per call — callers that need both the
|
|
* full snapshot and the missing subset should call this once and filter.
|
|
*/
|
|
export function findMissingSiblings(): SiblingPlugin[] {
|
|
const installed = readInstalledPackages();
|
|
return SIBLINGS.filter((s) => !installed.some((entry) => s.matches.test(entry)));
|
|
}
|