import * as path from "node:path"; import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; import { packageRoot } from "../lib/base-paths.ts"; import { resolveRuleFiles } from "../lib/rules.ts"; const LOCAL_RULES_SUBDIR = path.join(".agent", "rules"); export default function agentRulesExtension(pi: ExtensionAPI) { let rules: { label: string }[] = []; pi.on("session_start", async (_event, ctx) => { const baseDir = path.join(packageRoot(), "rules"); const localDir = path.join(ctx.cwd, LOCAL_RULES_SUBDIR); rules = resolveRuleFiles(baseDir, localDir).map((r) => ({ label: path.relative(ctx.cwd, r.absPath), })); if (rules.length > 0) ctx.ui.notify(`Found ${rules.length} rule(s) (base + local)`, "info"); }); pi.on("before_agent_start", async (event) => { if (rules.length === 0) return; const list = rules.map((r) => `- ${r.label}`).join("\n"); return { systemPrompt: event.systemPrompt + `\n\n## Project Rules\n\nThe following rules are available (base package + local overrides):\n\n${list}\n\nWhen working on tasks that touch one of these areas, read the relevant rule file(s) before acting.\n`, }; }); }