From 28693ed0081ccc0f695c8e2cfde9179a95c64141 Mon Sep 17 00:00:00 2001 From: yslee Date: Mon, 6 Apr 2026 15:52:24 +0900 Subject: [PATCH] feat(hook): notify agent when no VCS detected on plan approval When a plan is approved in a directory without version control, include a message in the approval output so the agent can ask the user to initialize git before making changes. Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/hook/server/index.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/hook/server/index.ts b/apps/hook/server/index.ts index 797cc6e9..04dd3e03 100644 --- a/apps/hook/server/index.ts +++ b/apps/hook/server/index.ts @@ -63,7 +63,7 @@ import { startAnnotateServer, handleAnnotateServerReady, } from "@plannotator/server/annotate"; -import { type DiffType, getVcsContext, runVcsDiff, gitRuntime } from "@plannotator/server/vcs"; +import { type DiffType, getVcsContext, runVcsDiff, gitRuntime, detectVcs } from "@plannotator/server/vcs"; import { fetchRef, createWorktree, removeWorktree, ensureObjectAvailable } from "@plannotator/shared/worktree"; import { parsePRUrl, checkPRAuth, fetchPR, getCliName, getCliInstallUrl, getMRLabel, getMRNumberLabel, getDisplayRepo } from "@plannotator/server/pr"; import { writeRemoteShareLink } from "@plannotator/server/share-url"; @@ -967,10 +967,19 @@ if (args[0] === "sessions") { // Cleanup server.stop(); + // Check if working directory has version control (git or p4) + const noVcsMessage = await (async () => { + if (!result.approved) return ""; + const provider = await detectVcs(); + if (await provider.detect()) return ""; + return "\n\n[Note: No version control detected in this directory. Before making changes, ask the user if they want to initialize git to enable change tracking.]"; + })(); + // Output decision in the appropriate format for the harness if (isGemini) { if (result.approved) { - console.log(result.feedback ? JSON.stringify({ systemMessage: result.feedback }) : "{}"); + const systemMessage = (result.feedback || "") + noVcsMessage; + console.log(systemMessage ? JSON.stringify({ systemMessage }) : "{}"); } else { console.log( JSON.stringify({ @@ -1000,6 +1009,7 @@ if (args[0] === "sessions") { decision: { behavior: "allow", ...(updatedPermissions.length > 0 && { updatedPermissions }), + ...(noVcsMessage && { message: noVcsMessage.trim() }), }, }, })