@kodr/aiwrangler 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +34 -12
- package/dist/{chunk-NQFO47CV.js → chunk-4D4NYPL3.js} +5 -5
- package/dist/{chunk-EAQASAXL.js → chunk-F3YFQ4NW.js} +18 -403
- package/dist/chunk-F3YFQ4NW.js.map +1 -0
- package/dist/{chunk-EDVWHCQV.js → chunk-HT3QDS3C.js} +2 -2
- package/dist/{chunk-2CIV4KGU.js → chunk-RZWCNEZS.js} +408 -21
- package/dist/chunk-RZWCNEZS.js.map +1 -0
- package/dist/cli.js +4 -4
- package/dist/index.d.ts +10 -1
- package/dist/index.js +22 -16
- package/dist/mcp.js +4 -4
- package/dist/plugin.js +184 -5
- package/dist/plugin.js.map +1 -1
- package/dist/tools.js +4 -4
- package/package.json +11 -5
- package/dist/chunk-2CIV4KGU.js.map +0 -1
- package/dist/chunk-EAQASAXL.js.map +0 -1
- /package/dist/{chunk-NQFO47CV.js.map → chunk-4D4NYPL3.js.map} +0 -0
- /package/dist/{chunk-EDVWHCQV.js.map → chunk-HT3QDS3C.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/jsonc.ts","../src/overrides.ts","../src/config.ts","../src/hash.ts","../src/groundtruth/sectionize.ts","../src/groundtruth/parsers.ts","../src/groundtruth/whitepaper.ts","../src/groundtruth/corpus.ts","../src/git/diff.ts","../src/gates/deterministic/rules.ts","../src/gates/deterministic/cargo.ts","../src/gates/deterministic/index.ts","../src/loop.ts","../src/ledger.ts"],"sourcesContent":["export type SourceKind = \"spec\" | \"rule\" | \"divergence\" | \"question\" | \"door\" | \"paper\" | \"doc\"\n\nexport type EntryStatus = \"ruled\" | \"open\" | \"answered\" | \"info\"\n\nexport interface CorpusSection {\n id: string\n kind: SourceKind\n title: string\n text: string\n source: string\n status: EntryStatus\n ruling?: string\n paperRef?: string\n precedence: number\n}\n\nexport interface CorpusSource {\n path: string\n hash: string\n}\n\nexport interface Corpus {\n sections: CorpusSection[]\n sources: CorpusSource[]\n hash: string\n paperText: string\n}\n\nexport const PRECEDENCE = {\n ruling: 0,\n paper: 1,\n door: 1,\n spec: 2,\n doc: 3,\n nonRuling: 4,\n} as const\n\nexport type Severity = \"block\" | \"review\" | \"human\"\n\nexport interface DiffLine {\n kind: \"add\" | \"del\" | \"ctx\"\n text: string\n newLine?: number\n oldLine?: number\n}\n\nexport interface DiffHunk {\n header: string\n lines: DiffLine[]\n}\n\nexport interface DiffFile {\n path: string\n oldPath?: string\n binary: boolean\n hunks: DiffHunk[]\n}\n\nexport interface RepoDiff {\n repo: string\n repoDir: string\n files: DiffFile[]\n}\n\nexport interface Finding {\n rule: string\n severity: Severity\n repo: string\n file: string\n line: number | null\n evidence: string\n note: string\n kind?: \"deterministic\" | \"semantic\"\n confidence?: number\n noul?: number\n acknowledged?: boolean\n}\n","export function stripJsonc(text: string): string {\n let out = \"\"\n let inString = false\n let inLine = false\n let inBlock = false\n for (let i = 0; i < text.length; i++) {\n const c = text[i] ?? \"\"\n const next = text[i + 1] ?? \"\"\n if (inLine) {\n if (c === \"\\n\") {\n inLine = false\n out += c\n }\n continue\n }\n if (inBlock) {\n if (c === \"*\" && next === \"/\") {\n inBlock = false\n i++\n }\n continue\n }\n if (inString) {\n out += c\n if (c === \"\\\\\" && next !== \"\") {\n out += next\n i++\n continue\n }\n if (c === '\"') inString = false\n continue\n }\n if (c === '\"') {\n inString = true\n out += c\n continue\n }\n if (c === \"/\" && next === \"/\") {\n inLine = true\n i++\n continue\n }\n if (c === \"/\" && next === \"*\") {\n inBlock = true\n i++\n continue\n }\n out += c\n }\n return out\n}\n\nexport function parseJsonc(text: string): unknown {\n const stripped = stripJsonc(text).replace(/,(\\s*[}\\]])/g, \"$1\")\n return JSON.parse(stripped)\n}\n","import { existsSync, readFileSync, writeFileSync, unlinkSync, renameSync, mkdirSync } from \"node:fs\"\nimport { join, dirname } from \"node:path\"\nimport { z } from \"zod\"\nimport type { Config } from \"./config.js\"\nimport { applyGateFlag, expandPath } from \"./config.js\"\n\nexport const OVERRIDES_FILENAME = \"runtime-overrides.json\"\n\nexport const RuntimeOverridesSchema = z.object({\n activePolicy: z.string().optional(),\n egressSemantic: z.boolean().optional(),\n actionThreshold: z.number().min(0).max(1).optional(),\n reviewThreshold: z.number().min(0).max(1).optional(),\n gates: z.record(z.string(), z.boolean()).optional(),\n})\n\nexport type RuntimeOverrides = z.infer<typeof RuntimeOverridesSchema>\n\nconst OverridesFileSchema = z.object({\n version: z.literal(1),\n createdAt: z.string(),\n note: z.string().optional(),\n expiresOn: z.enum([\"pass\", \"manual\"]),\n overrides: RuntimeOverridesSchema,\n})\n\nexport type OverridesFile = z.infer<typeof OverridesFileSchema>\n\nexport function overridesFilePath(config: Config, root: string): string {\n return join(expandPath(config.cache.dir, root), OVERRIDES_FILENAME)\n}\n\nexport function readRuntimeOverridesFile(config: Config, root: string): OverridesFile | null {\n const path = overridesFilePath(config, root)\n if (!existsSync(path)) return null\n try {\n const parsed = OverridesFileSchema.safeParse(JSON.parse(readFileSync(path, \"utf8\")))\n if (!parsed.success) return null\n return parsed.data\n } catch {\n return null\n }\n}\n\nexport function writeRuntimeOverridesFile(config: Config, root: string, file: OverridesFile): void {\n const path = overridesFilePath(config, root)\n mkdirSync(dirname(path), { recursive: true })\n const tmp = path + \".tmp\"\n writeFileSync(tmp, JSON.stringify(file, null, 2) + \"\\n\", \"utf8\")\n renameSync(tmp, path)\n}\n\nexport function clearRuntimeOverrides(config: Config, root: string): boolean {\n const path = overridesFilePath(config, root)\n if (!existsSync(path)) return false\n try {\n unlinkSync(path)\n return true\n } catch {\n return false\n }\n}\n\nexport function applyRuntimeOverrides(config: Config, overrides: RuntimeOverrides): { config: Config; appliedGates: string[] } {\n const next = structuredClone(config)\n const appliedGates: string[] = []\n if (overrides.activePolicy !== undefined) {\n if (!(overrides.activePolicy in next.policies)) {\n throw new Error(`runtime override activePolicy '${overrides.activePolicy}' is not a defined policy`)\n }\n next.activePolicy = overrides.activePolicy\n }\n if (overrides.egressSemantic !== undefined) next.egress.semantic = overrides.egressSemantic\n if (overrides.actionThreshold !== undefined || overrides.reviewThreshold !== undefined) {\n const policy = next.policies[next.activePolicy]\n if (!policy) throw new Error(`activePolicy '${next.activePolicy}' not defined in policies`)\n next.policies[next.activePolicy] = {\n actionThreshold: overrides.actionThreshold ?? policy.actionThreshold,\n reviewThreshold: overrides.reviewThreshold ?? policy.reviewThreshold,\n }\n }\n for (const [name, value] of Object.entries(overrides.gates ?? {})) {\n appliedGates.push(...applyGateFlag(next, name, value))\n }\n return { config: next, appliedGates }\n}\n\nexport function applyRuntimeOverridesFromDisk(config: Config, root: string): { config: Config; overrides: RuntimeOverrides | null } {\n const file = readRuntimeOverridesFile(config, root)\n if (!file) return { config, overrides: null }\n try {\n return { config: applyRuntimeOverrides(config, file.overrides).config, overrides: file.overrides }\n } catch {\n return { config, overrides: null }\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { isAbsolute, join, dirname, resolve } from \"node:path\"\nimport { z } from \"zod\"\nimport { parseJsonc } from \"./jsonc.js\"\nimport { applyRuntimeOverridesFromDisk, type RuntimeOverrides } from \"./overrides.js\"\n\nconst bool = (def: boolean) => z.boolean().default(def)\n\nconst GatesSchema = z.object({\n plan: z.object({ inSpec: bool(true), ambiguity: bool(true), openQuestions: bool(true), oneWayDoors: bool(true) }).default({}),\n retrieval: z.object({ rerank: bool(true), topK: z.number().int().min(1).max(20).default(6) }).default({}),\n check: z\n .object({\n deterministic: bool(true),\n battery: bool(true),\n selfReport: bool(true),\n testQuality: bool(true),\n docDrift: bool(true),\n injectionDefense: bool(true),\n })\n .default({}),\n security: z\n .object({ trustBoundary: bool(true), severity: bool(true), alwaysHuman: z.array(z.string()).default([\"keys\", \"seals\", \"digests\"]) })\n .default({}),\n loop: z.object({ retryProgress: bool(true), errorSalience: bool(true), maxCycles: z.number().int().min(1).default(3) }).default({}),\n session: z.object({ endAudit: bool(true), nudge: bool(true), maxNudges: z.number().int().min(0).default(3) }).default({}),\n})\n\nconst ThresholdsSchema = z.object({\n actionThreshold: z.number().min(0).max(1).default(0.8),\n reviewThreshold: z.number().min(0).max(1).default(0.5),\n})\n\nexport const ConfigSchema = z.object({\n model: z.string().default(\"jev-1.13.0\"),\n activePolicy: z.string().default(\"strict\"),\n egress: z.object({ semantic: bool(true), warnOncePerSession: bool(true) }).default({}),\n corpus: z\n .object({\n spec: z.string().default(\"corpus/spec.md\"),\n rules: z.string().default(\"corpus/rules.md\"),\n divergences: z.string().default(\"corpus/divergences.md\"),\n questions: z.string().default(\"corpus/questions.md\"),\n plan: z.string().default(\"corpus/plan.md\"),\n docs: z.array(z.string()).default([]),\n whitepaper: z.string().default(\"corpus/whitepaper.pdf\"),\n })\n .default({}),\n gates: GatesSchema.default({}),\n policies: z.record(z.string(), ThresholdsSchema).default({ strict: {}, permissive: { actionThreshold: 0.9, reviewThreshold: 0.35 } }),\n cache: z.object({ dir: z.string().default(\".aiwrangler\") }).default({}),\n ledger: z.object({ path: z.string().default(\".aiwrangler/ledger.jsonl\") }).default({}),\n repos: z\n .object({\n super: z.string().default(\".\"),\n members: z.array(z.string()).default([]),\n reviewed: z.array(z.string()).default([]),\n })\n .default({}),\n})\n\nexport type Config = z.infer<typeof ConfigSchema>\nexport type GatePath = string\n\nexport interface LoadedConfig {\n config: Config\n root: string\n source: \"explicit\" | \"discovered\" | \"user\" | \"defaults\"\n path: string | null\n overrides: import(\"./overrides.js\").RuntimeOverrides | null\n}\n\nexport function expandPath(p: string, root: string): string {\n if (p.startsWith(\"~\")) return join(homedir(), p.slice(1))\n if (isAbsolute(p)) return p\n return resolve(root, p)\n}\n\nexport function findConfigFile(startDir: string): { path: string; source: \"discovered\" | \"user\" } | null {\n let dir = resolve(startDir)\n for (;;) {\n const candidate = join(dir, \"aiwrangler.config.json\")\n if (existsSync(candidate)) return { path: candidate, source: \"discovered\" }\n const parent = dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n const user = join(homedir(), \".config\", \"aiwrangler\", \"aiwrangler.config.json\")\n if (existsSync(user)) return { path: user, source: \"user\" }\n return null\n}\n\nexport function flattenGates(config: Config): Map<GatePath, boolean> {\n const flat = new Map<GatePath, boolean>()\n const walk = (obj: unknown, prefix: string) => {\n if (obj === null || typeof obj !== \"object\") return\n for (const [key, value] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${key}` : key\n if (typeof value === \"boolean\") flat.set(path, value)\n else if (typeof value === \"object\" && !Array.isArray(value)) walk(value, path)\n }\n }\n walk(config.gates, \"\")\n return flat\n}\n\nexport function applyGateFlag(config: Config, name: string, value: boolean): string[] {\n const flat = flattenGates(config)\n const applied: string[] = []\n for (const path of flat.keys()) {\n const leaf = path.split(\".\").pop() ?? path\n if (path === name || leaf === name) {\n const parts = path.split(\".\")\n let node: Record<string, unknown> = config.gates as unknown as Record<string, unknown>\n for (const part of parts.slice(0, -1)) node = node[part] as Record<string, unknown>\n node[parts[parts.length - 1]!] = value\n applied.push(path)\n }\n }\n if (applied.length === 0) {\n throw new Error(`unknown gate '${name}'. Known gates: ${[...flat.keys()].join(\", \")}`)\n }\n return applied\n}\n\nfunction applyFlagList(config: Config, list: string, value: boolean): string[] {\n const applied: string[] = []\n const names = list\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n for (const name of names) {\n applied.push(...applyGateFlag(config, name, value))\n }\n return applied\n}\n\nexport function applyEnvOverrides(config: Config, env: Record<string, string | undefined> = process.env): Config {\n const next = structuredClone(config)\n if (env.AIWRANGLER_MODEL) next.model = env.AIWRANGLER_MODEL\n if (env.AIWRANGLER_POLICY) {\n if (!(env.AIWRANGLER_POLICY in next.policies)) {\n throw new Error(`AIWRANGLER_POLICY: unknown policy '${env.AIWRANGLER_POLICY}'. Known: ${Object.keys(next.policies).join(\", \")}`)\n }\n next.activePolicy = env.AIWRANGLER_POLICY\n }\n if (env.AIWRANGLER_EGRESS) {\n const on = [\"1\", \"true\", \"on\", \"yes\"].includes(env.AIWRANGLER_EGRESS.toLowerCase())\n next.egress.semantic = on\n }\n if (env.AIWRANGLER_DISABLE) applyFlagList(next, env.AIWRANGLER_DISABLE, false)\n if (env.AIWRANGLER_ENABLE) applyFlagList(next, env.AIWRANGLER_ENABLE, true)\n return next\n}\n\nexport function loadConfig(startDir: string, env: Record<string, string | undefined> = process.env): LoadedConfig {\n const explicit = env.AIWRANGLER_CONFIG\n let raw: unknown\n let root: string\n let source: LoadedConfig[\"source\"]\n let path: string | null\n\n if (explicit) {\n path = expandPath(explicit, resolve(startDir))\n if (!existsSync(path)) throw new Error(`AIWRANGLER_CONFIG: file not found: ${path}`)\n raw = parseJsonc(readFileSync(path, \"utf8\"))\n root = dirname(path)\n source = \"explicit\"\n } else {\n const found = findConfigFile(startDir)\n if (found) {\n path = found.path\n raw = parseJsonc(readFileSync(found.path, \"utf8\"))\n root = dirname(found.path)\n source = found.source\n } else {\n raw = {}\n root = resolve(startDir)\n source = \"defaults\"\n path = null\n }\n }\n\n const parsed = ConfigSchema.safeParse(raw)\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => ` ${i.path.join(\".\") || \"(root)\"}: ${i.message}`)\n .join(\"\\n\")\n throw new Error(`invalid aiwrangler config at ${path ?? \"defaults\"}:\\n${issues}`)\n }\n const { config, overrides } = applyRuntimeOverridesFromDisk(parsed.data, root)\n return { config: applyEnvOverrides(config, env), root, source, path, overrides }\n}\n\nexport function activeThresholds(config: Config): { actionThreshold: number; reviewThreshold: number } {\n const policy = config.policies[config.activePolicy]\n if (!policy) throw new Error(`activePolicy '${config.activePolicy}' not defined in policies`)\n return policy\n}\n","import { createHash } from \"node:crypto\"\n\nexport function sha256Hex(text: string): string {\n return createHash(\"sha256\").update(text, \"utf8\").digest(\"hex\")\n}\n\nexport function shortHash(text: string): string {\n return sha256Hex(text).slice(0, 12)\n}\n","export interface MdSection {\n level: number\n title: string\n text: string\n line: number\n}\n\nexport function splitMarkdown(md: string): MdSection[] {\n const lines = md.split(\"\\n\")\n const sections: MdSection[] = []\n let current: MdSection | null = null\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\"\n const m = line.match(/^(#{1,6})\\s+(.*)$/)\n if (m) {\n if (current) sections.push(current)\n current = { level: m[1]!.length, title: m[2]!.trim(), text: \"\", line: i + 1 }\n } else if (current) {\n current.text += line + \"\\n\"\n }\n }\n if (current) sections.push(current)\n return sections.map((s) => ({ ...s, text: s.text.trim() }))\n}\n\nexport function slug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 40)\n}\n","import type { CorpusSection, EntryStatus, SourceKind } from \"../types.js\"\nimport { PRECEDENCE } from \"../types.js\"\nimport { splitMarkdown, slug } from \"./sectionize.js\"\n\nfunction section(partial: Omit<CorpusSection, \"precedence\"> & { precedence?: number }): CorpusSection {\n return { precedence: PRECEDENCE.doc, ...partial }\n}\n\nconst ROMAN_RE = /^[IVX]+(?:-[A-Z])?$/\n\nexport function parseSpec(md: string, source: string): CorpusSection[] {\n const out: CorpusSection[] = []\n for (const sec of splitMarkdown(md)) {\n const m = sec.title.match(/^(\\d+)\\.\\s+(.*)$/)\n if (!m) continue\n const title = m[2]!\n const ref = title.match(/\\(([^)]+)\\)\\s*$/)\n const paperRef = ref && ROMAN_RE.test(ref[1]!) ? ref[1] : undefined\n out.push(\n section({\n id: `SPEC-${m[1]}`,\n kind: \"spec\",\n title,\n text: sec.text,\n source,\n status: \"info\",\n ...(paperRef ? { paperRef } : {}),\n precedence: PRECEDENCE.spec,\n }),\n )\n }\n return out\n}\n\nexport function parseRules(md: string, source: string): CorpusSection[] {\n const lines = md.split(\"\\n\")\n const out: CorpusSection[] = []\n let current: { n: string; lines: string[] } | null = null\n const flush = () => {\n if (!current) return\n out.push(\n section({\n id: `RULE-${current.n}`,\n kind: \"rule\",\n title: current.lines[0]!.trim(),\n text: current.lines.join(\"\\n\").trim(),\n source,\n status: \"info\",\n precedence: PRECEDENCE.spec,\n }),\n )\n current = null\n }\n for (const line of lines) {\n const m = line.match(/^(\\d+)\\.\\s+(.*)$/)\n if (m) {\n flush()\n current = { n: m[1]!, lines: [m[2]!] }\n continue\n }\n if (current && (/^\\s{2,}/.test(line) || line.trim() === \"\")) {\n if (line.trim() === \"\" && current.lines[current.lines.length - 1] === \"\") continue\n current.lines.push(line.trim() === \"\" ? \"\" : line.trim())\n continue\n }\n flush()\n }\n flush()\n return out\n}\n\nexport function parseDivergences(md: string, source: string): CorpusSection[] {\n const lines = md.split(\"\\n\")\n const out: CorpusSection[] = []\n let topic = \"\"\n let current: { id: string; lines: string[]; topic: string } | null = null\n const flush = () => {\n if (!current) return\n const body = current.lines.join(\"\\n\").trim()\n const marker = body.indexOf(\"**RULED\")\n const ruled = marker >= 0\n const ruling = ruled\n ? body\n .slice(marker)\n .replace(/\\*\\*/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 800)\n : undefined\n out.push(\n section({\n id: `DIV-D-${current.id}`,\n kind: \"divergence\",\n title: `${current.topic ? current.topic + \": \" : \"\"}${current.lines[0]!.trim()}`,\n text: body,\n source,\n status: ruled ? \"ruled\" : \"open\",\n ...(ruled && ruling ? { ruling } : {}),\n precedence: ruled ? PRECEDENCE.ruling : PRECEDENCE.nonRuling,\n }),\n )\n current = null\n }\n for (const line of lines) {\n const h = line.match(/^##\\s+(.*)$/)\n if (h) {\n flush()\n topic = h[1]!.trim()\n continue\n }\n const m = line.match(/^D-(\\d+)\\s+(.*)$/)\n if (m) {\n flush()\n current = { id: m[1]!, lines: [m[2]!], topic }\n continue\n }\n if (current) current.lines.push(line)\n }\n flush()\n return out\n}\n\nexport function parseQuestions(md: string, source: string): CorpusSection[] {\n const lines = md.split(\"\\n\")\n const out: CorpusSection[] = []\n let heading = \"\"\n let current: { n: string; lines: string[]; heading: string } | null = null\n const flush = () => {\n if (!current) return\n const body = current.lines.join(\"\\n\").trim()\n const marker = body.indexOf(\"**ANSWERED\")\n const answered = marker >= 0\n const ruling = answered\n ? body\n .slice(marker)\n .replace(/\\*\\*/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 800)\n : undefined\n out.push(\n section({\n id: `Q-${current.n}`,\n kind: \"question\",\n title: current.lines[0]!.trim(),\n text: body,\n source,\n status: answered ? \"answered\" : \"open\",\n ...(answered && ruling ? { ruling } : {}),\n precedence: answered ? PRECEDENCE.ruling : PRECEDENCE.nonRuling,\n }),\n )\n current = null\n }\n for (const line of lines) {\n const h = line.match(/^##\\s+(.*)$/)\n if (h) {\n flush()\n heading = h[1]!.trim()\n continue\n }\n const m = line.match(/^(\\d+)\\.\\s+(.*)$/)\n if (m) {\n flush()\n current = { n: m[1]!, lines: [m[2]!], heading }\n continue\n }\n if (current) current.lines.push(line)\n }\n flush()\n return out\n}\n\nexport function parsePlan(md: string, source: string): CorpusSection[] {\n const out: CorpusSection[] = []\n for (const sec of splitMarkdown(md)) {\n if (!/one-way door|launch gate/i.test(sec.title)) continue\n out.push(\n section({\n id: `DOOR-${slug(sec.title) || out.length + 1}`,\n kind: \"door\",\n title: sec.title,\n text: sec.text,\n source,\n status: \"info\",\n precedence: PRECEDENCE.door,\n }),\n )\n }\n return out\n}\n\nexport function parseDoc(md: string, source: string, label: string): CorpusSection[] {\n return splitMarkdown(md)\n .filter((s) => s.text.length > 0)\n .map((sec, i) =>\n section({\n id: `DOC-${label}-${String(i + 1).padStart(2, \"0\")}`,\n kind: \"doc\" as SourceKind,\n title: sec.title || \"(intro)\",\n text: sec.text,\n source,\n status: \"info\" as EntryStatus,\n precedence: PRECEDENCE.doc,\n }),\n )\n}\n\nconst PAPER_HEADING_RE = /^([IVX]+(?:-[A-Z])?)?\\.?\\s{1,4}(.+)$/\nconst ROMAN_ONLY_RE = /^[IVX]+$/\n\nfunction mergeSpacedCaps(title: string): string {\n const tokens = title.split(/\\s+/).filter(Boolean)\n const merged: string[] = []\n let i = 0\n while (i < tokens.length) {\n const tok = tokens[i]!\n const next = tokens[i + 1]\n if (next !== undefined && /^-?[A-Z]$/.test(tok) && /^[A-Z]/.test(next) && next.length > 1) {\n merged.push((tok.startsWith(\"-\") ? tok : \"\") + next)\n i += 2\n continue\n }\n if (tok.length === 1 && /^[A-Z]$/.test(tok) && next !== undefined && /^[A-Z]/.test(next)) {\n merged.push(tok + next)\n i += 2\n continue\n }\n merged.push(tok)\n i++\n }\n return merged.join(\" \").replace(/ -/g, \"-\").replace(/\\s+,/g, \",\")\n}\n\nfunction capsRatio(s: string): number {\n const letters = s.replace(/[^A-Za-z]/g, \"\")\n if (letters.length === 0) return 0\n const upper = letters.replace(/[^A-Z]/g, \"\")\n return upper.length / letters.length\n}\n\nexport function parsePaper(text: string, source: string): CorpusSection[] {\n const lines = text.split(\"\\n\").map((l) => l.replace(/^\\f/, \"\"))\n const byId = new Map<string, CorpusSection>()\n let current: { id: string; title: string; lines: string[] } | null = null\n\n const looksLikeCapsFragment = (line: string): boolean => {\n const t = line.trim()\n return t.length >= 3 && t.length <= 40 && !/[.:;]$/.test(t) && !/\\.\\s*\\.\\s*\\./.test(t) && capsRatio(t) >= 0.6\n }\n\n const flush = () => {\n if (!current) return\n const body = current.lines.join(\"\\n\").trim()\n const existing = byId.get(current.id)\n if (existing) {\n existing.text = (existing.text + \"\\n\" + body).trim()\n } else {\n byId.set(\n current.id,\n section({\n id: `PAPER-${current.id}`,\n kind: \"paper\",\n title: current.title,\n text: body,\n source,\n status: \"info\",\n precedence: PRECEDENCE.paper,\n }),\n )\n }\n current = null\n }\n\n for (let li = 0; li < lines.length; li++) {\n const line = lines[li] ?? \"\"\n if (/\\.\\s*\\.\\s*\\./.test(line)) continue\n const m = line.match(PAPER_HEADING_RE)\n if (m && m[1] && !ROMAN_ONLY_RE.test(m[2] ?? \"\") && !/^[ivx]+$/.test(m[1])) {\n let title = mergeSpacedCaps(m[2] ?? \"\")\n let consumed = 1\n while (\n li + consumed < lines.length &&\n looksLikeCapsFragment(lines[li + consumed] ?? \"\") &&\n title.split(/\\s+/).length < 10\n ) {\n title = title + \" \" + mergeSpacedCaps((lines[li + consumed] ?? \"\").trim())\n consumed++\n }\n const letters = title.replace(/[^A-Za-z]/g, \"\")\n if (letters.length >= 4 && capsRatio(title) >= 0.7) {\n flush()\n current = { id: m[1], title: title.replace(/\\s{2,}/g, \" \").trim(), lines: [] }\n li += consumed - 1\n continue\n }\n }\n if (current) current.lines.push(line)\n }\n flush()\n return [...byId.values()]\n}\n","import { spawnSync } from \"node:child_process\"\nimport { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport type { Config } from \"../config.js\"\nimport { expandPath } from \"../config.js\"\n\nexport function ensurePaperText(config: Config, root: string): { text: string | null; extracted: boolean } {\n const pdf = expandPath(config.corpus.whitepaper, root)\n const cacheDir = expandPath(config.cache.dir, root)\n const cached = join(cacheDir, \"whitepaper.txt\")\n const pdfMtime = existsSync(pdf) ? statSync(pdf).mtimeMs : 0\n if (existsSync(cached) && statSync(cached).mtimeMs >= pdfMtime) {\n return { text: readFileSync(cached, \"utf8\"), extracted: false }\n }\n if (!existsSync(pdf)) return { text: null, extracted: false }\n const res = spawnSync(\"pdftotext\", [pdf, \"-\"], { encoding: \"utf8\", maxBuffer: 32 * 1024 * 1024 })\n if (res.error || res.status !== 0) {\n const reason = res.error ? res.error.message : `pdftotext exit ${res.status}`\n throw new Error(`whitepaper extraction failed (${reason}); is poppler-utils installed?`)\n }\n const text = res.stdout\n if (text.split(/\\s+/).length < 1000) throw new Error(\"whitepaper extraction produced suspiciously little text; refusing to cache\")\n mkdirSync(cacheDir, { recursive: true })\n writeFileSync(cached, text, \"utf8\")\n return { text, extracted: true }\n}\n","import { readFileSync } from \"node:fs\"\nimport type { Config, LoadedConfig } from \"../config.js\"\nimport { expandPath, loadConfig } from \"../config.js\"\nimport { sha256Hex } from \"../hash.js\"\nimport type { Corpus, CorpusSection, CorpusSource } from \"../types.js\"\nimport { parseDivergences, parseDoc, parsePaper, parsePlan, parseQuestions, parseRules, parseSpec } from \"./parsers.js\"\nimport { ensurePaperText } from \"./whitepaper.js\"\n\nfunction slugFromPath(rel: string): string {\n return rel\n .toLowerCase()\n .replace(/\\.[a-z0-9]+$/i, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 40)\n}\n\nfunction readOr(path: string, fallback: CorpusSection[]): { text: string | null; sections: CorpusSection[] } {\n try {\n return { text: readFileSync(path, \"utf8\"), sections: [] }\n } catch {\n return { text: null, sections: fallback }\n }\n}\n\nexport function loadCorpus(config: Config, root: string): Corpus {\n const sections: CorpusSection[] = []\n const sources: CorpusSource[] = []\n\n const addFile = (path: string, parse: (md: string, source: string) => CorpusSection[]) => {\n const resolved = expandPath(path, root)\n const { text } = readOr(resolved, [])\n if (text === null) return\n sources.push({ path: resolved, hash: sha256Hex(text) })\n sections.push(...parse(text, resolved))\n }\n\n addFile(config.corpus.spec, parseSpec)\n addFile(config.corpus.rules, parseRules)\n addFile(config.corpus.divergences, parseDivergences)\n addFile(config.corpus.questions, parseQuestions)\n addFile(config.corpus.plan, parsePlan)\n for (const doc of config.corpus.docs) {\n const resolved = expandPath(doc, root)\n let label = doc.split(\"/\").pop()?.replace(/\\.[a-z]+$/i, \"\") ?? \"doc\"\n const rel = resolved.startsWith(root + \"/\") ? resolved.slice(root.length + 1) : null\n if (rel && rel.includes(\"/\")) label = slugFromPath(rel)\n addFile(doc, (md, source) => parseDoc(md, source, label))\n }\n\n const paper = ensurePaperText(config, root)\n if (paper.text !== null) {\n const paperPath = expandPath(config.corpus.whitepaper, root)\n sources.push({ path: paperPath, hash: sha256Hex(paper.text) })\n sections.push(...parsePaper(paper.text, paperPath))\n }\n\n const hash = sha256Hex(JSON.stringify({ sources: sources.map((s) => [s.path, s.hash]).sort((a, b) => (a[0] ?? \"\").localeCompare(b[0] ?? \"\")), ids: sections.map((s) => s.id).sort() }))\n return { sections, sources, hash, paperText: paper.text ?? \"\" }\n}\n\nexport function loadCorpusFrom(startDir: string): { loaded: LoadedConfig; corpus: Corpus } {\n const loaded = loadConfig(startDir)\n const corpus = loadCorpus(loaded.config, loaded.root)\n return { loaded, corpus }\n}\n","import { spawnSync } from \"node:child_process\"\nimport { existsSync, readFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport type { Config } from \"../config.js\"\nimport { expandPath } from \"../config.js\"\nimport type { DiffFile, DiffHunk, RepoDiff } from \"../types.js\"\n\nexport interface GitResult {\n code: number | null\n stdout: string\n stderr: string\n}\n\nexport function git(repoDir: string, args: string[], timeoutMs = 30_000): GitResult {\n const res = spawnSync(\"git\", [\"-C\", repoDir, ...args], { encoding: \"utf8\", timeout: timeoutMs, maxBuffer: 64 * 1024 * 1024 })\n if (res.error) return { code: null, stdout: \"\", stderr: String(res.error) }\n return { code: res.status, stdout: res.stdout ?? \"\", stderr: res.stderr ?? \"\" }\n}\n\nexport function parseUnifiedDiff(text: string): DiffFile[] {\n const files: DiffFile[] = []\n const lines = text.split(\"\\n\")\n let file: DiffFile | null = null\n let hunk: DiffHunk | null = null\n let newLine = 0\n let oldLine = 0\n\n for (const line of lines) {\n const header = line.match(/^diff --git a\\/(.+?) b\\/(.+)$/)\n if (header) {\n file = {\n path: header[2]!,\n ...(header[1] !== header[2] ? { oldPath: header[1] } : {}),\n binary: false,\n hunks: [],\n }\n files.push(file)\n hunk = null\n continue\n }\n if (!file) continue\n if (line.startsWith(\"Binary files\") || line.startsWith(\"GIT binary patch\")) {\n file.binary = true\n continue\n }\n if (line.startsWith(\"new file mode\") || line.startsWith(\"deleted file mode\") || line.startsWith(\"index \") || line.startsWith(\"--- \") || line.startsWith(\"+++ \") || line.startsWith(\"rename from\") || line.startsWith(\"rename to\") || line.startsWith(\"similarity index\") || line.startsWith(\"old mode\") || line.startsWith(\"new mode\")) {\n continue\n }\n const hunkMatch = line.match(/^@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/)\n if (hunkMatch) {\n hunk = { header: line, lines: [] }\n file.hunks.push(hunk)\n oldLine = Number(hunkMatch[1])\n newLine = Number(hunkMatch[2])\n continue\n }\n if (!hunk) continue\n if (line.startsWith(\"+\")) {\n hunk.lines.push({ kind: \"add\", text: line.slice(1), newLine })\n newLine++\n } else if (line.startsWith(\"-\")) {\n hunk.lines.push({ kind: \"del\", text: line.slice(1), oldLine })\n oldLine++\n } else if (line.startsWith(\" \")) {\n hunk.lines.push({ kind: \"ctx\", text: line.slice(1), newLine, oldLine })\n newLine++\n oldLine++\n }\n }\n return files\n}\n\nexport function addedLines(file: DiffFile): { text: string; line: number }[] {\n const out: { text: string; line: number }[] = []\n for (const hunk of file.hunks) {\n for (const l of hunk.lines) {\n if (l.kind === \"add\" && l.newLine !== undefined) out.push({ text: l.text, line: l.newLine })\n }\n }\n return out\n}\n\nexport function repoDirs(config: Config, root: string): { repo: string; dir: string }[] {\n const superPath = expandPath(config.repos.super, root)\n const dirs = [{ repo: \"(super)\", dir: superPath }]\n for (const member of config.repos.members) {\n const dir = join(superPath, member)\n if (existsSync(join(dir, \".git\"))) dirs.push({ repo: member, dir })\n }\n return dirs\n}\n\nfunction dirtyFiles(repoDir: string): { modified: string[]; untracked: string[] } {\n const modified: string[] = []\n const untracked: string[] = []\n const res = git(repoDir, [\"status\", \"--porcelain=v1\"])\n if (res.code !== 0) return { modified, untracked }\n for (const line of res.stdout.split(\"\\n\")) {\n if (!line.trim()) continue\n const xy = line.slice(0, 2)\n const path = line.slice(3).trim().replace(/\"(.*)\"/, \"$1\")\n if (!path) continue\n if (xy.includes(\"?\")) untracked.push(path)\n else modified.push(path)\n }\n if (untracked.length > 0) {\n // porcelain collapses fully-untracked directories to \"dir/\"; expand to the\n // exact file list (still .gitignore-aware) so nothing hides from the gates.\n const ls = git(repoDir, [\"ls-files\", \"--others\", \"--exclude-standard\"])\n const dirs = untracked.filter((p) => p.endsWith(\"/\"))\n if (ls.code === 0 && dirs.length > 0) {\n const exact = ls.stdout.split(\"\\n\").filter(Boolean)\n const expanded = new Set<string>()\n for (const p of untracked) {\n if (!p.endsWith(\"/\")) {\n expanded.add(p)\n continue\n }\n const prefix = p.slice(0, -1)\n for (const f of exact) {\n if (f === prefix || f.startsWith(prefix + \"/\")) expanded.add(f)\n }\n }\n untracked.length = 0\n untracked.push(...expanded)\n }\n }\n return { modified, untracked }\n}\n\nexport function dirtySet(config: Config, root: string): RepoDiff[] {\n const out: RepoDiff[] = []\n for (const { repo, dir } of repoDirs(config, root)) {\n const { modified, untracked } = dirtyFiles(dir)\n const files: DiffFile[] = []\n const seen = new Set<string>()\n for (const path of [...modified, ...untracked]) {\n if (seen.has(path)) continue\n seen.add(path)\n if (untracked.includes(path)) {\n try {\n const content = readFileSync(join(dir, path), \"utf8\")\n const lines = content.split(\"\\n\")\n files.push({\n path,\n binary: false,\n hunks: [{ header: \"@@ new file @@\", lines: lines.map((text, i) => ({ kind: \"add\" as const, text, newLine: i + 1 })) }],\n })\n } catch {\n files.push({ path, binary: true, hunks: [] })\n }\n continue\n }\n const combined = git(dir, [\"diff\", \"HEAD\", \"--\", path]).stdout + git(dir, [\"diff\", \"--cached\", \"--\", path]).stdout\n const parsed = parseUnifiedDiff(combined)\n files.push(...parsed)\n }\n if (files.length > 0) out.push({ repo, repoDir: dir, files })\n }\n return out\n}\n\nexport function commitDiff(repoDir: string, sha: string): DiffFile[] {\n const res = git(repoDir, [\"show\", \"--format=\", \"--diff-filter=AM\", sha])\n if (res.code !== 0) return []\n return parseUnifiedDiff(res.stdout)\n}\n\nexport function recentCommits(repoDir: string, count = 10, branch = \"main\"): { sha: string; subject: string }[] {\n const res = git(repoDir, [\"log\", \"--oneline\", `-${count}`, branch])\n if (res.code !== 0) return []\n return res.stdout\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => {\n const sha = line.slice(0, 40).split(\" \")[0] ?? \"\"\n const subject = line.slice(sha.length).trim()\n return { sha, subject }\n })\n}\n","import type { Config } from \"../../config.js\"\nimport type { DiffFile, Finding, RepoDiff } from \"../../types.js\"\nimport { addedLines } from \"../../git/diff.js\"\n\nconst SILENT_DEFAULT_PATTERNS: { re: RegExp; note: string }[] = [\n { re: /\\.unwrap_or_default\\(\\)/, note: \"unwrap_or_default() silently substitutes a default; per RULE-1 malformed/missing values must be errors\" },\n { re: /\\.unwrap_or\\(\\s*(0|false|true|None)\\s*\\)/, note: \"unwrap_or(literal) silently substitutes a value; per RULE-1 malformed/missing values must be errors\" },\n { re: /\\.unwrap_or\\(\\s*(String::new\\(\\)|Vec::new\\(\\)|vec!\\[\\]|Default::default\\(\\))\\s*\\)/, note: \"unwrap_or(empty container) silently substitutes; per RULE-1 malformed/missing values must be errors\" },\n { re: /Ok\\(\\s*_\\s*\\)\\s*=>\\s*(0|false|true|None|Default::default\\(\\))/, note: \"Ok(_) arm returns a literal default; per RULE-1 this maps a parsed value to a silent default\" },\n { re: /Err\\(\\s*_?\\s*\\)\\s*=>\\s*(0|false|true|None|Default::default\\(\\)|vec!\\[\\])/, note: \"Err(_) arm returns a literal instead of propagating; per RULE-1 errors must not become values\" },\n { re: /\\bcatch\\s*\\{\\s*\\}/, note: \"empty catch block swallows failures; per RULE-1 unreadable/malformed input must be an error\" },\n]\n\nconst TODO_BARE = /TODO(?!\\s*\\([a-z0-9-]+\\))/\nconst TODO_TAGGED = /TODO\\([a-z0-9-]+\\)/\nconst EM_DASH = /\\u2014/\nconst AI_TRAILER = /^\\s*(Co-Authored-By:.*\\b(Claude|Copilot|GPT|ChatGPT|Gemini|Cursor)\\b|Generated with)/i\nconst SENSITIVE_AREA = /(?<![A-Za-z])(sealed?|sealing|seals?|digests?|disclosure|keygen|keys?)(?![A-Za-z])/i\nconst FUEL_DECL = /((fn|const|static)\\s+[A-Za-z_]*(fuel|budget|limit)[A-Za-z_]*|let\\s+mut\\s+[A-Za-z_]*(fuel|budget|limit)[A-Za-z_]*|:\\s*(Fuel|Budget|Limit)[<\\s>])/i\n\nexport function checkFile(repo: string, file: DiffFile, config: Config): Finding[] {\n const findings: Finding[] = []\n const adds = addedLines(file)\n if (adds.length === 0) return findings\n const pathSensitive = SENSITIVE_AREA.test(file.path)\n\n for (const { text, line } of adds) {\n for (const { re, note } of SILENT_DEFAULT_PATTERNS) {\n if (re.test(text)) {\n findings.push({ rule: \"RULE-1\", severity: \"review\", repo, file: file.path, line, evidence: text.trim().slice(0, 120), note })\n }\n }\n if (/TODO/.test(text) && TODO_BARE.test(text) && !TODO_TAGGED.test(text)) {\n findings.push({\n rule: \"RULE-7\",\n severity: \"review\",\n repo,\n file: file.path,\n line,\n evidence: text.trim().slice(0, 120),\n note: \"TODO without a backend tag; every TODO must name the backend it waits on, e.g. TODO(node)\",\n })\n }\n if (EM_DASH.test(text)) {\n findings.push({ rule: \"RULE-6\", severity: \"block\", repo, file: file.path, line, evidence: text.trim().slice(0, 120), note: \"em dash in added line; house style bans em dashes\" })\n }\n if (config.repos.members.some((m) => text.includes(`../${m}/`))) {\n findings.push({\n rule: \"RULE-6\",\n severity: \"review\",\n repo,\n file: file.path,\n line,\n evidence: text.trim().slice(0, 120),\n note: \"relative path into a sibling repo; name the sibling instead of a relative path\",\n })\n }\n if (FUEL_DECL.test(text)) {\n findings.push({\n rule: \"RULE-9\",\n severity: \"review\",\n repo,\n file: file.path,\n line,\n evidence: text.trim().slice(0, 120),\n note: \"fuel/budget/limit declaration; must state units and who pays\",\n })\n }\n if (pathSensitive || (SENSITIVE_AREA.test(text) && /^(pub\\s+)?(async\\s+)?(fn|struct|enum|impl|trait|mod)\\s/.test(text.trim()))) {\n findings.push({\n rule: \"RULE-10\",\n severity: \"human\",\n repo,\n file: file.path,\n line,\n evidence: text.trim().slice(0, 120),\n note: \"touches keys/seals/digests/disclosure; requires human eyes even if correct\",\n })\n }\n if (/^\\s*pub\\s+(async\\s+)?(fn|struct|enum|trait|type|mod|const|static)\\s/.test(text) && config.repos.reviewed.includes(repo)) {\n findings.push({\n rule: \"RULE-2\",\n severity: \"review\",\n repo,\n file: file.path,\n line,\n evidence: text.trim().slice(0, 120),\n note: `new public API in reviewed repo '${repo}'; requires an enumerated-surface argument listing existing public items that are missing`,\n })\n }\n }\n return findings\n}\n\nexport function checkRepoDiff(diff: RepoDiff, config: Config): Finding[] {\n const out: Finding[] = []\n for (const file of diff.files) {\n if (file.binary) continue\n out.push(...checkFile(diff.repo, file, config))\n }\n\n const testsInDiff = diff.files.some(\n (f) => f.path.includes(\"test\") || f.path.startsWith(\"tests/\") || f.path.endsWith(\"tests.rs\"),\n )\n if (!testsInDiff) {\n for (const file of diff.files) {\n if (!file.path.endsWith(\".rs\") || !/^src\\//.test(file.path) || file.path.includes(\"test\")) continue\n const adds = addedLines(file)\n const behavioral = adds.filter((a) => /^(pub\\s+)?(async\\s+)?(fn|impl|struct|enum|trait)\\s|^\\s+(pub\\s+)?fn\\s/.test(a.text.trim()))\n if (behavioral.length > 0) {\n out.push({\n rule: \"RULE-8\",\n severity: \"review\",\n repo: diff.repo,\n file: file.path,\n line: behavioral[0]?.line ?? null,\n evidence: `${behavioral.length} behavioral line(s) added in ${file.path}; no test file anywhere in this diff`,\n note: \"new behavior ships with a test that fails without it; this repo-diff touches no tests\",\n })\n }\n }\n }\n return dedupe(out)\n}\n\nexport function checkCommitMessage(message: string, repo: string): Finding[] {\n const out: Finding[] = []\n for (const line of message.split(\"\\n\")) {\n if (AI_TRAILER.test(line)) {\n out.push({ rule: \"RULE-6\", severity: \"block\", repo, file: \"(commit message)\", line: null, evidence: line.trim().slice(0, 120), note: \"AI-identifying trailer in commit message; house style bans them\" })\n }\n if (EM_DASH.test(line)) {\n out.push({ rule: \"RULE-6\", severity: \"block\", repo, file: \"(commit message)\", line: null, evidence: line.trim().slice(0, 120), note: \"em dash in commit message; house style bans em dashes\" })\n }\n }\n return out\n}\n\nfunction dedupe(findings: Finding[]): Finding[] {\n const seen = new Set<string>()\n const out: Finding[] = []\n for (const f of findings) {\n const key = `${f.rule}|${f.repo}|${f.file}|${f.line}|${f.evidence}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push(f)\n }\n return out\n}\n","import { spawn, type ChildProcess } from \"node:child_process\"\n\nexport interface RunResult {\n code: number | null\n stdout: string\n stderr: string\n timedOut: boolean\n}\n\nexport function run(cmd: string[], opts: { cwd?: string; timeoutMs?: number; signal?: AbortSignal }): Promise<RunResult> {\n return new Promise((resolve) => {\n let proc: ChildProcess\n try {\n proc = spawn(cmd[0]!, cmd.slice(1), { cwd: opts.cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"], signal: opts.signal })\n } catch (err) {\n resolve({ code: null, stdout: \"\", stderr: String(err), timedOut: false })\n return\n }\n let stdout = \"\"\n let stderr = \"\"\n let timedOut = false\n const timer = opts.timeoutMs\n ? setTimeout(() => {\n timedOut = true\n proc.kill(\"SIGKILL\")\n }, opts.timeoutMs)\n : undefined\n proc.stdout?.on(\"data\", (d) => (stdout += d.toString()))\n proc.stderr?.on(\"data\", (d) => (stderr += d.toString()))\n const done = (code: number | null, extra = \"\") => {\n if (timer) clearTimeout(timer)\n resolve({ code, stdout, stderr: stderr + extra, timedOut })\n }\n proc.on(\"error\", (err) => done(null, String(err)))\n proc.on(\"close\", (code) => done(code))\n })\n}\n\nexport function tail(text: string, lines: number): string {\n const arr = text.trimEnd().split(\"\\n\")\n return arr.length <= lines ? text.trimEnd() : arr.slice(-lines).join(\"\\n\")\n}\n\nexport interface TestStats {\n passed: number\n failed: number\n suites: number\n}\n\nexport function summarizeTests(output: string): TestStats {\n const passed = [...output.matchAll(/test result: \\w+\\. (\\d+) passed/g)].reduce((n, m) => n + Number(m[1]), 0)\n const failed = [...output.matchAll(/test result: \\w+\\. \\d+ passed; (\\d+) failed/g)].reduce((n, m) => n + Number(m[1]), 0)\n const suites = (output.match(/test result:/g) ?? []).length\n return { passed, failed, suites }\n}\n\nexport interface CargoStep {\n label: string\n ok: boolean\n summary: string\n errors: string[]\n output: string\n}\n\nexport async function cargoCheck(\n repoDir: string,\n opts: { package?: string; release?: boolean; tests?: boolean; timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<CargoStep[]> {\n const args = [\"--color\", \"never\"]\n if (opts.package) args.push(\"-p\", opts.package)\n const steps: CargoStep[] = []\n\n const checkArgs = [\"check\", ...args]\n const check = await run([\"cargo\", ...checkArgs], { cwd: repoDir, timeoutMs: opts.timeoutMs ?? 10 * 60_000, ...(opts.signal ? { signal: opts.signal } : {}) })\n const checkOut = check.stdout + \"\\n\" + check.stderr\n steps.push({\n label: \"cargo check\",\n ok: !check.timedOut && check.code === 0,\n summary: check.timedOut ? \"TIMED OUT\" : check.code === 0 ? \"OK\" : `FAILED (exit ${check.code})`,\n errors: errorLines(checkOut),\n output: checkOut,\n })\n if (!steps[0]!.ok) return steps\n\n if (opts.tests) {\n const test = await run([\"cargo\", \"test\", ...args], { cwd: repoDir, timeoutMs: opts.timeoutMs ?? 10 * 60_000, ...(opts.signal ? { signal: opts.signal } : {}) })\n const testOut = test.stdout + \"\\n\" + test.stderr\n const t = summarizeTests(testOut)\n steps.push({\n label: \"cargo test\",\n ok: !test.timedOut && test.code === 0,\n summary: test.timedOut ? \"TIMED OUT\" : test.code === 0 ? `OK: ${t.suites} suite(s), ${t.passed} passed, ${t.failed} failed` : `FAILED (exit ${test.code})`,\n errors: errorLines(testOut),\n output: testOut,\n })\n }\n return steps\n}\n\nexport function errorLines(output: string): string[] {\n return output\n .split(\"\\n\")\n .filter((l) => /\\berror(\\[|:)/i.test(l) || /^failures:$/m.test(l) || /test result: FAILED/i.test(l))\n .slice(0, 30)\n}\n\nexport interface Diagnostic {\n file: string\n line: number | null\n col: number | null\n severity: string\n message: string\n code: string | null\n isRootCauseCandidate: boolean\n}\n\nexport function parseCargoJson(output: string): Diagnostic[] {\n const diags: Diagnostic[] = []\n for (const line of output.split(\"\\n\")) {\n const trimmed = line.trim()\n if (!trimmed.startsWith(\"{\")) continue\n let msg: any\n try {\n msg = JSON.parse(trimmed)\n } catch {\n continue\n }\n if (msg?.reason !== \"compiler-message\" || !msg.message) continue\n const m = msg.message\n const spans: any[] = Array.isArray(m.spans) ? m.spans : []\n const primary = spans.find((s) => s.is_primary) ?? spans[0]\n diags.push({\n file: primary?.file_name ?? \"\",\n line: primary?.line_start ?? null,\n col: primary?.column_start ?? null,\n severity: m.level ?? \"unknown\",\n message: m.message ?? \"\",\n code: m.code?.code ?? null,\n isRootCauseCandidate: (m.level === \"error\" && (!m.code || !CASCADING_CODES.includes(m.code.code))) || m.level === \"error: aborting\",\n })\n }\n return diags\n}\n\nconst CASCADING_CODES = [\"E0432\", \"E0433\", \"E0603\", \"E0560\"]\n","import type { Config } from \"../../config.js\"\nimport { dirtySet } from \"../../git/diff.js\"\nimport type { CargoStep } from \"./cargo.js\"\nimport { cargoCheck } from \"./cargo.js\"\nimport { checkRepoDiff } from \"./rules.js\"\nimport type { Finding, RepoDiff } from \"../../types.js\"\n\nexport interface DeterministicReport {\n repoDiffs: RepoDiff[]\n findings: Finding[]\n cargo: { repo: string; steps: CargoStep[] }[]\n}\n\nexport async function runDeterministic(\n config: Config,\n root: string,\n opts: { cargo?: boolean; tests?: boolean; repos?: string[]; diffs?: RepoDiff[] } = {},\n): Promise<DeterministicReport> {\n const repoDiffs = opts.diffs ?? dirtySet(config, root)\n const findings: Finding[] = []\n for (const diff of repoDiffs) {\n if (opts.repos && !opts.repos.includes(diff.repo)) continue\n findings.push(...checkRepoDiff(diff, config))\n }\n\n const cargo: { repo: string; steps: CargoStep[] }[] = []\n if (opts.cargo !== false) {\n for (const diff of repoDiffs) {\n if (opts.repos && !opts.repos.includes(diff.repo)) continue\n const rustTouched = diff.files.some((f) => f.path.endsWith(\".rs\") || f.path.endsWith(\"Cargo.toml\"))\n if (!rustTouched || diff.repo === \"(super)\") continue\n const steps = await cargoCheck(diff.repoDir, { tests: opts.tests ?? false })\n cargo.push({ repo: diff.repo, steps })\n }\n }\n\n return { repoDiffs, findings, cargo }\n}\n\nconst SEVERITY_ORDER: Record<string, number> = { block: 0, human: 1, review: 2 }\n\nexport function formatFindings(findings: Finding[]): string {\n if (findings.length === 0) return \"no deterministic findings\"\n const sorted = [...findings].sort((a, b) => SEVERITY_ORDER[a.severity]! - SEVERITY_ORDER[b.severity]!)\n const bySeverity = new Map<string, Finding[]>()\n for (const f of sorted) bySeverity.set(f.severity, [...(bySeverity.get(f.severity) ?? []), f])\n const out: string[] = []\n for (const [sev, fs] of bySeverity) {\n out.push(`${sev.toUpperCase()} (${fs.length}):`)\n for (const f of fs) {\n out.push(` ${f.rule} ${f.repo}/${f.file}:${f.line ?? \"-\"}: ${f.note}`)\n out.push(` | ${f.evidence}`)\n }\n }\n return out.join(\"\\n\")\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { dirname } from \"node:path\"\nimport { sha256Hex } from \"./hash.js\"\n\nexport interface LoopCycle {\n ts: string\n diffHash: string\n action: string\n topReasons: string[]\n}\n\nexport interface LoopState {\n cycles: LoopCycle[]\n}\n\nexport interface LoopVerdict {\n cycle: number\n repeatedDiff: boolean\n escalate: boolean\n reason?: string\n}\n\nexport function diffFingerprint(diffText: string): string {\n return sha256Hex(diffText)\n}\n\nexport class LoopTracker {\n private path: string\n private state: LoopState\n\n constructor(statePath: string) {\n this.path = statePath\n this.state = { cycles: [] }\n if (existsSync(statePath)) {\n try {\n this.state = JSON.parse(readFileSync(statePath, \"utf8\")) as LoopState\n } catch {\n this.state = { cycles: [] }\n }\n }\n }\n\n get history(): LoopCycle[] {\n return this.state.cycles\n }\n\n record(cycle: LoopCycle): void {\n this.state.cycles = [...this.state.cycles.slice(-9), cycle]\n mkdirSync(dirname(this.path), { recursive: true })\n writeFileSync(this.path, JSON.stringify(this.state), \"utf8\")\n }\n\n reset(): void {\n this.state = { cycles: [] }\n if (existsSync(this.path)) mkdirSync(dirname(this.path), { recursive: true })\n writeFileSync(this.path, JSON.stringify(this.state), \"utf8\")\n }\n\n evaluate(diffHash: string, reasons: string[], maxCycles: number): LoopVerdict {\n const last = this.state.cycles[this.state.cycles.length - 1]\n if (!last) return { cycle: 1, repeatedDiff: false, escalate: false }\n\n const repeatedDiff = last.diffHash === diffHash\n const reasonsOverlap =\n reasons.filter((r) => last.topReasons.some((prev) => overlapTokens(prev, r) > 0.5)).length >=\n Math.min(2, reasons.length)\n\n const cycle = repeatedDiff || reasonsOverlap ? this.consecutiveCount(diffHash, reasons) + 1 : 1\n if (cycle >= maxCycles) {\n return {\n cycle,\n repeatedDiff,\n escalate: true,\n reason: `circuit breaker: ${cycle} consecutive wrangler cycles without progress (repeated diff: ${repeatedDiff}, same findings: ${reasonsOverlap}); stop retrying and surface to the user`,\n }\n }\n return { cycle, repeatedDiff, escalate: false }\n }\n\n private consecutiveCount(diffHash: string, reasons: string[]): number {\n let n = 0\n for (let i = this.state.cycles.length - 1; i >= 0; i--) {\n const c = this.state.cycles[i]!\n if (c.diffHash === diffHash || reasonsOverlap(c.topReasons, reasons)) n++\n else break\n }\n return n\n }\n}\n\nfunction overlapTokens(a: string, b: string): number {\n const ta = new Set(a.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length > 3))\n const tb = new Set(b.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length > 3))\n if (ta.size === 0 || tb.size === 0) return 0\n let shared = 0\n for (const t of tb) if (ta.has(t)) shared++\n return shared / Math.max(ta.size, tb.size)\n}\n\nfunction reasonsOverlap(a: string[], b: string[]): boolean {\n return b.some((r) => a.some((prev) => overlapTokens(prev, r) > 0.5))\n}\n","import { appendFileSync, existsSync, mkdirSync, readFileSync } from \"node:fs\"\nimport { dirname } from \"node:path\"\nimport type { Config } from \"./config.js\"\nimport { expandPath } from \"./config.js\"\n\nexport interface GateLedgerEntry {\n ts: string\n kind: \"plan\" | \"check\"\n model: string\n corpusHash: string\n action: string\n usage?: { inputTokens: number; outputTokens: number }\n findings: { rule: string; severity: string; subject: string; acknowledged?: boolean }[]\n verdicts?: { question: string; noul: number }[]\n reasons?: string[]\n sessionID?: string\n diffHash?: string\n files?: { repo: string; path: string; added: number; removed: number }[]\n examinedFiles?: number | null\n overridesActive?: boolean\n}\n\nexport interface NoticeLedgerEntry {\n ts: string\n kind: \"notice\"\n message: string\n}\n\n/**\n * How a human confirmed an ack or override.\n * `elicitation` is an MCP client UI prompt, `os-dialog` is a native desktop dialog,\n * and `tty` is the owner typing yes at `aiwrangler` in a terminal.\n * Tool arguments never count as confirmation.\n */\nexport type HumanConfirmation = \"elicitation\" | \"os-dialog\" | \"tty\"\n\n/** Which trusted entry point recorded the write. Not taken from tool arguments. */\nexport type ApprovalHost = \"cli\" | \"mcp\" | \"opencode\"\n\nexport interface OverrideLedgerEntry {\n ts: string\n kind: \"override\"\n source: string\n changes: Record<string, unknown>\n note?: string\n /** How the human confirmed. Absent on gate expiry and older entries. */\n confirmation?: HumanConfirmation\n}\n\nexport interface AckLedgerEntry {\n ts: string\n kind: \"ack\"\n diffHash: string\n rules: string[]\n note?: string\n /** `cli`, `mcp`, or `opencode` for new writes. Older entries may say `agent`. */\n by?: string\n /** How the human confirmed. Absent on older entries. */\n confirmation?: HumanConfirmation\n}\n\nexport type LedgerEntry = GateLedgerEntry | NoticeLedgerEntry | OverrideLedgerEntry | AckLedgerEntry\n\nexport type LedgerKind = LedgerEntry[\"kind\"]\n\nexport class Ledger {\n private path: string\n\n constructor(config: Config, root: string) {\n this.path = expandPath(config.ledger.path, root)\n }\n\n get filePath(): string {\n return this.path\n }\n\n append(entry: LedgerEntry): void {\n mkdirSync(dirname(this.path), { recursive: true })\n appendFileSync(this.path, JSON.stringify(entry) + \"\\n\", \"utf8\")\n }\n\n read(): LedgerEntry[] {\n if (!existsSync(this.path)) return []\n return readFileSync(this.path, \"utf8\")\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => {\n try {\n return JSON.parse(line) as LedgerEntry\n } catch {\n return null\n }\n })\n .filter((e): e is LedgerEntry => e !== null)\n }\n\n recent(kind?: LedgerKind, n = 20): LedgerEntry[] {\n return this.read()\n .filter((e) => (kind ? e.kind === kind : true))\n .slice(-n)\n }\n\n acksFor(diffHash: string): AckLedgerEntry[] {\n return this.read().filter((e): e is AckLedgerEntry => e.kind === \"ack\" && e.diffHash === diffHash)\n }\n\n latestAckFor(diffHash: string): AckLedgerEntry | null {\n const acks = this.acksFor(diffHash)\n return acks.length > 0 ? acks[acks.length - 1]! : null\n }\n}\n"],"mappings":"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","names":["existsSync","readFileSync","join","dirname","z","z","join","existsSync","readFileSync","dirname","existsSync","mkdirSync","readFileSync","writeFileSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","readFileSync","readFileSync","spawnSync","existsSync","readFileSync","join","spawnSync","join","existsSync","readFileSync","resolve","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","existsSync","readFileSync","mkdirSync","dirname","writeFileSync","reasonsOverlap","existsSync","mkdirSync","readFileSync","dirname","mkdirSync","dirname","existsSync","readFileSync"]}
|
|
File without changes
|
|
File without changes
|