@demon-utils/playwright 0.1.6 → 0.1.7

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/index.js.map CHANGED
@@ -1,15 +1,23 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["node:path", "../src/commentary.ts", "../src/review.ts", "../src/git-context.ts", "../src/html-generator.ts", "../src/recorder.ts"],
3
+ "sources": ["../src/review-generator.ts", "../src/review.ts", "../src/git-context.ts", "../../../node_modules/universal-user-agent/index.js", "../../../node_modules/@octokit/endpoint/dist-bundle/index.js", "../../../node_modules/fast-content-type-parse/index.js", "../../../node_modules/@octokit/request-error/dist-src/index.js", "../../../node_modules/@octokit/request/dist-bundle/index.js", "../../../node_modules/@octokit/graphql/dist-bundle/index.js", "../src/github-issue.ts", "../src/orchestrator.ts", "../src/commentary.ts", "../src/recorder.ts", "../src/feedback-server.ts"],
4
4
  "sourcesContent": [
5
- "function assertPath(path){if(typeof path!==\"string\")throw TypeError(\"Path must be a string. Received \"+JSON.stringify(path))}function normalizeStringPosix(path,allowAboveRoot){var res=\"\",lastSegmentLength=0,lastSlash=-1,dots=0,code;for(var i=0;i<=path.length;++i){if(i<path.length)code=path.charCodeAt(i);else if(code===47)break;else code=47;if(code===47){if(lastSlash===i-1||dots===1);else if(lastSlash!==i-1&&dots===2){if(res.length<2||lastSegmentLength!==2||res.charCodeAt(res.length-1)!==46||res.charCodeAt(res.length-2)!==46){if(res.length>2){var lastSlashIndex=res.lastIndexOf(\"/\");if(lastSlashIndex!==res.length-1){if(lastSlashIndex===-1)res=\"\",lastSegmentLength=0;else res=res.slice(0,lastSlashIndex),lastSegmentLength=res.length-1-res.lastIndexOf(\"/\");lastSlash=i,dots=0;continue}}else if(res.length===2||res.length===1){res=\"\",lastSegmentLength=0,lastSlash=i,dots=0;continue}}if(allowAboveRoot){if(res.length>0)res+=\"/..\";else res=\"..\";lastSegmentLength=2}}else{if(res.length>0)res+=\"/\"+path.slice(lastSlash+1,i);else res=path.slice(lastSlash+1,i);lastSegmentLength=i-lastSlash-1}lastSlash=i,dots=0}else if(code===46&&dots!==-1)++dots;else dots=-1}return res}function _format(sep,pathObject){var dir=pathObject.dir||pathObject.root,base=pathObject.base||(pathObject.name||\"\")+(pathObject.ext||\"\");if(!dir)return base;if(dir===pathObject.root)return dir+base;return dir+sep+base}function resolve(){var resolvedPath=\"\",resolvedAbsolute=!1,cwd;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path;if(i>=0)path=arguments[i];else{if(cwd===void 0)cwd=process.cwd();path=cwd}if(assertPath(path),path.length===0)continue;resolvedPath=path+\"/\"+resolvedPath,resolvedAbsolute=path.charCodeAt(0)===47}if(resolvedPath=normalizeStringPosix(resolvedPath,!resolvedAbsolute),resolvedAbsolute)if(resolvedPath.length>0)return\"/\"+resolvedPath;else return\"/\";else if(resolvedPath.length>0)return resolvedPath;else return\".\"}function normalize(path){if(assertPath(path),path.length===0)return\".\";var isAbsolute=path.charCodeAt(0)===47,trailingSeparator=path.charCodeAt(path.length-1)===47;if(path=normalizeStringPosix(path,!isAbsolute),path.length===0&&!isAbsolute)path=\".\";if(path.length>0&&trailingSeparator)path+=\"/\";if(isAbsolute)return\"/\"+path;return path}function isAbsolute(path){return assertPath(path),path.length>0&&path.charCodeAt(0)===47}function join(){if(arguments.length===0)return\".\";var joined;for(var i=0;i<arguments.length;++i){var arg=arguments[i];if(assertPath(arg),arg.length>0)if(joined===void 0)joined=arg;else joined+=\"/\"+arg}if(joined===void 0)return\".\";return normalize(joined)}function relative(from,to){if(assertPath(from),assertPath(to),from===to)return\"\";if(from=resolve(from),to=resolve(to),from===to)return\"\";var fromStart=1;for(;fromStart<from.length;++fromStart)if(from.charCodeAt(fromStart)!==47)break;var fromEnd=from.length,fromLen=fromEnd-fromStart,toStart=1;for(;toStart<to.length;++toStart)if(to.charCodeAt(toStart)!==47)break;var toEnd=to.length,toLen=toEnd-toStart,length=fromLen<toLen?fromLen:toLen,lastCommonSep=-1,i=0;for(;i<=length;++i){if(i===length){if(toLen>length){if(to.charCodeAt(toStart+i)===47)return to.slice(toStart+i+1);else if(i===0)return to.slice(toStart+i)}else if(fromLen>length){if(from.charCodeAt(fromStart+i)===47)lastCommonSep=i;else if(i===0)lastCommonSep=0}break}var fromCode=from.charCodeAt(fromStart+i),toCode=to.charCodeAt(toStart+i);if(fromCode!==toCode)break;else if(fromCode===47)lastCommonSep=i}var out=\"\";for(i=fromStart+lastCommonSep+1;i<=fromEnd;++i)if(i===fromEnd||from.charCodeAt(i)===47)if(out.length===0)out+=\"..\";else out+=\"/..\";if(out.length>0)return out+to.slice(toStart+lastCommonSep);else{if(toStart+=lastCommonSep,to.charCodeAt(toStart)===47)++toStart;return to.slice(toStart)}}function _makeLong(path){return path}function dirname(path){if(assertPath(path),path.length===0)return\".\";var code=path.charCodeAt(0),hasRoot=code===47,end=-1,matchedSlash=!0;for(var i=path.length-1;i>=1;--i)if(code=path.charCodeAt(i),code===47){if(!matchedSlash){end=i;break}}else matchedSlash=!1;if(end===-1)return hasRoot?\"/\":\".\";if(hasRoot&&end===1)return\"//\";return path.slice(0,end)}function basename(path,ext){if(ext!==void 0&&typeof ext!==\"string\")throw TypeError('\"ext\" argument must be a string');assertPath(path);var start=0,end=-1,matchedSlash=!0,i;if(ext!==void 0&&ext.length>0&&ext.length<=path.length){if(ext.length===path.length&&ext===path)return\"\";var extIdx=ext.length-1,firstNonSlashEnd=-1;for(i=path.length-1;i>=0;--i){var code=path.charCodeAt(i);if(code===47){if(!matchedSlash){start=i+1;break}}else{if(firstNonSlashEnd===-1)matchedSlash=!1,firstNonSlashEnd=i+1;if(extIdx>=0)if(code===ext.charCodeAt(extIdx)){if(--extIdx===-1)end=i}else extIdx=-1,end=firstNonSlashEnd}}if(start===end)end=firstNonSlashEnd;else if(end===-1)end=path.length;return path.slice(start,end)}else{for(i=path.length-1;i>=0;--i)if(path.charCodeAt(i)===47){if(!matchedSlash){start=i+1;break}}else if(end===-1)matchedSlash=!1,end=i+1;if(end===-1)return\"\";return path.slice(start,end)}}function extname(path){assertPath(path);var startDot=-1,startPart=0,end=-1,matchedSlash=!0,preDotState=0;for(var i=path.length-1;i>=0;--i){var code=path.charCodeAt(i);if(code===47){if(!matchedSlash){startPart=i+1;break}continue}if(end===-1)matchedSlash=!1,end=i+1;if(code===46){if(startDot===-1)startDot=i;else if(preDotState!==1)preDotState=1}else if(startDot!==-1)preDotState=-1}if(startDot===-1||end===-1||preDotState===0||preDotState===1&&startDot===end-1&&startDot===startPart+1)return\"\";return path.slice(startDot,end)}function format(pathObject){if(pathObject===null||typeof pathObject!==\"object\")throw TypeError('The \"pathObject\" argument must be of type Object. Received type '+typeof pathObject);return _format(\"/\",pathObject)}function parse(path){assertPath(path);var ret={root:\"\",dir:\"\",base:\"\",ext:\"\",name:\"\"};if(path.length===0)return ret;var code=path.charCodeAt(0),isAbsolute2=code===47,start;if(isAbsolute2)ret.root=\"/\",start=1;else start=0;var startDot=-1,startPart=0,end=-1,matchedSlash=!0,i=path.length-1,preDotState=0;for(;i>=start;--i){if(code=path.charCodeAt(i),code===47){if(!matchedSlash){startPart=i+1;break}continue}if(end===-1)matchedSlash=!1,end=i+1;if(code===46){if(startDot===-1)startDot=i;else if(preDotState!==1)preDotState=1}else if(startDot!==-1)preDotState=-1}if(startDot===-1||end===-1||preDotState===0||preDotState===1&&startDot===end-1&&startDot===startPart+1){if(end!==-1)if(startPart===0&&isAbsolute2)ret.base=ret.name=path.slice(1,end);else ret.base=ret.name=path.slice(startPart,end)}else{if(startPart===0&&isAbsolute2)ret.name=path.slice(1,startDot),ret.base=path.slice(1,end);else ret.name=path.slice(startPart,startDot),ret.base=path.slice(startPart,end);ret.ext=path.slice(startDot,end)}if(startPart>0)ret.dir=path.slice(0,startPart-1);else if(isAbsolute2)ret.dir=\"/\";return ret}var sep=\"/\",delimiter=\":\",posix=((p)=>(p.posix=p,p))({resolve,normalize,isAbsolute,join,relative,_makeLong,dirname,basename,extname,format,parse,sep,delimiter,win32:null,posix:null});var path_default=posix;export{sep,resolve,relative,posix,parse,normalize,join,isAbsolute,format,extname,dirname,delimiter,path_default as default,basename,_makeLong};",
5
+ "import { existsSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, dirname, relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n buildReviewPrompt,\n invokeClaude,\n parseLlmResponse,\n} from \"./review.ts\";\nimport { getRepoContext } from \"./git-context.ts\";\nimport type { ReviewMetadata, DemoType } from \"./review-types.ts\";\n\nexport interface ReviewAppData {\n metadata: ReviewMetadata;\n title: string;\n videos: Record<string, string>;\n logs?: Record<string, string>;\n feedbackEndpoint?: string;\n}\n\nexport interface DemoFile {\n path: string;\n filename: string;\n relativePath: string;\n type: DemoType;\n}\n\nexport interface GenerateReviewOptions {\n directory: string;\n agent?: string;\n feedbackEndpoint?: string;\n title?: string;\n diffBase?: string; // Base commit/branch for diff (auto-detected if not provided)\n}\n\nexport interface GenerateReviewResult {\n htmlPath: string;\n metadataPath: string;\n metadata: ReviewMetadata;\n}\n\nexport function getReviewTemplate(): string {\n const currentFile = fileURLToPath(import.meta.url);\n const distDir = dirname(currentFile);\n const templatePath = join(distDir, \"review-template.html\");\n\n if (!existsSync(templatePath)) {\n throw new Error(\n `Review template not found at ${templatePath}. ` +\n `Make sure to build the review-app package first.`\n );\n }\n\n return readFileSync(templatePath, \"utf-8\");\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nexport function generateReviewHtml(appData: ReviewAppData): string {\n const template = getReviewTemplate();\n const jsonData = JSON.stringify(appData);\n\n return template\n .replace(\"<title>Demo Review</title>\", `<title>${escapeHtml(appData.title)}</title>`)\n .replace('\"{{__INJECT_REVIEW_DATA__}}\"', jsonData);\n}\n\n/**\n * Discover demo files (.webm and .jsonl) in the given directory.\n * Searches top-level first, then one level deep (Playwright creates per-test subdirectories).\n */\nexport function discoverDemoFiles(directory: string): DemoFile[] {\n const files: DemoFile[] = [];\n\n const processFile = (filePath: string, filename: string) => {\n const relativePath = relative(directory, filePath);\n if (filename.endsWith(\".webm\")) {\n files.push({ path: filePath, filename, relativePath, type: \"web-ux\" });\n } else if (filename.endsWith(\".jsonl\")) {\n files.push({ path: filePath, filename, relativePath, type: \"log-based\" });\n }\n };\n\n // Search top-level\n for (const f of readdirSync(directory)) {\n processFile(join(directory, f), f);\n }\n\n // If no files found at top level, search one level deep\n if (files.length === 0) {\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const subdir = join(directory, entry.name);\n for (const f of readdirSync(subdir)) {\n processFile(join(subdir, f), f);\n }\n }\n }\n\n return files.sort((a, b) => a.filename.localeCompare(b.filename));\n}\n\n/**\n * Generate a review HTML page from demo files in the given directory.\n * This is the main entry point for programmatic use.\n */\nexport async function generateReview(options: GenerateReviewOptions): Promise<GenerateReviewResult> {\n const { directory, agent, feedbackEndpoint, title = \"Demo Review\", diffBase } = options;\n\n const demoFiles = discoverDemoFiles(directory);\n const webUxDemos = demoFiles.filter((d) => d.type === \"web-ux\");\n const logBasedDemos = demoFiles.filter((d) => d.type === \"log-based\");\n\n if (demoFiles.length === 0) {\n throw new Error(`No .webm or .jsonl files found in \"${directory}\" or its subdirectories.`);\n }\n\n // Build maps from filename to relativePath for lookup\n const filenameToRelativePath = new Map(demoFiles.map((d) => [d.filename, d.relativePath]));\n\n // Collect demo-steps.json from the directory of each .webm file\n // Key by filename for prompt builder, and by relativePath for metadata\n const stepsMapByFilename: Record<string, Array<{ text: string; timestampSeconds: number }>> = {};\n const stepsMapByRelativePath: Record<string, Array<{ text: string; timestampSeconds: number }>> = {};\n for (const demo of webUxDemos) {\n const stepsPath = join(dirname(demo.path), \"demo-steps.json\");\n if (!existsSync(stepsPath)) continue;\n try {\n const raw = readFileSync(stepsPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n stepsMapByFilename[demo.filename] = parsed;\n stepsMapByRelativePath[demo.relativePath] = parsed;\n }\n } catch {\n // skip malformed steps files\n }\n }\n\n // Collect JSONL content for log-based demos, keyed by relativePath\n const logsMap: Record<string, string> = {};\n for (const demo of logBasedDemos) {\n logsMap[demo.relativePath] = readFileSync(demo.path, \"utf-8\");\n }\n\n // For web-ux demos, require steps\n const hasWebUxDemos = webUxDemos.length > 0;\n const hasLogDemos = logBasedDemos.length > 0;\n\n if (hasWebUxDemos && Object.keys(stepsMapByFilename).length === 0) {\n throw new Error(\n \"No demo-steps.json found alongside any .webm files. \" +\n \"Use DemoRecorder in your demo tests to generate step data.\"\n );\n }\n\n if (!hasWebUxDemos && !hasLogDemos) {\n throw new Error(\"No demo files found.\");\n }\n\n // Gather repo context (git diff + guidelines)\n let gitDiff: string | undefined;\n let guidelines: string[] | undefined;\n try {\n const repoContext = await getRepoContext(directory, { diffBase });\n gitDiff = repoContext.gitDiff;\n guidelines = repoContext.guidelines;\n } catch {\n // Silently continue without repo context\n }\n\n const allFilenames = demoFiles.map((d) => d.filename);\n const prompt = buildReviewPrompt({ filenames: allFilenames, stepsMap: stepsMapByFilename, gitDiff, guidelines });\n\n const rawOutput = await invokeClaude(prompt, { agent });\n const llmResponse = parseLlmResponse(rawOutput);\n\n // Build a map of filename to type for easy lookup\n const typeMap = new Map(demoFiles.map((d) => [d.filename, d.type]));\n\n // Construct final metadata by merging LLM summaries with steps and type\n // Convert filenames from LLM response to relative paths for proper video loading\n const metadata: ReviewMetadata = {\n demos: llmResponse.demos.map((demo) => {\n const relativePath = filenameToRelativePath.get(demo.file) ?? demo.file;\n return {\n file: relativePath,\n type: typeMap.get(demo.file) ?? \"web-ux\",\n summary: demo.summary,\n steps: stepsMapByRelativePath[relativePath] ?? [],\n };\n }),\n review: llmResponse.review,\n };\n\n const metadataPath = join(directory, \"review-metadata.json\");\n writeFileSync(metadataPath, JSON.stringify(metadata, null, 2) + \"\\n\");\n\n // Build app data and generate HTML\n // Videos are referenced by relative path in demo.file, no base64 encoding needed\n const appData: ReviewAppData = {\n metadata,\n title,\n videos: {},\n logs: Object.keys(logsMap).length > 0 ? logsMap : undefined,\n feedbackEndpoint,\n };\n\n const html = generateReviewHtml(appData);\n const htmlPath = join(directory, \"review.html\");\n writeFileSync(htmlPath, html);\n\n return { htmlPath, metadataPath, metadata };\n}\n",
6
+ "export type SpawnFn = (\n cmd: string[],\n) => { exitCode: Promise<number>; stdout: ReadableStream<Uint8Array> };\n\nexport interface InvokeClaudeOptions {\n agent?: string;\n spawn?: SpawnFn;\n}\n\nconst GIT_DIFF_MAX_CHARS = 50_000;\n\nexport interface BuildReviewPromptOptions {\n filenames: string[];\n stepsMap: Record<string, Array<{ text: string; timestampSeconds: number }>>;\n gitDiff?: string;\n guidelines?: string[];\n}\n\nexport function buildReviewPrompt(options: BuildReviewPromptOptions): string {\n const { filenames, stepsMap, gitDiff, guidelines } = options;\n\n const demoEntries = filenames.map((f) => {\n const steps = stepsMap[f] ?? [];\n const stepLines = steps\n .map((s) => `- [${s.timestampSeconds}s] ${s.text}`)\n .join(\"\\n\");\n return `Video: ${f}\\nRecorded steps:\\n${stepLines || \"(no steps recorded)\"}`;\n });\n\n const sections: string[] = [];\n\n if (guidelines && guidelines.length > 0) {\n sections.push(`## Coding Guidelines\\n\\n${guidelines.join(\"\\n\\n\")}`);\n }\n\n if (gitDiff) {\n let diff = gitDiff;\n if (diff.length > GIT_DIFF_MAX_CHARS) {\n diff = diff.slice(0, GIT_DIFF_MAX_CHARS) + \"\\n\\n... (diff truncated at 50k characters)\";\n }\n sections.push(`## Git Diff\\n\\n\\`\\`\\`diff\\n${diff}\\n\\`\\`\\``);\n }\n\n sections.push(`## Demo Recordings\\n\\n${demoEntries.join(\"\\n\\n\")}`);\n\n return `You are a code reviewer. You are given a git diff, coding guidelines, and demo recordings that show the feature in action.\n\n${sections.join(\"\\n\\n\")}\n\n## Task\n\nReview the code changes and demo recordings. Generate a JSON object matching this exact schema:\n\n{\n \"demos\": [\n {\n \"file\": \"<filename>\",\n \"summary\": \"<a meaningful sentence describing what this demo showcases based on the steps>\"\n }\n ],\n \"review\": {\n \"summary\": \"<2-3 sentence overview of the changes>\",\n \"highlights\": [\"<positive aspect 1>\", \"<positive aspect 2>\"],\n \"verdict\": \"approve\" | \"request_changes\",\n \"verdictReason\": \"<one sentence justifying the verdict>\",\n \"issues\": [\n {\n \"severity\": \"major\" | \"minor\" | \"nit\",\n \"description\": \"<what the issue is and how to fix it>\"\n }\n ]\n }\n}\n\nRules:\n- Return ONLY the JSON object, no markdown fences or extra text.\n- Include one entry in \"demos\" for each filename, in the same order.\n- \"file\" must exactly match the provided filename.\n- \"verdict\" must be exactly \"approve\" or \"request_changes\".\n- Use \"request_changes\" if there are any \"major\" issues.\n- \"severity\" must be exactly \"major\", \"minor\", or \"nit\".\n- \"major\": bugs, security issues, broken functionality, guideline violations.\n- \"minor\": code quality, readability, missing edge cases.\n- \"nit\": style, naming, trivial improvements.\n- \"highlights\" must have at least one entry.\n- \"issues\" can be an empty array if there are no issues.\n- Verify that demo steps demonstrate the acceptance criteria being met.`;\n}\n\nexport async function invokeClaude(\n prompt: string,\n options?: InvokeClaudeOptions,\n): Promise<string> {\n const spawnFn = options?.spawn ?? defaultSpawn;\n const agent = options?.agent ?? \"claude\";\n const proc = spawnFn([agent, \"-p\", prompt]);\n\n const reader = proc.stdout.getReader();\n const chunks: Uint8Array[] = [];\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const exitCode = await proc.exitCode;\n const output = new TextDecoder().decode(\n concatUint8Arrays(chunks),\n );\n\n if (exitCode !== 0) {\n throw new Error(\n `claude process exited with code ${exitCode}: ${output.trim()}`,\n );\n }\n\n return output.trim();\n}\n\nimport type { IssueSeverity, ReviewVerdict } from \"./review-types.ts\";\n\nexport interface LlmReviewResponse {\n demos: Array<{ file: string; summary: string }>;\n review: {\n summary: string;\n highlights: string[];\n verdict: ReviewVerdict;\n verdictReason: string;\n issues: Array<{ severity: IssueSeverity; description: string }>;\n };\n}\n\nconst VALID_VERDICTS: ReadonlySet<string> = new Set([\"approve\", \"request_changes\"]);\nconst VALID_SEVERITIES: ReadonlySet<string> = new Set([\"major\", \"minor\", \"nit\"]);\n\nexport function extractJson(raw: string): string {\n // Try raw string first\n try {\n JSON.parse(raw);\n return raw;\n } catch {\n // look for first { and last }\n }\n\n const start = raw.indexOf(\"{\");\n const end = raw.lastIndexOf(\"}\");\n if (start === -1 || end === -1 || end <= start) {\n throw new Error(`No JSON object found in LLM response: ${raw.slice(0, 200)}`);\n }\n\n return raw.slice(start, end + 1);\n}\n\nexport function parseLlmResponse(raw: string): LlmReviewResponse {\n const jsonStr = extractJson(raw);\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonStr);\n } catch {\n throw new Error(`Invalid JSON from LLM: ${raw.slice(0, 200)}`);\n }\n\n if (typeof parsed !== \"object\" || parsed === null || !(\"demos\" in parsed)) {\n throw new Error(\"Missing 'demos' array in review metadata\");\n }\n\n const obj = parsed as Record<string, unknown>;\n if (!Array.isArray(obj[\"demos\"])) {\n throw new Error(\"'demos' must be an array\");\n }\n\n for (const demo of obj[\"demos\"] as unknown[]) {\n if (typeof demo !== \"object\" || demo === null) {\n throw new Error(\"Each demo must be an object\");\n }\n const d = demo as Record<string, unknown>;\n\n if (typeof d[\"file\"] !== \"string\") {\n throw new Error(\"Each demo must have a 'file' string\");\n }\n if (typeof d[\"summary\"] !== \"string\") {\n throw new Error(\"Each demo must have a 'summary' string\");\n }\n }\n\n if (typeof obj[\"review\"] !== \"object\" || obj[\"review\"] === null) {\n throw new Error(\"Missing 'review' object in response\");\n }\n\n const review = obj[\"review\"] as Record<string, unknown>;\n\n if (typeof review[\"summary\"] !== \"string\") {\n throw new Error(\"review.summary must be a string\");\n }\n\n if (!Array.isArray(review[\"highlights\"])) {\n throw new Error(\"review.highlights must be an array\");\n }\n if (review[\"highlights\"].length === 0) {\n throw new Error(\"review.highlights must not be empty\");\n }\n for (const h of review[\"highlights\"]) {\n if (typeof h !== \"string\") {\n throw new Error(\"Each highlight must be a string\");\n }\n }\n\n if (typeof review[\"verdict\"] !== \"string\" || !VALID_VERDICTS.has(review[\"verdict\"])) {\n throw new Error(\"review.verdict must be 'approve' or 'request_changes'\");\n }\n\n if (typeof review[\"verdictReason\"] !== \"string\") {\n throw new Error(\"review.verdictReason must be a string\");\n }\n\n if (!Array.isArray(review[\"issues\"])) {\n throw new Error(\"review.issues must be an array\");\n }\n\n for (const issue of review[\"issues\"] as unknown[]) {\n if (typeof issue !== \"object\" || issue === null) {\n throw new Error(\"Each issue must be an object\");\n }\n const i = issue as Record<string, unknown>;\n if (typeof i[\"severity\"] !== \"string\" || !VALID_SEVERITIES.has(i[\"severity\"])) {\n throw new Error(\"Each issue severity must be 'major', 'minor', or 'nit'\");\n }\n if (typeof i[\"description\"] !== \"string\") {\n throw new Error(\"Each issue must have a 'description' string\");\n }\n }\n\n return parsed as LlmReviewResponse;\n}\n\nimport { spawn } from \"node:child_process\";\nimport { Readable } from \"node:stream\";\n\nfunction defaultSpawn(\n cmd: string[],\n): { exitCode: Promise<number>; stdout: ReadableStream<Uint8Array> } {\n const [command, ...args] = cmd;\n const proc = spawn(command!, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const exitCode = new Promise<number>((resolve) => {\n proc.on(\"close\", (code) => resolve(code ?? 1));\n });\n\n const stdout = Readable.toWeb(proc.stdout!) as unknown as ReadableStream<Uint8Array>;\n\n return { exitCode, stdout };\n}\n\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, a) => sum + a.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const a of arrays) {\n result.set(a, offset);\n offset += a.length;\n }\n return result;\n}\n",
7
+ "import { readFileSync } from \"node:fs\";\nimport { spawnSync } from \"node:child_process\";\n\nexport type ExecFn = (cmd: string[], cwd: string) => Promise<string>;\nexport type ReadFileFn = (path: string) => string;\n\nexport interface RepoContext {\n gitDiff: string;\n guidelines: string[];\n}\n\nexport interface GetRepoContextOptions {\n exec?: ExecFn;\n readFile?: ReadFileFn;\n diffBase?: string; // Base commit/branch for diff (auto-detected if not provided)\n}\n\nasync function detectDefaultBase(exec: ExecFn, gitRoot: string): Promise<string | null> {\n // Get current branch name\n let currentBranch: string;\n try {\n currentBranch = (await exec([\"git\", \"rev-parse\", \"--abbrev-ref\", \"HEAD\"], gitRoot)).trim();\n } catch {\n return null; // Detached HEAD or other issue\n }\n\n // If on main/master, no base to compare against\n if (currentBranch === \"main\" || currentBranch === \"master\") {\n return null;\n }\n\n // Try to find main or master as base\n for (const candidate of [\"main\", \"master\"]) {\n try {\n await exec([\"git\", \"rev-parse\", \"--verify\", candidate], gitRoot);\n return candidate;\n } catch {\n // Branch doesn't exist, try next\n }\n }\n\n return null;\n}\n\nconst defaultExec: ExecFn = async (cmd, cwd) => {\n const [command, ...args] = cmd;\n const proc = spawnSync(command!, args, { cwd, encoding: \"utf-8\" });\n if (proc.status !== 0) {\n const stderr = (proc.stderr ?? \"\").trim();\n throw new Error(`Command failed (exit ${proc.status}): ${cmd.join(\" \")}${stderr ? `: ${stderr}` : \"\"}`);\n }\n return proc.stdout ?? \"\";\n};\n\nconst defaultReadFile: ReadFileFn = (path) => {\n return readFileSync(path, \"utf-8\");\n};\n\nexport async function getRepoContext(\n demosDir: string,\n options?: GetRepoContextOptions,\n): Promise<RepoContext> {\n const exec = options?.exec ?? defaultExec;\n const readFile = options?.readFile ?? defaultReadFile;\n\n const gitRoot = (await exec([\"git\", \"rev-parse\", \"--show-toplevel\"], demosDir)).trim();\n\n // Determine the base for diff comparison\n const diffBase = options?.diffBase ?? await detectDefaultBase(exec, gitRoot);\n\n let gitDiff: string;\n if (diffBase) {\n // Use three-dot diff for merge-base comparison (shows changes on current branch)\n gitDiff = (await exec([\"git\", \"diff\", `${diffBase}...HEAD`], gitRoot)).trim();\n } else {\n // Fallback: worktree diff or last commit\n const workingDiff = (await exec([\"git\", \"diff\", \"HEAD\"], gitRoot)).trim();\n if (workingDiff.length > 0) {\n gitDiff = workingDiff;\n } else {\n gitDiff = (await exec([\"git\", \"diff\", \"HEAD~1..HEAD\"], gitRoot)).trim();\n }\n }\n\n const lsOutput = (await exec([\"git\", \"ls-files\"], gitRoot)).trim();\n const files = lsOutput.split(\"\\n\").filter((f) => f.length > 0);\n\n const guidelinePatterns = [\"CLAUDE.md\", \"SKILL.md\"];\n const guidelines: string[] = [];\n\n for (const file of files) {\n const basename = file.split(\"/\").pop() ?? \"\";\n if (guidelinePatterns.includes(basename)) {\n const fullPath = `${gitRoot}/${file}`;\n const content = readFile(fullPath);\n guidelines.push(`# ${file}\\n${content}`);\n }\n }\n\n return { gitDiff, guidelines };\n}\n",
8
+ "export function getUserAgent() {\n if (typeof navigator === \"object\" && \"userAgent\" in navigator) {\n return navigator.userAgent;\n }\n\n if (typeof process === \"object\" && process.version !== undefined) {\n return `Node.js/${process.version.substr(1)} (${process.platform}; ${\n process.arch\n })`;\n }\n\n return \"<environment undetectable>\";\n}\n",
9
+ "// pkg/dist-src/defaults.js\nimport { getUserAgent } from \"universal-user-agent\";\n\n// pkg/dist-src/version.js\nvar VERSION = \"0.0.0-development\";\n\n// pkg/dist-src/defaults.js\nvar userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`;\nvar DEFAULTS = {\n method: \"GET\",\n baseUrl: \"https://api.github.com\",\n headers: {\n accept: \"application/vnd.github.v3+json\",\n \"user-agent\": userAgent\n },\n mediaType: {\n format: \"\"\n }\n};\n\n// pkg/dist-src/util/lowercase-keys.js\nfunction lowercaseKeys(object) {\n if (!object) {\n return {};\n }\n return Object.keys(object).reduce((newObj, key) => {\n newObj[key.toLowerCase()] = object[key];\n return newObj;\n }, {});\n}\n\n// pkg/dist-src/util/is-plain-object.js\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null) return false;\n if (Object.prototype.toString.call(value) !== \"[object Object]\") return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null) return true;\n const Ctor = Object.prototype.hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n return typeof Ctor === \"function\" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);\n}\n\n// pkg/dist-src/util/merge-deep.js\nfunction mergeDeep(defaults, options) {\n const result = Object.assign({}, defaults);\n Object.keys(options).forEach((key) => {\n if (isPlainObject(options[key])) {\n if (!(key in defaults)) Object.assign(result, { [key]: options[key] });\n else result[key] = mergeDeep(defaults[key], options[key]);\n } else {\n Object.assign(result, { [key]: options[key] });\n }\n });\n return result;\n}\n\n// pkg/dist-src/util/remove-undefined-properties.js\nfunction removeUndefinedProperties(obj) {\n for (const key in obj) {\n if (obj[key] === void 0) {\n delete obj[key];\n }\n }\n return obj;\n}\n\n// pkg/dist-src/merge.js\nfunction merge(defaults, route, options) {\n if (typeof route === \"string\") {\n let [method, url] = route.split(\" \");\n options = Object.assign(url ? { method, url } : { url: method }, options);\n } else {\n options = Object.assign({}, route);\n }\n options.headers = lowercaseKeys(options.headers);\n removeUndefinedProperties(options);\n removeUndefinedProperties(options.headers);\n const mergedOptions = mergeDeep(defaults || {}, options);\n if (options.url === \"/graphql\") {\n if (defaults && defaults.mediaType.previews?.length) {\n mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(\n (preview) => !mergedOptions.mediaType.previews.includes(preview)\n ).concat(mergedOptions.mediaType.previews);\n }\n mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, \"\"));\n }\n return mergedOptions;\n}\n\n// pkg/dist-src/util/add-query-parameters.js\nfunction addQueryParameters(url, parameters) {\n const separator = /\\?/.test(url) ? \"&\" : \"?\";\n const names = Object.keys(parameters);\n if (names.length === 0) {\n return url;\n }\n return url + separator + names.map((name) => {\n if (name === \"q\") {\n return \"q=\" + parameters.q.split(\"+\").map(encodeURIComponent).join(\"+\");\n }\n return `${name}=${encodeURIComponent(parameters[name])}`;\n }).join(\"&\");\n}\n\n// pkg/dist-src/util/extract-url-variable-names.js\nvar urlVariableRegex = /\\{[^{}}]+\\}/g;\nfunction removeNonChars(variableName) {\n return variableName.replace(/(?:^\\W+)|(?:(?<!\\W)\\W+$)/g, \"\").split(/,/);\n}\nfunction extractUrlVariableNames(url) {\n const matches = url.match(urlVariableRegex);\n if (!matches) {\n return [];\n }\n return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);\n}\n\n// pkg/dist-src/util/omit.js\nfunction omit(object, keysToOmit) {\n const result = { __proto__: null };\n for (const key of Object.keys(object)) {\n if (keysToOmit.indexOf(key) === -1) {\n result[key] = object[key];\n }\n }\n return result;\n}\n\n// pkg/dist-src/util/url-template.js\nfunction encodeReserved(str) {\n return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {\n if (!/%[0-9A-Fa-f]/.test(part)) {\n part = encodeURI(part).replace(/%5B/g, \"[\").replace(/%5D/g, \"]\");\n }\n return part;\n }).join(\"\");\n}\nfunction encodeUnreserved(str) {\n return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {\n return \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\nfunction encodeValue(operator, value, key) {\n value = operator === \"+\" || operator === \"#\" ? encodeReserved(value) : encodeUnreserved(value);\n if (key) {\n return encodeUnreserved(key) + \"=\" + value;\n } else {\n return value;\n }\n}\nfunction isDefined(value) {\n return value !== void 0 && value !== null;\n}\nfunction isKeyOperator(operator) {\n return operator === \";\" || operator === \"&\" || operator === \"?\";\n}\nfunction getValues(context, operator, key, modifier) {\n var value = context[key], result = [];\n if (isDefined(value) && value !== \"\") {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n value = value.toString();\n if (modifier && modifier !== \"*\") {\n value = value.substring(0, parseInt(modifier, 10));\n }\n result.push(\n encodeValue(operator, value, isKeyOperator(operator) ? key : \"\")\n );\n } else {\n if (modifier === \"*\") {\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n result.push(\n encodeValue(operator, value2, isKeyOperator(operator) ? key : \"\")\n );\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n result.push(encodeValue(operator, value[k], k));\n }\n });\n }\n } else {\n const tmp = [];\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n tmp.push(encodeValue(operator, value2));\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n tmp.push(encodeUnreserved(k));\n tmp.push(encodeValue(operator, value[k].toString()));\n }\n });\n }\n if (isKeyOperator(operator)) {\n result.push(encodeUnreserved(key) + \"=\" + tmp.join(\",\"));\n } else if (tmp.length !== 0) {\n result.push(tmp.join(\",\"));\n }\n }\n }\n } else {\n if (operator === \";\") {\n if (isDefined(value)) {\n result.push(encodeUnreserved(key));\n }\n } else if (value === \"\" && (operator === \"&\" || operator === \"?\")) {\n result.push(encodeUnreserved(key) + \"=\");\n } else if (value === \"\") {\n result.push(\"\");\n }\n }\n return result;\n}\nfunction parseUrl(template) {\n return {\n expand: expand.bind(null, template)\n };\n}\nfunction expand(template, context) {\n var operators = [\"+\", \"#\", \".\", \"/\", \";\", \"?\", \"&\"];\n template = template.replace(\n /\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g,\n function(_, expression, literal) {\n if (expression) {\n let operator = \"\";\n const values = [];\n if (operators.indexOf(expression.charAt(0)) !== -1) {\n operator = expression.charAt(0);\n expression = expression.substr(1);\n }\n expression.split(/,/g).forEach(function(variable) {\n var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n });\n if (operator && operator !== \"+\") {\n var separator = \",\";\n if (operator === \"?\") {\n separator = \"&\";\n } else if (operator !== \"#\") {\n separator = operator;\n }\n return (values.length !== 0 ? operator : \"\") + values.join(separator);\n } else {\n return values.join(\",\");\n }\n } else {\n return encodeReserved(literal);\n }\n }\n );\n if (template === \"/\") {\n return template;\n } else {\n return template.replace(/\\/$/, \"\");\n }\n}\n\n// pkg/dist-src/parse.js\nfunction parse(options) {\n let method = options.method.toUpperCase();\n let url = (options.url || \"/\").replace(/:([a-z]\\w+)/g, \"{$1}\");\n let headers = Object.assign({}, options.headers);\n let body;\n let parameters = omit(options, [\n \"method\",\n \"baseUrl\",\n \"url\",\n \"headers\",\n \"request\",\n \"mediaType\"\n ]);\n const urlVariableNames = extractUrlVariableNames(url);\n url = parseUrl(url).expand(parameters);\n if (!/^http/.test(url)) {\n url = options.baseUrl + url;\n }\n const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat(\"baseUrl\");\n const remainingParameters = omit(parameters, omittedParameters);\n const isBinaryRequest = /application\\/octet-stream/i.test(headers.accept);\n if (!isBinaryRequest) {\n if (options.mediaType.format) {\n headers.accept = headers.accept.split(/,/).map(\n (format) => format.replace(\n /application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/,\n `application/vnd$1$2.${options.mediaType.format}`\n )\n ).join(\",\");\n }\n if (url.endsWith(\"/graphql\")) {\n if (options.mediaType.previews?.length) {\n const previewsFromAcceptHeader = headers.accept.match(/(?<![\\w-])[\\w-]+(?=-preview)/g) || [];\n headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map((preview) => {\n const format = options.mediaType.format ? `.${options.mediaType.format}` : \"+json\";\n return `application/vnd.github.${preview}-preview${format}`;\n }).join(\",\");\n }\n }\n }\n if ([\"GET\", \"HEAD\"].includes(method)) {\n url = addQueryParameters(url, remainingParameters);\n } else {\n if (\"data\" in remainingParameters) {\n body = remainingParameters.data;\n } else {\n if (Object.keys(remainingParameters).length) {\n body = remainingParameters;\n }\n }\n }\n if (!headers[\"content-type\"] && typeof body !== \"undefined\") {\n headers[\"content-type\"] = \"application/json; charset=utf-8\";\n }\n if ([\"PATCH\", \"PUT\"].includes(method) && typeof body === \"undefined\") {\n body = \"\";\n }\n return Object.assign(\n { method, url, headers },\n typeof body !== \"undefined\" ? { body } : null,\n options.request ? { request: options.request } : null\n );\n}\n\n// pkg/dist-src/endpoint-with-defaults.js\nfunction endpointWithDefaults(defaults, route, options) {\n return parse(merge(defaults, route, options));\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(oldDefaults, newDefaults) {\n const DEFAULTS2 = merge(oldDefaults, newDefaults);\n const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2);\n return Object.assign(endpoint2, {\n DEFAULTS: DEFAULTS2,\n defaults: withDefaults.bind(null, DEFAULTS2),\n merge: merge.bind(null, DEFAULTS2),\n parse\n });\n}\n\n// pkg/dist-src/index.js\nvar endpoint = withDefaults(null, DEFAULTS);\nexport {\n endpoint\n};\n",
10
+ "'use strict'\n\nconst NullObject = function NullObject () { }\nNullObject.prototype = Object.create(null)\n\n/**\n * RegExp to match *( \";\" parameter ) in RFC 7231 sec 3.1.1.1\n *\n * parameter = token \"=\" ( token / quoted-string )\n * token = 1*tchar\n * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" / \"*\"\n * / \"+\" / \"-\" / \".\" / \"^\" / \"_\" / \"`\" / \"|\" / \"~\"\n * / DIGIT / ALPHA\n * ; any VCHAR, except delimiters\n * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE\n * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text\n * obs-text = %x80-FF\n * quoted-pair = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n */\nconst paramRE = /; *([!#$%&'*+.^\\w`|~-]+)=(\"(?:[\\v\\u0020\\u0021\\u0023-\\u005b\\u005d-\\u007e\\u0080-\\u00ff]|\\\\[\\v\\u0020-\\u00ff])*\"|[!#$%&'*+.^\\w`|~-]+) */gu\n\n/**\n * RegExp to match quoted-pair in RFC 7230 sec 3.2.6\n *\n * quoted-pair = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n * obs-text = %x80-FF\n */\nconst quotedPairRE = /\\\\([\\v\\u0020-\\u00ff])/gu\n\n/**\n * RegExp to match type in RFC 7231 sec 3.1.1.1\n *\n * media-type = type \"/\" subtype\n * type = token\n * subtype = token\n */\nconst mediaTypeRE = /^[!#$%&'*+.^\\w|~-]+\\/[!#$%&'*+.^\\w|~-]+$/u\n\n// default ContentType to prevent repeated object creation\nconst defaultContentType = { type: '', parameters: new NullObject() }\nObject.freeze(defaultContentType.parameters)\nObject.freeze(defaultContentType)\n\n/**\n * Parse media type to object.\n *\n * @param {string|object} header\n * @return {Object}\n * @public\n */\n\nfunction parse (header) {\n if (typeof header !== 'string') {\n throw new TypeError('argument header is required and must be a string')\n }\n\n let index = header.indexOf(';')\n const type = index !== -1\n ? header.slice(0, index).trim()\n : header.trim()\n\n if (mediaTypeRE.test(type) === false) {\n throw new TypeError('invalid media type')\n }\n\n const result = {\n type: type.toLowerCase(),\n parameters: new NullObject()\n }\n\n // parse parameters\n if (index === -1) {\n return result\n }\n\n let key\n let match\n let value\n\n paramRE.lastIndex = index\n\n while ((match = paramRE.exec(header))) {\n if (match.index !== index) {\n throw new TypeError('invalid parameter format')\n }\n\n index += match[0].length\n key = match[1].toLowerCase()\n value = match[2]\n\n if (value[0] === '\"') {\n // remove quotes and escapes\n value = value\n .slice(1, value.length - 1)\n\n quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1'))\n }\n\n result.parameters[key] = value\n }\n\n if (index !== header.length) {\n throw new TypeError('invalid parameter format')\n }\n\n return result\n}\n\nfunction safeParse (header) {\n if (typeof header !== 'string') {\n return defaultContentType\n }\n\n let index = header.indexOf(';')\n const type = index !== -1\n ? header.slice(0, index).trim()\n : header.trim()\n\n if (mediaTypeRE.test(type) === false) {\n return defaultContentType\n }\n\n const result = {\n type: type.toLowerCase(),\n parameters: new NullObject()\n }\n\n // parse parameters\n if (index === -1) {\n return result\n }\n\n let key\n let match\n let value\n\n paramRE.lastIndex = index\n\n while ((match = paramRE.exec(header))) {\n if (match.index !== index) {\n return defaultContentType\n }\n\n index += match[0].length\n key = match[1].toLowerCase()\n value = match[2]\n\n if (value[0] === '\"') {\n // remove quotes and escapes\n value = value\n .slice(1, value.length - 1)\n\n quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1'))\n }\n\n result.parameters[key] = value\n }\n\n if (index !== header.length) {\n return defaultContentType\n }\n\n return result\n}\n\nmodule.exports.default = { parse, safeParse }\nmodule.exports.parse = parse\nmodule.exports.safeParse = safeParse\nmodule.exports.defaultContentType = defaultContentType\n",
11
+ "class RequestError extends Error {\n name;\n /**\n * http status code\n */\n status;\n /**\n * Request options that lead to the error.\n */\n request;\n /**\n * Response object if a response was received\n */\n response;\n constructor(message, statusCode, options) {\n super(message);\n this.name = \"HttpError\";\n this.status = Number.parseInt(statusCode);\n if (Number.isNaN(this.status)) {\n this.status = 0;\n }\n if (\"response\" in options) {\n this.response = options.response;\n }\n const requestCopy = Object.assign({}, options.request);\n if (options.request.headers.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(\n /(?<! ) .*$/,\n \" [REDACTED]\"\n )\n });\n }\n requestCopy.url = requestCopy.url.replace(/\\bclient_secret=\\w+/g, \"client_secret=[REDACTED]\").replace(/\\baccess_token=\\w+/g, \"access_token=[REDACTED]\");\n this.request = requestCopy;\n }\n}\nexport {\n RequestError\n};\n",
12
+ "// pkg/dist-src/index.js\nimport { endpoint } from \"@octokit/endpoint\";\n\n// pkg/dist-src/defaults.js\nimport { getUserAgent } from \"universal-user-agent\";\n\n// pkg/dist-src/version.js\nvar VERSION = \"9.2.4\";\n\n// pkg/dist-src/defaults.js\nvar defaults_default = {\n headers: {\n \"user-agent\": `octokit-request.js/${VERSION} ${getUserAgent()}`\n }\n};\n\n// pkg/dist-src/fetch-wrapper.js\nimport { safeParse } from \"fast-content-type-parse\";\n\n// pkg/dist-src/is-plain-object.js\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null) return false;\n if (Object.prototype.toString.call(value) !== \"[object Object]\") return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null) return true;\n const Ctor = Object.prototype.hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n return typeof Ctor === \"function\" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);\n}\n\n// pkg/dist-src/fetch-wrapper.js\nimport { RequestError } from \"@octokit/request-error\";\nasync function fetchWrapper(requestOptions) {\n const fetch = requestOptions.request?.fetch || globalThis.fetch;\n if (!fetch) {\n throw new Error(\n \"fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing\"\n );\n }\n const log = requestOptions.request?.log || console;\n const parseSuccessResponseBody = requestOptions.request?.parseSuccessResponseBody !== false;\n const body = isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body) ? JSON.stringify(requestOptions.body) : requestOptions.body;\n const requestHeaders = Object.fromEntries(\n Object.entries(requestOptions.headers).map(([name, value]) => [\n name,\n String(value)\n ])\n );\n let fetchResponse;\n try {\n fetchResponse = await fetch(requestOptions.url, {\n method: requestOptions.method,\n body,\n redirect: requestOptions.request?.redirect,\n headers: requestHeaders,\n signal: requestOptions.request?.signal,\n // duplex must be set if request.body is ReadableStream or Async Iterables.\n // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex.\n ...requestOptions.body && { duplex: \"half\" }\n });\n } catch (error) {\n let message = \"Unknown Error\";\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n error.status = 500;\n throw error;\n }\n message = error.message;\n if (error.name === \"TypeError\" && \"cause\" in error) {\n if (error.cause instanceof Error) {\n message = error.cause.message;\n } else if (typeof error.cause === \"string\") {\n message = error.cause;\n }\n }\n }\n const requestError = new RequestError(message, 500, {\n request: requestOptions\n });\n requestError.cause = error;\n throw requestError;\n }\n const status = fetchResponse.status;\n const url = fetchResponse.url;\n const responseHeaders = {};\n for (const [key, value] of fetchResponse.headers) {\n responseHeaders[key] = value;\n }\n const octokitResponse = {\n url,\n status,\n headers: responseHeaders,\n data: \"\"\n };\n if (\"deprecation\" in responseHeaders) {\n const matches = responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel=\"deprecation\"/);\n const deprecationLink = matches && matches.pop();\n log.warn(\n `[@octokit/request] \"${requestOptions.method} ${requestOptions.url}\" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : \"\"}`\n );\n }\n if (status === 204 || status === 205) {\n return octokitResponse;\n }\n if (requestOptions.method === \"HEAD\") {\n if (status < 400) {\n return octokitResponse;\n }\n throw new RequestError(fetchResponse.statusText, status, {\n response: octokitResponse,\n request: requestOptions\n });\n }\n if (status === 304) {\n octokitResponse.data = await getResponseData(fetchResponse);\n throw new RequestError(\"Not modified\", status, {\n response: octokitResponse,\n request: requestOptions\n });\n }\n if (status >= 400) {\n octokitResponse.data = await getResponseData(fetchResponse);\n throw new RequestError(toErrorMessage(octokitResponse.data), status, {\n response: octokitResponse,\n request: requestOptions\n });\n }\n octokitResponse.data = parseSuccessResponseBody ? await getResponseData(fetchResponse) : fetchResponse.body;\n return octokitResponse;\n}\nasync function getResponseData(response) {\n const contentType = response.headers.get(\"content-type\");\n if (!contentType) {\n return response.text().catch(() => \"\");\n }\n const mimetype = safeParse(contentType);\n if (isJSONResponse(mimetype)) {\n let text = \"\";\n try {\n text = await response.text();\n return JSON.parse(text);\n } catch (err) {\n return text;\n }\n } else if (mimetype.type.startsWith(\"text/\") || mimetype.parameters.charset?.toLowerCase() === \"utf-8\") {\n return response.text().catch(() => \"\");\n } else {\n return response.arrayBuffer().catch(() => new ArrayBuffer(0));\n }\n}\nfunction isJSONResponse(mimetype) {\n return mimetype.type === \"application/json\" || mimetype.type === \"application/scim+json\";\n}\nfunction toErrorMessage(data) {\n if (typeof data === \"string\") {\n return data;\n }\n if (data instanceof ArrayBuffer) {\n return \"Unknown error\";\n }\n if (\"message\" in data) {\n const suffix = \"documentation_url\" in data ? ` - ${data.documentation_url}` : \"\";\n return Array.isArray(data.errors) ? `${data.message}: ${data.errors.map((v) => JSON.stringify(v)).join(\", \")}${suffix}` : `${data.message}${suffix}`;\n }\n return `Unknown error: ${JSON.stringify(data)}`;\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(oldEndpoint, newDefaults) {\n const endpoint2 = oldEndpoint.defaults(newDefaults);\n const newApi = function(route, parameters) {\n const endpointOptions = endpoint2.merge(route, parameters);\n if (!endpointOptions.request || !endpointOptions.request.hook) {\n return fetchWrapper(endpoint2.parse(endpointOptions));\n }\n const request2 = (route2, parameters2) => {\n return fetchWrapper(\n endpoint2.parse(endpoint2.merge(route2, parameters2))\n );\n };\n Object.assign(request2, {\n endpoint: endpoint2,\n defaults: withDefaults.bind(null, endpoint2)\n });\n return endpointOptions.request.hook(request2, endpointOptions);\n };\n return Object.assign(newApi, {\n endpoint: endpoint2,\n defaults: withDefaults.bind(null, endpoint2)\n });\n}\n\n// pkg/dist-src/index.js\nvar request = withDefaults(endpoint, defaults_default);\nexport {\n request\n};\n",
13
+ "// pkg/dist-src/index.js\nimport { request } from \"@octokit/request\";\nimport { getUserAgent } from \"universal-user-agent\";\n\n// pkg/dist-src/version.js\nvar VERSION = \"0.0.0-development\";\n\n// pkg/dist-src/with-defaults.js\nimport { request as Request2 } from \"@octokit/request\";\n\n// pkg/dist-src/graphql.js\nimport { request as Request } from \"@octokit/request\";\n\n// pkg/dist-src/error.js\nfunction _buildMessageForResponseErrors(data) {\n return `Request failed due to following response errors:\n` + data.errors.map((e) => ` - ${e.message}`).join(\"\\n\");\n}\nvar GraphqlResponseError = class extends Error {\n constructor(request2, headers, response) {\n super(_buildMessageForResponseErrors(response));\n this.request = request2;\n this.headers = headers;\n this.response = response;\n this.errors = response.errors;\n this.data = response.data;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n name = \"GraphqlResponseError\";\n errors;\n data;\n};\n\n// pkg/dist-src/graphql.js\nvar NON_VARIABLE_OPTIONS = [\n \"method\",\n \"baseUrl\",\n \"url\",\n \"headers\",\n \"request\",\n \"query\",\n \"mediaType\",\n \"operationName\"\n];\nvar FORBIDDEN_VARIABLE_OPTIONS = [\"query\", \"method\", \"url\"];\nvar GHES_V3_SUFFIX_REGEX = /\\/api\\/v3\\/?$/;\nfunction graphql(request2, query, options) {\n if (options) {\n if (typeof query === \"string\" && \"query\" in options) {\n return Promise.reject(\n new Error(`[@octokit/graphql] \"query\" cannot be used as variable name`)\n );\n }\n for (const key in options) {\n if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue;\n return Promise.reject(\n new Error(\n `[@octokit/graphql] \"${key}\" cannot be used as variable name`\n )\n );\n }\n }\n const parsedOptions = typeof query === \"string\" ? Object.assign({ query }, options) : query;\n const requestOptions = Object.keys(\n parsedOptions\n ).reduce((result, key) => {\n if (NON_VARIABLE_OPTIONS.includes(key)) {\n result[key] = parsedOptions[key];\n return result;\n }\n if (!result.variables) {\n result.variables = {};\n }\n result.variables[key] = parsedOptions[key];\n return result;\n }, {});\n const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl;\n if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {\n requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, \"/api/graphql\");\n }\n return request2(requestOptions).then((response) => {\n if (response.data.errors) {\n const headers = {};\n for (const key of Object.keys(response.headers)) {\n headers[key] = response.headers[key];\n }\n throw new GraphqlResponseError(\n requestOptions,\n headers,\n response.data\n );\n }\n return response.data.data;\n });\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(request2, newDefaults) {\n const newRequest = request2.defaults(newDefaults);\n const newApi = (query, options) => {\n return graphql(newRequest, query, options);\n };\n return Object.assign(newApi, {\n defaults: withDefaults.bind(null, newRequest),\n endpoint: newRequest.endpoint\n });\n}\n\n// pkg/dist-src/index.js\nvar graphql2 = withDefaults(request, {\n headers: {\n \"user-agent\": `octokit-graphql.js/${VERSION} ${getUserAgent()}`\n },\n method: \"POST\",\n url: \"/graphql\"\n});\nfunction withCustomRequest(customRequest) {\n return withDefaults(customRequest, {\n method: \"POST\",\n url: \"/graphql\"\n });\n}\nexport {\n GraphqlResponseError,\n graphql2 as graphql,\n withCustomRequest\n};\n",
14
+ "import { graphql as defaultGraphql } from \"@octokit/graphql\";\nimport { spawnSync } from \"node:child_process\";\n\nexport interface GitHubIssue {\n number: number;\n title: string;\n body: string;\n labels: string[];\n state: string;\n}\n\ninterface GitHubIssueGraphQLResponse {\n repository: {\n issue: {\n number: number;\n title: string;\n body: string;\n state: string;\n labels: {\n nodes: Array<{ name: string }>;\n };\n };\n };\n}\n\nexport type GraphQLFn = typeof defaultGraphql;\n\nexport interface FetchGitHubIssueOptions {\n graphql?: GraphQLFn;\n owner?: string;\n repo?: string;\n token?: string;\n}\n\nconst ISSUE_QUERY = `\n query($owner: String!, $repo: String!, $number: Int!) {\n repository(owner: $owner, name: $repo) {\n issue(number: $number) {\n number\n title\n body\n state\n labels(first: 20) {\n nodes {\n name\n }\n }\n }\n }\n }\n`;\n\nfunction getRepoInfoFromGit(): { owner: string; repo: string } | null {\n try {\n const proc = spawnSync(\"git\", [\"remote\", \"get-url\", \"origin\"], { encoding: \"utf-8\" });\n if (proc.status !== 0 || !proc.stdout) {\n return null;\n }\n\n const url = proc.stdout.trim();\n // Handle SSH format: git@github.com:owner/repo.git\n const sshMatch = url.match(/git@github\\.com:([^/]+)\\/(.+?)(?:\\.git)?$/);\n if (sshMatch) {\n return { owner: sshMatch[1]!, repo: sshMatch[2]! };\n }\n\n // Handle HTTPS format: https://github.com/owner/repo.git\n const httpsMatch = url.match(/https:\\/\\/github\\.com\\/([^/]+)\\/(.+?)(?:\\.git)?$/);\n if (httpsMatch) {\n return { owner: httpsMatch[1]!, repo: httpsMatch[2]! };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nfunction getTokenFromEnvironment(): string | null {\n return process.env[\"GITHUB_TOKEN\"] ?? process.env[\"GH_TOKEN\"] ?? null;\n}\n\nexport async function fetchGitHubIssue(\n issueId: string | number,\n options?: FetchGitHubIssueOptions,\n): Promise<GitHubIssue> {\n const issueNumber = typeof issueId === \"string\" ? parseInt(issueId, 10) : issueId;\n if (isNaN(issueNumber)) {\n throw new Error(`Invalid issue ID: ${issueId}`);\n }\n\n // Get owner/repo from options or detect from git\n let owner = options?.owner;\n let repo = options?.repo;\n\n if (!owner || !repo) {\n const detected = getRepoInfoFromGit();\n if (!detected) {\n throw new Error(\n \"Could not detect repository owner/name from git remote. \" +\n \"Please provide owner and repo options, or run from a git repository with a GitHub origin.\"\n );\n }\n owner = owner ?? detected.owner;\n repo = repo ?? detected.repo;\n }\n\n // Get token from options or environment\n const token = options?.token ?? getTokenFromEnvironment();\n if (!token) {\n throw new Error(\n \"No GitHub token found. Please set GITHUB_TOKEN or GH_TOKEN environment variable, \" +\n \"or provide token in options.\"\n );\n }\n\n // Use provided graphql function or create one with the token\n const graphqlFn = options?.graphql ?? defaultGraphql.defaults({\n headers: {\n authorization: `token ${token}`,\n },\n });\n\n const response = await graphqlFn<GitHubIssueGraphQLResponse>(ISSUE_QUERY, {\n owner,\n repo,\n number: issueNumber,\n });\n\n const issue = response.repository.issue;\n\n return {\n number: issue.number,\n title: issue.title,\n body: issue.body ?? \"\",\n labels: issue.labels.nodes.map((l: { name: string }) => l.name),\n state: issue.state.toLowerCase(),\n };\n}\n",
15
+ "import { mkdirSync, existsSync, writeFileSync, readFileSync } from \"node:fs\";\nimport { join, dirname as pathDirname } from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\n\nimport type { SpawnFn } from \"./review.ts\";\nimport { invokeClaude, parseLlmResponse } from \"./review.ts\";\nimport { getRepoContext, type ExecFn } from \"./git-context.ts\";\nimport { fetchGitHubIssue, type GitHubIssue, type FetchGitHubIssueOptions } from \"./github-issue.ts\";\nimport {\n discoverDemoFiles,\n generateReviewHtml,\n type ReviewAppData,\n type DemoFile,\n} from \"./review-generator.ts\";\nimport type { ReviewMetadata, DemoType } from \"./review-types.ts\";\n\nexport interface OrchestratorOptions {\n issueId: string | number;\n issue?: GitHubIssue; // Pre-loaded issue (skips GitHub API fetch)\n diffBase?: string;\n agent?: string;\n feedbackEndpoint?: string; // URL for feedback submission (enables MCP integration)\n spawn?: SpawnFn;\n exec?: ExecFn;\n cwd?: string;\n github?: FetchGitHubIssueOptions;\n}\n\nexport interface OrchestratorResult {\n reviewFolder: string;\n htmlPath: string;\n metadataPath: string;\n metadata: ReviewMetadata;\n issue: GitHubIssue;\n}\n\nconst GIT_DIFF_MAX_CHARS = 50_000;\n\nconst defaultExec: ExecFn = async (cmd: string[], cwd: string) => {\n const [command, ...args] = cmd;\n const proc = spawnSync(command!, args, { cwd, encoding: \"utf-8\" });\n if (proc.status !== 0) {\n const stderr = (proc.stderr ?? \"\").trim();\n throw new Error(`Command failed (exit ${proc.status}): ${cmd.join(\" \")}${stderr ? `: ${stderr}` : \"\"}`);\n }\n return proc.stdout ?? \"\";\n};\n\nasync function getGitRoot(exec: ExecFn, cwd: string): Promise<string> {\n return (await exec([\"git\", \"rev-parse\", \"--show-toplevel\"], cwd)).trim();\n}\n\nasync function getCurrentBranch(exec: ExecFn, cwd: string): Promise<string> {\n const branch = (await exec([\"git\", \"branch\", \"--show-current\"], cwd)).trim();\n return branch.replace(/\\//g, \"-\") || \"unknown\";\n}\n\nexport function buildPresenterPrompt(options: {\n issue: GitHubIssue;\n gitDiff: string;\n guidelines: string[];\n reviewFolder: string;\n assetsFolder: string;\n testsFolder: string;\n}): string {\n const { issue, gitDiff, guidelines, reviewFolder, assetsFolder, testsFolder } = options;\n\n let diff = gitDiff;\n if (diff.length > GIT_DIFF_MAX_CHARS) {\n diff = diff.slice(0, GIT_DIFF_MAX_CHARS) + \"\\n\\n... (diff truncated at 50k characters)\";\n }\n\n const sections: string[] = [];\n\n sections.push(`## GitHub Issue #${issue.number}: ${issue.title}\\n\\n${issue.body}`);\n\n if (guidelines.length > 0) {\n sections.push(`## Coding Guidelines\\n\\n${guidelines.join(\"\\n\\n\")}`);\n }\n\n sections.push(`## Git Diff\\n\\n\\`\\`\\`diff\\n${diff}\\n\\`\\`\\``);\n\n return `You are a demo presenter. You must create demo recordings that showcase the feature described in the GitHub issue.\n\n${sections.join(\"\\n\\n\")}\n\n## Configuration\n\n- **Review Folder:** ${reviewFolder}\n- **Assets Directory:** ${assetsFolder}\n- **Tests Directory:** ${testsFolder}\n\n## Task\n\nBased on the GitHub issue and git diff above, create demo recordings that demonstrate each acceptance criterion is met.\n\nFor web-ux demos:\n- Create Playwright test files in the Tests Directory\n- Use DemoRecorder to capture steps\n- Save recordings to the Assets Directory\n\nFor log-based demos:\n- Create .jsonl files directly in the Assets Directory\n- Use demon__highlight annotations for key lines\n\nAfter creating demos, report:\n1. List of demo test files created (paths to .demo.ts files)\n2. List of artifact files generated (.webm for web-ux, .jsonl for log-based)\n3. Any errors encountered`;\n}\n\nexport function buildReviewerPrompt(options: {\n issue: GitHubIssue;\n gitDiff: string;\n guidelines: string[];\n demoFiles: DemoFile[];\n stepsMap: Record<string, Array<{ text: string; timestampSeconds: number }>>;\n logsMap: Record<string, string>;\n}): string {\n const { issue, gitDiff, guidelines, demoFiles, stepsMap, logsMap } = options;\n\n let diff = gitDiff;\n if (diff.length > GIT_DIFF_MAX_CHARS) {\n diff = diff.slice(0, GIT_DIFF_MAX_CHARS) + \"\\n\\n... (diff truncated at 50k characters)\";\n }\n\n const sections: string[] = [];\n\n sections.push(`## GitHub Issue #${issue.number}: ${issue.title}\\n\\n${issue.body}`);\n\n if (guidelines.length > 0) {\n sections.push(`## Coding Guidelines\\n\\n${guidelines.join(\"\\n\\n\")}`);\n }\n\n sections.push(`## Git Diff\\n\\n\\`\\`\\`diff\\n${diff}\\n\\`\\`\\``);\n\n const demoEntries = demoFiles.map((f) => {\n if (f.type === \"web-ux\") {\n const steps = stepsMap[f.filename] ?? stepsMap[f.relativePath] ?? [];\n const stepLines = steps\n .map((s) => `- [${s.timestampSeconds}s] ${s.text}`)\n .join(\"\\n\");\n return `Video: ${f.relativePath}\\nRecorded steps:\\n${stepLines || \"(no steps recorded)\"}`;\n } else {\n const logContent = logsMap[f.relativePath] ?? \"\";\n const preview = logContent.split(\"\\n\").slice(0, 20).join(\"\\n\");\n return `Log: ${f.relativePath}\\nContent preview:\\n${preview}`;\n }\n });\n\n sections.push(`## Demo Recordings\\n\\n${demoEntries.join(\"\\n\\n\")}`);\n\n return `You are a code reviewer. You are given a GitHub issue, git diff, coding guidelines, and demo recordings that show the feature in action.\n\n${sections.join(\"\\n\\n\")}\n\n## Task\n\nReview the code changes and demo recordings against the GitHub issue's acceptance criteria. Generate a JSON object matching this exact schema:\n\n{\n \"demos\": [\n {\n \"file\": \"<filename>\",\n \"summary\": \"<a meaningful sentence describing what this demo showcases based on the steps>\"\n }\n ],\n \"review\": {\n \"summary\": \"<2-3 sentence overview of the changes>\",\n \"highlights\": [\"<positive aspect 1>\", \"<positive aspect 2>\"],\n \"verdict\": \"approve\" | \"request_changes\",\n \"verdictReason\": \"<one sentence justifying the verdict>\",\n \"issues\": [\n {\n \"severity\": \"major\" | \"minor\" | \"nit\",\n \"description\": \"<what the issue is and how to fix it>\"\n }\n ]\n }\n}\n\nRules:\n- Return ONLY the JSON object, no markdown fences or extra text.\n- Include one entry in \"demos\" for each demo file, in the same order.\n- \"file\" must exactly match the provided relative path.\n- \"verdict\" must be exactly \"approve\" or \"request_changes\".\n- Use \"request_changes\" if acceptance criteria from the issue are not demonstrated.\n- \"severity\" must be exactly \"major\", \"minor\", or \"nit\".\n- \"major\": bugs, security issues, broken functionality, missing acceptance criteria.\n- \"minor\": code quality, readability, missing edge cases.\n- \"nit\": style, naming, trivial improvements.\n- \"highlights\" must have at least one entry.\n- \"issues\" can be an empty array if there are no issues.\n- Verify that demo steps demonstrate ALL acceptance criteria from the issue.`;\n}\n\nfunction collectDemoData(\n demoFiles: DemoFile[],\n): {\n stepsMapByFilename: Record<string, Array<{ text: string; timestampSeconds: number }>>;\n stepsMapByRelativePath: Record<string, Array<{ text: string; timestampSeconds: number }>>;\n logsMap: Record<string, string>;\n} {\n const stepsMapByFilename: Record<string, Array<{ text: string; timestampSeconds: number }>> = {};\n const stepsMapByRelativePath: Record<string, Array<{ text: string; timestampSeconds: number }>> = {};\n const logsMap: Record<string, string> = {};\n\n for (const demo of demoFiles) {\n if (demo.type === \"web-ux\") {\n const stepsPath = join(pathDirname(demo.path), \"demo-steps.json\");\n if (existsSync(stepsPath)) {\n try {\n const raw = readFileSync(stepsPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n stepsMapByFilename[demo.filename] = parsed;\n stepsMapByRelativePath[demo.relativePath] = parsed;\n }\n } catch {\n // skip malformed\n }\n }\n } else {\n logsMap[demo.relativePath] = readFileSync(demo.path, \"utf-8\");\n }\n }\n\n return { stepsMapByFilename, stepsMapByRelativePath, logsMap };\n}\n\nexport async function runReviewOrchestration(\n options: OrchestratorOptions,\n): Promise<OrchestratorResult> {\n const exec = options.exec ?? defaultExec;\n const cwd = options.cwd ?? process.cwd();\n\n // 1. Fetch GitHub issue (or use pre-loaded issue)\n const issue = options.issue ?? await fetchGitHubIssue(options.issueId, options.github);\n\n // 2. Get repo context (git diff + guidelines)\n const gitRoot = await getGitRoot(exec, cwd);\n const branchName = await getCurrentBranch(exec, cwd);\n\n const repoContext = await getRepoContext(gitRoot, {\n exec,\n diffBase: options.diffBase,\n });\n\n // 3. Create review folder structure\n const reviewFolder = join(gitRoot, \".demoon\", \"reviews\", branchName);\n const assetsFolder = join(reviewFolder, \"assets\");\n const testsFolder = join(reviewFolder, \"tests\");\n\n if (!existsSync(reviewFolder)) {\n mkdirSync(reviewFolder, { recursive: true });\n }\n if (!existsSync(assetsFolder)) {\n mkdirSync(assetsFolder, { recursive: true });\n }\n if (!existsSync(testsFolder)) {\n mkdirSync(testsFolder, { recursive: true });\n }\n\n // 4. Run Presenter phase\n const presenterPrompt = buildPresenterPrompt({\n issue,\n gitDiff: repoContext.gitDiff,\n guidelines: repoContext.guidelines,\n reviewFolder,\n assetsFolder,\n testsFolder,\n });\n\n await invokeClaude(presenterPrompt, { agent: options.agent, spawn: options.spawn });\n\n // 5. Discover generated demos\n const demoFiles = discoverDemoFiles(assetsFolder);\n\n if (demoFiles.length === 0) {\n throw new Error(`No demo files (.webm or .jsonl) found in ${assetsFolder} after Presenter phase`);\n }\n\n // 6. Collect demo data (steps, logs)\n const { stepsMapByFilename, stepsMapByRelativePath, logsMap } = collectDemoData(\n demoFiles,\n );\n\n // 7. Run Reviewer phase\n const reviewerPrompt = buildReviewerPrompt({\n issue,\n gitDiff: repoContext.gitDiff,\n guidelines: repoContext.guidelines,\n demoFiles,\n stepsMap: stepsMapByFilename,\n logsMap,\n });\n\n const rawOutput = await invokeClaude(reviewerPrompt, { agent: options.agent, spawn: options.spawn });\n const llmResponse = parseLlmResponse(rawOutput);\n\n // 8. Build metadata\n const filenameToRelativePath = new Map(demoFiles.map((d) => [d.filename, d.relativePath]));\n const typeMap = new Map<string, DemoType>(demoFiles.map((d) => [d.filename, d.type]));\n\n const metadata: ReviewMetadata = {\n demos: llmResponse.demos.map((demo) => {\n const relativePath = filenameToRelativePath.get(demo.file) ?? demo.file;\n return {\n file: relativePath,\n type: typeMap.get(demo.file) ?? \"web-ux\",\n summary: demo.summary,\n steps: stepsMapByRelativePath[relativePath] ?? [],\n };\n }),\n review: llmResponse.review,\n };\n\n // 9. Write metadata and HTML\n const metadataPath = join(assetsFolder, \"review-metadata.json\");\n writeFileSync(metadataPath, JSON.stringify(metadata, null, 2) + \"\\n\");\n\n const appData: ReviewAppData = {\n metadata,\n title: `Review: Issue #${issue.number} - ${issue.title}`,\n videos: {},\n logs: Object.keys(logsMap).length > 0 ? logsMap : undefined,\n feedbackEndpoint: options.feedbackEndpoint,\n };\n\n const html = generateReviewHtml(appData);\n const htmlPath = join(assetsFolder, \"review.html\");\n writeFileSync(htmlPath, html);\n\n return {\n reviewFolder,\n htmlPath,\n metadataPath,\n metadata,\n issue,\n };\n}\n",
6
16
  "import type { Page } from \"@playwright/test\";\n\nexport interface ShowCommentaryOptions {\n selector: string;\n text: string;\n}\n\nconst TOOLTIP_ID = \"demon-commentary-tooltip\";\n\nexport async function showCommentary(\n page: Page,\n options: ShowCommentaryOptions,\n): Promise<void> {\n await page.evaluate(\n ({ selector, text, tooltipId }) => {\n const target = document.querySelector(selector);\n if (!target) {\n throw new Error(\n `demon commentary: element not found for selector \"${selector}\"`,\n );\n }\n\n // Remove any existing tooltip\n document.getElementById(tooltipId)?.remove();\n\n const rect = target.getBoundingClientRect();\n\n const tooltip = document.createElement(\"div\");\n tooltip.id = tooltipId;\n tooltip.textContent = text;\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-demon-commentary\", \"\");\n style.textContent = `\n @keyframes demon-commentary-in {\n from {\n opacity: 0;\n transform: translateY(var(--demon-slide-y, 8px));\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @keyframes demon-commentary-out {\n from {\n opacity: 1;\n transform: translateY(0);\n }\n to {\n opacity: 0;\n transform: translateY(var(--demon-slide-y, 8px));\n }\n }\n #${tooltipId} {\n --demon-slide-y: 8px;\n position: fixed;\n z-index: 2147483647;\n background: #1a1a2e;\n color: #eee;\n padding: 8px 14px;\n border-radius: 6px;\n font: 14px/1.4 system-ui, sans-serif;\n max-width: 320px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\n pointer-events: none;\n animation: demon-commentary-in 0.3s ease-out forwards;\n }\n #${tooltipId}.demon-commentary-hiding {\n animation: demon-commentary-out 0.25s ease-in forwards;\n }\n `;\n\n // Remove previous style if any\n document.querySelector(\"style[data-demon-commentary]\")?.remove();\n document.head.appendChild(style);\n\n // Append hidden to measure real dimensions\n tooltip.style.visibility = \"hidden\";\n document.body.appendChild(tooltip);\n const tooltipRect = tooltip.getBoundingClientRect();\n const tooltipWidth = tooltipRect.width;\n const tooltipHeight = tooltipRect.height;\n const viewportWidth = window.innerWidth;\n\n // Vertical: default below target, flip above if overflowing bottom\n let top = rect.bottom + 10;\n if (\n top + tooltipHeight > window.innerHeight &&\n rect.top - 10 - tooltipHeight >= 0\n ) {\n top = rect.top - 10 - tooltipHeight;\n tooltip.style.setProperty(\"--demon-slide-y\", \"-8px\");\n }\n\n // Horizontal: centered, clamped to viewport\n const left = Math.max(\n 4,\n Math.min(\n rect.left + rect.width / 2 - tooltipWidth / 2,\n viewportWidth - 4 - tooltipWidth,\n ),\n );\n\n tooltip.style.top = `${top}px`;\n tooltip.style.left = `${left}px`;\n tooltip.style.visibility = \"\";\n },\n { selector: options.selector, text: options.text, tooltipId: TOOLTIP_ID },\n );\n}\n\nexport async function hideCommentary(page: Page): Promise<void> {\n await page.evaluate((tooltipId) => {\n const tooltip = document.getElementById(tooltipId);\n if (!tooltip) return;\n\n tooltip.classList.add(\"demon-commentary-hiding\");\n\n tooltip.addEventListener(\n \"animationend\",\n () => {\n tooltip.remove();\n document.querySelector(\"style[data-demon-commentary]\")?.remove();\n },\n { once: true },\n );\n }, TOOLTIP_ID);\n\n // Wait for the animate-out to complete\n await page.waitForTimeout(300);\n}\n",
7
- "export type SpawnFn = (\n cmd: string[],\n) => { exitCode: Promise<number>; stdout: ReadableStream<Uint8Array> };\n\nexport interface InvokeClaudeOptions {\n agent?: string;\n spawn?: SpawnFn;\n}\n\nconst GIT_DIFF_MAX_CHARS = 50_000;\n\nexport interface BuildReviewPromptOptions {\n filenames: string[];\n stepsMap: Record<string, Array<{ text: string; timestampSeconds: number }>>;\n gitDiff?: string;\n guidelines?: string[];\n}\n\nexport function buildReviewPrompt(options: BuildReviewPromptOptions): string {\n const { filenames, stepsMap, gitDiff, guidelines } = options;\n\n const demoEntries = filenames.map((f) => {\n const steps = stepsMap[f] ?? [];\n const stepLines = steps\n .map((s) => `- [${s.timestampSeconds}s] ${s.text}`)\n .join(\"\\n\");\n return `Video: ${f}\\nRecorded steps:\\n${stepLines || \"(no steps recorded)\"}`;\n });\n\n const sections: string[] = [];\n\n if (guidelines && guidelines.length > 0) {\n sections.push(`## Coding Guidelines\\n\\n${guidelines.join(\"\\n\\n\")}`);\n }\n\n if (gitDiff) {\n let diff = gitDiff;\n if (diff.length > GIT_DIFF_MAX_CHARS) {\n diff = diff.slice(0, GIT_DIFF_MAX_CHARS) + \"\\n\\n... (diff truncated at 50k characters)\";\n }\n sections.push(`## Git Diff\\n\\n\\`\\`\\`diff\\n${diff}\\n\\`\\`\\``);\n }\n\n sections.push(`## Demo Recordings\\n\\n${demoEntries.join(\"\\n\\n\")}`);\n\n return `You are a code reviewer. You are given a git diff, coding guidelines, and demo recordings that show the feature in action.\n\n${sections.join(\"\\n\\n\")}\n\n## Task\n\nReview the code changes and demo recordings. Generate a JSON object matching this exact schema:\n\n{\n \"demos\": [\n {\n \"file\": \"<filename>\",\n \"summary\": \"<a meaningful sentence describing what this demo showcases based on the steps>\"\n }\n ],\n \"review\": {\n \"summary\": \"<2-3 sentence overview of the changes>\",\n \"highlights\": [\"<positive aspect 1>\", \"<positive aspect 2>\"],\n \"verdict\": \"approve\" | \"request_changes\",\n \"verdictReason\": \"<one sentence justifying the verdict>\",\n \"issues\": [\n {\n \"severity\": \"major\" | \"minor\" | \"nit\",\n \"description\": \"<what the issue is and how to fix it>\"\n }\n ]\n }\n}\n\nRules:\n- Return ONLY the JSON object, no markdown fences or extra text.\n- Include one entry in \"demos\" for each filename, in the same order.\n- \"file\" must exactly match the provided filename.\n- \"verdict\" must be exactly \"approve\" or \"request_changes\".\n- Use \"request_changes\" if there are any \"major\" issues.\n- \"severity\" must be exactly \"major\", \"minor\", or \"nit\".\n- \"major\": bugs, security issues, broken functionality, guideline violations.\n- \"minor\": code quality, readability, missing edge cases.\n- \"nit\": style, naming, trivial improvements.\n- \"highlights\" must have at least one entry.\n- \"issues\" can be an empty array if there are no issues.\n- Verify that demo steps demonstrate the acceptance criteria being met.`;\n}\n\nexport async function invokeClaude(\n prompt: string,\n options?: InvokeClaudeOptions,\n): Promise<string> {\n const spawnFn = options?.spawn ?? defaultSpawn;\n const agent = options?.agent ?? \"claude\";\n const proc = spawnFn([agent, \"-p\", prompt]);\n\n const reader = proc.stdout.getReader();\n const chunks: Uint8Array[] = [];\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const exitCode = await proc.exitCode;\n const output = new TextDecoder().decode(\n concatUint8Arrays(chunks),\n );\n\n if (exitCode !== 0) {\n throw new Error(\n `claude process exited with code ${exitCode}: ${output.trim()}`,\n );\n }\n\n return output.trim();\n}\n\nimport type { IssueSeverity, ReviewVerdict } from \"./review-types.ts\";\n\nexport interface LlmReviewResponse {\n demos: Array<{ file: string; summary: string }>;\n review: {\n summary: string;\n highlights: string[];\n verdict: ReviewVerdict;\n verdictReason: string;\n issues: Array<{ severity: IssueSeverity; description: string }>;\n };\n}\n\nconst VALID_VERDICTS: ReadonlySet<string> = new Set([\"approve\", \"request_changes\"]);\nconst VALID_SEVERITIES: ReadonlySet<string> = new Set([\"major\", \"minor\", \"nit\"]);\n\nexport function extractJson(raw: string): string {\n // Try raw string first\n try {\n JSON.parse(raw);\n return raw;\n } catch {\n // look for first { and last }\n }\n\n const start = raw.indexOf(\"{\");\n const end = raw.lastIndexOf(\"}\");\n if (start === -1 || end === -1 || end <= start) {\n throw new Error(`No JSON object found in LLM response: ${raw.slice(0, 200)}`);\n }\n\n return raw.slice(start, end + 1);\n}\n\nexport function parseLlmResponse(raw: string): LlmReviewResponse {\n const jsonStr = extractJson(raw);\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonStr);\n } catch {\n throw new Error(`Invalid JSON from LLM: ${raw.slice(0, 200)}`);\n }\n\n if (typeof parsed !== \"object\" || parsed === null || !(\"demos\" in parsed)) {\n throw new Error(\"Missing 'demos' array in review metadata\");\n }\n\n const obj = parsed as Record<string, unknown>;\n if (!Array.isArray(obj[\"demos\"])) {\n throw new Error(\"'demos' must be an array\");\n }\n\n for (const demo of obj[\"demos\"] as unknown[]) {\n if (typeof demo !== \"object\" || demo === null) {\n throw new Error(\"Each demo must be an object\");\n }\n const d = demo as Record<string, unknown>;\n\n if (typeof d[\"file\"] !== \"string\") {\n throw new Error(\"Each demo must have a 'file' string\");\n }\n if (typeof d[\"summary\"] !== \"string\") {\n throw new Error(\"Each demo must have a 'summary' string\");\n }\n }\n\n if (typeof obj[\"review\"] !== \"object\" || obj[\"review\"] === null) {\n throw new Error(\"Missing 'review' object in response\");\n }\n\n const review = obj[\"review\"] as Record<string, unknown>;\n\n if (typeof review[\"summary\"] !== \"string\") {\n throw new Error(\"review.summary must be a string\");\n }\n\n if (!Array.isArray(review[\"highlights\"])) {\n throw new Error(\"review.highlights must be an array\");\n }\n if (review[\"highlights\"].length === 0) {\n throw new Error(\"review.highlights must not be empty\");\n }\n for (const h of review[\"highlights\"]) {\n if (typeof h !== \"string\") {\n throw new Error(\"Each highlight must be a string\");\n }\n }\n\n if (typeof review[\"verdict\"] !== \"string\" || !VALID_VERDICTS.has(review[\"verdict\"])) {\n throw new Error(\"review.verdict must be 'approve' or 'request_changes'\");\n }\n\n if (typeof review[\"verdictReason\"] !== \"string\") {\n throw new Error(\"review.verdictReason must be a string\");\n }\n\n if (!Array.isArray(review[\"issues\"])) {\n throw new Error(\"review.issues must be an array\");\n }\n\n for (const issue of review[\"issues\"] as unknown[]) {\n if (typeof issue !== \"object\" || issue === null) {\n throw new Error(\"Each issue must be an object\");\n }\n const i = issue as Record<string, unknown>;\n if (typeof i[\"severity\"] !== \"string\" || !VALID_SEVERITIES.has(i[\"severity\"])) {\n throw new Error(\"Each issue severity must be 'major', 'minor', or 'nit'\");\n }\n if (typeof i[\"description\"] !== \"string\") {\n throw new Error(\"Each issue must have a 'description' string\");\n }\n }\n\n return parsed as LlmReviewResponse;\n}\n\nfunction defaultSpawn(\n cmd: string[],\n): { exitCode: Promise<number>; stdout: ReadableStream<Uint8Array> } {\n const [command, ...args] = cmd;\n const proc = Bun.spawn([command!, ...args], {\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n return {\n exitCode: proc.exited,\n stdout: proc.stdout as unknown as ReadableStream<Uint8Array>,\n };\n}\n\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, a) => sum + a.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const a of arrays) {\n result.set(a, offset);\n offset += a.length;\n }\n return result;\n}\n",
8
- "import { readFileSync } from \"node:fs\";\n\nexport type ExecFn = (cmd: string[], cwd: string) => Promise<string>;\nexport type ReadFileFn = (path: string) => string;\n\nexport interface RepoContext {\n gitDiff: string;\n guidelines: string[];\n}\n\nexport interface GetRepoContextOptions {\n exec?: ExecFn;\n readFile?: ReadFileFn;\n}\n\nconst defaultExec: ExecFn = async (cmd, cwd) => {\n const proc = Bun.spawnSync(cmd, { cwd });\n if (proc.exitCode !== 0) {\n const stderr = proc.stderr.toString().trim();\n throw new Error(`Command failed (exit ${proc.exitCode}): ${cmd.join(\" \")}${stderr ? `: ${stderr}` : \"\"}`);\n }\n return proc.stdout.toString();\n};\n\nconst defaultReadFile: ReadFileFn = (path) => {\n return readFileSync(path, \"utf-8\");\n};\n\nexport async function getRepoContext(\n demosDir: string,\n options?: GetRepoContextOptions,\n): Promise<RepoContext> {\n const exec = options?.exec ?? defaultExec;\n const readFile = options?.readFile ?? defaultReadFile;\n\n const gitRoot = (await exec([\"git\", \"rev-parse\", \"--show-toplevel\"], demosDir)).trim();\n\n let gitDiff: string;\n const workingDiff = (await exec([\"git\", \"diff\", \"HEAD\"], gitRoot)).trim();\n if (workingDiff.length > 0) {\n gitDiff = workingDiff;\n } else {\n gitDiff = (await exec([\"git\", \"diff\", \"HEAD~1..HEAD\"], gitRoot)).trim();\n }\n\n const lsOutput = (await exec([\"git\", \"ls-files\"], gitRoot)).trim();\n const files = lsOutput.split(\"\\n\").filter((f) => f.length > 0);\n\n const guidelinePatterns = [\"CLAUDE.md\", \"SKILL.md\"];\n const guidelines: string[] = [];\n\n for (const file of files) {\n const basename = file.split(\"/\").pop() ?? \"\";\n if (guidelinePatterns.includes(basename)) {\n const fullPath = `${gitRoot}/${file}`;\n const content = readFile(fullPath);\n guidelines.push(`# ${file}\\n${content}`);\n }\n }\n\n return { gitDiff, guidelines };\n}\n",
9
- "import type { ReviewMetadata, CodeReview } from \"./review-types.ts\";\n\nexport interface GenerateReviewHtmlOptions {\n metadata: ReviewMetadata;\n title?: string;\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction escapeAttr(s: string): string {\n return escapeHtml(s);\n}\n\nfunction renderReviewSection(review: CodeReview): string {\n const bannerClass = review.verdict === \"approve\" ? \"approve\" : \"request-changes\";\n const verdictLabel = review.verdict === \"approve\" ? \"Approved\" : \"Changes Requested\";\n\n const highlightsHtml = review.highlights\n .map((h) => `<li>${escapeHtml(h)}</li>`)\n .join(\"\\n \");\n\n const issuesHtml = review.issues.length > 0\n ? review.issues\n .map((issue) => {\n const badgeLabel = issue.severity.toUpperCase();\n return `<div class=\"issue ${issue.severity}\"><span class=\"severity-badge\">${badgeLabel}</span> <span class=\"issue-text\">${escapeHtml(issue.description)}</span><button class=\"feedback-add-issue\" data-issue=\"${escapeAttr(issue.description)}\">+</button></div>`;\n })\n .join(\"\\n \")\n : '<p class=\"no-issues\">No issues found.</p>';\n\n return `<section class=\"review-section\">\n <div class=\"verdict-banner ${bannerClass}\">\n <strong>${verdictLabel}</strong>: ${escapeHtml(review.verdictReason)}\n </div>\n <div class=\"review-body\">\n <h2>Summary</h2>\n <p>${escapeHtml(review.summary)}</p>\n <h2>Highlights</h2>\n <ul class=\"highlights-list\">\n ${highlightsHtml}\n </ul>\n <h2>Issues</h2>\n ${issuesHtml}\n </div>\n </section>`;\n}\n\nexport function generateReviewHtml(options: GenerateReviewHtmlOptions): string {\n const { metadata, title = \"Demo Review\" } = options;\n\n if (metadata.demos.length === 0) {\n throw new Error(\"metadata.demos must not be empty\");\n }\n\n const firstDemo = metadata.demos[0];\n\n const demoButtons = metadata.demos\n .map((demo, i) => {\n const activeClass = i === 0 ? ' class=\"active\"' : \"\";\n return `<li><button data-index=\"${i}\"${activeClass}>${escapeHtml(demo.file)}</button></li>`;\n })\n .join(\"\\n \");\n\n const metadataJson = JSON.stringify(metadata).replace(/<\\//g, \"<\\\\/\");\n\n const reviewHtml = metadata.review ? renderReviewSection(metadata.review) : \"\";\n const hasReview = !!metadata.review;\n const defaultTab = hasReview ? \"summary\" : \"demos\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(title)}</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: system-ui, -apple-system, sans-serif; background: #1a1a2e; color: #e0e0e0; min-height: 100vh; }\n header { padding: 1rem 2rem; background: #16213e; border-bottom: 1px solid #0f3460; }\n header h1 { font-size: 1.4rem; color: #e94560; }\n .tab-bar { display: flex; gap: 0; background: #16213e; border-bottom: 2px solid #0f3460; padding: 0 2rem; }\n .tab-btn { padding: 0.7rem 1.5rem; background: none; border: none; border-bottom: 3px solid transparent; color: #999; font-size: 0.95rem; cursor: pointer; font-family: inherit; transition: all 0.15s; margin-bottom: -2px; }\n .tab-btn:hover { color: #e0e0e0; }\n .tab-btn.active { color: #e94560; border-bottom-color: #e94560; }\n .tab-panel { display: none; }\n .tab-panel.active { display: block; }\n .review-section { padding: 1.5rem 2rem; }\n .verdict-banner { padding: 1rem 1.5rem; border-radius: 6px; font-size: 1rem; margin-bottom: 1.5rem; }\n .verdict-banner.approve { background: #1b4332; border: 1px solid #2d6a4f; color: #95d5b2; }\n .verdict-banner.request-changes { background: #4a1520; border: 1px solid #842029; color: #f5c6cb; }\n .review-body { max-width: 900px; }\n .review-body h2 { font-size: 1.1rem; color: #e94560; margin: 1.2rem 0 0.5rem; }\n .review-body p { font-size: 0.95rem; line-height: 1.6; color: #ccc; }\n .highlights-list { list-style: disc; padding-left: 1.5rem; margin-bottom: 0.5rem; }\n .highlights-list li { font-size: 0.95rem; line-height: 1.5; color: #95d5b2; margin-bottom: 0.3rem; }\n .issue { padding: 0.6rem 0.8rem; margin-bottom: 0.5rem; border-radius: 4px; font-size: 0.9rem; line-height: 1.4; }\n .issue.major { background: rgba(132, 32, 41, 0.3); border-left: 4px solid #dc3545; }\n .issue.minor { background: rgba(255, 193, 7, 0.1); border-left: 4px solid #ffc107; }\n .issue.nit { background: rgba(108, 117, 125, 0.2); border-left: 4px solid #6c757d; }\n .severity-badge { display: inline-block; font-size: 0.7rem; font-weight: bold; padding: 0.15rem 0.4rem; border-radius: 3px; margin-right: 0.5rem; vertical-align: middle; }\n .issue.major .severity-badge { background: #dc3545; color: #fff; }\n .issue.minor .severity-badge { background: #ffc107; color: #000; }\n .issue.nit .severity-badge { background: #6c757d; color: #fff; }\n .no-issues { color: #95d5b2; font-style: italic; }\n .demos-section { padding: 1rem 0; }\n .review-layout { display: flex; height: 600px; }\n .video-panel { flex: 4; padding: 1rem; display: flex; align-items: center; justify-content: center; background: #0f0f23; }\n .video-wrapper { position: relative; width: 100%; max-height: 100%; display: flex; flex-direction: column; }\n .video-wrapper video { width: 100%; max-height: calc(100% - 36px); border-radius: 4px 4px 0 0; display: block; cursor: pointer; }\n .video-controls { display: flex; align-items: center; gap: 8px; padding: 6px 10px; background: #16213e; border-radius: 0 0 4px 4px; }\n .video-controls button { background: none; border: none; color: #e0e0e0; cursor: pointer; font-size: 1rem; padding: 0; width: 20px; display: flex; align-items: center; justify-content: center; }\n .video-controls button:hover { color: #e94560; }\n .video-controls input[type=\"range\"] { flex: 1; height: 4px; accent-color: #e94560; cursor: pointer; }\n .video-controls .vc-time { font-size: 0.75rem; color: #999; white-space: nowrap; font-variant-numeric: tabular-nums; }\n .side-panel { flex: 1; min-width: 260px; max-width: 360px; padding: 1rem; overflow-y: auto; background: #16213e; border-left: 1px solid #0f3460; }\n .side-panel h2 { font-size: 1rem; margin-bottom: 0.5rem; color: #e94560; }\n .side-panel section { margin-bottom: 1.5rem; }\n #demo-list { list-style: none; }\n #demo-list li { margin-bottom: 0.25rem; }\n #demo-list button { width: 100%; text-align: left; padding: 0.4rem 0.6rem; background: #1a1a2e; color: #e0e0e0; border: 1px solid #0f3460; border-radius: 4px; cursor: pointer; font-size: 0.85rem; }\n #demo-list button:hover { background: #0f3460; }\n #demo-list button.active { background: #e94560; color: #fff; border-color: #e94560; }\n #summary-text { font-size: 0.9rem; line-height: 1.5; color: #ccc; }\n #steps-list { list-style: none; }\n #steps-list li { margin-bottom: 0.3rem; }\n #steps-list button { width: 100%; text-align: left; padding: 0.4rem 0.6rem; background: transparent; color: #53a8b6; border: none; border-left: 3px solid transparent; cursor: pointer; font-size: 0.85rem; transition: all 0.2s; }\n #steps-list button:hover { color: #e94560; }\n #steps-list button.step-active { background: rgba(233, 69, 96, 0.15); color: #e94560; border-left-color: #e94560; }\n .timestamp { font-weight: bold; margin-right: 0.4rem; color: #e94560; }\n .issue { position: relative; }\n .feedback-add-issue { position: absolute; right: 0.5rem; top: 50%; transform: translateY(-50%); background: none; border: 1px solid #53a8b6; color: #53a8b6; border-radius: 4px; cursor: pointer; font-size: 0.85rem; padding: 0.1rem 0.45rem; line-height: 1; }\n .feedback-add-issue:hover { background: #53a8b6; color: #1a1a2e; }\n #feedback-selection-btn { display: none; position: absolute; z-index: 1000; padding: 0.35rem 0.7rem; background: #e94560; color: #fff; border: none; border-radius: 4px; cursor: pointer; font-size: 0.8rem; white-space: nowrap; }\n .feedback-layout { display: flex; gap: 1.5rem; padding: 1.5rem 2rem; }\n .feedback-left { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1rem; }\n .feedback-right { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 0.5rem; }\n #feedback-list { list-style: none; padding: 0; }\n #feedback-list li { display: flex; align-items: center; gap: 0.5rem; padding: 0.4rem 0.6rem; background: #16213e; border: 1px solid #0f3460; border-radius: 4px; margin-bottom: 0.4rem; font-size: 0.9rem; }\n #feedback-list li span { flex: 1; }\n .feedback-remove { background: none; border: none; color: #dc3545; cursor: pointer; font-size: 0.9rem; padding: 0 0.3rem; }\n .feedback-remove:hover { color: #ff6b7a; }\n #feedback-general { width: 100%; min-height: 100px; background: #16213e; color: #e0e0e0; border: 1px solid #0f3460; border-radius: 4px; padding: 0.6rem; font-family: inherit; font-size: 0.9rem; resize: vertical; }\n #feedback-preview { background: #0f0f23; color: #ccc; border: 1px solid #0f3460; border-radius: 4px; padding: 1rem; white-space: pre-wrap; font-size: 0.85rem; line-height: 1.5; flex: 1; min-height: 200px; overflow-y: auto; }\n #feedback-copy { align-self: flex-end; padding: 0.5rem 1rem; background: none; border: 1px solid #53a8b6; color: #53a8b6; border-radius: 4px; cursor: pointer; font-size: 0.85rem; }\n #feedback-copy:hover { background: #53a8b6; color: #1a1a2e; }\n </style>\n</head>\n<body>\n <header>\n <h1>${escapeHtml(title)}</h1>\n </header>\n <nav class=\"tab-bar\">\n ${hasReview ? `<button class=\"tab-btn${defaultTab === \"summary\" ? \" active\" : \"\"}\" data-tab=\"summary\">Summary</button>` : \"\"}\n <button class=\"tab-btn${defaultTab === \"demos\" ? \" active\" : \"\"}\" data-tab=\"demos\">Demos</button>\n ${hasReview ? `<button class=\"tab-btn\" data-tab=\"feedback\">Feedback</button>` : \"\"}\n </nav>\n <main>\n ${hasReview ? `<div id=\"tab-summary\" class=\"tab-panel${defaultTab === \"summary\" ? \" active\" : \"\"}\">\n ${reviewHtml}\n </div>` : \"\"}\n <div id=\"tab-demos\" class=\"tab-panel${defaultTab === \"demos\" ? \" active\" : \"\"}\">\n <section class=\"demos-section\">\n <div class=\"review-layout\">\n <div class=\"video-panel\">\n <div class=\"video-wrapper\">\n <video id=\"review-video\" src=\"${escapeAttr(firstDemo.file)}\"></video>\n <div class=\"video-controls\">\n <button id=\"vc-play\" aria-label=\"Play\">&#9654;</button>\n <input id=\"vc-seek\" type=\"range\" min=\"0\" max=\"100\" value=\"0\" step=\"0.1\">\n <span class=\"vc-time\" id=\"vc-time\">0:00 / 0:00</span>\n </div>\n </div>\n </div>\n <div class=\"side-panel\">\n <section>\n <h2>Demos</h2>\n <ul id=\"demo-list\">\n ${demoButtons}\n </ul>\n </section>\n <section>\n <h2>Summary</h2>\n <p id=\"summary-text\"></p>\n </section>\n <section id=\"steps-section\">\n <h2>Steps</h2>\n <ul id=\"steps-list\"></ul>\n </section>\n </div>\n </div>\n </section>\n </div>\n ${hasReview ? `<div id=\"tab-feedback\" class=\"tab-panel\">\n <div class=\"feedback-layout\">\n <div class=\"feedback-left\">\n <h2>Feedback Items</h2>\n <ul id=\"feedback-list\"></ul>\n <h2>General Feedback</h2>\n <textarea id=\"feedback-general\" placeholder=\"Add general feedback here...\"></textarea>\n </div>\n <div class=\"feedback-right\">\n <h2>Preview</h2>\n <pre id=\"feedback-preview\"></pre>\n <button id=\"feedback-copy\">Copy to clipboard</button>\n </div>\n </div>\n </div>` : \"\"}\n </main>\n ${hasReview ? `<button id=\"feedback-selection-btn\">Add to feedback</button>` : \"\"}\n <script>\n (function() {\n // Tab switching\n var tabBtns = document.querySelectorAll(\".tab-btn\");\n var tabPanels = document.querySelectorAll(\".tab-panel\");\n tabBtns.forEach(function(btn) {\n btn.addEventListener(\"click\", function() {\n var target = btn.getAttribute(\"data-tab\");\n tabBtns.forEach(function(b) { b.classList.toggle(\"active\", b === btn); });\n tabPanels.forEach(function(p) { p.classList.toggle(\"active\", p.id === \"tab-\" + target); });\n });\n });\n\n var metadata = ${metadataJson};\n var video = document.getElementById(\"review-video\");\n var summaryText = document.getElementById(\"summary-text\");\n var stepsList = document.getElementById(\"steps-list\");\n var demoButtons = document.querySelectorAll(\"#demo-list button\");\n\n function esc(s) {\n var d = document.createElement(\"div\");\n d.appendChild(document.createTextNode(s));\n return d.innerHTML;\n }\n\n function formatTime(seconds) {\n var m = Math.floor(seconds / 60);\n var s = Math.floor(seconds % 60);\n return m + \":\" + (s < 10 ? \"0\" : \"\") + s;\n }\n\n function selectDemo(index) {\n var demo = metadata.demos[index];\n video.src = demo.file;\n video.load();\n summaryText.textContent = demo.summary;\n\n demoButtons.forEach(function(btn, i) {\n btn.classList.toggle(\"active\", i === index);\n });\n\n var stepsHtml = \"\";\n demo.steps.forEach(function(step) {\n stepsHtml += '<li><button data-time=\"' + step.timestampSeconds + '\">' +\n '<span class=\"timestamp\">' + esc(formatTime(step.timestampSeconds)) + '</span>' +\n esc(step.text) + '</button></li>';\n });\n stepsList.innerHTML = stepsHtml;\n }\n\n demoButtons.forEach(function(btn) {\n btn.addEventListener(\"click\", function() {\n selectDemo(parseInt(btn.getAttribute(\"data-index\"), 10));\n });\n });\n\n stepsList.addEventListener(\"click\", function(e) {\n var btn = e.target.closest(\"button[data-time]\");\n if (btn) {\n video.currentTime = parseFloat(btn.getAttribute(\"data-time\"));\n video.play();\n }\n });\n\n video.addEventListener(\"timeupdate\", function() {\n var buttons = document.querySelectorAll(\"#steps-list button[data-time]\");\n var ct = video.currentTime;\n var activeIdx = -1;\n buttons.forEach(function(btn, i) {\n if (parseFloat(btn.getAttribute(\"data-time\")) <= ct) activeIdx = i;\n btn.classList.remove(\"step-active\");\n });\n if (activeIdx >= 0) buttons[activeIdx].classList.add(\"step-active\");\n });\n\n selectDemo(0);\n\n // Custom video controls\n var playBtn = document.getElementById(\"vc-play\");\n var seekBar = document.getElementById(\"vc-seek\");\n var timeDisplay = document.getElementById(\"vc-time\");\n var seeking = false;\n\n function fmtTime(sec) {\n var m = Math.floor(sec / 60);\n var s = Math.floor(sec % 60);\n return m + \":\" + (s < 10 ? \"0\" : \"\") + s;\n }\n\n function updateTime() {\n var cur = video.currentTime || 0;\n var dur = video.duration || 0;\n timeDisplay.textContent = fmtTime(cur) + \" / \" + fmtTime(dur);\n if (!seeking && dur) seekBar.value = (cur / dur) * 100;\n }\n\n function updatePlayBtn() {\n playBtn.innerHTML = video.paused ? \"&#9654;\" : \"&#9646;&#9646;\";\n }\n\n playBtn.addEventListener(\"click\", function() {\n video.paused ? video.play() : video.pause();\n });\n video.addEventListener(\"click\", function() {\n video.paused ? video.play() : video.pause();\n });\n video.addEventListener(\"play\", updatePlayBtn);\n video.addEventListener(\"pause\", updatePlayBtn);\n video.addEventListener(\"ended\", updatePlayBtn);\n video.addEventListener(\"timeupdate\", updateTime);\n video.addEventListener(\"loadedmetadata\", updateTime);\n\n seekBar.addEventListener(\"input\", function() {\n seeking = true;\n if (video.duration) {\n video.currentTime = (seekBar.value / 100) * video.duration;\n }\n });\n seekBar.addEventListener(\"change\", function() { seeking = false; });\n\n // Feedback tab logic\n if (document.getElementById(\"tab-feedback\")) {\n var feedbackItems = [];\n var feedbackList = document.getElementById(\"feedback-list\");\n var feedbackGeneral = document.getElementById(\"feedback-general\");\n var feedbackPreview = document.getElementById(\"feedback-preview\");\n var feedbackCopy = document.getElementById(\"feedback-copy\");\n var selectionBtn = document.getElementById(\"feedback-selection-btn\");\n\n function addFeedbackItem(text) {\n var trimmed = text.trim();\n if (!trimmed) return;\n for (var i = 0; i < feedbackItems.length; i++) {\n if (feedbackItems[i] === trimmed) return;\n }\n feedbackItems.push(trimmed);\n renderFeedback();\n }\n\n function removeFeedbackItem(index) {\n feedbackItems.splice(index, 1);\n renderFeedback();\n }\n\n function renderFeedback() {\n var html = \"\";\n feedbackItems.forEach(function(item, i) {\n html += '<li><span>' + esc(item) + '</span><button class=\"feedback-remove\" data-index=\"' + i + '\">X</button></li>';\n });\n feedbackList.innerHTML = html;\n updatePreview();\n }\n\n function updatePreview() {\n var lines = \"\";\n feedbackItems.forEach(function(item, i) {\n lines += (i + 1) + \". Address: \" + item + \"\\\\n\";\n });\n var general = feedbackGeneral.value.trim();\n if (general) {\n lines += \"\\\\nGeneral feedback:\\\\n\" + general;\n }\n feedbackPreview.textContent = lines;\n }\n\n // Issue \"+\" buttons\n var summaryTab = document.getElementById(\"tab-summary\");\n if (summaryTab) {\n summaryTab.addEventListener(\"click\", function(e) {\n var btn = e.target.closest(\".feedback-add-issue\");\n if (btn) {\n addFeedbackItem(btn.getAttribute(\"data-issue\"));\n }\n });\n }\n\n // Text selection floating button\n var selectionTimeout;\n document.addEventListener(\"mouseup\", function(e) {\n clearTimeout(selectionTimeout);\n selectionTimeout = setTimeout(function() {\n var sel = window.getSelection();\n var text = sel ? sel.toString().trim() : \"\";\n if (!text) return;\n var anchor = sel.anchorNode;\n var inSummary = false;\n var node = anchor;\n while (node) {\n if (node.id === \"tab-summary\") { inSummary = true; break; }\n node = node.parentNode;\n }\n if (!inSummary) return;\n selectionBtn.style.display = \"block\";\n selectionBtn.style.left = e.pageX + \"px\";\n selectionBtn.style.top = (e.pageY - 35) + \"px\";\n selectionBtn._selectedText = text;\n }, 100);\n });\n\n selectionBtn.addEventListener(\"click\", function() {\n if (selectionBtn._selectedText) {\n addFeedbackItem(selectionBtn._selectedText);\n }\n selectionBtn.style.display = \"none\";\n window.getSelection().removeAllRanges();\n });\n\n document.addEventListener(\"mousedown\", function(e) {\n if (e.target !== selectionBtn) {\n selectionBtn.style.display = \"none\";\n }\n });\n\n // Remove buttons\n feedbackList.addEventListener(\"click\", function(e) {\n var btn = e.target.closest(\".feedback-remove\");\n if (btn) {\n removeFeedbackItem(parseInt(btn.getAttribute(\"data-index\"), 10));\n }\n });\n\n // Textarea input\n feedbackGeneral.addEventListener(\"input\", updatePreview);\n\n // Copy button\n feedbackCopy.addEventListener(\"click\", function() {\n var text = feedbackPreview.textContent;\n function onCopied() {\n feedbackCopy.textContent = \"Copied!\";\n setTimeout(function() { feedbackCopy.textContent = \"Copy to clipboard\"; }, 1500);\n }\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(text).then(onCopied, onCopied);\n } else {\n onCopied();\n }\n });\n\n renderFeedback();\n }\n })();\n </script>\n</body>\n</html>`;\n}\n",
10
- "import type { Page } from \"@playwright/test\";\n\nimport type { ShowCommentaryOptions } from \"./commentary.ts\";\nimport { showCommentary as defaultShowCommentary } from \"./commentary.ts\";\n\nexport interface DemoStep {\n text: string;\n timestampSeconds: number;\n}\n\ntype ShowCommentaryFn = (\n page: Page,\n options: ShowCommentaryOptions,\n) => Promise<void>;\n\ntype TestStepFn = (\n title: string,\n body: () => Promise<void>,\n) => Promise<void>;\n\nexport interface DemoRecorderOptions {\n showCommentary?: ShowCommentaryFn;\n testStep?: TestStepFn;\n}\n\nexport class DemoRecorder {\n private steps: DemoStep[] = [];\n private startTime: number;\n private showCommentaryFn: ShowCommentaryFn;\n private testStepFn: TestStepFn | undefined;\n\n constructor(options?: DemoRecorderOptions) {\n this.startTime = Date.now();\n this.showCommentaryFn = options?.showCommentary ?? defaultShowCommentary;\n this.testStepFn = options?.testStep;\n }\n\n async step(\n page: Page,\n text: string,\n options: { selector: string },\n ): Promise<void> {\n const body = async () => {\n await this.showCommentaryFn(page, {\n selector: options.selector,\n text,\n });\n\n const timestampSeconds =\n Math.round((Date.now() - this.startTime) / 100) / 10;\n\n this.steps.push({ text, timestampSeconds });\n };\n\n if (this.testStepFn) {\n await this.testStepFn(text, body);\n } else {\n await body();\n }\n }\n\n getSteps(): DemoStep[] {\n return [...this.steps];\n }\n\n async save(outputDir: string): Promise<void> {\n const { join } = await import(\"node:path\");\n const { mkdirSync, writeFileSync } = await import(\"node:fs\");\n\n mkdirSync(outputDir, { recursive: true });\n const filePath = join(outputDir, \"demo-steps.json\");\n writeFileSync(filePath, JSON.stringify(this.steps, null, 2) + \"\\n\");\n }\n}\n"
17
+ "import type { Page } from \"@playwright/test\";\n\nimport type { ShowCommentaryOptions } from \"./commentary.ts\";\nimport { showCommentary as defaultShowCommentary } from \"./commentary.ts\";\n\nexport interface DemoStep {\n text: string;\n timestampSeconds: number;\n}\n\ntype ShowCommentaryFn = (\n page: Page,\n options: ShowCommentaryOptions,\n) => Promise<void>;\n\ntype TestStepFn = (\n title: string,\n body: () => Promise<void>,\n) => Promise<void>;\n\nexport interface DemoRecorderOptions {\n showCommentary?: ShowCommentaryFn;\n testStep?: TestStepFn;\n}\n\nexport class DemoRecorder {\n private steps: DemoStep[] = [];\n private startTime: number;\n private showCommentaryFn: ShowCommentaryFn;\n private testStepFn: TestStepFn | undefined;\n\n constructor(options?: DemoRecorderOptions) {\n this.startTime = Date.now();\n this.showCommentaryFn = options?.showCommentary ?? defaultShowCommentary;\n this.testStepFn = options?.testStep;\n }\n\n async step(\n page: Page,\n text: string,\n options: { selector: string },\n ): Promise<void> {\n const body = async () => {\n await this.showCommentaryFn(page, {\n selector: options.selector,\n text,\n });\n\n const timestampSeconds =\n Math.round((Date.now() - this.startTime) / 100) / 10;\n\n this.steps.push({ text, timestampSeconds });\n };\n\n if (this.testStepFn) {\n await this.testStepFn(text, body);\n } else {\n await body();\n }\n }\n\n getSteps(): DemoStep[] {\n return [...this.steps];\n }\n\n async save(outputDir: string): Promise<void> {\n const { join } = await import(\"node:path\");\n const { mkdirSync, writeFileSync } = await import(\"node:fs\");\n\n mkdirSync(outputDir, { recursive: true });\n const filePath = join(outputDir, \"demo-steps.json\");\n writeFileSync(filePath, JSON.stringify(this.steps, null, 2) + \"\\n\");\n }\n}\n",
18
+ "import { randomUUID } from \"node:crypto\";\n\nexport type ReviewVerdict = \"approve\" | \"request_changes\";\n\nexport interface FeedbackPayload {\n verdict: ReviewVerdict;\n feedback?: string;\n}\n\ninterface PendingReview {\n resolve: (payload: FeedbackPayload) => void;\n reject: (error: Error) => void;\n}\n\nconst pendingReviews = new Map<string, PendingReview>();\n\nconst CORS_HEADERS = {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"POST, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type\",\n};\n\nfunction isValidPayload(body: unknown): body is FeedbackPayload {\n if (typeof body !== \"object\" || body === null) return false;\n const obj = body as Record<string, unknown>;\n if (obj[\"verdict\"] !== \"approve\" && obj[\"verdict\"] !== \"request_changes\") return false;\n if (obj[\"feedback\"] !== undefined && typeof obj[\"feedback\"] !== \"string\") return false;\n return true;\n}\n\nexport interface FeedbackServerResult {\n server: ReturnType<typeof Bun.serve>;\n port: number;\n reviewId: string;\n feedbackEndpoint: string;\n waitForFeedback: () => Promise<FeedbackPayload>;\n stop: () => void;\n}\n\nexport function startFeedbackServer(preferredPort = 0): FeedbackServerResult {\n const reviewId = randomUUID();\n\n const server = Bun.serve({\n port: preferredPort,\n async fetch(req) {\n const url = new URL(req.url);\n\n // Handle CORS preflight\n if (req.method === \"OPTIONS\") {\n return new Response(null, {\n status: 204,\n headers: CORS_HEADERS,\n });\n }\n\n // Handle feedback endpoint\n if (url.pathname === \"/feedback\" && req.method === \"POST\") {\n const requestReviewId = url.searchParams.get(\"reviewId\");\n const headers = {\n \"Content-Type\": \"application/json\",\n ...CORS_HEADERS,\n };\n\n if (!requestReviewId) {\n return new Response(\n JSON.stringify({ error: \"Missing reviewId query parameter\" }),\n { status: 400, headers }\n );\n }\n\n const pending = pendingReviews.get(requestReviewId);\n if (!pending) {\n return new Response(\n JSON.stringify({ error: \"Review not found or already completed\" }),\n { status: 404, headers }\n );\n }\n\n let body: unknown;\n try {\n body = await req.json();\n } catch {\n return new Response(\n JSON.stringify({ error: \"Invalid JSON\" }),\n { status: 400, headers }\n );\n }\n\n if (!isValidPayload(body)) {\n return new Response(\n JSON.stringify({ error: \"Invalid payload\" }),\n { status: 400, headers }\n );\n }\n\n pending.resolve(body);\n pendingReviews.delete(requestReviewId);\n\n return new Response(\n JSON.stringify({ success: true, verdict: body.verdict }),\n { status: 200, headers }\n );\n }\n\n // Health check\n if (url.pathname === \"/health\") {\n return new Response(JSON.stringify({ status: \"ok\" }), {\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n return new Response(\"Not Found\", { status: 404 });\n },\n });\n\n const port = server.port ?? 3000;\n const feedbackEndpoint = `http://localhost:${port}/feedback?reviewId=${reviewId}`;\n\n const feedbackPromise = new Promise<FeedbackPayload>((resolve, reject) => {\n pendingReviews.set(reviewId, { resolve, reject });\n });\n\n return {\n server,\n port,\n reviewId,\n feedbackEndpoint,\n waitForFeedback: () => feedbackPromise,\n stop: () => {\n const pending = pendingReviews.get(reviewId);\n if (pending) {\n pending.reject(new Error(\"Server stopped\"));\n pendingReviews.delete(reviewId);\n }\n server.stop();\n },\n };\n}\n"
11
19
  ],
12
- "mappings": "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",
13
- "debugId": "160BDBF1FB742F2264756E2164756E21",
20
+ "mappings": "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",
21
+ "debugId": "D9F27F14A139E97164756E2164756E21",
14
22
  "names": []
15
23
  }