@cleartrip/frontguard 0.1.0 → 0.1.1
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/dist/cli.js +1 -2
- package/dist/cli.js.map +1 -1
- package/package.json +4 -3
package/dist/cli.js
CHANGED
|
@@ -3,6 +3,7 @@ import process2 from 'process';
|
|
|
3
3
|
import { defineCommand, runMain } from 'citty';
|
|
4
4
|
import fs from 'fs/promises';
|
|
5
5
|
import path from 'path';
|
|
6
|
+
import { fetch } from 'undici';
|
|
6
7
|
import { createRequire } from 'module';
|
|
7
8
|
import fs4 from 'fs';
|
|
8
9
|
import { pathToFileURL } from 'url';
|
|
@@ -1919,8 +1920,6 @@ function formatConsole(p) {
|
|
|
1919
1920
|
lines.push(pc.bold("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"));
|
|
1920
1921
|
return lines.join("\n");
|
|
1921
1922
|
}
|
|
1922
|
-
|
|
1923
|
-
// src/llm/review.ts
|
|
1924
1923
|
function safeGetEnv(name) {
|
|
1925
1924
|
const v = process.env[name];
|
|
1926
1925
|
return v && v.trim() ? v : void 0;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/init.ts","../src/ci/parse-ai-disclosure.ts","../src/ci/github.ts","../src/ci/pr-comment.ts","../src/config/defaults.ts","../src/config/load.ts","../src/detect/stack.ts","../src/runner/exec-tools.ts","../src/checks/eslint.ts","../src/checks/prettier.ts","../src/checks/typescript.ts","../src/checks/secrets.ts","../src/checks/pr-hygiene.ts","../src/checks/pr-size.ts","../src/runner/git.ts","../src/checks/ts-any-delta.ts","../src/checks/cycles.ts","../src/checks/dead-code.ts","../src/checks/bundle.ts","../src/checks/cwv.ts","../src/checks/custom-rules.ts","../src/checks/ai-assisted-strict.ts","../src/runner/ai-escalation.ts","../src/report/builder.ts","../src/llm/review.ts","../src/llm/manual-appendix.ts","../src/commands/run.ts","../src/cli.ts"],"names":["fs","path","r","truncate","exec","gateSeverity","fg","sev","PATTERNS","text","process"],"mappings":"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","file":"cli.js","sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nconst WORKFLOW = `name: FrontGuard\n\non:\n pull_request:\n types: [opened, synchronize, reopened]\n\npermissions:\n contents: read\n pull-requests: write\n\nconcurrency:\n group: frontguard-\\${{ github.workflow }}-\\${{ github.event.pull_request.number || github.ref }}\n cancel-in-progress: true\n\njobs:\n review-brief:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - uses: actions/setup-node@v4\n with:\n node-version: 20\n\n - name: Install dependencies\n run: |\n if [ -f pnpm-lock.yaml ]; then\n corepack enable\n pnpm install --frozen-lockfile || pnpm install\n elif [ -f yarn.lock ]; then\n yarn install --frozen-lockfile || yarn install\n elif [ -f package-lock.json ]; then\n npm ci || npm install\n else\n npm install\n fi\n\n - name: FrontGuard (Phase 1 — warn-only)\n run: npx @cleartrip/frontguard run --ci\n env:\n GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n`\n\nconst CONFIG = `import { defineConfig } from '@cleartrip/frontguard'\n\nexport default defineConfig({\n mode: 'warn', // or FrontGuard run with \\`--enforce\\`\n // extends: '@your-org/frontguard-config/base',\n\n // Example custom rules (return true when violated):\n // rules: {\n // 'no-inline-style': {\n // severity: 'warn',\n // message: 'Avoid inline style objects',\n // check: (file) => file.content.includes('style={{'),\n // },\n // },\n\n // checks: {\n // bundle: { enabled: true, maxDeltaBytes: 50_000, maxTotalBytes: null },\n // cycles: { enabled: true },\n // deadCode: { enabled: true, gate: 'info' },\n // // LLM in CI needs a key in the *runner* (GitHub secret). IDE keys (Cursor Enterprise)\n // // are not available in Actions — use paste workflow instead:\n // // frontguard run --append ./.frontguard/review-notes.md\n // // or FRONTGUARD_MANUAL_APPENDIX_FILE / FRONTGUARD_MANUAL_APPENDIX\n // llm: {\n // enabled: true,\n // provider: 'openai',\n // apiKeyEnv: 'OPENAI_API_KEY',\n // },\n // },\n})\n`\n\nconst PR_TEMPLATE = `## Summary\n\n## Why\n\n## How to test\n\n## AI disclosure\n<!-- FrontGuard reads this section. Mark exactly one of Yes / No. -->\n\n- [ ] **Yes** — AI tools (Cursor, Copilot, ChatGPT, Claude, etc.) helped write or materially refactor code in this PR\n- [ ] **No** — I did not use AI-generated code for the changes in this PR\n\nIf **Yes**, list tools and what they touched (helps reviewers run a stricter first pass):\n\n- Tools: \n- Areas/files or prompts (short): \n\n## AI assistance (optional detail)\n- [ ] I have reviewed every AI-suggested line for security, auth, and product correctness\n`\n\nasync function ensureDir(dir: string) {\n await fs.mkdir(dir, { recursive: true })\n}\n\nexport async function initFrontGuard(cwd: string): Promise<void> {\n const gh = path.join(cwd, '.github', 'workflows')\n await ensureDir(gh)\n const wfPath = path.join(gh, 'frontguard.yml')\n await fs.writeFile(wfPath, WORKFLOW, 'utf8')\n\n const cfgPath = path.join(cwd, 'frontguard.config.js')\n try {\n await fs.access(cfgPath)\n } catch {\n await fs.writeFile(cfgPath, CONFIG, 'utf8')\n }\n\n const tplRoot = path.join(cwd, '.github')\n await ensureDir(tplRoot)\n const tplPath = path.join(tplRoot, 'pull_request_template.md')\n try {\n await fs.access(tplPath)\n } catch {\n await fs.writeFile(tplPath, PR_TEMPLATE, 'utf8')\n }\n}\n","/**\n * Parse PR markdown for explicit AI disclosure (no network / no IDE keys).\n *\n * Supports:\n * - `## … AI …` section with `- [x] **Yes**` / `- [x] **No**`\n * - Legacy: \"AI tools were used\" + checked box somewhere in body\n */\n\nexport interface AiDisclosureResult {\n assisted: boolean\n explicitNo: boolean\n /** Checked box in AI section but unclear yes vs no */\n ambiguous: boolean\n}\n\nfunction extractAiSection(body: string): string | null {\n const lines = body.split(/\\r?\\n/)\n const idx = lines.findIndex((l) => /^#{1,6}\\s+.*\\bAI\\b/i.test(l.trim()))\n if (idx < 0) return null\n\n const out: string[] = []\n for (let j = idx + 1; j < lines.length; j++) {\n const line = lines[j] ?? ''\n if (/^##\\s+/.test(line)) break\n out.push(line)\n }\n const text = out.join('\\n').trim()\n return text.length ? text : null\n}\n\nfunction isCheckedItem(line: string): boolean {\n return /^\\s*-\\s*\\[[xX]\\]/.test(line)\n}\n\nexport function parseAiDisclosure(body: string): AiDisclosureResult {\n let assisted = false\n let explicitNo = false\n let ambiguous = false\n\n const section = extractAiSection(body)\n\n if (section) {\n let anyChecked = false\n for (const raw of section.split(/\\r?\\n/)) {\n const line = raw.trimEnd()\n if (!isCheckedItem(line)) continue\n anyChecked = true\n const lower = line.toLowerCase()\n\n const saysNo =\n /\\*\\*no\\*\\*/i.test(line) ||\n /\\bwithout ai\\b/i.test(lower) ||\n /\\bdid not use ai\\b/i.test(lower) ||\n /\\bno\\s+ai\\b/i.test(lower)\n\n const saysYes =\n /\\*\\*yes\\*\\*/i.test(line) ||\n /\\byes\\s*[—–-]\\s*ai\\b/i.test(lower) ||\n /\\bwere used\\b/i.test(lower) ||\n /ai tools.*used/i.test(lower) ||\n /\\b(copilot|cursor|chatgpt|claude)\\b/i.test(lower)\n\n if (saysNo && !saysYes) explicitNo = true\n else if (saysYes) assisted = true\n else if (/\\bai\\b/i.test(line) && !saysNo) assisted = true\n }\n\n if (anyChecked && !assisted && !explicitNo) ambiguous = true\n }\n\n if (!section && /ai tools were used/i.test(body)) {\n const checked = /\\[[xX]\\]\\s*AI tools were used/i.test(body)\n if (checked) assisted = true\n }\n\n if (explicitNo && assisted) {\n ambiguous = true\n assisted = false\n explicitNo = false\n }\n\n return { assisted, explicitNo, ambiguous }\n}\n","import fs from 'node:fs/promises'\nimport type { PrContext } from '../types.js'\nimport { parseAiDisclosure } from './parse-ai-disclosure.js'\n\ninterface GhPullPayload {\n pull_request?: {\n number?: number\n title?: string\n body?: string | null\n base?: { ref?: string }\n head?: { ref?: string }\n additions?: number\n deletions?: number\n changed_files?: number\n /** Not always present; fallback to diff */\n files?: { filename?: string }[]\n }\n}\n\nexport async function readGithubEvent(): Promise<PrContext | null> {\n const p = process.env.GITHUB_EVENT_PATH\n if (!p) return null\n\n try {\n const raw = await fs.readFile(p, 'utf8')\n const payload = JSON.parse(raw) as GhPullPayload\n const pr = payload.pull_request\n if (!pr) return null\n\n const files = (pr.files ?? []).map((f) => f.filename ?? '').filter(Boolean)\n\n const body = pr.body ?? ''\n const ai = parseAiDisclosure(body)\n\n return {\n number: pr.number ?? 0,\n title: pr.title ?? '',\n body,\n baseRef: pr.base?.ref ?? 'main',\n headRef: pr.head?.ref ?? '',\n additions: pr.additions ?? 0,\n deletions: pr.deletions ?? 0,\n changedFiles: pr.changed_files ?? files.length,\n files,\n aiAssisted: ai.assisted,\n aiExplicitNo: ai.explicitNo,\n aiDisclosureAmbiguous: ai.ambiguous,\n }\n } catch {\n return null\n }\n}\n","import fs from 'node:fs/promises'\n\nconst MARKER = '<!-- frontguard:brief -->'\n\nasync function resolvePrNumber(): Promise<number | null> {\n const raw = process.env.FRONTGUARD_PR_NUMBER ?? process.env.PR_NUMBER\n const n = Number(raw)\n if (Number.isFinite(n) && n > 0) return n\n\n const path = process.env.GITHUB_EVENT_PATH\n if (!path) return null\n try {\n const payload = JSON.parse(await fs.readFile(path, 'utf8')) as {\n pull_request?: { number?: number }\n }\n const num = payload.pull_request?.number\n return typeof num === 'number' && num > 0 ? num : null\n } catch {\n return null\n }\n}\n\nexport async function upsertBriefComment(body: string): Promise<void> {\n const token = process.env.GITHUB_TOKEN\n const repo = process.env.GITHUB_REPOSITORY\n\n if (!token || !repo) {\n return\n }\n\n const [owner, name] = repo.split('/')\n if (!owner || !name) return\n\n const prNumber = await resolvePrNumber()\n if (!prNumber) {\n return\n }\n\n const apiBase = process.env.GITHUB_API_URL ?? 'https://api.github.com'\n const headers = {\n authorization: `Bearer ${token}`,\n accept: 'application/vnd.github+json',\n 'x-github-api-version': '2022-11-28',\n 'content-type': 'application/json',\n } as const\n\n const prefixed = `${MARKER}\\n${body}`\n\n const listUrl = `${apiBase}/repos/${owner}/${name}/issues/${prNumber}/comments?per_page=100`\n const listRes = await fetch(listUrl, { headers })\n if (!listRes.ok) {\n return\n }\n\n const comments = (await listRes.json()) as Array<{ id: number; body?: string }>\n const existing = comments.find(\n (c) => typeof c.body === 'string' && c.body.includes(MARKER),\n )\n\n if (existing) {\n const patchUrl = `${apiBase}/repos/${owner}/${name}/issues/comments/${existing.id}`\n await fetch(patchUrl, {\n method: 'PATCH',\n headers,\n body: JSON.stringify({ body: prefixed }),\n })\n return\n }\n\n const postUrl = `${apiBase}/repos/${owner}/${name}/issues/${prNumber}/comments`\n await fetch(postUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({ body: prefixed }),\n })\n}\n","import type { FrontGuardConfig } from './schema.js'\n\nexport const defaultConfig: FrontGuardConfig = {\n mode: 'warn',\n rules: {},\n checks: {\n eslint: { enabled: true, glob: '**/*.{js,cjs,mjs,jsx,ts,tsx}' },\n prettier: {\n enabled: true,\n glob: '**/*.{js,cjs,mjs,jsx,ts,tsx,json,md,css,scss,yml,yaml}',\n },\n typescript: { enabled: true },\n secrets: { enabled: true },\n prHygiene: {\n enabled: true,\n minBodyLength: 80,\n requireSections: false,\n sectionHints: ['what', 'why', 'test', 'how to test', 'screenshot'],\n requireAiDisclosureSection: true,\n gateWhenAiDisclosureAmbiguous: 'warn',\n },\n aiAssistedReview: {\n enabled: true,\n gate: 'warn',\n escalate: {\n secretFindingsToBlock: true,\n tsAnyDeltaToBlock: true,\n },\n },\n prSize: { warnLines: 400, softBlockLines: 800 },\n\n tsAnyDelta: {\n enabled: true,\n gate: 'warn',\n baseRef: 'main',\n maxAdded: 0,\n },\n cycles: {\n enabled: false,\n gate: 'warn',\n entries: ['src'],\n extraArgs: [],\n },\n deadCode: {\n enabled: false,\n gate: 'info',\n extraArgs: [],\n maxReportLines: 80,\n },\n bundle: {\n enabled: false,\n gate: 'warn',\n runBuild: true,\n buildCommand: 'npm run build',\n measureGlobs: ['dist/**/*', 'build/static/**/*', '.next/static/**/*'],\n baselinePath: '.frontguard/bundle-baseline.json',\n maxDeltaBytes: null,\n maxTotalBytes: null,\n },\n cwv: {\n enabled: true,\n gate: 'warn',\n scanGlobs: ['app/**/*.{tsx,jsx}', 'pages/**/*.{tsx,jsx}', 'src/**/*.{tsx,jsx}'],\n maxFileBytes: 400_000,\n },\n llm: {\n enabled: false,\n provider: 'openai',\n model: 'gpt-4o-mini',\n apiKeyEnv: 'OPENAI_API_KEY',\n maxDiffChars: 48_000,\n timeoutMs: 60_000,\n },\n },\n}\n","import { createRequire } from 'node:module'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport defu from 'defu'\nimport type { FrontGuardConfig } from './schema.js'\nimport { defaultConfig } from './defaults.js'\n\nconst CONFIG_NAMES = [\n 'frontguard.config.js',\n 'frontguard.config.mjs',\n 'frontguard.config.cjs',\n] as const\n\nasync function importConfig(\n absolutePath: string,\n): Promise<{ default?: FrontGuardConfig } | FrontGuardConfig> {\n const url = pathToFileURL(absolutePath).href\n return import(url) as Promise<{ default?: FrontGuardConfig } | FrontGuardConfig>\n}\n\nfunction normalizeExport(\n mod: { default?: FrontGuardConfig } | FrontGuardConfig,\n): FrontGuardConfig {\n if (mod && typeof mod === 'object' && 'default' in mod && mod.default) {\n return mod.default as FrontGuardConfig\n }\n return mod as FrontGuardConfig\n}\n\nfunction stripExtends<T extends { extends?: unknown }>(c: T): Omit<T, 'extends'> {\n const { extends: _e, ...rest } = c\n return rest\n}\n\nasync function loadExtendsLayer(\n cwd: string,\n spec: string | string[] | undefined,\n): Promise<Partial<FrontGuardConfig>> {\n if (!spec) return {}\n const req = createRequire(path.join(cwd, 'package.json'))\n const specs = Array.isArray(spec) ? spec : [spec]\n let merged: Partial<FrontGuardConfig> = {}\n\n for (const s of specs) {\n try {\n const resolved = req.resolve(s)\n const mod = await import(pathToFileURL(resolved).href)\n const layer = normalizeExport(\n mod as { default?: FrontGuardConfig } | FrontGuardConfig,\n )\n merged = defu(stripExtends(layer), merged) as Partial<FrontGuardConfig>\n } catch {\n // org package not installed\n }\n }\n\n return merged\n}\n\nexport async function loadConfig(cwd: string): Promise<FrontGuardConfig> {\n let userFile: FrontGuardConfig | null = null\n\n for (const name of CONFIG_NAMES) {\n const full = path.join(cwd, name)\n if (!fs.existsSync(full)) continue\n try {\n const mod = await importConfig(full)\n userFile = normalizeExport(mod)\n break\n } catch {\n continue\n }\n }\n\n const extendsSpec = userFile?.extends\n const orgLayer = await loadExtendsLayer(cwd, extendsSpec)\n\n const user = userFile ? stripExtends(userFile) : {}\n const base = structuredClone(defaultConfig)\n const withOrg = defu(orgLayer, base) as FrontGuardConfig\n return defu(user, withOrg) as FrontGuardConfig\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { StackInfo } from '../types.js'\n\ninterface Pkg {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n workspaces?: unknown\n}\n\nfunction allDeps(pkg: Pkg): Record<string, string> {\n return {\n ...pkg.peerDependencies,\n ...pkg.devDependencies,\n ...pkg.dependencies,\n }\n}\n\nfunction hasDep(deps: Record<string, string>, name: string): boolean {\n return Object.prototype.hasOwnProperty.call(deps, name)\n}\n\nexport async function detectStack(cwd: string): Promise<StackInfo> {\n let pkg: Pkg = {}\n try {\n const raw = await fs.readFile(path.join(cwd, 'package.json'), 'utf8')\n pkg = JSON.parse(raw) as Pkg\n } catch {\n return {\n isMonorepo: false,\n hasTypeScript: false,\n hasReact: false,\n hasNext: false,\n hasReactNative: false,\n hasJest: false,\n hasVitest: false,\n hasPlaywright: false,\n packageManager: 'unknown',\n tsStrict: null,\n }\n }\n\n const deps = allDeps(pkg)\n const isMonorepo = Boolean(pkg.workspaces)\n\n let tsStrict: boolean | null = null\n try {\n const tsconfigPath = path.join(cwd, 'tsconfig.json')\n const tsRaw = await fs.readFile(tsconfigPath, 'utf8')\n const ts = JSON.parse(tsRaw) as { compilerOptions?: { strict?: boolean } }\n if (typeof ts.compilerOptions?.strict === 'boolean') {\n tsStrict = ts.compilerOptions.strict\n }\n } catch {\n // no tsconfig\n }\n\n let pm: StackInfo['packageManager'] = 'unknown'\n try {\n await fs.access(path.join(cwd, 'pnpm-lock.yaml'))\n pm = 'pnpm'\n } catch {\n try {\n await fs.access(path.join(cwd, 'yarn.lock'))\n pm = 'yarn'\n } catch {\n try {\n await fs.access(path.join(cwd, 'package-lock.json'))\n pm = 'npm'\n } catch {\n pm = 'npm'\n }\n }\n }\n\n return {\n isMonorepo,\n hasTypeScript: hasDep(deps, 'typescript') || Boolean(tsStrict !== null),\n hasReact: hasDep(deps, 'react'),\n hasNext: hasDep(deps, 'next'),\n hasReactNative: hasDep(deps, 'react-native'),\n hasJest: hasDep(deps, 'jest'),\n hasVitest: hasDep(deps, 'vitest'),\n hasPlaywright: hasDep(deps, '@playwright/test'),\n packageManager: pm,\n tsStrict,\n }\n}\n","import path from 'node:path'\nimport fs from 'node:fs/promises'\nimport { exec } from 'tinyexec'\n\nexport interface RunOptions {\n cwd: string\n}\n\nexport async function pathExists(file: string): Promise<boolean> {\n try {\n await fs.access(file)\n return true\n } catch {\n return false\n }\n}\n\nexport async function resolveBin(cwd: string, name: string): Promise<string | null> {\n const local = path.join(cwd, 'node_modules', '.bin', name)\n if (await pathExists(local)) return local\n\n const win = local + '.cmd'\n if (await pathExists(win)) return win\n\n return null\n}\n\n/** Run with local binary if present, else `npx --no-install` first then `npx`. */\nexport async function runNpmBinary(\n cwd: string,\n name: string,\n args: string[],\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n try {\n const bin = await resolveBin(cwd, name)\n if (bin) {\n const r = await exec(bin, args, { nodeOptions: { cwd } })\n return {\n exitCode: r.exitCode ?? 0,\n stdout: r.stdout ?? '',\n stderr: r.stderr ?? '',\n }\n }\n\n let r = await exec('npx', ['--no-install', name, ...args], { nodeOptions: { cwd } })\n if ((r.exitCode ?? 0) !== 0) {\n r = await exec('npx', [name, ...args], { nodeOptions: { cwd } })\n }\n return {\n exitCode: r.exitCode ?? 0,\n stdout: r.stdout ?? '',\n stderr: r.stderr ?? '',\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n return {\n exitCode: 127,\n stdout: '',\n stderr: msg,\n }\n }\n}\n\n/** Invoke `npx` with explicit args (e.g. `npx -y madge ...`). */\nexport async function runNpx(\n cwd: string,\n args: string[],\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n try {\n const r = await exec('npx', args, { nodeOptions: { cwd } })\n return {\n exitCode: r.exitCode ?? 0,\n stdout: r.stdout ?? '',\n stderr: r.stderr ?? '',\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n return {\n exitCode: 127,\n stdout: '',\n stderr: msg,\n }\n }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { CheckResult, Finding, StackInfo } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\nimport { pathExists, runNpmBinary } from '../runner/exec-tools.js'\n\nasync function hasEslintDependency(cwd: string): Promise<boolean> {\n try {\n const raw = await fs.readFile(path.join(cwd, 'package.json'), 'utf8')\n const p = JSON.parse(raw) as {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n return Boolean(p.devDependencies?.eslint || p.dependencies?.eslint)\n } catch {\n return false\n }\n}\n\nasync function hasEslintConfig(cwd: string): Promise<boolean> {\n const candidates = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n '.eslintrc',\n '.eslintrc.json',\n '.eslintrc.cjs',\n '.eslintrc.yaml',\n '.eslintrc.yml',\n ]\n for (const c of candidates) {\n if (await pathExists(path.join(cwd, c))) return true\n }\n return false\n}\n\nfunction meaningfulStderr(stderr: string): string {\n return stderr\n .split('\\n')\n .filter((l) => l.trim() && !/^npm warn\\b/i.test(l))\n .join('\\n')\n .trim()\n}\n\nexport async function runEslint(\n cwd: string,\n config: FrontGuardConfig,\n _stack: StackInfo,\n): Promise<CheckResult> {\n const t0 = performance.now()\n if (!config.checks.eslint.enabled) {\n return {\n checkId: 'eslint',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n const configured = await hasEslintConfig(cwd)\n const dep = await hasEslintDependency(cwd)\n if (!configured && !dep) {\n return {\n checkId: 'eslint',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'ESLint not installed or configured',\n }\n }\n\n const glob = config.checks.eslint.glob ?? '**/*.{js,cjs,mjs,jsx,ts,tsx}'\n const args = [\n glob,\n '--max-warnings',\n '0',\n '--no-error-on-unmatched-pattern',\n '-f',\n 'json',\n ]\n\n const { exitCode, stdout, stderr } = await runNpmBinary(cwd, 'eslint', args)\n const errText = meaningfulStderr(stderr)\n\n const findings: Finding[] = []\n\n if (exitCode === 0) {\n if (errText) {\n findings.push({\n id: 'eslint-stderr',\n severity: 'warn',\n message: 'ESLint wrote to stderr',\n detail: truncate(errText, 4000),\n })\n }\n return {\n checkId: 'eslint',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n }\n\n try {\n const rows = JSON.parse(stdout) as Array<{\n filePath: string\n messages: Array<{ ruleId: string | null; message: string; line?: number }>\n }>\n let n = 0\n for (const row of rows) {\n for (const m of row.messages) {\n if (n++ >= 40) break\n findings.push({\n id: `eslint-${m.ruleId ?? 'unknown'}`,\n severity: 'warn',\n message: m.message,\n file: row.filePath,\n detail: m.line ? `line ${m.line}` : undefined,\n })\n }\n }\n if (n === 0) {\n findings.push({\n id: 'eslint-failed',\n severity: 'warn',\n message: 'ESLint exited with a non-zero status',\n detail: truncate(\n [stdout, errText].filter(Boolean).join('\\n') || `exit ${exitCode}`,\n 4000,\n ),\n })\n }\n } catch {\n findings.push({\n id: 'eslint-failed',\n severity: 'warn',\n message: 'ESLint exited with errors',\n detail: truncate(\n [stdout, errText].filter(Boolean).join('\\n') || `exit ${exitCode}`,\n 4000,\n ),\n })\n }\n\n return {\n checkId: 'eslint',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s\n return s.slice(0, max) + '…'\n}\n","import type { CheckResult, Finding } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\nimport { runNpmBinary } from '../runner/exec-tools.js'\n\nexport async function runPrettier(\n cwd: string,\n config: FrontGuardConfig,\n): Promise<CheckResult> {\n const t0 = performance.now()\n if (!config.checks.prettier.enabled) {\n return {\n checkId: 'prettier',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n const glob =\n config.checks.prettier.glob ??\n '**/*.{js,cjs,mjs,jsx,ts,tsx,json,md,css,scss,yml,yaml}'\n const { exitCode, stdout, stderr } = await runNpmBinary(cwd, 'prettier', [\n '--check',\n glob,\n '--ignore-unknown',\n ])\n\n const findings: Finding[] = []\n\n if (exitCode === 127 || /command not found|not recognized|ENOENT/i.test(stderr)) {\n return {\n checkId: 'prettier',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'prettier binary not found (install prettier or use npx)',\n }\n }\n\n if (exitCode !== 0) {\n const blob = [stdout, stderr].filter(Boolean).join('\\n').trim()\n findings.push({\n id: 'prettier-check',\n severity: 'warn',\n message: 'Prettier reported formatting differences',\n detail: blob ? truncate(blob, 6000) : `exit ${exitCode}`,\n })\n }\n\n return {\n checkId: 'prettier',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s\n return s.slice(0, max) + '…'\n}\n","import path from 'node:path'\nimport type { CheckResult, Finding, StackInfo } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\nimport { pathExists, runNpmBinary } from '../runner/exec-tools.js'\n\nexport async function runTypeScript(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n): Promise<CheckResult> {\n const t0 = performance.now()\n if (!config.checks.typescript.enabled) {\n return {\n checkId: 'typescript',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n const hasTs = stack.hasTypeScript || (await pathExists(path.join(cwd, 'tsconfig.json')))\n if (!hasTs) {\n return {\n checkId: 'typescript',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'no TypeScript project detected',\n }\n }\n\n const args = ['--noEmit', ...(config.checks.typescript.tscArgs ?? [])]\n const { exitCode, stdout, stderr } = await runNpmBinary(cwd, 'tsc', args)\n\n const findings: Finding[] = []\n if (exitCode === 127 || /command not found|not recognized|ENOENT/i.test(stderr)) {\n return {\n checkId: 'typescript',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'typescript compiler not found',\n }\n }\n if (exitCode !== 0) {\n const out = [stdout, stderr].filter(Boolean).join('\\n').trim()\n findings.push({\n id: 'tsc',\n severity: 'warn',\n message: 'TypeScript compiler reported diagnostics',\n detail: out ? truncate(out, 8000) : `exit ${exitCode}`,\n })\n }\n\n return {\n checkId: 'typescript',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s\n return s.slice(0, max) + '…'\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport fg from 'fast-glob'\nimport type { CheckResult, Finding, PrContext } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\n\n/** Lightweight pattern scan — warn-only in Phase 1. Kept conservative to limit noise. */\nconst PATTERNS: Array<{ id: string; re: RegExp; message: string }> = [\n {\n id: 'aws-access-key',\n re: /AKIA[0-9A-Z]{16}/,\n message: 'Possible AWS access key id',\n },\n {\n id: 'github-pat',\n re: /\\bghp_[a-zA-Z0-9]{20,}\\b/,\n message: 'Possible GitHub personal access token',\n },\n {\n id: 'openai-sk',\n re: /\\bsk-[a-zA-Z0-9]{20,}\\b/,\n message: 'Possible OpenAI-style API secret',\n },\n {\n id: 'private-key-block',\n re: /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/,\n message: 'Private key material in source',\n },\n]\n\nconst TEXT_EXT = new Set([\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.json',\n '.md',\n '.yml',\n '.yaml',\n '.env',\n '.txt',\n])\n\nexport async function runSecrets(\n cwd: string,\n config: FrontGuardConfig,\n pr: PrContext | null,\n): Promise<CheckResult> {\n const t0 = performance.now()\n if (!config.checks.secrets.enabled) {\n return {\n checkId: 'secrets',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n const findings: Finding[] = []\n\n let globs: string[]\n if (pr?.files.length) {\n globs = pr.files.filter((f) => isProbablyTextFile(f))\n } else {\n globs = await fg(\n [\n '**/*.{ts,tsx,js,jsx,mjs,cjs,json,md,yml,yaml,env}',\n '!**/node_modules/**',\n '!**/dist/**',\n '!**/.next/**',\n '!**/build/**',\n '!**/coverage/**',\n ],\n { cwd, onlyFiles: true, dot: false },\n )\n }\n\n const maxFiles = 200\n let scanned = 0\n\n for (const rel of globs) {\n if (scanned++ > maxFiles) {\n findings.push({\n id: 'secrets-cap',\n severity: 'info',\n message: `Secret scan capped after ${maxFiles} files (run on PR for narrower scope)`,\n })\n break\n }\n\n const full = path.join(cwd, rel)\n let content: string\n try {\n content = await fs.readFile(full, 'utf8')\n } catch {\n continue\n }\n if (content.length > 500_000) continue\n\n for (const { id, re, message } of PATTERNS) {\n if (re.test(content)) {\n findings.push({\n id,\n severity: 'warn',\n message,\n file: rel,\n })\n }\n }\n }\n\n return {\n checkId: 'secrets',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction isProbablyTextFile(rel: string): boolean {\n const ext = path.extname(rel).toLowerCase()\n return TEXT_EXT.has(ext)\n}\n","import type { CheckResult, Finding, PrContext } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\n\nexport function runPrHygiene(\n config: FrontGuardConfig,\n pr: PrContext | null,\n): CheckResult {\n const t0 = performance.now()\n if (!config.checks.prHygiene.enabled) {\n return {\n checkId: 'pr-hygiene',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n if (!pr) {\n return {\n checkId: 'pr-hygiene',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'not running in GitHub pull_request context',\n }\n }\n\n const findings: Finding[] = []\n const body = (pr.body ?? '').trim()\n const min = config.checks.prHygiene.minBodyLength\n\n if (body.length < min) {\n findings.push({\n id: 'pr-body-short',\n severity: 'warn',\n message: `PR description is shorter than ${min} characters`,\n detail: `Current length: ${body.length}`,\n })\n }\n\n const lower = body.toLowerCase()\n const hints = config.checks.prHygiene.sectionHints\n const missing = hints.filter((h) => !sectionMentioned(lower, h))\n\n if (missing.length > 0) {\n findings.push({\n id: 'pr-sections',\n severity: config.checks.prHygiene.requireSections ? 'warn' : 'info',\n message: `PR description may be missing suggested sections: ${missing.join(', ')}`,\n })\n }\n\n if (config.checks.prHygiene.requireAiDisclosureSection) {\n const hasAiHeader = /^#{1,6}\\s+.*\\bAI\\b/im.test(body)\n if (!hasAiHeader) {\n findings.push({\n id: 'pr-ai-section-missing',\n severity: 'warn',\n message:\n 'PR is missing an **AI disclosure** section (e.g. `## AI disclosure`). Mark whether this PR used AI tools.',\n })\n }\n }\n\n if (pr.aiDisclosureAmbiguous) {\n findings.push({\n id: 'pr-ai-disclosure-ambiguous',\n severity: config.checks.prHygiene.gateWhenAiDisclosureAmbiguous,\n message:\n 'AI disclosure checkboxes look ambiguous — please mark **Yes** or **No** clearly in the AI section.',\n })\n }\n\n if (pr.aiAssisted) {\n findings.push({\n id: 'pr-ai-flag',\n severity: 'warn',\n message:\n '**AI-assisted PR:** FrontGuard is applying stricter static checks and may escalate secrets / `any` deltas. Verify business logic, auth, and data handling manually.',\n })\n }\n\n if (pr.aiExplicitNo) {\n findings.push({\n id: 'pr-ai-explicit-no',\n severity: 'info',\n message:\n 'Author indicated **no AI** for code generation — standard review profile.',\n })\n }\n\n return {\n checkId: 'pr-hygiene',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction sectionMentioned(body: string, hint: string): boolean {\n const h = hint.toLowerCase()\n if (h === 'what') {\n return /\\bwhat\\b/.test(body) || /##\\s*summary/.test(body) || /##\\s*context/.test(body)\n }\n if (h === 'why') {\n return /\\bwhy\\b/.test(body) || /motivation/.test(body) || /##\\s*rationale/.test(body)\n }\n if (h === 'test' || h === 'how to test') {\n return (\n /how to test/.test(body) ||\n /\\btesting\\b/.test(body) ||\n /##\\s*test/.test(body) ||\n /qa\\s*steps/.test(body)\n )\n }\n if (h === 'screenshot') {\n return /screenshot|screen recording|loom|recording/i.test(body)\n }\n return body.includes(h)\n}\n","import type { CheckResult, Finding, PrContext } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\n\nexport function runPrSize(config: FrontGuardConfig, pr: PrContext | null): CheckResult {\n const t0 = performance.now()\n if (!pr) {\n return {\n checkId: 'pr-size',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'not running in GitHub pull_request context',\n }\n }\n\n const findings: Finding[] = []\n const lines = pr.additions + pr.deletions\n const { warnLines, softBlockLines } = config.checks.prSize\n\n if (lines >= softBlockLines) {\n findings.push({\n id: 'pr-size-large',\n severity: 'warn',\n message: `PR is very large (${lines} lines changed; ≥ ${softBlockLines})`,\n detail: 'Consider splitting to improve review quality.',\n })\n } else if (lines >= warnLines) {\n findings.push({\n id: 'pr-size-medium',\n severity: 'info',\n message: `PR size is elevated (${lines} lines changed; ≥ ${warnLines})`,\n })\n }\n\n return {\n checkId: 'pr-size',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n","import { exec } from 'tinyexec'\n\nexport async function gitOk(cwd: string): Promise<boolean> {\n try {\n const r = await exec('git', ['rev-parse', '--is-inside-work-tree'], {\n nodeOptions: { cwd },\n })\n return (r.stdout ?? '').trim() === 'true'\n } catch {\n return false\n }\n}\n\nexport async function gitMergeBase(cwd: string, baseRef: string): Promise<string | null> {\n try {\n const r = await exec('git', ['merge-base', 'HEAD', baseRef], {\n nodeOptions: { cwd },\n })\n const s = (r.stdout ?? '').trim()\n return s || null\n } catch {\n return null\n }\n}\n\n/** Unified diff patch (text) between base and HEAD for pathspecs. */\nexport async function gitDiffPatch(\n cwd: string,\n baseRef: string,\n pathspecs: string[],\n): Promise<string | null> {\n if (pathspecs.length === 0) return null\n try {\n const r = await exec(\n 'git',\n ['diff', `${baseRef}...HEAD`, '--unified=1', '--no-color', '--', ...pathspecs],\n { nodeOptions: { cwd } },\n )\n return r.stdout ?? ''\n } catch {\n return null\n }\n}\n\nexport async function gitShowFile(\n cwd: string,\n gitRef: string,\n filePath: string,\n): Promise<string | null> {\n try {\n const r = await exec('git', ['show', `${gitRef}:${filePath}`], {\n nodeOptions: { cwd },\n })\n return r.stdout ?? ''\n } catch {\n return null\n }\n}\n\n/** Unified diff for review / LLM context. */\nexport async function gitDiffForReview(\n cwd: string,\n baseRef: string,\n maxChars: number,\n): Promise<string> {\n try {\n const r = await exec(\n 'git',\n ['diff', `${baseRef}...HEAD`, '--unified=2', '--no-color'],\n {\n nodeOptions: { cwd },\n },\n )\n let s = r.stdout ?? ''\n if (s.length > maxChars) {\n s = s.slice(0, maxChars) + '\\n…(truncated)\\n'\n }\n return s\n } catch {\n return ''\n }\n}\n\nexport async function resolveDiffBaseRef(cwd: string, fallback: string): Promise<string> {\n const gh = process.env.GITHUB_BASE_REF\n if (gh) {\n const origin = `origin/${gh}`\n try {\n await exec('git', ['rev-parse', '--verify', origin], { nodeOptions: { cwd } })\n return origin\n } catch {\n // try fetch name only\n }\n }\n try {\n const cand = fallback.includes('/') ? fallback : `origin/${fallback}`\n await exec('git', ['rev-parse', '--verify', cand], { nodeOptions: { cwd } })\n return cand\n } catch {\n try {\n await exec('git', ['rev-parse', '--verify', fallback], { nodeOptions: { cwd } })\n return fallback\n } catch {\n return fallback\n }\n }\n}\n","import type { CheckResult, Finding, StackInfo } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\nimport { gitDiffPatch, gitOk, resolveDiffBaseRef } from '../runner/git.js'\n\nfunction gateSeverity(g: CheckGate): Finding['severity'] {\n return g === 'block' ? 'block' : g === 'info' ? 'info' : 'warn'\n}\n\n/** Approximate count of *new* `any` introduced on `+` diff lines. */\nexport function countAddedAnyInPatch(patch: string): number {\n let n = 0\n for (const raw of patch.split('\\n')) {\n if (!raw.startsWith('+') || raw.startsWith('+++')) continue\n const line = raw.slice(1)\n if (/^\\s*\\/(\\/|\\*)/.test(line)) continue\n const patterns = [\n /:\\s*any\\b/g,\n /\\bas\\s+any\\b/g,\n /<\\s*any\\s*>/g,\n /\\bReadonlyArray\\s*<\\s*any\\s*>/g,\n /\\bArray\\s*<\\s*any\\s*>/g,\n /\\bRecord\\s*<\\s*[^,]+,\\s*any\\s*>/g,\n ]\n for (const p of patterns) {\n const m = line.match(p)\n if (m) n += m.length\n }\n }\n return n\n}\n\nexport async function runTsAnyDelta(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.tsAnyDelta\n if (!cfg.enabled || !stack.hasTypeScript) {\n return {\n checkId: 'ts-any-delta',\n findings: [],\n durationMs: 0,\n skipped: !cfg.enabled ? 'disabled in config' : 'no TypeScript',\n }\n }\n\n if (!(await gitOk(cwd))) {\n return {\n checkId: 'ts-any-delta',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'not a git repository',\n }\n }\n\n const base = await resolveDiffBaseRef(cwd, cfg.baseRef)\n const patch = (await gitDiffPatch(cwd, base, ['*.ts', '*.tsx', '*.mts', '*.cts'])) ?? ''\n\n if (!patch.trim()) {\n return {\n checkId: 'ts-any-delta',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'no diff vs base (fetch depth or base ref?)',\n }\n }\n\n const added = countAddedAnyInPatch(patch)\n const findings: Finding[] = []\n\n if (added === 0) {\n return {\n checkId: 'ts-any-delta',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n }\n\n const overBudget = cfg.maxAdded > 0 && added > cfg.maxAdded\n const shouldGate = cfg.maxAdded === 0 ? added > 0 : overBudget\n\n const severity: Finding['severity'] = shouldGate ? gateSeverity(cfg.gate) : 'info'\n\n findings.push({\n id: 'ts-any-added',\n severity,\n message: shouldGate\n ? cfg.maxAdded > 0\n ? `Added ~${added} new \\`any\\` usages (budget ${cfg.maxAdded})`\n : `Added ~${added} new \\`any\\` usages in the PR diff`\n : `Added ~${added} new \\`any\\` usages (within budget ${cfg.maxAdded})`,\n detail: `merge-base: ${base}`,\n })\n\n return {\n checkId: 'ts-any-delta',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n","import type { CheckResult, Finding, StackInfo } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\nimport { pathExists, runNpx } from '../runner/exec-tools.js'\nimport path from 'node:path'\n\nfunction gateSeverity(g: CheckGate): Finding['severity'] {\n return g === 'block' ? 'block' : g === 'info' ? 'info' : 'warn'\n}\n\nexport async function runCycles(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.cycles\n if (!cfg.enabled || !stack.hasTypeScript) {\n return {\n checkId: 'cycles',\n findings: [],\n durationMs: 0,\n skipped: !cfg.enabled ? 'disabled in config' : 'no TypeScript',\n }\n }\n\n let entry = cfg.entries[0] ?? 'src'\n for (const e of cfg.entries) {\n if (await pathExists(path.join(cwd, e))) {\n entry = e\n break\n }\n }\n if (!(await pathExists(path.join(cwd, entry)))) {\n return {\n checkId: 'cycles',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: `entry path not found (${entry})`,\n }\n }\n\n const args = [\n '-y',\n 'madge@6',\n entry,\n '--extensions',\n 'ts,tsx,js,jsx',\n '--circular',\n ...cfg.extraArgs,\n ]\n\n const { exitCode, stdout, stderr } = await runNpx(cwd, args)\n const out = [stdout, stderr].filter(Boolean).join('\\n').trim()\n\n if (exitCode === 127 || /command not found|not recognized|ENOENT/i.test(stderr)) {\n return {\n checkId: 'cycles',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'npx/madge not available',\n }\n }\n\n const findings: Finding[] = []\n const cyclic = exitCode !== 0 && /circular|Circular|\\(circular\\)/i.test(out)\n\n if (cyclic) {\n findings.push({\n id: 'import-cycle',\n severity: gateSeverity(cfg.gate),\n message: 'Circular dependencies detected (madge)',\n detail: truncate(out || `exit ${exitCode}`, 12_000),\n })\n } else if (exitCode !== 0) {\n findings.push({\n id: 'madge-error',\n severity: 'info',\n message: 'madge exited non-zero — verify entry/extensions or install deps locally',\n detail: truncate(out || `exit ${exitCode}`, 8000),\n })\n }\n\n return {\n checkId: 'cycles',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s\n return s.slice(0, max) + '…'\n}\n","import type { CheckResult, Finding, PrContext, StackInfo } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\nimport { runNpx } from '../runner/exec-tools.js'\n\nfunction gateSeverity(g: CheckGate): Finding['severity'] {\n return g === 'block' ? 'block' : g === 'info' ? 'info' : 'warn'\n}\n\nexport async function runDeadCode(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n pr: PrContext | null,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.deadCode\n if (!cfg.enabled || !stack.hasTypeScript) {\n return {\n checkId: 'dead-code',\n findings: [],\n durationMs: 0,\n skipped: !cfg.enabled ? 'disabled in config' : 'no TypeScript',\n }\n }\n\n const args = ['-y', 'ts-prune', ...cfg.extraArgs]\n const { exitCode, stdout, stderr } = await runNpx(cwd, args)\n\n if (exitCode === 127 || /command not found|not recognized|ENOENT/i.test(stderr)) {\n return {\n checkId: 'dead-code',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'npx/ts-prune not available',\n }\n }\n\n const raw = (stdout || '').trim()\n const lines = raw\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l && /^[\\w./\\\\~-]+[^\\s]*\\s*-\\s*.+/.test(l))\n\n if (lines.length === 0) {\n return {\n checkId: 'dead-code',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n }\n }\n\n const prFiles = pr?.files?.length\n ? new Set(pr.files.map((f) => f.replace(/\\\\/g, '/')))\n : null\n\n const relevant = prFiles\n ? lines.filter((l) => {\n const file = l.split(/\\s*-\\s*/)[0]?.trim()\n if (!file) return false\n return [...prFiles].some((p) => p === file || p.endsWith(file))\n })\n : lines\n\n const report = (relevant.length ? relevant : lines)\n .slice(0, cfg.maxReportLines)\n .join('\\n')\n\n const findings: Finding[] = [\n {\n id: 'ts-prune',\n severity: gateSeverity(cfg.gate),\n message: prFiles\n ? `Potentially unused exports (${relevant.length} on touched files; ${lines.length} total)`\n : `Potentially unused exports reported by ts-prune (${lines.length})`,\n detail: report,\n },\n ]\n\n return {\n checkId: 'dead-code',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport fg from 'fast-glob'\nimport { exec } from 'tinyexec'\nimport type { CheckResult, Finding, StackInfo } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\nimport { resolveDiffBaseRef } from '../runner/git.js'\n\nfunction gateSeverity(g: CheckGate): Finding['severity'] {\n return g === 'block' ? 'block' : g === 'info' ? 'info' : 'warn'\n}\n\ninterface BaselineFile {\n totalBytes: number\n generatedAt?: string\n}\n\nasync function sumGlobBytes(cwd: string, patterns: string[]): Promise<number> {\n let total = 0\n for (const pattern of patterns) {\n const files = await fg(pattern, {\n cwd,\n onlyFiles: true,\n dot: false,\n ignore: ['**/node_modules/**'],\n })\n for (const rel of files) {\n try {\n const st = await fs.stat(path.join(cwd, rel))\n total += st.size\n } catch {\n /* skip */\n }\n }\n }\n return total\n}\n\nasync function readBaseline(\n cwd: string,\n relPath: string,\n baseRef: string | null,\n): Promise<BaselineFile | null> {\n const disk = path.join(cwd, relPath)\n try {\n const raw = await fs.readFile(disk, 'utf8')\n return JSON.parse(raw) as BaselineFile\n } catch {\n /* no local baseline */\n }\n\n if (!baseRef) return null\n try {\n const r = await exec('git', ['show', `${baseRef}:${relPath}`], {\n nodeOptions: { cwd },\n })\n if ((r.exitCode ?? 0) !== 0) return null\n return JSON.parse((r.stdout ?? '').trim()) as BaselineFile\n } catch {\n return null\n }\n}\n\nasync function gitOkQuick(cwd: string): Promise<boolean> {\n try {\n const r = await exec('git', ['rev-parse', '--is-inside-work-tree'], {\n nodeOptions: { cwd },\n })\n return (r.stdout ?? '').trim() === 'true'\n } catch {\n return false\n }\n}\n\nfunction tokenizeCommand(cmd: string): string[] {\n return cmd\n .trim()\n .split(/\\s+/)\n .map((t) => t.trim())\n .filter(Boolean)\n}\n\nexport async function runBundle(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.bundle\n\n if (!cfg.enabled) {\n return {\n checkId: 'bundle',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n if (stack.hasReactNative && !stack.hasNext) {\n return {\n checkId: 'bundle',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'skipped for React Native (configure web artifacts if needed)',\n }\n }\n\n if (cfg.runBuild) {\n const parts = tokenizeCommand(cfg.buildCommand)\n if (parts.length === 0) {\n return {\n checkId: 'bundle',\n findings: [\n {\n id: 'bundle-cmd',\n severity: 'warn',\n message: '`checks.bundle.buildCommand` is empty',\n },\n ],\n durationMs: Math.round(performance.now() - t0),\n }\n }\n const [bin, ...args] = parts\n const res = await exec(bin, args, { nodeOptions: { cwd } })\n if ((res.exitCode ?? 0) !== 0) {\n return {\n checkId: 'bundle',\n findings: [\n {\n id: 'bundle-build',\n severity: gateSeverity(cfg.gate),\n message: 'Build command failed — cannot measure bundle',\n detail: [res.stdout, res.stderr].filter(Boolean).join('\\n').slice(0, 8000),\n },\n ],\n durationMs: Math.round(performance.now() - t0),\n }\n }\n }\n\n const total = await sumGlobBytes(cwd, cfg.measureGlobs)\n if (total === 0) {\n return {\n checkId: 'bundle',\n findings: [\n {\n id: 'bundle-empty',\n severity: 'info',\n message:\n 'No bundle artifacts matched `measureGlobs` — configure paths or run a web build',\n },\n ],\n durationMs: Math.round(performance.now() - t0),\n }\n }\n\n const baseRef = (await gitOkQuick(cwd))\n ? await resolveDiffBaseRef(cwd, config.checks.tsAnyDelta.baseRef)\n : null\n const baseline = await readBaseline(cwd, cfg.baselinePath, baseRef)\n\n const findings: Finding[] = []\n const infoLines = [\n `Measured ${total} bytes (${(total / 1024 / 1024).toFixed(2)} MiB)`,\n baseline\n ? `Baseline from \\`${cfg.baselinePath}\\`: ${baseline.totalBytes} bytes`\n : `No baseline at \\`${cfg.baselinePath}\\` (commit a baseline JSON to compare)`,\n ].join('\\n')\n\n if (cfg.maxTotalBytes != null && total > cfg.maxTotalBytes) {\n findings.push({\n id: 'bundle-max-total',\n severity: gateSeverity(cfg.gate),\n message: `Bundle size ${total} bytes exceeds maxTotalBytes (${cfg.maxTotalBytes})`,\n detail: infoLines,\n })\n }\n\n if (baseline && cfg.maxDeltaBytes != null) {\n const delta = total - baseline.totalBytes\n if (delta > cfg.maxDeltaBytes) {\n findings.push({\n id: 'bundle-delta',\n severity: gateSeverity(cfg.gate),\n message: `Bundle grew by ${delta} bytes vs baseline (limit ${cfg.maxDeltaBytes})`,\n detail: infoLines,\n })\n }\n }\n\n if (\n findings.length === 0 &&\n !baseline &&\n (cfg.maxDeltaBytes != null || cfg.maxTotalBytes != null)\n ) {\n findings.push({\n id: 'bundle-baseline-missing',\n severity: 'info',\n message:\n 'Baseline file missing — delta/total gates need a committed `.frontguard/bundle-baseline.json`',\n detail: infoLines,\n })\n }\n\n if (findings.length === 0) {\n findings.push({\n id: 'bundle-ok',\n severity: 'info',\n message: 'Bundle measurement complete',\n detail: infoLines,\n })\n }\n\n return {\n checkId: 'bundle',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport fg from 'fast-glob'\nimport type { CheckResult, Finding, PrContext, StackInfo } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\n\nfunction gateSeverity(g: CheckGate): Finding['severity'] {\n return g === 'block' ? 'block' : g === 'info' ? 'info' : 'warn'\n}\n\n/** Heuristic CWV / LCP hygiene for JSX/TSX (static only). */\nexport async function runCwv(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n pr: PrContext | null,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.cwv\n\n if (!cfg.enabled) {\n return {\n checkId: 'cwv',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n if (stack.hasReactNative && !stack.hasNext) {\n return {\n checkId: 'cwv',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'skipped for React Native',\n }\n }\n\n const prSet = pr?.files?.length\n ? new Set(pr.files.map((f) => f.replace(/\\\\/g, '/')))\n : null\n\n const files = await fg(cfg.scanGlobs, {\n cwd,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/*.test.*', '**/*.spec.*'],\n })\n\n const toScan = prSet\n ? files.filter((f) => [...prSet].some((p) => p === f || p.endsWith(f)))\n : files\n\n const findings: Finding[] = []\n const sev = gateSeverity(cfg.gate)\n\n for (const rel of toScan.slice(0, 400)) {\n const full = path.join(cwd, rel)\n let text: string\n try {\n text = await fs.readFile(full, 'utf8')\n } catch {\n continue\n }\n if (text.length > cfg.maxFileBytes) continue\n\n if (\n stack.hasNext &&\n /<img\\b/i.test(text) &&\n !/from\\s+['\"]next\\/image['\"]/.test(text)\n ) {\n findings.push({\n id: 'cwv-img-tag',\n severity: sev,\n message: 'Raw `<img>` detected — prefer `next/image` for LCP-friendly delivery',\n file: rel,\n })\n }\n\n if (/dangerouslySetInnerHTML/i.test(text)) {\n findings.push({\n id: 'cwv-dsh',\n severity: 'warn',\n message:\n '`dangerouslySetInnerHTML` can impact main-thread work — validate necessity',\n file: rel,\n })\n }\n }\n\n return {\n checkId: 'cwv',\n findings: dedupeFindings(findings).slice(0, 40),\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction dedupeFindings(f: Finding[]): Finding[] {\n const seen = new Set<string>()\n const out: Finding[] = []\n for (const x of f) {\n const k = `${x.id}:${x.file ?? ''}`\n if (seen.has(k)) continue\n seen.add(k)\n out.push(x)\n }\n return out\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport fg from 'fast-glob'\nimport type { CheckResult, Finding } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\n\nconst DEFAULT_GLOB = '**/*.{ts,tsx,js,jsx,mjs,cjs}'\n\nexport async function runCustomRules(\n cwd: string,\n config: FrontGuardConfig,\n restrictToFiles: string[] | null,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const rules = config.rules\n if (!rules || Object.keys(rules).length === 0) {\n return {\n checkId: 'custom-rules',\n findings: [],\n durationMs: 0,\n skipped: 'no rules configured',\n }\n }\n\n const active = Object.entries(rules).filter(([, v]) => v !== 'off') as [\n string,\n Exclude<(typeof rules)[string], 'off'>,\n ][]\n\n if (active.length === 0) {\n return {\n checkId: 'custom-rules',\n findings: [],\n durationMs: 0,\n skipped: 'all rules off',\n }\n }\n\n let files: string[]\n if (restrictToFiles?.length) {\n files = restrictToFiles.filter((f) => /\\.(tsx?|jsx?|mjs|cjs)$/i.test(f))\n } else {\n files = await fg(DEFAULT_GLOB, {\n cwd,\n ignore: ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/build/**'],\n onlyFiles: true,\n })\n }\n\n const findings: Finding[] = []\n const maxFiles = 300\n let n = 0\n\n for (const rel of files) {\n if (n++ > maxFiles) {\n findings.push({\n id: 'custom-rules-cap',\n severity: 'info',\n message: `Custom rules scan capped after ${maxFiles} files`,\n })\n break\n }\n const full = path.join(cwd, rel)\n let content: string\n try {\n content = await fs.readFile(full, 'utf8')\n } catch {\n continue\n }\n if (content.length > 600_000) continue\n\n const ctx = { path: rel, content }\n for (const [id, def] of active) {\n if (typeof def.check !== 'function') continue\n try {\n if (def.check(ctx)) {\n findings.push({\n id: `rule:${id}`,\n severity: def.severity,\n message: def.message,\n file: rel,\n })\n }\n } catch (e) {\n findings.push({\n id: `rule-error:${id}`,\n severity: 'warn',\n message: `Rule \\`${id}\\` threw`,\n detail: e instanceof Error ? e.message : String(e),\n file: rel,\n })\n }\n }\n }\n\n return {\n checkId: 'custom-rules',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { CheckResult, Finding, PrContext } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\n\nfunction sev(gate: CheckGate): Finding['severity'] {\n return gate === 'block' ? 'block' : gate === 'info' ? 'info' : 'warn'\n}\n\nconst CODE_EXT = /\\.(tsx?|jsx?|mjs|cjs)$/i\n\ninterface Pattern {\n id: string\n re: RegExp\n message: string\n /** Always block regardless of gate (security) */\n forceBlock?: boolean\n}\n\nconst PATTERNS: Pattern[] = [\n {\n id: 'ai-eval',\n re: /\\beval\\s*\\(/,\n message:\n '`eval()` — high risk; AI output often slips this in. Replace with safe parsing.',\n forceBlock: true,\n },\n {\n id: 'ai-new-function',\n re: /\\bnew\\s+Function\\s*\\(/,\n message: '`new Function()` is eval-like — verify necessity and input trust.',\n forceBlock: true,\n },\n {\n id: 'ai-dsh',\n re: /dangerouslySetInnerHTML\\s*=/,\n message: '`dangerouslySetInnerHTML` — XSS risk. Ensure trusted/sanitized HTML only.',\n },\n {\n id: 'ai-inner-html-assign',\n re: /\\.innerHTML\\s*=/,\n message: 'DOM `innerHTML` assignment — XSS risk; prefer textContent or sanitization.',\n },\n {\n id: 'ai-document-write',\n re: /\\bdocument\\.write\\s*\\(/,\n message: '`document.write` — brittle and unsafe in modern apps.',\n },\n {\n id: 'ai-ts-ignore',\n re: /@ts-ignore\\b/,\n message:\n '`@ts-ignore` hides errors (AI often uses instead of fixing). Prefer `@ts-expect-error` with reason.',\n },\n {\n id: 'ai-empty-catch',\n re: /catch\\s*(?:\\([^)]*\\))?\\s*\\{\\s*\\}/,\n message: 'Empty `catch` — errors swallowed; at least log or rethrow intentionally.',\n },\n {\n id: 'ai-http-url',\n re: /(['\"])http:\\/\\//,\n message: 'Plain `http://` URL — mixed content / MITM risk in browser code.',\n },\n {\n id: 'ai-token-storage',\n re: /(?:localStorage|sessionStorage)\\.(?:setItem|getItem)\\s*\\(\\s*['\"][^'\"]*token[^'\"]*['\"]/i,\n message: 'Token in web storage — confirm threat model (XSS exfiltration).',\n },\n {\n id: 'ai-child-process',\n re: /(?:from\\s+['\"]child_process['\"]|require\\s*\\(\\s*['\"]child_process['\"]\\s*\\))/,\n message:\n '`child_process` in app code — unusual for browser bundles; confirm this is server-only tooling.',\n },\n {\n id: 'ai-sql-template',\n re: /(?:query|execute|raw)\\s*\\(\\s*[`'\"][^`'\"]*\\$\\{/i,\n message: 'Possible dynamic SQL/string — ensure parameterization, not string concat.',\n },\n]\n\nexport async function runAiAssistedStrict(\n cwd: string,\n config: FrontGuardConfig,\n pr: PrContext | null,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.aiAssistedReview\n\n if (!cfg.enabled) {\n return {\n checkId: 'ai-assisted-strict',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n if (!pr) {\n return {\n checkId: 'ai-assisted-strict',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'not a pull request context',\n }\n }\n\n if (!pr.aiAssisted) {\n return {\n checkId: 'ai-assisted-strict',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'PR does not indicate AI-assisted code',\n }\n }\n\n const files = (pr.files ?? []).filter((f) => CODE_EXT.test(f)).slice(0, 150)\n const gate = cfg.gate\n const findings: Finding[] = []\n\n for (const rel of files) {\n const full = path.join(cwd, rel)\n let content: string\n try {\n content = await fs.readFile(full, 'utf8')\n } catch {\n continue\n }\n if (content.length > 500_000) continue\n\n for (const { id, re, message, forceBlock } of PATTERNS) {\n if (!re.test(content)) continue\n findings.push({\n id,\n severity: forceBlock ? 'block' : sev(gate),\n message: `[AI-assisted strict] ${message}`,\n file: rel,\n })\n }\n }\n\n return {\n checkId: 'ai-assisted-strict',\n findings: dedupe(findings),\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction dedupe(f: Finding[]): Finding[] {\n const s = new Set<string>()\n const out: Finding[] = []\n for (const x of f) {\n const k = `${x.id}:${x.file ?? ''}`\n if (s.has(k)) continue\n s.add(k)\n out.push(x)\n }\n return out\n}\n","import type { FrontGuardConfig } from '../config/schema.js'\nimport type { CheckResult, PrContext } from '../types.js'\n\n/**\n * When the PR discloses AI use, escalate selected automated findings so reviewers\n * treat them as merge blockers (in enforce mode) or high-signal warnings.\n */\nexport function applyAiAssistedEscalation(\n results: CheckResult[],\n pr: PrContext | null,\n config: FrontGuardConfig,\n): void {\n const cfg = config.checks.aiAssistedReview\n if (!pr?.aiAssisted || !cfg.enabled) return\n\n const { escalate } = cfg\n\n for (const r of results) {\n if (r.skipped) continue\n\n if (escalate.secretFindingsToBlock && r.checkId === 'secrets') {\n for (const f of r.findings) {\n if (f.severity === 'warn' || f.severity === 'info') f.severity = 'block'\n }\n }\n\n if (escalate.tsAnyDeltaToBlock && r.checkId === 'ts-any-delta') {\n for (const f of r.findings) {\n if (f.severity === 'warn' || f.severity === 'info') f.severity = 'block'\n }\n }\n }\n}\n","import pc from 'picocolors'\nimport type { GuardMode } from '../config/schema.js'\nimport type { CheckResult, PrContext, StackInfo } from '../types.js'\n\nexport interface FullReport {\n riskScore: 'LOW' | 'MEDIUM' | 'HIGH'\n stack: StackInfo\n pr: PrContext | null\n results: CheckResult[]\n markdown: string\n consoleText: string\n}\n\nexport function buildReport(\n stack: StackInfo,\n pr: PrContext | null,\n results: CheckResult[],\n options?: { mode?: GuardMode; llmAppendix?: string | null },\n): FullReport {\n const mode = options?.mode ?? 'warn'\n const allFindings = results.flatMap((r) =>\n r.findings.map((f) => ({ ...f, checkId: r.checkId })),\n )\n const warns = allFindings.filter((f) => f.severity === 'warn').length\n const infos = allFindings.filter((f) => f.severity === 'info').length\n const blocks = allFindings.filter((f) => f.severity === 'block').length\n\n const lines = pr != null ? pr.additions + pr.deletions : null\n\n const riskScore = scoreRisk(blocks, warns, lines, pr?.changedFiles ?? 0)\n\n const markdown = formatMarkdown({\n riskScore,\n mode,\n stack,\n pr,\n results,\n warns,\n infos,\n blocks,\n lines,\n llmAppendix: options?.llmAppendix ?? null,\n })\n\n const consoleText = formatConsole({\n riskScore,\n mode,\n stack,\n pr,\n results,\n warns,\n infos,\n blocks,\n })\n\n return { riskScore, stack, pr, results, markdown, consoleText }\n}\n\nfunction formatStackOneLiner(s: StackInfo): string {\n const bits: string[] = []\n if (s.hasNext) bits.push('Next.js')\n if (s.hasReactNative) bits.push('React Native')\n else if (s.hasReact) bits.push('React')\n if (s.hasTypeScript) bits.push('TypeScript')\n if (s.tsStrict === true) bits.push('strict TS')\n bits.push(`pkg: ${s.packageManager}`)\n return bits.join(' · ') || 'unknown'\n}\n\nfunction scoreRisk(\n blocks: number,\n warns: number,\n lines: number | null,\n files: number,\n): FullReport['riskScore'] {\n let score = 0\n if (blocks > 0) score += 3\n if (warns >= 8) score += 2\n else if (warns >= 3) score += 1\n if (lines != null) {\n if (lines >= 800) score += 2\n else if (lines >= 400) score += 1\n }\n if (files >= 25) score += 1\n if (score >= 5) return 'HIGH'\n if (score >= 2) return 'MEDIUM'\n return 'LOW'\n}\n\nfunction formatMarkdown(p: {\n riskScore: FullReport['riskScore']\n mode: GuardMode\n stack: StackInfo\n pr: PrContext | null\n results: CheckResult[]\n warns: number\n infos: number\n blocks: number\n lines: number | null\n llmAppendix: string | null\n}): string {\n const {\n riskScore,\n mode,\n stack,\n pr,\n results,\n warns,\n infos,\n blocks,\n lines,\n llmAppendix,\n } = p\n const sb: string[] = []\n\n sb.push('## FrontGuard review brief')\n sb.push('')\n sb.push(\n `**Risk:** ${riskScore} · **Mode:** ${mode === 'enforce' ? 'enforce (CI may fail on `block`)' : 'warn-only'}`,\n )\n if (pr?.aiAssisted) {\n sb.push('')\n sb.push(\n '**AI-assisted PR:** Stricter static pass is active (security / footgun patterns on changed files; secrets & `any` deltas may be escalated). **Human review** still required for correctness and product rules.',\n )\n }\n sb.push('')\n sb.push(`**Stack:** ${formatStackOneLiner(stack)}`)\n if (pr && lines != null) {\n sb.push(\n `**Size:** ${lines} lines (+${pr.additions} / -${pr.deletions}) across ${pr.changedFiles} files`,\n )\n }\n sb.push('')\n sb.push(\n blocks > 0\n ? `**Blocking (\\`block\\`) findings:** ${blocks}`\n : '**Blocking (\\`block\\`) findings:** 0',\n )\n sb.push(`**Warnings:** ${warns} · **Info:** ${infos}`)\n sb.push('')\n\n sb.push('### Check summary')\n for (const r of results) {\n const status = r.skipped\n ? `⏭️ skipped (${r.skipped})`\n : r.findings.length === 0\n ? '✅ clean'\n : `⚠️ ${r.findings.length} finding(s)`\n sb.push(`- **${r.checkId}** — ${status} (${r.durationMs}ms)`)\n }\n sb.push('')\n\n const blockFindings = results.flatMap((r) =>\n r.findings.filter((f) => f.severity === 'block').map((f) => ({ r, f })),\n )\n if (blockFindings.length) {\n sb.push('### Blocking')\n for (const { f } of blockFindings.slice(0, 40)) {\n const loc = f.file ? ` \\`${f.file}\\`` : ''\n sb.push(`- ${f.message}${loc}`)\n if (f.detail) {\n sb.push(\n ` - <details><summary>detail</summary>\\n\\n\\`\\`\\`text\\n${f.detail}\\n\\`\\`\\`\\n\\n</details>`,\n )\n }\n }\n sb.push('')\n }\n\n const warnFindings = results.flatMap((r) =>\n r.findings.filter((f) => f.severity === 'warn').map((f) => ({ r, f })),\n )\n if (warnFindings.length) {\n sb.push('### Warnings')\n for (const { f } of warnFindings.slice(0, 30)) {\n const loc = f.file ? ` \\`${f.file}\\`` : ''\n sb.push(`- ${f.message}${loc}`)\n if (f.detail) {\n sb.push(\n ` - <details><summary>detail</summary>\\n\\n\\`\\`\\`text\\n${f.detail}\\n\\`\\`\\`\\n\\n</details>`,\n )\n }\n }\n if (warnFindings.length > 30) {\n sb.push(`- _…and ${warnFindings.length - 30} more_`)\n }\n sb.push('')\n }\n\n const infoFindings = results.flatMap((r) =>\n r.findings.filter((f) => f.severity === 'info').map((f) => ({ r, f })),\n )\n if (infoFindings.length) {\n sb.push('### Notes')\n for (const { f } of infoFindings.slice(0, 20)) {\n sb.push(`- ${f.message}`)\n }\n sb.push('')\n }\n\n if (llmAppendix?.trim()) {\n sb.push(llmAppendix.trim())\n sb.push('')\n }\n\n sb.push('---')\n sb.push('_Generated by FrontGuard — configure with `frontguard.config.js`_')\n return sb.join('\\n')\n}\n\nfunction formatConsole(p: {\n riskScore: FullReport['riskScore']\n mode: GuardMode\n stack: StackInfo\n pr: PrContext | null\n results: CheckResult[]\n warns: number\n infos: number\n blocks: number\n}): string {\n const { riskScore, mode, stack, pr, results, warns, infos, blocks } = p\n const lines: string[] = []\n lines.push(pc.bold('┌─ FrontGuard review brief ─────────────────────────────┐'))\n lines.push(`│ ${pc.dim('Risk:')} ${riskScore.padEnd(43)} │`)\n lines.push(`│ ${pc.dim('Mode:')} ${mode.padEnd(42)} │`)\n lines.push(\n `│ ${pc.dim('Stack:')} ${(stack.hasNext ? 'Next.js ' : '') + (stack.hasReactNative ? 'RN ' : '') + (stack.hasReact ? 'React ' : '') + (stack.hasTypeScript ? 'TS' : 'JS')}`\n .padEnd(56)\n .slice(0, 56) + ' │',\n )\n if (pr) {\n const sz = `${pr.additions + pr.deletions} lines (+${pr.additions}/-${pr.deletions}) · ${pr.changedFiles} files`\n lines.push(`│ ${pc.dim('PR:')} ${sz.slice(0, 49).padEnd(49)} │`)\n }\n lines.push('│ ' + ''.padEnd(53) + ' │')\n const statusLine =\n blocks > 0\n ? pc.red(`✖ ${blocks} blocking`)\n : warns === 0 && infos === 0\n ? pc.green('✓ No findings')\n : pc.yellow(`⚠ ${warns} warnings · ${infos} info`)\n lines.push(`│ ${statusLine}`.padEnd(64).slice(0, 64) + ' │')\n for (const r of results) {\n const label = r.skipped\n ? pc.dim(` ${r.checkId}: skipped`)\n : ` ${r.checkId}: ${r.findings.length} issues`\n lines.push(`│${label.slice(0, 54).padEnd(54)}│`)\n }\n lines.push(pc.bold('└────────────────────────────────────────────────────────┘'))\n return lines.join('\\n')\n}\n","import type { FrontGuardConfig } from '../config/schema.js'\nimport type { CheckResult, PrContext } from '../types.js'\nimport { gitDiffForReview, gitOk, resolveDiffBaseRef } from '../runner/git.js'\n\nfunction safeGetEnv(name: string): string | undefined {\n const v = process.env[name]\n return v && v.trim() ? v : undefined\n}\n\nexport async function runLlmReview(opts: {\n cwd: string\n config: FrontGuardConfig\n pr: PrContext | null\n results: CheckResult[]\n}): Promise<string | null> {\n const { cwd, config, pr, results } = opts\n const cfg = config.checks.llm\n if (!cfg.enabled) return null\n\n const apiKey = safeGetEnv(cfg.apiKeyEnv)\n if (!apiKey) {\n // IDE keys (e.g. Cursor Enterprise) are not available in CI runners.\n if (process.env.FRONTGUARD_LLM_SHOW_NO_KEY_HINT !== '1') {\n return null\n }\n return [\n '### AI review (automated CI)',\n '',\n '_No API key in this environment._ IDE credentials do not reach GitHub Actions.',\n '',\n '**Options:**',\n '1. **Manual** — Paste notes from Cursor/ChatGPT/Claude into a file, then `frontguard run --append ./notes.md` (or `FRONTGUARD_MANUAL_APPENDIX_FILE`).',\n `2. **Org CI** — Map an approved inference key to \\`${cfg.apiKeyEnv}\\` via your secret store.`,\n '3. **Docs in PR** — Rely on the PR template “AI assistance” section for reviewer context.',\n ].join('\\n')\n }\n\n if (!(await gitOk(cwd))) {\n return '_LLM review skipped: not a git repository_'\n }\n\n const base = await resolveDiffBaseRef(cwd, config.checks.tsAnyDelta.baseRef)\n const diff = await gitDiffForReview(cwd, base, cfg.maxDiffChars)\n if (!diff.trim()) {\n return '_LLM review skipped: empty diff vs base_'\n }\n\n const summaryLines = results\n .flatMap((r) => r.findings.map((f) => `- [${f.severity}] ${r.checkId}: ${f.message}`))\n .slice(0, 40)\n .join('\\n')\n\n const prompt = [\n 'You are a senior frontend reviewer. Respond in Markdown with short sections:',\n '### Summary',\n '### Risk hotspots (files / themes)',\n '### Logic / correctness smells',\n '### Tests & regressions',\n '',\n 'Constraints:',\n '- Be specific to this diff; avoid generic advice.',\n '- If uncertain, say what you need to verify manually.',\n '',\n pr\n ? `PR title: ${pr.title}\\nPR body excerpt:\\n${pr.body.slice(0, 2000)}`\n : 'No GitHub PR context (local run).',\n '',\n 'Existing automated findings (may be incomplete):',\n summaryLines || '(none)',\n '',\n 'Git diff (may be truncated):',\n '```diff',\n diff,\n '```',\n ].join('\\n')\n\n const controller = new AbortController()\n const t = setTimeout(() => controller.abort(), cfg.timeoutMs)\n\n try {\n if (cfg.provider === 'anthropic') {\n const text = await callAnthropic(cfg.model, apiKey, prompt, controller.signal)\n return `### AI review (non-binding)\\n\\n${text}`\n }\n const text = await callOpenAI(cfg.model, apiKey, prompt, controller.signal)\n return `### AI review (non-binding)\\n\\n${text}`\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n return `_LLM request failed: ${msg}_`\n } finally {\n clearTimeout(t)\n }\n}\n\nasync function callOpenAI(\n model: string,\n apiKey: string,\n prompt: string,\n signal: AbortSignal,\n): Promise<string> {\n const res = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n signal,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n temperature: 0.2,\n messages: [\n {\n role: 'system',\n content:\n 'You audit frontend pull requests. Output concise Markdown. No preamble about being an AI.',\n },\n { role: 'user', content: prompt },\n ],\n }),\n })\n\n if (!res.ok) {\n const t = await res.text()\n throw new Error(`OpenAI HTTP ${res.status}: ${t.slice(0, 500)}`)\n }\n\n const data = (await res.json()) as {\n choices?: Array<{ message?: { content?: string } }>\n }\n const text = data.choices?.[0]?.message?.content?.trim()\n if (!text) throw new Error('OpenAI returned empty content')\n return text\n}\n\nasync function callAnthropic(\n model: string,\n apiKey: string,\n prompt: string,\n signal: AbortSignal,\n): Promise<string> {\n const res = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n signal,\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: 4096,\n temperature: 0.2,\n messages: [{ role: 'user', content: prompt }],\n }),\n })\n\n if (!res.ok) {\n const t = await res.text()\n throw new Error(`Anthropic HTTP ${res.status}: ${t.slice(0, 500)}`)\n }\n\n const data = (await res.json()) as {\n content?: Array<{ type?: string; text?: string }>\n }\n const text = data.content\n ?.map((b) => (b.type === 'text' ? b.text : ''))\n .join('')\n .trim()\n\n if (!text) throw new Error('Anthropic returned empty content')\n return text\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nconst MAX_CHARS = 200_000\n\n/**\n * Human-in-the-loop review text: paste output from IDE chat, ChatGPT, Claude, etc.\n * No API keys — suitable for enterprise CI that cannot store LLM secrets.\n */\nexport async function loadManualAppendix(opts: {\n cwd: string\n /** From CLI `--append` */\n filePath?: string | null\n}): Promise<string | null> {\n const { cwd, filePath } = opts\n\n const envFile = process.env.FRONTGUARD_MANUAL_APPENDIX_FILE?.trim()\n const resolvedPath = filePath?.trim() || envFile\n if (resolvedPath) {\n const abs = path.isAbsolute(resolvedPath)\n ? resolvedPath\n : path.join(cwd, resolvedPath)\n try {\n let text = await fs.readFile(abs, 'utf8')\n if (text.length > MAX_CHARS) {\n text = text.slice(0, MAX_CHARS) + '\\n\\n_(truncated)_\\n'\n }\n const t = text.trim()\n if (t) {\n return `### Contributed review notes\\n\\n_Pasted or file-based (no CI API key)._ \\n\\n${t}`\n }\n } catch {\n /* missing file is OK */\n }\n }\n\n const inline = process.env.FRONTGUARD_MANUAL_APPENDIX?.trim()\n if (inline) {\n let text = inline\n if (text.length > MAX_CHARS) {\n text = text.slice(0, MAX_CHARS) + '\\n\\n_(truncated)_\\n'\n }\n return `### Contributed review notes\\n\\n${text.trim()}`\n }\n\n return null\n}\n","import process from 'node:process'\nimport { readGithubEvent } from '../ci/github.js'\nimport { upsertBriefComment } from '../ci/pr-comment.js'\nimport { loadConfig } from '../config/load.js'\nimport { detectStack } from '../detect/stack.js'\nimport { runEslint } from '../checks/eslint.js'\nimport { runPrettier } from '../checks/prettier.js'\nimport { runTypeScript } from '../checks/typescript.js'\nimport { runSecrets } from '../checks/secrets.js'\nimport { runPrHygiene } from '../checks/pr-hygiene.js'\nimport { runPrSize } from '../checks/pr-size.js'\nimport { runTsAnyDelta } from '../checks/ts-any-delta.js'\nimport { runCycles } from '../checks/cycles.js'\nimport { runDeadCode } from '../checks/dead-code.js'\nimport { runBundle } from '../checks/bundle.js'\nimport { runCwv } from '../checks/cwv.js'\nimport { runCustomRules } from '../checks/custom-rules.js'\nimport { runAiAssistedStrict } from '../checks/ai-assisted-strict.js'\nimport { applyAiAssistedEscalation } from '../runner/ai-escalation.js'\nimport { buildReport } from '../report/builder.js'\nimport { runLlmReview } from '../llm/review.js'\nimport { loadManualAppendix } from '../llm/manual-appendix.js'\nimport type { GuardMode } from '../config/schema.js'\n\nexport interface RunOptions {\n cwd: string\n ci: boolean\n markdown: boolean\n /** Force failing CI when `block` findings exist */\n enforce?: boolean\n /** Markdown file to append (e.g. paste from IDE chat / external LLM) */\n append?: string | null\n}\n\nexport async function runFrontGuard(opts: RunOptions): Promise<void> {\n const config = await loadConfig(opts.cwd)\n const mode: GuardMode = opts.enforce ? 'enforce' : config.mode\n\n const stack = await detectStack(opts.cwd)\n const pr = await readGithubEvent()\n\n const restrictFiles = pr?.files?.length ? pr.files : null\n\n const [\n eslint,\n prettier,\n typescript,\n secrets,\n tsAnyDelta,\n cycles,\n deadCode,\n cwv,\n customRules,\n aiStrict,\n ] = await Promise.all([\n runEslint(opts.cwd, config, stack),\n runPrettier(opts.cwd, config),\n runTypeScript(opts.cwd, config, stack),\n runSecrets(opts.cwd, config, pr),\n runTsAnyDelta(opts.cwd, config, stack),\n runCycles(opts.cwd, config, stack),\n runDeadCode(opts.cwd, config, stack, pr),\n runCwv(opts.cwd, config, stack, pr),\n runCustomRules(opts.cwd, config, restrictFiles),\n runAiAssistedStrict(opts.cwd, config, pr),\n ])\n\n const bundle = await runBundle(opts.cwd, config, stack)\n\n const prHygiene = runPrHygiene(config, pr)\n const prSize = runPrSize(config, pr)\n\n const results = [\n eslint,\n prettier,\n typescript,\n secrets,\n tsAnyDelta,\n cycles,\n deadCode,\n bundle,\n cwv,\n customRules,\n aiStrict,\n prHygiene,\n prSize,\n ]\n\n applyAiAssistedEscalation(results, pr, config)\n\n const manualAppendix = await loadManualAppendix({\n cwd: opts.cwd,\n filePath: opts.append ?? null,\n })\n const automatedAppendix = await runLlmReview({\n cwd: opts.cwd,\n config,\n pr,\n results,\n })\n const llmAppendix =\n [manualAppendix, automatedAppendix].filter(Boolean).join('\\n\\n') || null\n\n const report = buildReport(stack, pr, results, { mode, llmAppendix })\n\n if (opts.markdown) {\n process.stdout.write(report.markdown + '\\n')\n } else {\n process.stdout.write(report.consoleText + '\\n\\n')\n process.stdout.write(report.markdown + '\\n')\n }\n\n if (opts.ci && process.env.GITHUB_TOKEN) {\n await upsertBriefComment(report.markdown)\n }\n\n const hasBlock = results.some((r) => r.findings.some((f) => f.severity === 'block'))\n process.exitCode = mode === 'enforce' && hasBlock ? 1 : 0\n}\n","#!/usr/bin/env node\nimport process from 'node:process'\nimport { defineCommand, runMain } from 'citty'\nimport { initFrontGuard } from './commands/init.js'\nimport { runFrontGuard } from './commands/run.js'\n\nconst init = defineCommand({\n meta: {\n name: 'init',\n description: 'Add workflow, PR template, and frontguard.config.js',\n },\n run: async () => {\n const cwd = process.cwd()\n await initFrontGuard(cwd)\n process.stdout.write(\n 'FrontGuard initialized.\\n\\n' +\n 'Next: add the package as a devDependency so CI matches local runs:\\n' +\n ' npm install -D @cleartrip/frontguard\\n' +\n ' yarn add -D @cleartrip/frontguard\\n',\n )\n },\n})\n\nconst run = defineCommand({\n meta: {\n name: 'run',\n description: 'Run checks and print the review brief',\n },\n args: {\n ci: {\n type: 'boolean',\n description: 'Upsert PR comment when GITHUB_TOKEN is available',\n default: false,\n },\n markdown: {\n type: 'boolean',\n description: 'Print markdown only',\n default: false,\n },\n enforce: {\n type: 'boolean',\n description: 'Exit non-zero if any finding has severity block',\n default: false,\n },\n append: {\n type: 'string',\n description:\n 'Append markdown from a file (paste from IDE/ChatGPT/Claude; no CI API key needed)',\n },\n },\n run: async ({ args }) => {\n await runFrontGuard({\n cwd: process.cwd(),\n ci: Boolean(args.ci),\n markdown: Boolean(args.markdown),\n enforce: Boolean(args.enforce),\n append: typeof args.append === 'string' ? args.append : null,\n })\n },\n})\n\nconst main = defineCommand({\n meta: { name: 'frontguard', description: 'FrontGuard — frontend PR guardrails' },\n subCommands: { init, run },\n})\n\nrunMain(main)\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/init.ts","../src/ci/parse-ai-disclosure.ts","../src/ci/github.ts","../src/ci/pr-comment.ts","../src/config/defaults.ts","../src/config/load.ts","../src/detect/stack.ts","../src/runner/exec-tools.ts","../src/checks/eslint.ts","../src/checks/prettier.ts","../src/checks/typescript.ts","../src/checks/secrets.ts","../src/checks/pr-hygiene.ts","../src/checks/pr-size.ts","../src/runner/git.ts","../src/checks/ts-any-delta.ts","../src/checks/cycles.ts","../src/checks/dead-code.ts","../src/checks/bundle.ts","../src/checks/cwv.ts","../src/checks/custom-rules.ts","../src/checks/ai-assisted-strict.ts","../src/runner/ai-escalation.ts","../src/report/builder.ts","../src/llm/review.ts","../src/llm/manual-appendix.ts","../src/commands/run.ts","../src/cli.ts"],"names":["fs","path","r","truncate","exec","gateSeverity","fg","sev","PATTERNS","text","fetch","process"],"mappings":"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","file":"cli.js","sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nconst WORKFLOW = `name: FrontGuard\n\non:\n pull_request:\n types: [opened, synchronize, reopened]\n\npermissions:\n contents: read\n pull-requests: write\n\nconcurrency:\n group: frontguard-\\${{ github.workflow }}-\\${{ github.event.pull_request.number || github.ref }}\n cancel-in-progress: true\n\njobs:\n review-brief:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - uses: actions/setup-node@v4\n with:\n node-version: 20\n\n - name: Install dependencies\n run: |\n if [ -f pnpm-lock.yaml ]; then\n corepack enable\n pnpm install --frozen-lockfile || pnpm install\n elif [ -f yarn.lock ]; then\n yarn install --frozen-lockfile || yarn install\n elif [ -f package-lock.json ]; then\n npm ci || npm install\n else\n npm install\n fi\n\n - name: FrontGuard (Phase 1 — warn-only)\n run: npx @cleartrip/frontguard run --ci\n env:\n GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n`\n\nconst CONFIG = `import { defineConfig } from '@cleartrip/frontguard'\n\nexport default defineConfig({\n mode: 'warn', // or FrontGuard run with \\`--enforce\\`\n // extends: '@your-org/frontguard-config/base',\n\n // Example custom rules (return true when violated):\n // rules: {\n // 'no-inline-style': {\n // severity: 'warn',\n // message: 'Avoid inline style objects',\n // check: (file) => file.content.includes('style={{'),\n // },\n // },\n\n // checks: {\n // bundle: { enabled: true, maxDeltaBytes: 50_000, maxTotalBytes: null },\n // cycles: { enabled: true },\n // deadCode: { enabled: true, gate: 'info' },\n // // LLM in CI needs a key in the *runner* (GitHub secret). IDE keys (Cursor Enterprise)\n // // are not available in Actions — use paste workflow instead:\n // // frontguard run --append ./.frontguard/review-notes.md\n // // or FRONTGUARD_MANUAL_APPENDIX_FILE / FRONTGUARD_MANUAL_APPENDIX\n // llm: {\n // enabled: true,\n // provider: 'openai',\n // apiKeyEnv: 'OPENAI_API_KEY',\n // },\n // },\n})\n`\n\nconst PR_TEMPLATE = `## Summary\n\n## Why\n\n## How to test\n\n## AI disclosure\n<!-- FrontGuard reads this section. Mark exactly one of Yes / No. -->\n\n- [ ] **Yes** — AI tools (Cursor, Copilot, ChatGPT, Claude, etc.) helped write or materially refactor code in this PR\n- [ ] **No** — I did not use AI-generated code for the changes in this PR\n\nIf **Yes**, list tools and what they touched (helps reviewers run a stricter first pass):\n\n- Tools: \n- Areas/files or prompts (short): \n\n## AI assistance (optional detail)\n- [ ] I have reviewed every AI-suggested line for security, auth, and product correctness\n`\n\nasync function ensureDir(dir: string) {\n await fs.mkdir(dir, { recursive: true })\n}\n\nexport async function initFrontGuard(cwd: string): Promise<void> {\n const gh = path.join(cwd, '.github', 'workflows')\n await ensureDir(gh)\n const wfPath = path.join(gh, 'frontguard.yml')\n await fs.writeFile(wfPath, WORKFLOW, 'utf8')\n\n const cfgPath = path.join(cwd, 'frontguard.config.js')\n try {\n await fs.access(cfgPath)\n } catch {\n await fs.writeFile(cfgPath, CONFIG, 'utf8')\n }\n\n const tplRoot = path.join(cwd, '.github')\n await ensureDir(tplRoot)\n const tplPath = path.join(tplRoot, 'pull_request_template.md')\n try {\n await fs.access(tplPath)\n } catch {\n await fs.writeFile(tplPath, PR_TEMPLATE, 'utf8')\n }\n}\n","/**\n * Parse PR markdown for explicit AI disclosure (no network / no IDE keys).\n *\n * Supports:\n * - `## … AI …` section with `- [x] **Yes**` / `- [x] **No**`\n * - Legacy: \"AI tools were used\" + checked box somewhere in body\n */\n\nexport interface AiDisclosureResult {\n assisted: boolean\n explicitNo: boolean\n /** Checked box in AI section but unclear yes vs no */\n ambiguous: boolean\n}\n\nfunction extractAiSection(body: string): string | null {\n const lines = body.split(/\\r?\\n/)\n const idx = lines.findIndex((l) => /^#{1,6}\\s+.*\\bAI\\b/i.test(l.trim()))\n if (idx < 0) return null\n\n const out: string[] = []\n for (let j = idx + 1; j < lines.length; j++) {\n const line = lines[j] ?? ''\n if (/^##\\s+/.test(line)) break\n out.push(line)\n }\n const text = out.join('\\n').trim()\n return text.length ? text : null\n}\n\nfunction isCheckedItem(line: string): boolean {\n return /^\\s*-\\s*\\[[xX]\\]/.test(line)\n}\n\nexport function parseAiDisclosure(body: string): AiDisclosureResult {\n let assisted = false\n let explicitNo = false\n let ambiguous = false\n\n const section = extractAiSection(body)\n\n if (section) {\n let anyChecked = false\n for (const raw of section.split(/\\r?\\n/)) {\n const line = raw.trimEnd()\n if (!isCheckedItem(line)) continue\n anyChecked = true\n const lower = line.toLowerCase()\n\n const saysNo =\n /\\*\\*no\\*\\*/i.test(line) ||\n /\\bwithout ai\\b/i.test(lower) ||\n /\\bdid not use ai\\b/i.test(lower) ||\n /\\bno\\s+ai\\b/i.test(lower)\n\n const saysYes =\n /\\*\\*yes\\*\\*/i.test(line) ||\n /\\byes\\s*[—–-]\\s*ai\\b/i.test(lower) ||\n /\\bwere used\\b/i.test(lower) ||\n /ai tools.*used/i.test(lower) ||\n /\\b(copilot|cursor|chatgpt|claude)\\b/i.test(lower)\n\n if (saysNo && !saysYes) explicitNo = true\n else if (saysYes) assisted = true\n else if (/\\bai\\b/i.test(line) && !saysNo) assisted = true\n }\n\n if (anyChecked && !assisted && !explicitNo) ambiguous = true\n }\n\n if (!section && /ai tools were used/i.test(body)) {\n const checked = /\\[[xX]\\]\\s*AI tools were used/i.test(body)\n if (checked) assisted = true\n }\n\n if (explicitNo && assisted) {\n ambiguous = true\n assisted = false\n explicitNo = false\n }\n\n return { assisted, explicitNo, ambiguous }\n}\n","import fs from 'node:fs/promises'\nimport type { PrContext } from '../types.js'\nimport { parseAiDisclosure } from './parse-ai-disclosure.js'\n\ninterface GhPullPayload {\n pull_request?: {\n number?: number\n title?: string\n body?: string | null\n base?: { ref?: string }\n head?: { ref?: string }\n additions?: number\n deletions?: number\n changed_files?: number\n /** Not always present; fallback to diff */\n files?: { filename?: string }[]\n }\n}\n\nexport async function readGithubEvent(): Promise<PrContext | null> {\n const p = process.env.GITHUB_EVENT_PATH\n if (!p) return null\n\n try {\n const raw = await fs.readFile(p, 'utf8')\n const payload = JSON.parse(raw) as GhPullPayload\n const pr = payload.pull_request\n if (!pr) return null\n\n const files = (pr.files ?? []).map((f) => f.filename ?? '').filter(Boolean)\n\n const body = pr.body ?? ''\n const ai = parseAiDisclosure(body)\n\n return {\n number: pr.number ?? 0,\n title: pr.title ?? '',\n body,\n baseRef: pr.base?.ref ?? 'main',\n headRef: pr.head?.ref ?? '',\n additions: pr.additions ?? 0,\n deletions: pr.deletions ?? 0,\n changedFiles: pr.changed_files ?? files.length,\n files,\n aiAssisted: ai.assisted,\n aiExplicitNo: ai.explicitNo,\n aiDisclosureAmbiguous: ai.ambiguous,\n }\n } catch {\n return null\n }\n}\n","import fs from 'node:fs/promises'\nimport { fetch } from 'undici'\n\nconst MARKER = '<!-- frontguard:brief -->'\n\nasync function resolvePrNumber(): Promise<number | null> {\n const raw = process.env.FRONTGUARD_PR_NUMBER ?? process.env.PR_NUMBER\n const n = Number(raw)\n if (Number.isFinite(n) && n > 0) return n\n\n const path = process.env.GITHUB_EVENT_PATH\n if (!path) return null\n try {\n const payload = JSON.parse(await fs.readFile(path, 'utf8')) as {\n pull_request?: { number?: number }\n }\n const num = payload.pull_request?.number\n return typeof num === 'number' && num > 0 ? num : null\n } catch {\n return null\n }\n}\n\nexport async function upsertBriefComment(body: string): Promise<void> {\n const token = process.env.GITHUB_TOKEN\n const repo = process.env.GITHUB_REPOSITORY\n\n if (!token || !repo) {\n return\n }\n\n const [owner, name] = repo.split('/')\n if (!owner || !name) return\n\n const prNumber = await resolvePrNumber()\n if (!prNumber) {\n return\n }\n\n const apiBase = process.env.GITHUB_API_URL ?? 'https://api.github.com'\n const headers = {\n authorization: `Bearer ${token}`,\n accept: 'application/vnd.github+json',\n 'x-github-api-version': '2022-11-28',\n 'content-type': 'application/json',\n } as const\n\n const prefixed = `${MARKER}\\n${body}`\n\n const listUrl = `${apiBase}/repos/${owner}/${name}/issues/${prNumber}/comments?per_page=100`\n const listRes = await fetch(listUrl, { headers })\n if (!listRes.ok) {\n return\n }\n\n const comments = (await listRes.json()) as Array<{ id: number; body?: string }>\n const existing = comments.find(\n (c) => typeof c.body === 'string' && c.body.includes(MARKER),\n )\n\n if (existing) {\n const patchUrl = `${apiBase}/repos/${owner}/${name}/issues/comments/${existing.id}`\n await fetch(patchUrl, {\n method: 'PATCH',\n headers,\n body: JSON.stringify({ body: prefixed }),\n })\n return\n }\n\n const postUrl = `${apiBase}/repos/${owner}/${name}/issues/${prNumber}/comments`\n await fetch(postUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({ body: prefixed }),\n })\n}\n","import type { FrontGuardConfig } from './schema.js'\n\nexport const defaultConfig: FrontGuardConfig = {\n mode: 'warn',\n rules: {},\n checks: {\n eslint: { enabled: true, glob: '**/*.{js,cjs,mjs,jsx,ts,tsx}' },\n prettier: {\n enabled: true,\n glob: '**/*.{js,cjs,mjs,jsx,ts,tsx,json,md,css,scss,yml,yaml}',\n },\n typescript: { enabled: true },\n secrets: { enabled: true },\n prHygiene: {\n enabled: true,\n minBodyLength: 80,\n requireSections: false,\n sectionHints: ['what', 'why', 'test', 'how to test', 'screenshot'],\n requireAiDisclosureSection: true,\n gateWhenAiDisclosureAmbiguous: 'warn',\n },\n aiAssistedReview: {\n enabled: true,\n gate: 'warn',\n escalate: {\n secretFindingsToBlock: true,\n tsAnyDeltaToBlock: true,\n },\n },\n prSize: { warnLines: 400, softBlockLines: 800 },\n\n tsAnyDelta: {\n enabled: true,\n gate: 'warn',\n baseRef: 'main',\n maxAdded: 0,\n },\n cycles: {\n enabled: false,\n gate: 'warn',\n entries: ['src'],\n extraArgs: [],\n },\n deadCode: {\n enabled: false,\n gate: 'info',\n extraArgs: [],\n maxReportLines: 80,\n },\n bundle: {\n enabled: false,\n gate: 'warn',\n runBuild: true,\n buildCommand: 'npm run build',\n measureGlobs: ['dist/**/*', 'build/static/**/*', '.next/static/**/*'],\n baselinePath: '.frontguard/bundle-baseline.json',\n maxDeltaBytes: null,\n maxTotalBytes: null,\n },\n cwv: {\n enabled: true,\n gate: 'warn',\n scanGlobs: ['app/**/*.{tsx,jsx}', 'pages/**/*.{tsx,jsx}', 'src/**/*.{tsx,jsx}'],\n maxFileBytes: 400_000,\n },\n llm: {\n enabled: false,\n provider: 'openai',\n model: 'gpt-4o-mini',\n apiKeyEnv: 'OPENAI_API_KEY',\n maxDiffChars: 48_000,\n timeoutMs: 60_000,\n },\n },\n}\n","import { createRequire } from 'node:module'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport defu from 'defu'\nimport type { FrontGuardConfig } from './schema.js'\nimport { defaultConfig } from './defaults.js'\n\nconst CONFIG_NAMES = [\n 'frontguard.config.js',\n 'frontguard.config.mjs',\n 'frontguard.config.cjs',\n] as const\n\nasync function importConfig(\n absolutePath: string,\n): Promise<{ default?: FrontGuardConfig } | FrontGuardConfig> {\n const url = pathToFileURL(absolutePath).href\n return import(url) as Promise<{ default?: FrontGuardConfig } | FrontGuardConfig>\n}\n\nfunction normalizeExport(\n mod: { default?: FrontGuardConfig } | FrontGuardConfig,\n): FrontGuardConfig {\n if (mod && typeof mod === 'object' && 'default' in mod && mod.default) {\n return mod.default as FrontGuardConfig\n }\n return mod as FrontGuardConfig\n}\n\nfunction stripExtends<T extends { extends?: unknown }>(c: T): Omit<T, 'extends'> {\n const { extends: _e, ...rest } = c\n return rest\n}\n\nasync function loadExtendsLayer(\n cwd: string,\n spec: string | string[] | undefined,\n): Promise<Partial<FrontGuardConfig>> {\n if (!spec) return {}\n const req = createRequire(path.join(cwd, 'package.json'))\n const specs = Array.isArray(spec) ? spec : [spec]\n let merged: Partial<FrontGuardConfig> = {}\n\n for (const s of specs) {\n try {\n const resolved = req.resolve(s)\n const mod = await import(pathToFileURL(resolved).href)\n const layer = normalizeExport(\n mod as { default?: FrontGuardConfig } | FrontGuardConfig,\n )\n merged = defu(stripExtends(layer), merged) as Partial<FrontGuardConfig>\n } catch {\n // org package not installed\n }\n }\n\n return merged\n}\n\nexport async function loadConfig(cwd: string): Promise<FrontGuardConfig> {\n let userFile: FrontGuardConfig | null = null\n\n for (const name of CONFIG_NAMES) {\n const full = path.join(cwd, name)\n if (!fs.existsSync(full)) continue\n try {\n const mod = await importConfig(full)\n userFile = normalizeExport(mod)\n break\n } catch {\n continue\n }\n }\n\n const extendsSpec = userFile?.extends\n const orgLayer = await loadExtendsLayer(cwd, extendsSpec)\n\n const user = userFile ? stripExtends(userFile) : {}\n const base = structuredClone(defaultConfig)\n const withOrg = defu(orgLayer, base) as FrontGuardConfig\n return defu(user, withOrg) as FrontGuardConfig\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { StackInfo } from '../types.js'\n\ninterface Pkg {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n workspaces?: unknown\n}\n\nfunction allDeps(pkg: Pkg): Record<string, string> {\n return {\n ...pkg.peerDependencies,\n ...pkg.devDependencies,\n ...pkg.dependencies,\n }\n}\n\nfunction hasDep(deps: Record<string, string>, name: string): boolean {\n return Object.prototype.hasOwnProperty.call(deps, name)\n}\n\nexport async function detectStack(cwd: string): Promise<StackInfo> {\n let pkg: Pkg = {}\n try {\n const raw = await fs.readFile(path.join(cwd, 'package.json'), 'utf8')\n pkg = JSON.parse(raw) as Pkg\n } catch {\n return {\n isMonorepo: false,\n hasTypeScript: false,\n hasReact: false,\n hasNext: false,\n hasReactNative: false,\n hasJest: false,\n hasVitest: false,\n hasPlaywright: false,\n packageManager: 'unknown',\n tsStrict: null,\n }\n }\n\n const deps = allDeps(pkg)\n const isMonorepo = Boolean(pkg.workspaces)\n\n let tsStrict: boolean | null = null\n try {\n const tsconfigPath = path.join(cwd, 'tsconfig.json')\n const tsRaw = await fs.readFile(tsconfigPath, 'utf8')\n const ts = JSON.parse(tsRaw) as { compilerOptions?: { strict?: boolean } }\n if (typeof ts.compilerOptions?.strict === 'boolean') {\n tsStrict = ts.compilerOptions.strict\n }\n } catch {\n // no tsconfig\n }\n\n let pm: StackInfo['packageManager'] = 'unknown'\n try {\n await fs.access(path.join(cwd, 'pnpm-lock.yaml'))\n pm = 'pnpm'\n } catch {\n try {\n await fs.access(path.join(cwd, 'yarn.lock'))\n pm = 'yarn'\n } catch {\n try {\n await fs.access(path.join(cwd, 'package-lock.json'))\n pm = 'npm'\n } catch {\n pm = 'npm'\n }\n }\n }\n\n return {\n isMonorepo,\n hasTypeScript: hasDep(deps, 'typescript') || Boolean(tsStrict !== null),\n hasReact: hasDep(deps, 'react'),\n hasNext: hasDep(deps, 'next'),\n hasReactNative: hasDep(deps, 'react-native'),\n hasJest: hasDep(deps, 'jest'),\n hasVitest: hasDep(deps, 'vitest'),\n hasPlaywright: hasDep(deps, '@playwright/test'),\n packageManager: pm,\n tsStrict,\n }\n}\n","import path from 'node:path'\nimport fs from 'node:fs/promises'\nimport { exec } from 'tinyexec'\n\nexport interface RunOptions {\n cwd: string\n}\n\nexport async function pathExists(file: string): Promise<boolean> {\n try {\n await fs.access(file)\n return true\n } catch {\n return false\n }\n}\n\nexport async function resolveBin(cwd: string, name: string): Promise<string | null> {\n const local = path.join(cwd, 'node_modules', '.bin', name)\n if (await pathExists(local)) return local\n\n const win = local + '.cmd'\n if (await pathExists(win)) return win\n\n return null\n}\n\n/** Run with local binary if present, else `npx --no-install` first then `npx`. */\nexport async function runNpmBinary(\n cwd: string,\n name: string,\n args: string[],\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n try {\n const bin = await resolveBin(cwd, name)\n if (bin) {\n const r = await exec(bin, args, { nodeOptions: { cwd } })\n return {\n exitCode: r.exitCode ?? 0,\n stdout: r.stdout ?? '',\n stderr: r.stderr ?? '',\n }\n }\n\n let r = await exec('npx', ['--no-install', name, ...args], { nodeOptions: { cwd } })\n if ((r.exitCode ?? 0) !== 0) {\n r = await exec('npx', [name, ...args], { nodeOptions: { cwd } })\n }\n return {\n exitCode: r.exitCode ?? 0,\n stdout: r.stdout ?? '',\n stderr: r.stderr ?? '',\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n return {\n exitCode: 127,\n stdout: '',\n stderr: msg,\n }\n }\n}\n\n/** Invoke `npx` with explicit args (e.g. `npx -y madge ...`). */\nexport async function runNpx(\n cwd: string,\n args: string[],\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n try {\n const r = await exec('npx', args, { nodeOptions: { cwd } })\n return {\n exitCode: r.exitCode ?? 0,\n stdout: r.stdout ?? '',\n stderr: r.stderr ?? '',\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n return {\n exitCode: 127,\n stdout: '',\n stderr: msg,\n }\n }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { CheckResult, Finding, StackInfo } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\nimport { pathExists, runNpmBinary } from '../runner/exec-tools.js'\n\nasync function hasEslintDependency(cwd: string): Promise<boolean> {\n try {\n const raw = await fs.readFile(path.join(cwd, 'package.json'), 'utf8')\n const p = JSON.parse(raw) as {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n return Boolean(p.devDependencies?.eslint || p.dependencies?.eslint)\n } catch {\n return false\n }\n}\n\nasync function hasEslintConfig(cwd: string): Promise<boolean> {\n const candidates = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n '.eslintrc',\n '.eslintrc.json',\n '.eslintrc.cjs',\n '.eslintrc.yaml',\n '.eslintrc.yml',\n ]\n for (const c of candidates) {\n if (await pathExists(path.join(cwd, c))) return true\n }\n return false\n}\n\nfunction meaningfulStderr(stderr: string): string {\n return stderr\n .split('\\n')\n .filter((l) => l.trim() && !/^npm warn\\b/i.test(l))\n .join('\\n')\n .trim()\n}\n\nexport async function runEslint(\n cwd: string,\n config: FrontGuardConfig,\n _stack: StackInfo,\n): Promise<CheckResult> {\n const t0 = performance.now()\n if (!config.checks.eslint.enabled) {\n return {\n checkId: 'eslint',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n const configured = await hasEslintConfig(cwd)\n const dep = await hasEslintDependency(cwd)\n if (!configured && !dep) {\n return {\n checkId: 'eslint',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'ESLint not installed or configured',\n }\n }\n\n const glob = config.checks.eslint.glob ?? '**/*.{js,cjs,mjs,jsx,ts,tsx}'\n const args = [\n glob,\n '--max-warnings',\n '0',\n '--no-error-on-unmatched-pattern',\n '-f',\n 'json',\n ]\n\n const { exitCode, stdout, stderr } = await runNpmBinary(cwd, 'eslint', args)\n const errText = meaningfulStderr(stderr)\n\n const findings: Finding[] = []\n\n if (exitCode === 0) {\n if (errText) {\n findings.push({\n id: 'eslint-stderr',\n severity: 'warn',\n message: 'ESLint wrote to stderr',\n detail: truncate(errText, 4000),\n })\n }\n return {\n checkId: 'eslint',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n }\n\n try {\n const rows = JSON.parse(stdout) as Array<{\n filePath: string\n messages: Array<{ ruleId: string | null; message: string; line?: number }>\n }>\n let n = 0\n for (const row of rows) {\n for (const m of row.messages) {\n if (n++ >= 40) break\n findings.push({\n id: `eslint-${m.ruleId ?? 'unknown'}`,\n severity: 'warn',\n message: m.message,\n file: row.filePath,\n detail: m.line ? `line ${m.line}` : undefined,\n })\n }\n }\n if (n === 0) {\n findings.push({\n id: 'eslint-failed',\n severity: 'warn',\n message: 'ESLint exited with a non-zero status',\n detail: truncate(\n [stdout, errText].filter(Boolean).join('\\n') || `exit ${exitCode}`,\n 4000,\n ),\n })\n }\n } catch {\n findings.push({\n id: 'eslint-failed',\n severity: 'warn',\n message: 'ESLint exited with errors',\n detail: truncate(\n [stdout, errText].filter(Boolean).join('\\n') || `exit ${exitCode}`,\n 4000,\n ),\n })\n }\n\n return {\n checkId: 'eslint',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s\n return s.slice(0, max) + '…'\n}\n","import type { CheckResult, Finding } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\nimport { runNpmBinary } from '../runner/exec-tools.js'\n\nexport async function runPrettier(\n cwd: string,\n config: FrontGuardConfig,\n): Promise<CheckResult> {\n const t0 = performance.now()\n if (!config.checks.prettier.enabled) {\n return {\n checkId: 'prettier',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n const glob =\n config.checks.prettier.glob ??\n '**/*.{js,cjs,mjs,jsx,ts,tsx,json,md,css,scss,yml,yaml}'\n const { exitCode, stdout, stderr } = await runNpmBinary(cwd, 'prettier', [\n '--check',\n glob,\n '--ignore-unknown',\n ])\n\n const findings: Finding[] = []\n\n if (exitCode === 127 || /command not found|not recognized|ENOENT/i.test(stderr)) {\n return {\n checkId: 'prettier',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'prettier binary not found (install prettier or use npx)',\n }\n }\n\n if (exitCode !== 0) {\n const blob = [stdout, stderr].filter(Boolean).join('\\n').trim()\n findings.push({\n id: 'prettier-check',\n severity: 'warn',\n message: 'Prettier reported formatting differences',\n detail: blob ? truncate(blob, 6000) : `exit ${exitCode}`,\n })\n }\n\n return {\n checkId: 'prettier',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s\n return s.slice(0, max) + '…'\n}\n","import path from 'node:path'\nimport type { CheckResult, Finding, StackInfo } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\nimport { pathExists, runNpmBinary } from '../runner/exec-tools.js'\n\nexport async function runTypeScript(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n): Promise<CheckResult> {\n const t0 = performance.now()\n if (!config.checks.typescript.enabled) {\n return {\n checkId: 'typescript',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n const hasTs = stack.hasTypeScript || (await pathExists(path.join(cwd, 'tsconfig.json')))\n if (!hasTs) {\n return {\n checkId: 'typescript',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'no TypeScript project detected',\n }\n }\n\n const args = ['--noEmit', ...(config.checks.typescript.tscArgs ?? [])]\n const { exitCode, stdout, stderr } = await runNpmBinary(cwd, 'tsc', args)\n\n const findings: Finding[] = []\n if (exitCode === 127 || /command not found|not recognized|ENOENT/i.test(stderr)) {\n return {\n checkId: 'typescript',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'typescript compiler not found',\n }\n }\n if (exitCode !== 0) {\n const out = [stdout, stderr].filter(Boolean).join('\\n').trim()\n findings.push({\n id: 'tsc',\n severity: 'warn',\n message: 'TypeScript compiler reported diagnostics',\n detail: out ? truncate(out, 8000) : `exit ${exitCode}`,\n })\n }\n\n return {\n checkId: 'typescript',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s\n return s.slice(0, max) + '…'\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport fg from 'fast-glob'\nimport type { CheckResult, Finding, PrContext } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\n\n/** Lightweight pattern scan — warn-only in Phase 1. Kept conservative to limit noise. */\nconst PATTERNS: Array<{ id: string; re: RegExp; message: string }> = [\n {\n id: 'aws-access-key',\n re: /AKIA[0-9A-Z]{16}/,\n message: 'Possible AWS access key id',\n },\n {\n id: 'github-pat',\n re: /\\bghp_[a-zA-Z0-9]{20,}\\b/,\n message: 'Possible GitHub personal access token',\n },\n {\n id: 'openai-sk',\n re: /\\bsk-[a-zA-Z0-9]{20,}\\b/,\n message: 'Possible OpenAI-style API secret',\n },\n {\n id: 'private-key-block',\n re: /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/,\n message: 'Private key material in source',\n },\n]\n\nconst TEXT_EXT = new Set([\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.json',\n '.md',\n '.yml',\n '.yaml',\n '.env',\n '.txt',\n])\n\nexport async function runSecrets(\n cwd: string,\n config: FrontGuardConfig,\n pr: PrContext | null,\n): Promise<CheckResult> {\n const t0 = performance.now()\n if (!config.checks.secrets.enabled) {\n return {\n checkId: 'secrets',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n const findings: Finding[] = []\n\n let globs: string[]\n if (pr?.files.length) {\n globs = pr.files.filter((f) => isProbablyTextFile(f))\n } else {\n globs = await fg(\n [\n '**/*.{ts,tsx,js,jsx,mjs,cjs,json,md,yml,yaml,env}',\n '!**/node_modules/**',\n '!**/dist/**',\n '!**/.next/**',\n '!**/build/**',\n '!**/coverage/**',\n ],\n { cwd, onlyFiles: true, dot: false },\n )\n }\n\n const maxFiles = 200\n let scanned = 0\n\n for (const rel of globs) {\n if (scanned++ > maxFiles) {\n findings.push({\n id: 'secrets-cap',\n severity: 'info',\n message: `Secret scan capped after ${maxFiles} files (run on PR for narrower scope)`,\n })\n break\n }\n\n const full = path.join(cwd, rel)\n let content: string\n try {\n content = await fs.readFile(full, 'utf8')\n } catch {\n continue\n }\n if (content.length > 500_000) continue\n\n for (const { id, re, message } of PATTERNS) {\n if (re.test(content)) {\n findings.push({\n id,\n severity: 'warn',\n message,\n file: rel,\n })\n }\n }\n }\n\n return {\n checkId: 'secrets',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction isProbablyTextFile(rel: string): boolean {\n const ext = path.extname(rel).toLowerCase()\n return TEXT_EXT.has(ext)\n}\n","import type { CheckResult, Finding, PrContext } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\n\nexport function runPrHygiene(\n config: FrontGuardConfig,\n pr: PrContext | null,\n): CheckResult {\n const t0 = performance.now()\n if (!config.checks.prHygiene.enabled) {\n return {\n checkId: 'pr-hygiene',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n if (!pr) {\n return {\n checkId: 'pr-hygiene',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'not running in GitHub pull_request context',\n }\n }\n\n const findings: Finding[] = []\n const body = (pr.body ?? '').trim()\n const min = config.checks.prHygiene.minBodyLength\n\n if (body.length < min) {\n findings.push({\n id: 'pr-body-short',\n severity: 'warn',\n message: `PR description is shorter than ${min} characters`,\n detail: `Current length: ${body.length}`,\n })\n }\n\n const lower = body.toLowerCase()\n const hints = config.checks.prHygiene.sectionHints\n const missing = hints.filter((h) => !sectionMentioned(lower, h))\n\n if (missing.length > 0) {\n findings.push({\n id: 'pr-sections',\n severity: config.checks.prHygiene.requireSections ? 'warn' : 'info',\n message: `PR description may be missing suggested sections: ${missing.join(', ')}`,\n })\n }\n\n if (config.checks.prHygiene.requireAiDisclosureSection) {\n const hasAiHeader = /^#{1,6}\\s+.*\\bAI\\b/im.test(body)\n if (!hasAiHeader) {\n findings.push({\n id: 'pr-ai-section-missing',\n severity: 'warn',\n message:\n 'PR is missing an **AI disclosure** section (e.g. `## AI disclosure`). Mark whether this PR used AI tools.',\n })\n }\n }\n\n if (pr.aiDisclosureAmbiguous) {\n findings.push({\n id: 'pr-ai-disclosure-ambiguous',\n severity: config.checks.prHygiene.gateWhenAiDisclosureAmbiguous,\n message:\n 'AI disclosure checkboxes look ambiguous — please mark **Yes** or **No** clearly in the AI section.',\n })\n }\n\n if (pr.aiAssisted) {\n findings.push({\n id: 'pr-ai-flag',\n severity: 'warn',\n message:\n '**AI-assisted PR:** FrontGuard is applying stricter static checks and may escalate secrets / `any` deltas. Verify business logic, auth, and data handling manually.',\n })\n }\n\n if (pr.aiExplicitNo) {\n findings.push({\n id: 'pr-ai-explicit-no',\n severity: 'info',\n message:\n 'Author indicated **no AI** for code generation — standard review profile.',\n })\n }\n\n return {\n checkId: 'pr-hygiene',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction sectionMentioned(body: string, hint: string): boolean {\n const h = hint.toLowerCase()\n if (h === 'what') {\n return /\\bwhat\\b/.test(body) || /##\\s*summary/.test(body) || /##\\s*context/.test(body)\n }\n if (h === 'why') {\n return /\\bwhy\\b/.test(body) || /motivation/.test(body) || /##\\s*rationale/.test(body)\n }\n if (h === 'test' || h === 'how to test') {\n return (\n /how to test/.test(body) ||\n /\\btesting\\b/.test(body) ||\n /##\\s*test/.test(body) ||\n /qa\\s*steps/.test(body)\n )\n }\n if (h === 'screenshot') {\n return /screenshot|screen recording|loom|recording/i.test(body)\n }\n return body.includes(h)\n}\n","import type { CheckResult, Finding, PrContext } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\n\nexport function runPrSize(config: FrontGuardConfig, pr: PrContext | null): CheckResult {\n const t0 = performance.now()\n if (!pr) {\n return {\n checkId: 'pr-size',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'not running in GitHub pull_request context',\n }\n }\n\n const findings: Finding[] = []\n const lines = pr.additions + pr.deletions\n const { warnLines, softBlockLines } = config.checks.prSize\n\n if (lines >= softBlockLines) {\n findings.push({\n id: 'pr-size-large',\n severity: 'warn',\n message: `PR is very large (${lines} lines changed; ≥ ${softBlockLines})`,\n detail: 'Consider splitting to improve review quality.',\n })\n } else if (lines >= warnLines) {\n findings.push({\n id: 'pr-size-medium',\n severity: 'info',\n message: `PR size is elevated (${lines} lines changed; ≥ ${warnLines})`,\n })\n }\n\n return {\n checkId: 'pr-size',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n","import { exec } from 'tinyexec'\n\nexport async function gitOk(cwd: string): Promise<boolean> {\n try {\n const r = await exec('git', ['rev-parse', '--is-inside-work-tree'], {\n nodeOptions: { cwd },\n })\n return (r.stdout ?? '').trim() === 'true'\n } catch {\n return false\n }\n}\n\nexport async function gitMergeBase(cwd: string, baseRef: string): Promise<string | null> {\n try {\n const r = await exec('git', ['merge-base', 'HEAD', baseRef], {\n nodeOptions: { cwd },\n })\n const s = (r.stdout ?? '').trim()\n return s || null\n } catch {\n return null\n }\n}\n\n/** Unified diff patch (text) between base and HEAD for pathspecs. */\nexport async function gitDiffPatch(\n cwd: string,\n baseRef: string,\n pathspecs: string[],\n): Promise<string | null> {\n if (pathspecs.length === 0) return null\n try {\n const r = await exec(\n 'git',\n ['diff', `${baseRef}...HEAD`, '--unified=1', '--no-color', '--', ...pathspecs],\n { nodeOptions: { cwd } },\n )\n return r.stdout ?? ''\n } catch {\n return null\n }\n}\n\nexport async function gitShowFile(\n cwd: string,\n gitRef: string,\n filePath: string,\n): Promise<string | null> {\n try {\n const r = await exec('git', ['show', `${gitRef}:${filePath}`], {\n nodeOptions: { cwd },\n })\n return r.stdout ?? ''\n } catch {\n return null\n }\n}\n\n/** Unified diff for review / LLM context. */\nexport async function gitDiffForReview(\n cwd: string,\n baseRef: string,\n maxChars: number,\n): Promise<string> {\n try {\n const r = await exec(\n 'git',\n ['diff', `${baseRef}...HEAD`, '--unified=2', '--no-color'],\n {\n nodeOptions: { cwd },\n },\n )\n let s = r.stdout ?? ''\n if (s.length > maxChars) {\n s = s.slice(0, maxChars) + '\\n…(truncated)\\n'\n }\n return s\n } catch {\n return ''\n }\n}\n\nexport async function resolveDiffBaseRef(cwd: string, fallback: string): Promise<string> {\n const gh = process.env.GITHUB_BASE_REF\n if (gh) {\n const origin = `origin/${gh}`\n try {\n await exec('git', ['rev-parse', '--verify', origin], { nodeOptions: { cwd } })\n return origin\n } catch {\n // try fetch name only\n }\n }\n try {\n const cand = fallback.includes('/') ? fallback : `origin/${fallback}`\n await exec('git', ['rev-parse', '--verify', cand], { nodeOptions: { cwd } })\n return cand\n } catch {\n try {\n await exec('git', ['rev-parse', '--verify', fallback], { nodeOptions: { cwd } })\n return fallback\n } catch {\n return fallback\n }\n }\n}\n","import type { CheckResult, Finding, StackInfo } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\nimport { gitDiffPatch, gitOk, resolveDiffBaseRef } from '../runner/git.js'\n\nfunction gateSeverity(g: CheckGate): Finding['severity'] {\n return g === 'block' ? 'block' : g === 'info' ? 'info' : 'warn'\n}\n\n/** Approximate count of *new* `any` introduced on `+` diff lines. */\nexport function countAddedAnyInPatch(patch: string): number {\n let n = 0\n for (const raw of patch.split('\\n')) {\n if (!raw.startsWith('+') || raw.startsWith('+++')) continue\n const line = raw.slice(1)\n if (/^\\s*\\/(\\/|\\*)/.test(line)) continue\n const patterns = [\n /:\\s*any\\b/g,\n /\\bas\\s+any\\b/g,\n /<\\s*any\\s*>/g,\n /\\bReadonlyArray\\s*<\\s*any\\s*>/g,\n /\\bArray\\s*<\\s*any\\s*>/g,\n /\\bRecord\\s*<\\s*[^,]+,\\s*any\\s*>/g,\n ]\n for (const p of patterns) {\n const m = line.match(p)\n if (m) n += m.length\n }\n }\n return n\n}\n\nexport async function runTsAnyDelta(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.tsAnyDelta\n if (!cfg.enabled || !stack.hasTypeScript) {\n return {\n checkId: 'ts-any-delta',\n findings: [],\n durationMs: 0,\n skipped: !cfg.enabled ? 'disabled in config' : 'no TypeScript',\n }\n }\n\n if (!(await gitOk(cwd))) {\n return {\n checkId: 'ts-any-delta',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'not a git repository',\n }\n }\n\n const base = await resolveDiffBaseRef(cwd, cfg.baseRef)\n const patch = (await gitDiffPatch(cwd, base, ['*.ts', '*.tsx', '*.mts', '*.cts'])) ?? ''\n\n if (!patch.trim()) {\n return {\n checkId: 'ts-any-delta',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'no diff vs base (fetch depth or base ref?)',\n }\n }\n\n const added = countAddedAnyInPatch(patch)\n const findings: Finding[] = []\n\n if (added === 0) {\n return {\n checkId: 'ts-any-delta',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n }\n\n const overBudget = cfg.maxAdded > 0 && added > cfg.maxAdded\n const shouldGate = cfg.maxAdded === 0 ? added > 0 : overBudget\n\n const severity: Finding['severity'] = shouldGate ? gateSeverity(cfg.gate) : 'info'\n\n findings.push({\n id: 'ts-any-added',\n severity,\n message: shouldGate\n ? cfg.maxAdded > 0\n ? `Added ~${added} new \\`any\\` usages (budget ${cfg.maxAdded})`\n : `Added ~${added} new \\`any\\` usages in the PR diff`\n : `Added ~${added} new \\`any\\` usages (within budget ${cfg.maxAdded})`,\n detail: `merge-base: ${base}`,\n })\n\n return {\n checkId: 'ts-any-delta',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n","import type { CheckResult, Finding, StackInfo } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\nimport { pathExists, runNpx } from '../runner/exec-tools.js'\nimport path from 'node:path'\n\nfunction gateSeverity(g: CheckGate): Finding['severity'] {\n return g === 'block' ? 'block' : g === 'info' ? 'info' : 'warn'\n}\n\nexport async function runCycles(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.cycles\n if (!cfg.enabled || !stack.hasTypeScript) {\n return {\n checkId: 'cycles',\n findings: [],\n durationMs: 0,\n skipped: !cfg.enabled ? 'disabled in config' : 'no TypeScript',\n }\n }\n\n let entry = cfg.entries[0] ?? 'src'\n for (const e of cfg.entries) {\n if (await pathExists(path.join(cwd, e))) {\n entry = e\n break\n }\n }\n if (!(await pathExists(path.join(cwd, entry)))) {\n return {\n checkId: 'cycles',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: `entry path not found (${entry})`,\n }\n }\n\n const args = [\n '-y',\n 'madge@6',\n entry,\n '--extensions',\n 'ts,tsx,js,jsx',\n '--circular',\n ...cfg.extraArgs,\n ]\n\n const { exitCode, stdout, stderr } = await runNpx(cwd, args)\n const out = [stdout, stderr].filter(Boolean).join('\\n').trim()\n\n if (exitCode === 127 || /command not found|not recognized|ENOENT/i.test(stderr)) {\n return {\n checkId: 'cycles',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'npx/madge not available',\n }\n }\n\n const findings: Finding[] = []\n const cyclic = exitCode !== 0 && /circular|Circular|\\(circular\\)/i.test(out)\n\n if (cyclic) {\n findings.push({\n id: 'import-cycle',\n severity: gateSeverity(cfg.gate),\n message: 'Circular dependencies detected (madge)',\n detail: truncate(out || `exit ${exitCode}`, 12_000),\n })\n } else if (exitCode !== 0) {\n findings.push({\n id: 'madge-error',\n severity: 'info',\n message: 'madge exited non-zero — verify entry/extensions or install deps locally',\n detail: truncate(out || `exit ${exitCode}`, 8000),\n })\n }\n\n return {\n checkId: 'cycles',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s\n return s.slice(0, max) + '…'\n}\n","import type { CheckResult, Finding, PrContext, StackInfo } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\nimport { runNpx } from '../runner/exec-tools.js'\n\nfunction gateSeverity(g: CheckGate): Finding['severity'] {\n return g === 'block' ? 'block' : g === 'info' ? 'info' : 'warn'\n}\n\nexport async function runDeadCode(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n pr: PrContext | null,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.deadCode\n if (!cfg.enabled || !stack.hasTypeScript) {\n return {\n checkId: 'dead-code',\n findings: [],\n durationMs: 0,\n skipped: !cfg.enabled ? 'disabled in config' : 'no TypeScript',\n }\n }\n\n const args = ['-y', 'ts-prune', ...cfg.extraArgs]\n const { exitCode, stdout, stderr } = await runNpx(cwd, args)\n\n if (exitCode === 127 || /command not found|not recognized|ENOENT/i.test(stderr)) {\n return {\n checkId: 'dead-code',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'npx/ts-prune not available',\n }\n }\n\n const raw = (stdout || '').trim()\n const lines = raw\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l && /^[\\w./\\\\~-]+[^\\s]*\\s*-\\s*.+/.test(l))\n\n if (lines.length === 0) {\n return {\n checkId: 'dead-code',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n }\n }\n\n const prFiles = pr?.files?.length\n ? new Set(pr.files.map((f) => f.replace(/\\\\/g, '/')))\n : null\n\n const relevant = prFiles\n ? lines.filter((l) => {\n const file = l.split(/\\s*-\\s*/)[0]?.trim()\n if (!file) return false\n return [...prFiles].some((p) => p === file || p.endsWith(file))\n })\n : lines\n\n const report = (relevant.length ? relevant : lines)\n .slice(0, cfg.maxReportLines)\n .join('\\n')\n\n const findings: Finding[] = [\n {\n id: 'ts-prune',\n severity: gateSeverity(cfg.gate),\n message: prFiles\n ? `Potentially unused exports (${relevant.length} on touched files; ${lines.length} total)`\n : `Potentially unused exports reported by ts-prune (${lines.length})`,\n detail: report,\n },\n ]\n\n return {\n checkId: 'dead-code',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport fg from 'fast-glob'\nimport { exec } from 'tinyexec'\nimport type { CheckResult, Finding, StackInfo } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\nimport { resolveDiffBaseRef } from '../runner/git.js'\n\nfunction gateSeverity(g: CheckGate): Finding['severity'] {\n return g === 'block' ? 'block' : g === 'info' ? 'info' : 'warn'\n}\n\ninterface BaselineFile {\n totalBytes: number\n generatedAt?: string\n}\n\nasync function sumGlobBytes(cwd: string, patterns: string[]): Promise<number> {\n let total = 0\n for (const pattern of patterns) {\n const files = await fg(pattern, {\n cwd,\n onlyFiles: true,\n dot: false,\n ignore: ['**/node_modules/**'],\n })\n for (const rel of files) {\n try {\n const st = await fs.stat(path.join(cwd, rel))\n total += st.size\n } catch {\n /* skip */\n }\n }\n }\n return total\n}\n\nasync function readBaseline(\n cwd: string,\n relPath: string,\n baseRef: string | null,\n): Promise<BaselineFile | null> {\n const disk = path.join(cwd, relPath)\n try {\n const raw = await fs.readFile(disk, 'utf8')\n return JSON.parse(raw) as BaselineFile\n } catch {\n /* no local baseline */\n }\n\n if (!baseRef) return null\n try {\n const r = await exec('git', ['show', `${baseRef}:${relPath}`], {\n nodeOptions: { cwd },\n })\n if ((r.exitCode ?? 0) !== 0) return null\n return JSON.parse((r.stdout ?? '').trim()) as BaselineFile\n } catch {\n return null\n }\n}\n\nasync function gitOkQuick(cwd: string): Promise<boolean> {\n try {\n const r = await exec('git', ['rev-parse', '--is-inside-work-tree'], {\n nodeOptions: { cwd },\n })\n return (r.stdout ?? '').trim() === 'true'\n } catch {\n return false\n }\n}\n\nfunction tokenizeCommand(cmd: string): string[] {\n return cmd\n .trim()\n .split(/\\s+/)\n .map((t) => t.trim())\n .filter(Boolean)\n}\n\nexport async function runBundle(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.bundle\n\n if (!cfg.enabled) {\n return {\n checkId: 'bundle',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n if (stack.hasReactNative && !stack.hasNext) {\n return {\n checkId: 'bundle',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'skipped for React Native (configure web artifacts if needed)',\n }\n }\n\n if (cfg.runBuild) {\n const parts = tokenizeCommand(cfg.buildCommand)\n if (parts.length === 0) {\n return {\n checkId: 'bundle',\n findings: [\n {\n id: 'bundle-cmd',\n severity: 'warn',\n message: '`checks.bundle.buildCommand` is empty',\n },\n ],\n durationMs: Math.round(performance.now() - t0),\n }\n }\n const [bin, ...args] = parts\n const res = await exec(bin, args, { nodeOptions: { cwd } })\n if ((res.exitCode ?? 0) !== 0) {\n return {\n checkId: 'bundle',\n findings: [\n {\n id: 'bundle-build',\n severity: gateSeverity(cfg.gate),\n message: 'Build command failed — cannot measure bundle',\n detail: [res.stdout, res.stderr].filter(Boolean).join('\\n').slice(0, 8000),\n },\n ],\n durationMs: Math.round(performance.now() - t0),\n }\n }\n }\n\n const total = await sumGlobBytes(cwd, cfg.measureGlobs)\n if (total === 0) {\n return {\n checkId: 'bundle',\n findings: [\n {\n id: 'bundle-empty',\n severity: 'info',\n message:\n 'No bundle artifacts matched `measureGlobs` — configure paths or run a web build',\n },\n ],\n durationMs: Math.round(performance.now() - t0),\n }\n }\n\n const baseRef = (await gitOkQuick(cwd))\n ? await resolveDiffBaseRef(cwd, config.checks.tsAnyDelta.baseRef)\n : null\n const baseline = await readBaseline(cwd, cfg.baselinePath, baseRef)\n\n const findings: Finding[] = []\n const infoLines = [\n `Measured ${total} bytes (${(total / 1024 / 1024).toFixed(2)} MiB)`,\n baseline\n ? `Baseline from \\`${cfg.baselinePath}\\`: ${baseline.totalBytes} bytes`\n : `No baseline at \\`${cfg.baselinePath}\\` (commit a baseline JSON to compare)`,\n ].join('\\n')\n\n if (cfg.maxTotalBytes != null && total > cfg.maxTotalBytes) {\n findings.push({\n id: 'bundle-max-total',\n severity: gateSeverity(cfg.gate),\n message: `Bundle size ${total} bytes exceeds maxTotalBytes (${cfg.maxTotalBytes})`,\n detail: infoLines,\n })\n }\n\n if (baseline && cfg.maxDeltaBytes != null) {\n const delta = total - baseline.totalBytes\n if (delta > cfg.maxDeltaBytes) {\n findings.push({\n id: 'bundle-delta',\n severity: gateSeverity(cfg.gate),\n message: `Bundle grew by ${delta} bytes vs baseline (limit ${cfg.maxDeltaBytes})`,\n detail: infoLines,\n })\n }\n }\n\n if (\n findings.length === 0 &&\n !baseline &&\n (cfg.maxDeltaBytes != null || cfg.maxTotalBytes != null)\n ) {\n findings.push({\n id: 'bundle-baseline-missing',\n severity: 'info',\n message:\n 'Baseline file missing — delta/total gates need a committed `.frontguard/bundle-baseline.json`',\n detail: infoLines,\n })\n }\n\n if (findings.length === 0) {\n findings.push({\n id: 'bundle-ok',\n severity: 'info',\n message: 'Bundle measurement complete',\n detail: infoLines,\n })\n }\n\n return {\n checkId: 'bundle',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport fg from 'fast-glob'\nimport type { CheckResult, Finding, PrContext, StackInfo } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\n\nfunction gateSeverity(g: CheckGate): Finding['severity'] {\n return g === 'block' ? 'block' : g === 'info' ? 'info' : 'warn'\n}\n\n/** Heuristic CWV / LCP hygiene for JSX/TSX (static only). */\nexport async function runCwv(\n cwd: string,\n config: FrontGuardConfig,\n stack: StackInfo,\n pr: PrContext | null,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.cwv\n\n if (!cfg.enabled) {\n return {\n checkId: 'cwv',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n if (stack.hasReactNative && !stack.hasNext) {\n return {\n checkId: 'cwv',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'skipped for React Native',\n }\n }\n\n const prSet = pr?.files?.length\n ? new Set(pr.files.map((f) => f.replace(/\\\\/g, '/')))\n : null\n\n const files = await fg(cfg.scanGlobs, {\n cwd,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/*.test.*', '**/*.spec.*'],\n })\n\n const toScan = prSet\n ? files.filter((f) => [...prSet].some((p) => p === f || p.endsWith(f)))\n : files\n\n const findings: Finding[] = []\n const sev = gateSeverity(cfg.gate)\n\n for (const rel of toScan.slice(0, 400)) {\n const full = path.join(cwd, rel)\n let text: string\n try {\n text = await fs.readFile(full, 'utf8')\n } catch {\n continue\n }\n if (text.length > cfg.maxFileBytes) continue\n\n if (\n stack.hasNext &&\n /<img\\b/i.test(text) &&\n !/from\\s+['\"]next\\/image['\"]/.test(text)\n ) {\n findings.push({\n id: 'cwv-img-tag',\n severity: sev,\n message: 'Raw `<img>` detected — prefer `next/image` for LCP-friendly delivery',\n file: rel,\n })\n }\n\n if (/dangerouslySetInnerHTML/i.test(text)) {\n findings.push({\n id: 'cwv-dsh',\n severity: 'warn',\n message:\n '`dangerouslySetInnerHTML` can impact main-thread work — validate necessity',\n file: rel,\n })\n }\n }\n\n return {\n checkId: 'cwv',\n findings: dedupeFindings(findings).slice(0, 40),\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction dedupeFindings(f: Finding[]): Finding[] {\n const seen = new Set<string>()\n const out: Finding[] = []\n for (const x of f) {\n const k = `${x.id}:${x.file ?? ''}`\n if (seen.has(k)) continue\n seen.add(k)\n out.push(x)\n }\n return out\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport fg from 'fast-glob'\nimport type { CheckResult, Finding } from '../types.js'\nimport type { FrontGuardConfig } from '../config/schema.js'\n\nconst DEFAULT_GLOB = '**/*.{ts,tsx,js,jsx,mjs,cjs}'\n\nexport async function runCustomRules(\n cwd: string,\n config: FrontGuardConfig,\n restrictToFiles: string[] | null,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const rules = config.rules\n if (!rules || Object.keys(rules).length === 0) {\n return {\n checkId: 'custom-rules',\n findings: [],\n durationMs: 0,\n skipped: 'no rules configured',\n }\n }\n\n const active = Object.entries(rules).filter(([, v]) => v !== 'off') as [\n string,\n Exclude<(typeof rules)[string], 'off'>,\n ][]\n\n if (active.length === 0) {\n return {\n checkId: 'custom-rules',\n findings: [],\n durationMs: 0,\n skipped: 'all rules off',\n }\n }\n\n let files: string[]\n if (restrictToFiles?.length) {\n files = restrictToFiles.filter((f) => /\\.(tsx?|jsx?|mjs|cjs)$/i.test(f))\n } else {\n files = await fg(DEFAULT_GLOB, {\n cwd,\n ignore: ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/build/**'],\n onlyFiles: true,\n })\n }\n\n const findings: Finding[] = []\n const maxFiles = 300\n let n = 0\n\n for (const rel of files) {\n if (n++ > maxFiles) {\n findings.push({\n id: 'custom-rules-cap',\n severity: 'info',\n message: `Custom rules scan capped after ${maxFiles} files`,\n })\n break\n }\n const full = path.join(cwd, rel)\n let content: string\n try {\n content = await fs.readFile(full, 'utf8')\n } catch {\n continue\n }\n if (content.length > 600_000) continue\n\n const ctx = { path: rel, content }\n for (const [id, def] of active) {\n if (typeof def.check !== 'function') continue\n try {\n if (def.check(ctx)) {\n findings.push({\n id: `rule:${id}`,\n severity: def.severity,\n message: def.message,\n file: rel,\n })\n }\n } catch (e) {\n findings.push({\n id: `rule-error:${id}`,\n severity: 'warn',\n message: `Rule \\`${id}\\` threw`,\n detail: e instanceof Error ? e.message : String(e),\n file: rel,\n })\n }\n }\n }\n\n return {\n checkId: 'custom-rules',\n findings,\n durationMs: Math.round(performance.now() - t0),\n }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { CheckResult, Finding, PrContext } from '../types.js'\nimport type { CheckGate, FrontGuardConfig } from '../config/schema.js'\n\nfunction sev(gate: CheckGate): Finding['severity'] {\n return gate === 'block' ? 'block' : gate === 'info' ? 'info' : 'warn'\n}\n\nconst CODE_EXT = /\\.(tsx?|jsx?|mjs|cjs)$/i\n\ninterface Pattern {\n id: string\n re: RegExp\n message: string\n /** Always block regardless of gate (security) */\n forceBlock?: boolean\n}\n\nconst PATTERNS: Pattern[] = [\n {\n id: 'ai-eval',\n re: /\\beval\\s*\\(/,\n message:\n '`eval()` — high risk; AI output often slips this in. Replace with safe parsing.',\n forceBlock: true,\n },\n {\n id: 'ai-new-function',\n re: /\\bnew\\s+Function\\s*\\(/,\n message: '`new Function()` is eval-like — verify necessity and input trust.',\n forceBlock: true,\n },\n {\n id: 'ai-dsh',\n re: /dangerouslySetInnerHTML\\s*=/,\n message: '`dangerouslySetInnerHTML` — XSS risk. Ensure trusted/sanitized HTML only.',\n },\n {\n id: 'ai-inner-html-assign',\n re: /\\.innerHTML\\s*=/,\n message: 'DOM `innerHTML` assignment — XSS risk; prefer textContent or sanitization.',\n },\n {\n id: 'ai-document-write',\n re: /\\bdocument\\.write\\s*\\(/,\n message: '`document.write` — brittle and unsafe in modern apps.',\n },\n {\n id: 'ai-ts-ignore',\n re: /@ts-ignore\\b/,\n message:\n '`@ts-ignore` hides errors (AI often uses instead of fixing). Prefer `@ts-expect-error` with reason.',\n },\n {\n id: 'ai-empty-catch',\n re: /catch\\s*(?:\\([^)]*\\))?\\s*\\{\\s*\\}/,\n message: 'Empty `catch` — errors swallowed; at least log or rethrow intentionally.',\n },\n {\n id: 'ai-http-url',\n re: /(['\"])http:\\/\\//,\n message: 'Plain `http://` URL — mixed content / MITM risk in browser code.',\n },\n {\n id: 'ai-token-storage',\n re: /(?:localStorage|sessionStorage)\\.(?:setItem|getItem)\\s*\\(\\s*['\"][^'\"]*token[^'\"]*['\"]/i,\n message: 'Token in web storage — confirm threat model (XSS exfiltration).',\n },\n {\n id: 'ai-child-process',\n re: /(?:from\\s+['\"]child_process['\"]|require\\s*\\(\\s*['\"]child_process['\"]\\s*\\))/,\n message:\n '`child_process` in app code — unusual for browser bundles; confirm this is server-only tooling.',\n },\n {\n id: 'ai-sql-template',\n re: /(?:query|execute|raw)\\s*\\(\\s*[`'\"][^`'\"]*\\$\\{/i,\n message: 'Possible dynamic SQL/string — ensure parameterization, not string concat.',\n },\n]\n\nexport async function runAiAssistedStrict(\n cwd: string,\n config: FrontGuardConfig,\n pr: PrContext | null,\n): Promise<CheckResult> {\n const t0 = performance.now()\n const cfg = config.checks.aiAssistedReview\n\n if (!cfg.enabled) {\n return {\n checkId: 'ai-assisted-strict',\n findings: [],\n durationMs: 0,\n skipped: 'disabled in config',\n }\n }\n\n if (!pr) {\n return {\n checkId: 'ai-assisted-strict',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'not a pull request context',\n }\n }\n\n if (!pr.aiAssisted) {\n return {\n checkId: 'ai-assisted-strict',\n findings: [],\n durationMs: Math.round(performance.now() - t0),\n skipped: 'PR does not indicate AI-assisted code',\n }\n }\n\n const files = (pr.files ?? []).filter((f) => CODE_EXT.test(f)).slice(0, 150)\n const gate = cfg.gate\n const findings: Finding[] = []\n\n for (const rel of files) {\n const full = path.join(cwd, rel)\n let content: string\n try {\n content = await fs.readFile(full, 'utf8')\n } catch {\n continue\n }\n if (content.length > 500_000) continue\n\n for (const { id, re, message, forceBlock } of PATTERNS) {\n if (!re.test(content)) continue\n findings.push({\n id,\n severity: forceBlock ? 'block' : sev(gate),\n message: `[AI-assisted strict] ${message}`,\n file: rel,\n })\n }\n }\n\n return {\n checkId: 'ai-assisted-strict',\n findings: dedupe(findings),\n durationMs: Math.round(performance.now() - t0),\n }\n}\n\nfunction dedupe(f: Finding[]): Finding[] {\n const s = new Set<string>()\n const out: Finding[] = []\n for (const x of f) {\n const k = `${x.id}:${x.file ?? ''}`\n if (s.has(k)) continue\n s.add(k)\n out.push(x)\n }\n return out\n}\n","import type { FrontGuardConfig } from '../config/schema.js'\nimport type { CheckResult, PrContext } from '../types.js'\n\n/**\n * When the PR discloses AI use, escalate selected automated findings so reviewers\n * treat them as merge blockers (in enforce mode) or high-signal warnings.\n */\nexport function applyAiAssistedEscalation(\n results: CheckResult[],\n pr: PrContext | null,\n config: FrontGuardConfig,\n): void {\n const cfg = config.checks.aiAssistedReview\n if (!pr?.aiAssisted || !cfg.enabled) return\n\n const { escalate } = cfg\n\n for (const r of results) {\n if (r.skipped) continue\n\n if (escalate.secretFindingsToBlock && r.checkId === 'secrets') {\n for (const f of r.findings) {\n if (f.severity === 'warn' || f.severity === 'info') f.severity = 'block'\n }\n }\n\n if (escalate.tsAnyDeltaToBlock && r.checkId === 'ts-any-delta') {\n for (const f of r.findings) {\n if (f.severity === 'warn' || f.severity === 'info') f.severity = 'block'\n }\n }\n }\n}\n","import pc from 'picocolors'\nimport type { GuardMode } from '../config/schema.js'\nimport type { CheckResult, PrContext, StackInfo } from '../types.js'\n\nexport interface FullReport {\n riskScore: 'LOW' | 'MEDIUM' | 'HIGH'\n stack: StackInfo\n pr: PrContext | null\n results: CheckResult[]\n markdown: string\n consoleText: string\n}\n\nexport function buildReport(\n stack: StackInfo,\n pr: PrContext | null,\n results: CheckResult[],\n options?: { mode?: GuardMode; llmAppendix?: string | null },\n): FullReport {\n const mode = options?.mode ?? 'warn'\n const allFindings = results.flatMap((r) =>\n r.findings.map((f) => ({ ...f, checkId: r.checkId })),\n )\n const warns = allFindings.filter((f) => f.severity === 'warn').length\n const infos = allFindings.filter((f) => f.severity === 'info').length\n const blocks = allFindings.filter((f) => f.severity === 'block').length\n\n const lines = pr != null ? pr.additions + pr.deletions : null\n\n const riskScore = scoreRisk(blocks, warns, lines, pr?.changedFiles ?? 0)\n\n const markdown = formatMarkdown({\n riskScore,\n mode,\n stack,\n pr,\n results,\n warns,\n infos,\n blocks,\n lines,\n llmAppendix: options?.llmAppendix ?? null,\n })\n\n const consoleText = formatConsole({\n riskScore,\n mode,\n stack,\n pr,\n results,\n warns,\n infos,\n blocks,\n })\n\n return { riskScore, stack, pr, results, markdown, consoleText }\n}\n\nfunction formatStackOneLiner(s: StackInfo): string {\n const bits: string[] = []\n if (s.hasNext) bits.push('Next.js')\n if (s.hasReactNative) bits.push('React Native')\n else if (s.hasReact) bits.push('React')\n if (s.hasTypeScript) bits.push('TypeScript')\n if (s.tsStrict === true) bits.push('strict TS')\n bits.push(`pkg: ${s.packageManager}`)\n return bits.join(' · ') || 'unknown'\n}\n\nfunction scoreRisk(\n blocks: number,\n warns: number,\n lines: number | null,\n files: number,\n): FullReport['riskScore'] {\n let score = 0\n if (blocks > 0) score += 3\n if (warns >= 8) score += 2\n else if (warns >= 3) score += 1\n if (lines != null) {\n if (lines >= 800) score += 2\n else if (lines >= 400) score += 1\n }\n if (files >= 25) score += 1\n if (score >= 5) return 'HIGH'\n if (score >= 2) return 'MEDIUM'\n return 'LOW'\n}\n\nfunction formatMarkdown(p: {\n riskScore: FullReport['riskScore']\n mode: GuardMode\n stack: StackInfo\n pr: PrContext | null\n results: CheckResult[]\n warns: number\n infos: number\n blocks: number\n lines: number | null\n llmAppendix: string | null\n}): string {\n const {\n riskScore,\n mode,\n stack,\n pr,\n results,\n warns,\n infos,\n blocks,\n lines,\n llmAppendix,\n } = p\n const sb: string[] = []\n\n sb.push('## FrontGuard review brief')\n sb.push('')\n sb.push(\n `**Risk:** ${riskScore} · **Mode:** ${mode === 'enforce' ? 'enforce (CI may fail on `block`)' : 'warn-only'}`,\n )\n if (pr?.aiAssisted) {\n sb.push('')\n sb.push(\n '**AI-assisted PR:** Stricter static pass is active (security / footgun patterns on changed files; secrets & `any` deltas may be escalated). **Human review** still required for correctness and product rules.',\n )\n }\n sb.push('')\n sb.push(`**Stack:** ${formatStackOneLiner(stack)}`)\n if (pr && lines != null) {\n sb.push(\n `**Size:** ${lines} lines (+${pr.additions} / -${pr.deletions}) across ${pr.changedFiles} files`,\n )\n }\n sb.push('')\n sb.push(\n blocks > 0\n ? `**Blocking (\\`block\\`) findings:** ${blocks}`\n : '**Blocking (\\`block\\`) findings:** 0',\n )\n sb.push(`**Warnings:** ${warns} · **Info:** ${infos}`)\n sb.push('')\n\n sb.push('### Check summary')\n for (const r of results) {\n const status = r.skipped\n ? `⏭️ skipped (${r.skipped})`\n : r.findings.length === 0\n ? '✅ clean'\n : `⚠️ ${r.findings.length} finding(s)`\n sb.push(`- **${r.checkId}** — ${status} (${r.durationMs}ms)`)\n }\n sb.push('')\n\n const blockFindings = results.flatMap((r) =>\n r.findings.filter((f) => f.severity === 'block').map((f) => ({ r, f })),\n )\n if (blockFindings.length) {\n sb.push('### Blocking')\n for (const { f } of blockFindings.slice(0, 40)) {\n const loc = f.file ? ` \\`${f.file}\\`` : ''\n sb.push(`- ${f.message}${loc}`)\n if (f.detail) {\n sb.push(\n ` - <details><summary>detail</summary>\\n\\n\\`\\`\\`text\\n${f.detail}\\n\\`\\`\\`\\n\\n</details>`,\n )\n }\n }\n sb.push('')\n }\n\n const warnFindings = results.flatMap((r) =>\n r.findings.filter((f) => f.severity === 'warn').map((f) => ({ r, f })),\n )\n if (warnFindings.length) {\n sb.push('### Warnings')\n for (const { f } of warnFindings.slice(0, 30)) {\n const loc = f.file ? ` \\`${f.file}\\`` : ''\n sb.push(`- ${f.message}${loc}`)\n if (f.detail) {\n sb.push(\n ` - <details><summary>detail</summary>\\n\\n\\`\\`\\`text\\n${f.detail}\\n\\`\\`\\`\\n\\n</details>`,\n )\n }\n }\n if (warnFindings.length > 30) {\n sb.push(`- _…and ${warnFindings.length - 30} more_`)\n }\n sb.push('')\n }\n\n const infoFindings = results.flatMap((r) =>\n r.findings.filter((f) => f.severity === 'info').map((f) => ({ r, f })),\n )\n if (infoFindings.length) {\n sb.push('### Notes')\n for (const { f } of infoFindings.slice(0, 20)) {\n sb.push(`- ${f.message}`)\n }\n sb.push('')\n }\n\n if (llmAppendix?.trim()) {\n sb.push(llmAppendix.trim())\n sb.push('')\n }\n\n sb.push('---')\n sb.push('_Generated by FrontGuard — configure with `frontguard.config.js`_')\n return sb.join('\\n')\n}\n\nfunction formatConsole(p: {\n riskScore: FullReport['riskScore']\n mode: GuardMode\n stack: StackInfo\n pr: PrContext | null\n results: CheckResult[]\n warns: number\n infos: number\n blocks: number\n}): string {\n const { riskScore, mode, stack, pr, results, warns, infos, blocks } = p\n const lines: string[] = []\n lines.push(pc.bold('┌─ FrontGuard review brief ─────────────────────────────┐'))\n lines.push(`│ ${pc.dim('Risk:')} ${riskScore.padEnd(43)} │`)\n lines.push(`│ ${pc.dim('Mode:')} ${mode.padEnd(42)} │`)\n lines.push(\n `│ ${pc.dim('Stack:')} ${(stack.hasNext ? 'Next.js ' : '') + (stack.hasReactNative ? 'RN ' : '') + (stack.hasReact ? 'React ' : '') + (stack.hasTypeScript ? 'TS' : 'JS')}`\n .padEnd(56)\n .slice(0, 56) + ' │',\n )\n if (pr) {\n const sz = `${pr.additions + pr.deletions} lines (+${pr.additions}/-${pr.deletions}) · ${pr.changedFiles} files`\n lines.push(`│ ${pc.dim('PR:')} ${sz.slice(0, 49).padEnd(49)} │`)\n }\n lines.push('│ ' + ''.padEnd(53) + ' │')\n const statusLine =\n blocks > 0\n ? pc.red(`✖ ${blocks} blocking`)\n : warns === 0 && infos === 0\n ? pc.green('✓ No findings')\n : pc.yellow(`⚠ ${warns} warnings · ${infos} info`)\n lines.push(`│ ${statusLine}`.padEnd(64).slice(0, 64) + ' │')\n for (const r of results) {\n const label = r.skipped\n ? pc.dim(` ${r.checkId}: skipped`)\n : ` ${r.checkId}: ${r.findings.length} issues`\n lines.push(`│${label.slice(0, 54).padEnd(54)}│`)\n }\n lines.push(pc.bold('└────────────────────────────────────────────────────────┘'))\n return lines.join('\\n')\n}\n","import { fetch } from 'undici'\nimport type { FrontGuardConfig } from '../config/schema.js'\nimport type { CheckResult, PrContext } from '../types.js'\nimport { gitDiffForReview, gitOk, resolveDiffBaseRef } from '../runner/git.js'\n\nfunction safeGetEnv(name: string): string | undefined {\n const v = process.env[name]\n return v && v.trim() ? v : undefined\n}\n\nexport async function runLlmReview(opts: {\n cwd: string\n config: FrontGuardConfig\n pr: PrContext | null\n results: CheckResult[]\n}): Promise<string | null> {\n const { cwd, config, pr, results } = opts\n const cfg = config.checks.llm\n if (!cfg.enabled) return null\n\n const apiKey = safeGetEnv(cfg.apiKeyEnv)\n if (!apiKey) {\n // IDE keys (e.g. Cursor Enterprise) are not available in CI runners.\n if (process.env.FRONTGUARD_LLM_SHOW_NO_KEY_HINT !== '1') {\n return null\n }\n return [\n '### AI review (automated CI)',\n '',\n '_No API key in this environment._ IDE credentials do not reach GitHub Actions.',\n '',\n '**Options:**',\n '1. **Manual** — Paste notes from Cursor/ChatGPT/Claude into a file, then `frontguard run --append ./notes.md` (or `FRONTGUARD_MANUAL_APPENDIX_FILE`).',\n `2. **Org CI** — Map an approved inference key to \\`${cfg.apiKeyEnv}\\` via your secret store.`,\n '3. **Docs in PR** — Rely on the PR template “AI assistance” section for reviewer context.',\n ].join('\\n')\n }\n\n if (!(await gitOk(cwd))) {\n return '_LLM review skipped: not a git repository_'\n }\n\n const base = await resolveDiffBaseRef(cwd, config.checks.tsAnyDelta.baseRef)\n const diff = await gitDiffForReview(cwd, base, cfg.maxDiffChars)\n if (!diff.trim()) {\n return '_LLM review skipped: empty diff vs base_'\n }\n\n const summaryLines = results\n .flatMap((r) => r.findings.map((f) => `- [${f.severity}] ${r.checkId}: ${f.message}`))\n .slice(0, 40)\n .join('\\n')\n\n const prompt = [\n 'You are a senior frontend reviewer. Respond in Markdown with short sections:',\n '### Summary',\n '### Risk hotspots (files / themes)',\n '### Logic / correctness smells',\n '### Tests & regressions',\n '',\n 'Constraints:',\n '- Be specific to this diff; avoid generic advice.',\n '- If uncertain, say what you need to verify manually.',\n '',\n pr\n ? `PR title: ${pr.title}\\nPR body excerpt:\\n${pr.body.slice(0, 2000)}`\n : 'No GitHub PR context (local run).',\n '',\n 'Existing automated findings (may be incomplete):',\n summaryLines || '(none)',\n '',\n 'Git diff (may be truncated):',\n '```diff',\n diff,\n '```',\n ].join('\\n')\n\n const controller = new AbortController()\n const t = setTimeout(() => controller.abort(), cfg.timeoutMs)\n\n try {\n if (cfg.provider === 'anthropic') {\n const text = await callAnthropic(cfg.model, apiKey, prompt, controller.signal)\n return `### AI review (non-binding)\\n\\n${text}`\n }\n const text = await callOpenAI(cfg.model, apiKey, prompt, controller.signal)\n return `### AI review (non-binding)\\n\\n${text}`\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n return `_LLM request failed: ${msg}_`\n } finally {\n clearTimeout(t)\n }\n}\n\nasync function callOpenAI(\n model: string,\n apiKey: string,\n prompt: string,\n signal: AbortSignal,\n): Promise<string> {\n const res = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n signal,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n temperature: 0.2,\n messages: [\n {\n role: 'system',\n content:\n 'You audit frontend pull requests. Output concise Markdown. No preamble about being an AI.',\n },\n { role: 'user', content: prompt },\n ],\n }),\n })\n\n if (!res.ok) {\n const t = await res.text()\n throw new Error(`OpenAI HTTP ${res.status}: ${t.slice(0, 500)}`)\n }\n\n const data = (await res.json()) as {\n choices?: Array<{ message?: { content?: string } }>\n }\n const text = data.choices?.[0]?.message?.content?.trim()\n if (!text) throw new Error('OpenAI returned empty content')\n return text\n}\n\nasync function callAnthropic(\n model: string,\n apiKey: string,\n prompt: string,\n signal: AbortSignal,\n): Promise<string> {\n const res = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n signal,\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: 4096,\n temperature: 0.2,\n messages: [{ role: 'user', content: prompt }],\n }),\n })\n\n if (!res.ok) {\n const t = await res.text()\n throw new Error(`Anthropic HTTP ${res.status}: ${t.slice(0, 500)}`)\n }\n\n const data = (await res.json()) as {\n content?: Array<{ type?: string; text?: string }>\n }\n const text = data.content\n ?.map((b) => (b.type === 'text' ? b.text : ''))\n .join('')\n .trim()\n\n if (!text) throw new Error('Anthropic returned empty content')\n return text\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nconst MAX_CHARS = 200_000\n\n/**\n * Human-in-the-loop review text: paste output from IDE chat, ChatGPT, Claude, etc.\n * No API keys — suitable for enterprise CI that cannot store LLM secrets.\n */\nexport async function loadManualAppendix(opts: {\n cwd: string\n /** From CLI `--append` */\n filePath?: string | null\n}): Promise<string | null> {\n const { cwd, filePath } = opts\n\n const envFile = process.env.FRONTGUARD_MANUAL_APPENDIX_FILE?.trim()\n const resolvedPath = filePath?.trim() || envFile\n if (resolvedPath) {\n const abs = path.isAbsolute(resolvedPath)\n ? resolvedPath\n : path.join(cwd, resolvedPath)\n try {\n let text = await fs.readFile(abs, 'utf8')\n if (text.length > MAX_CHARS) {\n text = text.slice(0, MAX_CHARS) + '\\n\\n_(truncated)_\\n'\n }\n const t = text.trim()\n if (t) {\n return `### Contributed review notes\\n\\n_Pasted or file-based (no CI API key)._ \\n\\n${t}`\n }\n } catch {\n /* missing file is OK */\n }\n }\n\n const inline = process.env.FRONTGUARD_MANUAL_APPENDIX?.trim()\n if (inline) {\n let text = inline\n if (text.length > MAX_CHARS) {\n text = text.slice(0, MAX_CHARS) + '\\n\\n_(truncated)_\\n'\n }\n return `### Contributed review notes\\n\\n${text.trim()}`\n }\n\n return null\n}\n","import process from 'node:process'\nimport { readGithubEvent } from '../ci/github.js'\nimport { upsertBriefComment } from '../ci/pr-comment.js'\nimport { loadConfig } from '../config/load.js'\nimport { detectStack } from '../detect/stack.js'\nimport { runEslint } from '../checks/eslint.js'\nimport { runPrettier } from '../checks/prettier.js'\nimport { runTypeScript } from '../checks/typescript.js'\nimport { runSecrets } from '../checks/secrets.js'\nimport { runPrHygiene } from '../checks/pr-hygiene.js'\nimport { runPrSize } from '../checks/pr-size.js'\nimport { runTsAnyDelta } from '../checks/ts-any-delta.js'\nimport { runCycles } from '../checks/cycles.js'\nimport { runDeadCode } from '../checks/dead-code.js'\nimport { runBundle } from '../checks/bundle.js'\nimport { runCwv } from '../checks/cwv.js'\nimport { runCustomRules } from '../checks/custom-rules.js'\nimport { runAiAssistedStrict } from '../checks/ai-assisted-strict.js'\nimport { applyAiAssistedEscalation } from '../runner/ai-escalation.js'\nimport { buildReport } from '../report/builder.js'\nimport { runLlmReview } from '../llm/review.js'\nimport { loadManualAppendix } from '../llm/manual-appendix.js'\nimport type { GuardMode } from '../config/schema.js'\n\nexport interface RunOptions {\n cwd: string\n ci: boolean\n markdown: boolean\n /** Force failing CI when `block` findings exist */\n enforce?: boolean\n /** Markdown file to append (e.g. paste from IDE chat / external LLM) */\n append?: string | null\n}\n\nexport async function runFrontGuard(opts: RunOptions): Promise<void> {\n const config = await loadConfig(opts.cwd)\n const mode: GuardMode = opts.enforce ? 'enforce' : config.mode\n\n const stack = await detectStack(opts.cwd)\n const pr = await readGithubEvent()\n\n const restrictFiles = pr?.files?.length ? pr.files : null\n\n const [\n eslint,\n prettier,\n typescript,\n secrets,\n tsAnyDelta,\n cycles,\n deadCode,\n cwv,\n customRules,\n aiStrict,\n ] = await Promise.all([\n runEslint(opts.cwd, config, stack),\n runPrettier(opts.cwd, config),\n runTypeScript(opts.cwd, config, stack),\n runSecrets(opts.cwd, config, pr),\n runTsAnyDelta(opts.cwd, config, stack),\n runCycles(opts.cwd, config, stack),\n runDeadCode(opts.cwd, config, stack, pr),\n runCwv(opts.cwd, config, stack, pr),\n runCustomRules(opts.cwd, config, restrictFiles),\n runAiAssistedStrict(opts.cwd, config, pr),\n ])\n\n const bundle = await runBundle(opts.cwd, config, stack)\n\n const prHygiene = runPrHygiene(config, pr)\n const prSize = runPrSize(config, pr)\n\n const results = [\n eslint,\n prettier,\n typescript,\n secrets,\n tsAnyDelta,\n cycles,\n deadCode,\n bundle,\n cwv,\n customRules,\n aiStrict,\n prHygiene,\n prSize,\n ]\n\n applyAiAssistedEscalation(results, pr, config)\n\n const manualAppendix = await loadManualAppendix({\n cwd: opts.cwd,\n filePath: opts.append ?? null,\n })\n const automatedAppendix = await runLlmReview({\n cwd: opts.cwd,\n config,\n pr,\n results,\n })\n const llmAppendix =\n [manualAppendix, automatedAppendix].filter(Boolean).join('\\n\\n') || null\n\n const report = buildReport(stack, pr, results, { mode, llmAppendix })\n\n if (opts.markdown) {\n process.stdout.write(report.markdown + '\\n')\n } else {\n process.stdout.write(report.consoleText + '\\n\\n')\n process.stdout.write(report.markdown + '\\n')\n }\n\n if (opts.ci && process.env.GITHUB_TOKEN) {\n await upsertBriefComment(report.markdown)\n }\n\n const hasBlock = results.some((r) => r.findings.some((f) => f.severity === 'block'))\n process.exitCode = mode === 'enforce' && hasBlock ? 1 : 0\n}\n","#!/usr/bin/env node\nimport process from 'node:process'\nimport { defineCommand, runMain } from 'citty'\nimport { initFrontGuard } from './commands/init.js'\nimport { runFrontGuard } from './commands/run.js'\n\nconst init = defineCommand({\n meta: {\n name: 'init',\n description: 'Add workflow, PR template, and frontguard.config.js',\n },\n run: async () => {\n const cwd = process.cwd()\n await initFrontGuard(cwd)\n process.stdout.write(\n 'FrontGuard initialized.\\n\\n' +\n 'Next: add the package as a devDependency so CI matches local runs:\\n' +\n ' npm install -D @cleartrip/frontguard\\n' +\n ' yarn add -D @cleartrip/frontguard\\n',\n )\n },\n})\n\nconst run = defineCommand({\n meta: {\n name: 'run',\n description: 'Run checks and print the review brief',\n },\n args: {\n ci: {\n type: 'boolean',\n description: 'Upsert PR comment when GITHUB_TOKEN is available',\n default: false,\n },\n markdown: {\n type: 'boolean',\n description: 'Print markdown only',\n default: false,\n },\n enforce: {\n type: 'boolean',\n description: 'Exit non-zero if any finding has severity block',\n default: false,\n },\n append: {\n type: 'string',\n description:\n 'Append markdown from a file (paste from IDE/ChatGPT/Claude; no CI API key needed)',\n },\n },\n run: async ({ args }) => {\n await runFrontGuard({\n cwd: process.cwd(),\n ci: Boolean(args.ci),\n markdown: Boolean(args.markdown),\n enforce: Boolean(args.enforce),\n append: typeof args.append === 'string' ? args.append : null,\n })\n },\n})\n\nconst main = defineCommand({\n meta: { name: 'frontguard', description: 'FrontGuard — frontend PR guardrails' },\n subCommands: { init, run },\n})\n\nrunMain(main)\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cleartrip/frontguard",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Org-wide frontend PR guardrails: linting, hygiene, any-delta, cycles, dead code, bundle/CWV hints, custom rules, optional LLM brief",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"templates"
|
|
21
21
|
],
|
|
22
22
|
"engines": {
|
|
23
|
-
"node": ">=18.
|
|
23
|
+
"node": ">=18.12.0"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
26
|
"build": "tsup",
|
|
@@ -42,7 +42,8 @@
|
|
|
42
42
|
"defu": "^6.1.4",
|
|
43
43
|
"fast-glob": "^3.3.3",
|
|
44
44
|
"picocolors": "^1.1.1",
|
|
45
|
-
"tinyexec": "^1.0.1"
|
|
45
|
+
"tinyexec": "^1.0.1",
|
|
46
|
+
"undici": "^6.21.1"
|
|
46
47
|
},
|
|
47
48
|
"devDependencies": {
|
|
48
49
|
"@types/node": "^22.14.0",
|