Commitd3506b3unknown_key
feat: wire self-healing loop into post-receive hooks
feat: wire self-healing loop into post-receive hooks When GateTest fails on a push, the heal loop now auto-triggers if autoFixEnabled is true in repo settings. Runs asynchronously so it doesn't block the push response. Broadcasts SSE events at each step for live UI feedback. https://claude.ai/code/session_01M6EgoTaZ6HAZiVu77xp11g
1 file changed+15−1d3506b38279f5bcc3f78a102629793fbb55f1dca
1 changed file+15−1
Modifiedsrc/hooks/post-receive.ts+15−1View fileUnifiedSplit
@@ -289,12 +289,26 @@ export async function onPostReceive(
289289 if (ref.newSha.startsWith("0000")) continue;
290290
291291 if (settings?.gateTestEnabled !== false) {
292 const branch = ref.refName.replace(/^refs\/heads\//, "");
292293 promises.push(
293294 runGateTestScan(owner, repo, ref.refName, ref.newSha)
294 .then((result) => {
295 .then(async (result) => {
295296 console.log(
296297 `[gatetest] ${owner}/${repo} ${ref.refName}: ${result.passed ? "PASSED" : "FAILED"} — ${result.details}`
297298 );
299 // Self-healing: if gate failed, trigger the heal loop
300 if (!result.passed && !result.skipped && settings?.autoFixEnabled !== false && repoRow) {
301 try {
302 const { runHealLoop, isHealLoopEnabled } = await import("../lib/heal-loop");
303 if (isHealLoopEnabled()) {
304 console.log(`[heal-loop] Triggering for ${owner}/${repo}:${branch}`);
305 runHealLoop(owner, repo, branch, {
306 repositoryId: repoRow.id,
307 triggerSource: "post-receive",
308 }).catch((err) => console.error("[heal-loop] Error:", err));
309 }
310 } catch {}
311 }
298312 })
299313 .catch((err) => {
300314 console.error(`[gatetest] scan error for ${owner}/${repo}:`, err);
301315