add pi-config extension
This commit is contained in:
@@ -308,4 +308,101 @@ export default function (pi: ExtensionAPI) {
|
||||
ctx.ui.notify(output.join("\n"), "info");
|
||||
},
|
||||
});
|
||||
|
||||
// ── /config-setup ───────────────────────────────────────────
|
||||
pi.registerCommand("config-setup", {
|
||||
description: "Set up this folder with .pi, settings.json, and memory vault. Creates what's missing and sets MEMCTX_PACKS_PATH for the current session.",
|
||||
handler: async (_args, ctx: ExtensionCommandContext) => {
|
||||
const cwd = ctx.cwd;
|
||||
const piDir = path.join(cwd, ".pi");
|
||||
const settingsPath = path.join(piDir, "settings.json");
|
||||
const memoryPacksDir = path.join(piDir, "memory-vault", "packs");
|
||||
|
||||
const created: string[] = [];
|
||||
const existed: string[] = [];
|
||||
|
||||
// 1. .pi/
|
||||
if (!fs.existsSync(piDir)) {
|
||||
fs.mkdirSync(piDir, { recursive: true });
|
||||
created.push(".pi/");
|
||||
} else {
|
||||
existed.push(".pi/");
|
||||
}
|
||||
|
||||
// 2. settings.json — load or create, ensure ~/.agents package
|
||||
let settings: PiSettings;
|
||||
if (fs.existsSync(settingsPath)) {
|
||||
try {
|
||||
settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
|
||||
} catch {
|
||||
settings = {};
|
||||
}
|
||||
existed.push(".pi/settings.json");
|
||||
} else {
|
||||
settings = {};
|
||||
created.push(".pi/settings.json");
|
||||
}
|
||||
ensureAgentsPackage(settings);
|
||||
saveSettings(cwd, settings);
|
||||
|
||||
// 3. memory-vault/packs/
|
||||
if (!fs.existsSync(memoryPacksDir)) {
|
||||
fs.mkdirSync(memoryPacksDir, { recursive: true });
|
||||
created.push(".pi/memory-vault/packs/");
|
||||
} else {
|
||||
existed.push(".pi/memory-vault/packs/");
|
||||
}
|
||||
|
||||
// 4. Seed a minimal pack so pi-memctx finds this vault (needs at least one pack to exist)
|
||||
const slug = path.basename(cwd).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "workspace";
|
||||
const seedPackDir = path.join(memoryPacksDir, slug, "00-system", "pi-agent");
|
||||
if (!fs.existsSync(seedPackDir)) {
|
||||
fs.mkdirSync(seedPackDir, { recursive: true });
|
||||
const today = new Date().toISOString().slice(0, 10);
|
||||
const title = slug.replace(/-/g, " ").replace(/\b\w/g, (c: string) => c.toUpperCase());
|
||||
const manifest = `---
|
||||
type: system
|
||||
id: system.${slug}.memory-manifest
|
||||
title: ${title} Memory Manifest
|
||||
status: active
|
||||
source_of_truth: true
|
||||
freshness: current
|
||||
last_reviewed: ${today}
|
||||
tags:
|
||||
- agent-memory/system
|
||||
- pack/${slug}
|
||||
---
|
||||
|
||||
# ${title} Memory Manifest
|
||||
|
||||
This pack stores safe durable context generated from \`${cwd}\`.
|
||||
|
||||
## Retrieval Protocol
|
||||
|
||||
See [[packs/${slug}/00-system/pi-agent/retrieval-protocol|Retrieval Protocol]] and [[packs/${slug}/00-system/pi-agent/resource-map|Resource Map]].
|
||||
`;
|
||||
fs.writeFileSync(path.join(seedPackDir, "memory-manifest.md"), manifest);
|
||||
created.push(".pi/memory-vault/packs/" + slug + "/");
|
||||
}
|
||||
|
||||
// 5. Set env var so pi-memctx uses this local vault for the session
|
||||
process.env.MEMCTX_PACKS_PATH = memoryPacksDir;
|
||||
|
||||
const lines = [
|
||||
created.length > 0
|
||||
? `\u2713 Created: ${created.join(", ")}`
|
||||
: "",
|
||||
existed.length > 0
|
||||
? ` Already existed: ${existed.join(", ")}`
|
||||
: "",
|
||||
"",
|
||||
`MEMCTX_PACKS_PATH set to:`,
|
||||
` ${memoryPacksDir}`,
|
||||
"",
|
||||
created.length > 0 ? "Next: run /memctx-init in this folder to create the memory pack." : "",
|
||||
].filter(Boolean).join("\n");
|
||||
|
||||
ctx.ui.notify(lines, "success");
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user