import type { HerdrCapabilityResolver } from "./capability.js"; /** * The tool loads on demand, so the model needs this note before it reaches for `herdr` or * `git worktree` in bash. */ export const HERDR_PROMPT_NOTE = "Use the herdr_worktree tool for Git worktrees, not herdr or git worktree in bash. Create a worktree when work needs its own checkout, for example parallel multi-agent work."; interface BeforeAgentStartEvent { readonly systemPrompt?: unknown; } interface BeforeAgentStartContext { readonly cwd?: string; readonly signal?: AbortSignal; } interface BeforeAgentStartResult { readonly systemPrompt: string; } export interface HerdrPromptApi { on?( event: "before_agent_start", handler: ( event: BeforeAgentStartEvent, context?: BeforeAgentStartContext, ) => Promise, ): void; } export function registerHerdrGuidance( pi: HerdrPromptApi, capabilities: HerdrCapabilityResolver, ): void { pi.on?.("before_agent_start", async (event, context) => { const systemPrompt = event?.systemPrompt; // A host may chain several handlers, so the note must not be appended twice. if (typeof systemPrompt !== "string" || systemPrompt.includes(HERDR_PROMPT_NOTE)) { return undefined; } const capability = await capabilities.tryEnsure(context?.cwd ?? process.cwd(), context?.signal); if (!capability) { return undefined; } return { systemPrompt: `${systemPrompt}\n\n${HERDR_PROMPT_NOTE}` }; }); }