paqad-ai
Version:
Spec-driven development framework — AI agents that think before they type
76 lines (67 loc) • 2.29 kB
JavaScript
import process from 'node:process';
import { isPaqadDisabled, parseHookPayload, resolveProjectRoot } from './lib/paqad-disabled.mjs';
import { resolveCompletionTranscriptText } from './lib/transcript.mjs';
import { sessionIdFromStdin } from './lib/context-seam-emit.mjs';
import { runVerificationBackstop } from '../scripts/verify-backstop.mjs';
const ADAPTER_TYPE = process.argv[2] || undefined;
let input = '';
process.stdin.on('data', (chunk) => {
input += chunk;
});
process.stdin.on('end', () => {
void main(input);
});
process.stdin.resume();
const silent = { write: () => true };
async function recordMarkers(projectRoot, rawInput) {
try {
const payload = JSON.parse(rawInput);
const transcriptText = resolveCompletionTranscriptText(rawInput, ADAPTER_TYPE);
if (!transcriptText) return;
const distUrl = new URL('../../dist/stage-evidence/marker-parse.js', import.meta.url);
const { parseAndRecordMarkers } = await import(distUrl.href);
parseAndRecordMarkers({
projectRoot,
transcriptText,
sessionId: payload?.session_id ?? null,
adapter: ADAPTER_TYPE,
});
} catch {}
}
async function deferredForRunningStage(projectRoot, rawInput) {
const payload = parseHookPayload(rawInput);
try {
const distUrl = new URL('../../dist/stage-evidence/completion-deferred.js', import.meta.url);
const { deferCompletionForBackgroundStage } = await import(distUrl.href);
return deferCompletionForBackgroundStage({
projectRoot,
backgroundTasks: payload?.background_tasks,
sessionId: sessionIdFromStdin(rawInput),
adapter: ADAPTER_TYPE ?? 'gemini-cli',
}).deferred;
} catch {
return false;
}
}
async function main(rawInput) {
const projectRoot = resolveProjectRoot(process.env, parseHookPayload(rawInput));
if (!isPaqadDisabled(projectRoot)) {
await recordMarkers(projectRoot, rawInput);
if (await deferredForRunningStage(projectRoot, rawInput)) {
process.exit(0);
return;
}
}
try {
await runVerificationBackstop({
origin: 'hook-completion',
softFail: true,
projectRoot,
hostSessionId: sessionIdFromStdin(rawInput),
stdout: silent,
stderr: silent,
});
} catch {}
process.exit(0);
}