paqad-ai
Version:
Spec-driven development framework — AI agents that think before they type
367 lines (347 loc) • 13.9 kB
TypeScript
import { R as RuleRunFinding } from '../bundle-ledgers-3AJbkb_G.js';
declare const RULE_SCRIPT_MAP_SCHEMA_VERSION: 1;
type VerifiabilityKind = 'deterministic' | 'heuristic' | 'unverifiable';
type ScriptScope = 'changed-files' | 'whole-tree' | 'git-diff' | 'git-history';
interface Verifiability {
kind: VerifiabilityKind;
reason?: string;
}
interface ScriptEntry {
path: string;
kind: Exclude<VerifiabilityKind, 'unverifiable'>;
runtime: 'node';
scope: ScriptScope;
last_validated_at: string;
fixtures_passed: boolean;
}
interface RuleEntry {
id: string;
source: string;
text: string;
text_hash: string;
verifiability: Verifiability;
enforced_by: string[];
scripts: ScriptEntry[];
}
interface RuleScriptMap {
schema_version: typeof RULE_SCRIPT_MAP_SCHEMA_VERSION;
generated_at: string;
rule_files_hash: string;
rules: RuleEntry[];
archived?: RuleEntry[];
}
declare function sha256(input: string): string;
declare function ruleTextHash(text: string): string;
declare function parseRuleMarker(line: string): string | null;
declare function parseRuleMarkerRun(line: string): string | null;
declare function stripRuleMarker(line: string): {
text: string;
id: string | null;
};
declare function embedRuleMarker(line: string, id: string, discovered?: string): string;
declare function mintRuleId(source: string, text: string, takenIds: ReadonlySet<string>): string;
declare function isRuleId(value: string): boolean;
interface ParsedRule {
line: number;
indent: string;
text: string;
text_hash: string;
id: string | null;
}
declare function parseRuleFile(content: string): ParsedRule[];
interface EmbedResult {
content: string;
rules: {
id: string;
text: string;
text_hash: string;
isNew: boolean;
}[];
}
declare function embedRuleIds(source: string, content: string, takenIds: Set<string>): EmbedResult;
declare function ruleScriptMapPath(projectRoot: string): string;
declare function emptyRuleScriptMap(now?: Date): RuleScriptMap;
declare function loadRuleScriptMap(projectRoot: string): RuleScriptMap | null;
declare function serializeRuleScriptMap(map: RuleScriptMap): string;
interface RuleScriptMapEvent {
ts: string;
via: string;
action: 'analyze' | 'generate' | 'edit' | 'remove' | 'downgrade' | 'reconcile';
rule_ids: string[];
note?: string;
}
interface ApplyRuleScriptMapOptions {
projectRoot: string;
map: RuleScriptMap;
via: string;
event: Omit<RuleScriptMapEvent, 'ts' | 'via'>;
keepDigest?: boolean;
}
interface ApplyRuleScriptMapResult {
snapshot_path: string;
applied_at: string;
}
declare function snapshotRuleScriptMap(projectRoot: string, via: string, now?: Date): string;
declare function atomicWriteRuleScriptMap(projectRoot: string, yaml: string): void;
declare function applyRuleScriptMap(opts: ApplyRuleScriptMapOptions): ApplyRuleScriptMapResult;
interface RuleInventoryItem {
id: string;
source: string;
text: string;
text_hash: string;
isNew: boolean;
}
interface ScanResult {
inventory: RuleInventoryItem[];
files: string[];
rule_files_hash: string;
changed_files: string[];
}
declare function collectRuleFiles(projectRoot: string): string[];
declare function computeRuleFilesHash(projectRoot: string, files: string[]): string;
declare function scanAndEmbedIds(projectRoot: string): ScanResult;
interface RuleClassification {
id: string;
verifiability: RuleEntry['verifiability'];
enforced_by: string[];
}
declare function assembleMap(inventory: RuleInventoryItem[], classifications: Map<string, RuleClassification>, rule_files_hash: string, priorMap: RuleScriptMap | null, now?: Date): RuleScriptMap;
declare function isRuleScriptMapStale(projectRoot: string): boolean;
declare function isRuleScriptMapCurrent(projectRoot: string): boolean;
interface RepairedRuleText {
id: string;
text: string;
}
declare function dropRuleScriptMapSources(projectRoot: string, sources: readonly string[], mapWasCurrent: boolean, repairedTexts?: readonly RepairedRuleText[]): void;
interface CompileRuleScriptsResult {
map: RuleScriptMap;
ruleCount: number;
scriptedCount: number;
changedFiles: string[];
snapshotPath: string;
appliedAt: string;
}
declare function compileRuleScripts(projectRoot: string): CompileRuleScriptsResult;
interface ValidationResult {
valid: boolean;
errors: string[];
}
declare function validateScriptHeader(header: unknown): ValidationResult;
declare function validateFindings(report: unknown): ValidationResult;
declare const HEADER_MARKER = "@paqad-rule-script";
interface ScriptHeader {
rule_id: string;
source: string;
kind: 'deterministic' | 'heuristic';
scope: 'changed-files' | 'whole-tree' | 'git-diff' | 'git-history';
runtime: 'node';
requires?: {
node?: string;
binaries?: string[];
};
per_file?: boolean;
last_validated_at?: string;
false_positive_surface?: string;
}
declare function extractHeaderFields(content: string): Record<string, string> | null;
interface ParsedHeader {
ok: boolean;
header?: ScriptHeader;
errors: string[];
}
declare function parseScriptHeader(content: string): ParsedHeader;
interface ExecutePayload {
projectRoot: string;
files: string[];
}
interface Finding {
file: string;
line?: number;
message: string;
severity: 'critical' | 'blocker' | 'high' | 'medium' | 'low' | 'nit' | 'info';
}
interface FindingsReport {
rule_id: string;
kind: 'deterministic' | 'heuristic';
findings: Finding[];
}
interface ExecuteResult {
ok: boolean;
report?: FindingsReport;
error?: string;
warning?: string;
}
declare const SCRIPT_ABORTED_ERROR = "script stopped: the rule gate ran out of time";
declare function executeRuleScript(scriptPath: string, payload: ExecutePayload, timeoutMs?: number): ExecuteResult;
interface ExecuteAsyncOptions {
timeoutMs?: number;
signal?: AbortSignal;
}
declare function executeRuleScriptAsync(scriptPath: string, payload: ExecutePayload, options?: ExecuteAsyncOptions): Promise<ExecuteResult>;
declare function isOnPath(bin: string): boolean;
declare function missingBinaries(binaries: string[] | undefined): string[];
interface FixtureFailure {
fixture: string;
expected: 'zero-findings' | 'at-least-one-finding';
actual: number;
detail?: string;
}
interface FixtureResult {
passed: boolean;
pass_fixtures: number;
fail_fixtures: number;
failures: FixtureFailure[];
missing_fixtures: boolean;
missing_binaries?: string[];
}
declare function fixturesRoot(scriptPath: string): string;
declare function runFixtures(scriptPath: string): FixtureResult;
declare const OVER_FLAG_THRESHOLDS: Record<'deterministic' | 'heuristic', number>;
interface OverFlagResult {
files_checked: number;
files_flagged: number;
rate: number;
threshold: number;
exceeded: boolean;
}
declare function checkOverFlag(scriptPath: string, kind: Exclude<VerifiabilityKind, 'unverifiable'>, projectRoot: string, files: string[], threshold?: number): OverFlagResult;
declare function upsertScriptEntry(map: RuleScriptMap, ruleId: string, entry: ScriptEntry): RuleScriptMap;
declare function addRuleEntry(map: RuleScriptMap, entry: {
id: string;
source: string;
text: string;
text_hash: string;
}): RuleScriptMap;
declare function setRuleText(map: RuleScriptMap, ruleId: string, text: string, textHash: string): RuleScriptMap;
declare function clearRuleScripts(map: RuleScriptMap, ruleId: string): RuleScriptMap;
declare function setVerifiability(map: RuleScriptMap, ruleId: string, verifiability: Verifiability): RuleScriptMap;
declare function archiveRule(map: RuleScriptMap, ruleId: string): RuleScriptMap;
type RuleComplianceMode = 'off' | 'warn' | 'strict';
interface ScriptRunResult {
rule_id: string;
script: string;
kind: 'deterministic' | 'heuristic';
findings: Finding[];
skipped?: string;
warning?: string;
}
interface RunFilter {
kinds?: RuleScriptKind[];
scopes?: RuleScriptScope[];
}
interface RunReport {
generated_at: string;
mode: RuleComplianceMode;
rule_files_hash: string;
script_files_hash: string;
target_files_hash: string;
filter?: RunFilter;
results: ScriptRunResult[];
counts: {
deterministic: number;
heuristic: number;
skipped: number;
};
blocking: boolean;
from_cache?: boolean;
aborted?: boolean;
}
type RuleScriptKind = 'deterministic' | 'heuristic';
type RuleScriptScope = 'changed-files' | 'whole-tree';
interface RunOptions {
projectRoot: string;
mode: RuleComplianceMode;
changedFiles?: string[];
wholeTreeGlobs?: string[];
kinds?: RuleScriptKind[];
scopes?: RuleScriptScope[];
}
interface RunAsyncOptions extends RunOptions {
concurrency?: number;
signal?: AbortSignal;
useFileCache?: boolean;
scriptTimeoutMs?: number;
}
declare function scriptFilesHash(projectRoot: string, map: RuleScriptMap): string;
declare function runRuleScripts(opts: RunOptions): RunReport;
declare function runRuleScriptsAsync(opts: RunAsyncOptions): Promise<RunReport>;
declare function ruleRunFindings(report: RunReport): RuleRunFinding[] | undefined;
declare function readReport(projectRoot: string): RunReport | null;
interface RuleViolation {
rule_id: string;
title?: string;
script: string;
file: string;
line?: number;
message: string;
severity: Finding['severity'];
}
interface EnforcementResult {
ran: boolean;
mode: RuleComplianceMode;
blocking: boolean;
violations: RuleViolation[];
armed: number;
summary: string;
aborted?: boolean;
}
type EnforceScope = 'changed-files' | 'whole-tree';
interface EnforceOptions {
projectRoot: string;
mode: RuleComplianceMode;
changedFiles?: string[];
scope?: EnforceScope;
kinds?: RuleScriptKind[];
scopes?: RuleScriptScope[];
concurrency?: number;
signal?: AbortSignal;
useFileCache?: boolean;
editTargets?: string[];
}
declare function projectRelativeTargets(projectRoot: string, targets: string[] | undefined): string[];
declare function enforceRuleScripts(options: EnforceOptions): Promise<EnforcementResult>;
declare function formatEnforcementSummary(result: {
mode: RuleComplianceMode;
blocking: boolean;
violations: RuleViolation[];
}): string;
type RuleScriptFindingCode = 'RS-RULE-ADDED' | 'RS-RULE-EDITED' | 'RS-RULE-REMOVED' | 'RS-SCRIPT-STALE' | 'RS-FIXTURE-FAIL' | 'RS-CONFLICT' | 'RS-CACHE-INVALID';
interface RuleScriptDriftFinding {
code: RuleScriptFindingCode;
rule_id?: string;
source?: string;
message: string;
}
interface RuleScriptDriftReport {
generated_at: string;
findings: RuleScriptDriftFinding[];
counts: Record<RuleScriptFindingCode, number>;
blocked: boolean;
}
declare function reconcileRuleScripts(projectRoot: string): RuleScriptDriftReport;
declare function readDrift(projectRoot: string): RuleScriptDriftReport | null;
interface RuleConflict {
rule_ids: string[];
message: string;
}
declare function recordConflictFindings(projectRoot: string, conflicts: RuleConflict[]): RuleScriptDriftReport;
interface RuleWriteOptions {
discovered?: string;
}
declare function cleanRuleText(input: string): string;
interface AddedRule {
id: string;
source: string;
text: string;
text_hash: string;
}
declare function addRule(projectRoot: string, sourceRel: string, text: string, options?: RuleWriteOptions): AddedRule;
declare function editRuleText(projectRoot: string, ruleId: string, newText: string, options?: RuleWriteOptions): {
source: string;
} | null;
declare function removeRuleBullet(projectRoot: string, ruleId: string): {
source: string;
} | null;
declare function pruneOrphanScripts(projectRoot: string, map: RuleScriptMap): string[];
export { HEADER_MARKER, OVER_FLAG_THRESHOLDS, RULE_SCRIPT_MAP_SCHEMA_VERSION, SCRIPT_ABORTED_ERROR, addRule, addRuleEntry, applyRuleScriptMap, archiveRule, assembleMap, atomicWriteRuleScriptMap, checkOverFlag, cleanRuleText, clearRuleScripts, collectRuleFiles, compileRuleScripts, computeRuleFilesHash, dropRuleScriptMapSources, editRuleText, embedRuleIds, embedRuleMarker, emptyRuleScriptMap, enforceRuleScripts, executeRuleScript, executeRuleScriptAsync, extractHeaderFields, fixturesRoot, formatEnforcementSummary, isOnPath, isRuleId, isRuleScriptMapCurrent, isRuleScriptMapStale, loadRuleScriptMap, mintRuleId, missingBinaries, parseRuleFile, parseRuleMarker, parseRuleMarkerRun, parseScriptHeader, projectRelativeTargets, pruneOrphanScripts, readDrift, readReport, reconcileRuleScripts, recordConflictFindings, removeRuleBullet, ruleRunFindings, ruleScriptMapPath, ruleTextHash, runFixtures, runRuleScripts, runRuleScriptsAsync, scanAndEmbedIds, scriptFilesHash, serializeRuleScriptMap, setRuleText, setVerifiability, sha256, snapshotRuleScriptMap, stripRuleMarker, upsertScriptEntry, validateFindings, validateScriptHeader };
export type { AddedRule, ApplyRuleScriptMapOptions, ApplyRuleScriptMapResult, CompileRuleScriptsResult, EmbedResult, EnforceOptions, EnforceScope, EnforcementResult, ExecuteAsyncOptions, ExecutePayload, ExecuteResult, Finding, FindingsReport, FixtureFailure, FixtureResult, OverFlagResult, ParsedHeader, ParsedRule, RepairedRuleText, RuleClassification, RuleComplianceMode, RuleConflict, RuleEntry, RuleInventoryItem, RuleScriptDriftFinding, RuleScriptDriftReport, RuleScriptFindingCode, RuleScriptKind, RuleScriptMap, RuleScriptMapEvent, RuleScriptScope, RuleViolation, RuleWriteOptions, RunAsyncOptions, RunFilter, RunOptions, RunReport, ScanResult, ScriptEntry, ScriptHeader, ScriptRunResult, ScriptScope, ValidationResult, Verifiability, VerifiabilityKind };