skilltest 0.9.0 → 0.10.0

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 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/lint.ts","../src/core/skill-parser.ts","../src/core/linter/compat.ts","../src/core/linter/markdown-zones.ts","../src/core/linter/content.ts","../src/core/linter/disclosure.ts","../src/utils/fs.ts","../src/core/linter/frontmatter.ts","../src/core/linter/plugin.ts","../src/core/linter/security.ts","../src/core/linter/structure.ts","../src/core/linter/index.ts","../src/reporters/html.ts","../src/reporters/terminal.ts","../src/commands/common.ts","../src/core/eval-runner.ts","../src/core/grader.ts","../src/utils/concurrency.ts","../src/core/tool-environment.ts","../src/core/trigger-tester.ts","../src/reporters/json.ts","../src/commands/trigger.ts","../src/utils/config.ts","../src/providers/anthropic.ts","../src/providers/openai.ts","../src/providers/index.ts","../src/commands/eval.ts","../src/commands/check.ts","../src/core/check-runner.ts","../src/commands/improve.ts","../src/core/improver.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport { registerLintCommand } from \"./commands/lint.js\";\nimport { registerTriggerCommand } from \"./commands/trigger.js\";\nimport { registerEvalCommand } from \"./commands/eval.js\";\nimport { registerCheckCommand } from \"./commands/check.js\";\nimport { registerImproveCommand } from \"./commands/improve.js\";\nimport { setCommandExecutionContext } from \"./commands/common.js\";\nimport { extractCliConfigOverrides, resolveConfigContext } from \"./utils/config.js\";\n\nfunction resolveVersion(): string {\n try {\n const currentFilePath = fileURLToPath(import.meta.url);\n const packageJsonPath = path.resolve(path.dirname(currentFilePath), \"..\", \"package.json\");\n const raw = fs.readFileSync(packageJsonPath, \"utf8\");\n const parsed = JSON.parse(raw) as { version?: string };\n return parsed.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nfunction shouldRenderJson(argv: string[]): boolean {\n return argv.includes(\"--json\");\n}\n\nfunction renderTopLevelError(error: unknown, asJson: boolean): void {\n const message = error instanceof Error ? error.message : String(error);\n if (asJson) {\n process.stdout.write(`${JSON.stringify({ error: message }, null, 2)}\\n`);\n return;\n }\n process.stderr.write(`Error: ${message}\\n`);\n}\n\nexport async function run(argv: string[]): Promise<void> {\n const program = new Command();\n program\n .name(\"skilltest\")\n .description(\"The testing framework for Agent Skills.\")\n .version(resolveVersion())\n .option(\"--json\", \"Output results as JSON\")\n .option(\"--no-color\", \"Disable colored output\")\n .showHelpAfterError();\n\n program.hook(\"preAction\", async (_program, actionCommand) => {\n const targetPath = typeof actionCommand.processedArgs[0] === \"string\" ? actionCommand.processedArgs[0] : undefined;\n const cliOverrides = extractCliConfigOverrides(actionCommand);\n const context = await resolveConfigContext(targetPath, cliOverrides);\n setCommandExecutionContext(actionCommand, context);\n });\n\n registerLintCommand(program);\n registerTriggerCommand(program);\n registerEvalCommand(program);\n registerCheckCommand(program);\n registerImproveCommand(program);\n\n try {\n await program.parseAsync(argv);\n } catch (error) {\n renderTopLevelError(error, shouldRenderJson(argv));\n process.exitCode = 2;\n }\n}\n\nrun(process.argv).catch((error: unknown) => {\n renderTopLevelError(error, shouldRenderJson(process.argv));\n process.exitCode = 2;\n});\n","import fs from \"node:fs/promises\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { lintFails, runLinter } from \"../core/linter/index.js\";\nimport { renderLintHtml } from \"../reporters/html.js\";\nimport { renderLintReport } from \"../reporters/terminal.js\";\nimport { getGlobalCliOptions, getResolvedConfig, writeError, writeResult } from \"./common.js\";\n\nconst lintCliSchema = z.object({\n html: z.string().optional(),\n plugin: z.array(z.string().min(1)).optional()\n});\n\ninterface LintCommandOptions {\n json: boolean;\n color: boolean;\n failOn: \"error\" | \"warn\";\n suppress: string[];\n plugins: string[];\n html?: string;\n}\n\nfunction collectPluginPaths(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nasync function handleLintCommand(targetPath: string, options: LintCommandOptions): Promise<void> {\n try {\n const report = await runLinter(targetPath, { suppress: options.suppress, plugins: options.plugins });\n if (options.json) {\n writeResult(report, true);\n } else {\n writeResult(renderLintReport(report, options.color), false);\n }\n\n if (options.html) {\n await fs.writeFile(options.html, renderLintHtml(report), \"utf8\");\n }\n\n if (lintFails(report, options.failOn)) {\n process.exitCode = 1;\n }\n } catch (error) {\n writeError(error, options.json);\n process.exitCode = 2;\n }\n}\n\nexport function registerLintCommand(program: Command): void {\n program\n .command(\"lint\")\n .description(\"Run static lint checks against a SKILL.md file or skill directory.\")\n .argument(\"<path-to-skill>\", \"Path to SKILL.md or skill directory\")\n .option(\"--html <path>\", \"Write an HTML report to the given file path\")\n .option(\"--plugin <path>\", \"Load a custom lint plugin file\", collectPluginPaths, [])\n .action(async (targetPath: string, _commandOptions: unknown, command: Command) => {\n const globalOptions = getGlobalCliOptions(command);\n const config = getResolvedConfig(command);\n const parsedCli = lintCliSchema.safeParse(command.opts());\n if (!parsedCli.success) {\n writeError(new Error(parsedCli.error.issues[0]?.message ?? \"Invalid lint options.\"), globalOptions.json);\n process.exitCode = 2;\n return;\n }\n\n await handleLintCommand(targetPath, {\n ...globalOptions,\n failOn: config.lint.failOn,\n suppress: config.lint.suppress,\n plugins: config.lint.plugins,\n html: parsedCli.data.html\n });\n });\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport yaml from \"js-yaml\";\nimport { z } from \"zod\";\n\nexport interface SkillFileContext {\n skillRoot: string;\n skillFile: string;\n raw: string;\n lineCount: number;\n}\n\nexport interface FrontmatterParseResult {\n hasFrontmatter: boolean;\n rawFrontmatter: string | null;\n data: Record<string, unknown> | null;\n content: string;\n error: string | null;\n}\n\nconst frontmatterSchema = z\n .object({\n name: z.string(),\n description: z.string(),\n license: z.string().optional()\n })\n .passthrough();\n\nexport type SkillFrontmatter = z.infer<typeof frontmatterSchema>;\n\nexport interface ParsedSkill {\n skillRoot: string;\n skillFile: string;\n raw: string;\n content: string;\n frontmatterRaw: string | null;\n frontmatter: SkillFrontmatter;\n}\n\nconst FRONTMATTER_BLOCK_REGEX = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\nexport async function resolveSkillPath(inputPath: string): Promise<{ skillRoot: string; skillFile: string }> {\n const absoluteInput = path.resolve(inputPath);\n let stat;\n\n try {\n stat = await fs.stat(absoluteInput);\n } catch {\n throw new Error(`Path not found: ${inputPath}`);\n }\n\n if (stat.isDirectory()) {\n const skillFile = path.join(absoluteInput, \"SKILL.md\");\n try {\n const skillStat = await fs.stat(skillFile);\n if (!skillStat.isFile()) {\n throw new Error();\n }\n } catch {\n throw new Error(`No SKILL.md found in directory: ${inputPath}`);\n }\n\n return { skillRoot: absoluteInput, skillFile };\n }\n\n if (!stat.isFile()) {\n throw new Error(`Path is not a file or directory: ${inputPath}`);\n }\n\n if (path.basename(absoluteInput) !== \"SKILL.md\") {\n throw new Error(`Expected SKILL.md or a directory containing SKILL.md. Received: ${inputPath}`);\n }\n\n return { skillRoot: path.dirname(absoluteInput), skillFile: absoluteInput };\n}\n\nexport async function loadSkillFile(inputPath: string): Promise<SkillFileContext> {\n const { skillRoot, skillFile } = await resolveSkillPath(inputPath);\n const raw = await fs.readFile(skillFile, \"utf8\");\n const lineCount = raw === \"\" ? 0 : raw.split(/\\r?\\n/).length;\n\n return { skillRoot, skillFile, raw, lineCount };\n}\n\nexport function parseFrontmatter(rawSkill: string): FrontmatterParseResult {\n const blockMatch = rawSkill.match(FRONTMATTER_BLOCK_REGEX);\n const rawFrontmatter = blockMatch?.[1] ?? null;\n\n if (!rawFrontmatter) {\n return {\n hasFrontmatter: false,\n rawFrontmatter: null,\n data: null,\n content: rawSkill,\n error: null\n };\n }\n\n try {\n const parsedByYaml = yaml.load(rawFrontmatter);\n if (parsedByYaml === null || typeof parsedByYaml !== \"object\" || Array.isArray(parsedByYaml)) {\n return {\n hasFrontmatter: true,\n rawFrontmatter,\n data: null,\n content: rawSkill.replace(FRONTMATTER_BLOCK_REGEX, \"\"),\n error: \"Frontmatter must parse into a YAML object.\"\n };\n }\n\n const parsedByMatter = matter(rawSkill);\n return {\n hasFrontmatter: true,\n rawFrontmatter,\n data: parsedByMatter.data as Record<string, unknown>,\n content: parsedByMatter.content,\n error: null\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown frontmatter parse error\";\n return {\n hasFrontmatter: true,\n rawFrontmatter,\n data: null,\n content: rawSkill.replace(FRONTMATTER_BLOCK_REGEX, \"\"),\n error: message\n };\n }\n}\n\nexport async function parseSkillStrict(inputPath: string): Promise<ParsedSkill> {\n const skillContext = await loadSkillFile(inputPath);\n return parseSkillDocumentStrict(skillContext.raw, skillContext.skillRoot, skillContext.skillFile);\n}\n\nexport function parseSkillDocumentStrict(rawSkill: string, skillRoot: string, skillFile: string): ParsedSkill {\n const parsedFrontmatter = parseFrontmatter(rawSkill);\n\n if (!parsedFrontmatter.hasFrontmatter) {\n throw new Error(\"SKILL.md is missing YAML frontmatter.\");\n }\n\n if (parsedFrontmatter.error) {\n throw new Error(`Invalid frontmatter: ${parsedFrontmatter.error}`);\n }\n\n const validation = frontmatterSchema.safeParse(parsedFrontmatter.data ?? {});\n if (!validation.success) {\n const issue = validation.error.issues[0];\n throw new Error(`Invalid frontmatter field '${issue.path.join(\".\")}': ${issue.message}`);\n }\n\n return {\n skillRoot,\n skillFile,\n raw: rawSkill,\n content: parsedFrontmatter.content,\n frontmatterRaw: parsedFrontmatter.rawFrontmatter,\n frontmatter: validation.data\n };\n}\n\nconst RELATIVE_LINK_PREFIXES = [\"./\", \"../\", \"scripts/\", \"references/\", \"assets/\"];\n\nexport function extractRelativeFileReferences(markdown: string): string[] {\n const references = new Set<string>();\n\n const markdownLinkRegex = /\\[[^\\]]+\\]\\(([^)]+)\\)/g;\n for (const match of markdown.matchAll(markdownLinkRegex)) {\n const rawTarget = (match[1] ?? \"\").trim();\n const cleaned = cleanReferenceTarget(rawTarget);\n if (cleaned && isLikelyRelativePath(cleaned)) {\n references.add(cleaned);\n }\n }\n\n const inlineCodeRegex = /`([^`]+)`/g;\n for (const match of markdown.matchAll(inlineCodeRegex)) {\n const candidate = (match[1] ?? \"\").trim();\n if (isLikelyRelativePath(candidate)) {\n references.add(cleanReferenceTarget(candidate) as string);\n }\n }\n\n const barePathRegex = /\\b(?:scripts|references|assets)\\/[A-Za-z0-9._\\-/]+/g;\n for (const match of markdown.matchAll(barePathRegex)) {\n const candidate = match[0];\n if (candidate) {\n references.add(cleanReferenceTarget(candidate) as string);\n }\n }\n\n return Array.from(references);\n}\n\nexport function cleanReferenceTarget(target: string): string | null {\n if (!target) {\n return null;\n }\n\n let cleaned = target.trim();\n\n if (cleaned.startsWith(\"<\") && cleaned.endsWith(\">\")) {\n cleaned = cleaned.slice(1, -1).trim();\n }\n\n if (cleaned === \"\" || cleaned.startsWith(\"#\")) {\n return null;\n }\n\n if (/^(https?:|mailto:|tel:)/i.test(cleaned)) {\n return null;\n }\n\n const hashIndex = cleaned.indexOf(\"#\");\n if (hashIndex >= 0) {\n cleaned = cleaned.slice(0, hashIndex).trim();\n }\n\n return cleaned || null;\n}\n\nexport function isLikelyRelativePath(candidate: string): boolean {\n if (!candidate) {\n return false;\n }\n\n if (candidate.startsWith(\"/\")) {\n return false;\n }\n\n if (/^[A-Za-z]:\\\\/.test(candidate)) {\n return false;\n }\n\n if (/^(https?:|mailto:|tel:)/i.test(candidate)) {\n return false;\n }\n\n if (RELATIVE_LINK_PREFIXES.some((prefix) => candidate.startsWith(prefix))) {\n return true;\n }\n\n return /^[A-Za-z0-9._-]+(?:\\/[A-Za-z0-9._-]+)+$/.test(candidate);\n}\n","import { LintContext } from \"./context.js\";\nimport { LintIssue } from \"./types.js\";\n\nexport function runCompatibilityChecks(context: LintContext): LintIssue[] {\n const issues: LintIssue[] = [];\n const frontmatter = context.frontmatter.data ?? {};\n const body = context.frontmatter.content;\n\n const hasAllowedTools = Object.prototype.hasOwnProperty.call(frontmatter, \"allowed-tools\");\n const mentionsClaudeOnly = /\\bclaude code\\b/i.test(body);\n const mentionsCodexOnly = /\\bcodex\\b/i.test(body) && !/\\bopenai\\b/i.test(body);\n\n if (hasAllowedTools) {\n issues.push({\n id: \"compat.allowed-tools\",\n checkId: \"compat:frontmatter\",\n title: \"Platform-Specific Frontmatter\",\n status: \"warn\",\n message: \"Frontmatter includes allowed-tools, which is typically Claude-specific.\",\n suggestion: \"Document fallback behavior for platforms that ignore allowed-tools.\"\n });\n } else {\n issues.push({\n id: \"compat.allowed-tools\",\n checkId: \"compat:frontmatter\",\n title: \"Platform-Specific Frontmatter\",\n status: \"pass\",\n message: \"No known provider-specific frontmatter keys detected.\"\n });\n }\n\n if (mentionsClaudeOnly || mentionsCodexOnly) {\n const platform = mentionsClaudeOnly ? \"Claude\" : \"Codex\";\n issues.push({\n id: \"compat.provider-phrasing\",\n checkId: \"compat:provider-language\",\n title: \"Provider-Specific Language\",\n status: \"warn\",\n message: `Skill body appears tuned to ${platform}-specific behavior.`,\n suggestion: \"Add neutral instructions or an explicit compatibility note for other agents.\"\n });\n } else {\n issues.push({\n id: \"compat.provider-phrasing\",\n checkId: \"compat:provider-language\",\n title: \"Provider-Specific Language\",\n status: \"pass\",\n message: \"Skill body appears provider-neutral.\"\n });\n }\n\n const likelyCompatibility = hasAllowedTools || mentionsClaudeOnly || mentionsCodexOnly\n ? \"Likely compatible with some agents, but includes platform-specific assumptions.\"\n : \"Likely broadly compatible across Anthropic, OpenAI/Codex-style, and other markdown skill runners.\";\n\n issues.push({\n id: \"compat.summary\",\n checkId: \"compat:summary\",\n title: \"Compatibility Hint\",\n status: hasAllowedTools || mentionsClaudeOnly || mentionsCodexOnly ? \"warn\" : \"pass\",\n message: likelyCompatibility\n });\n\n return issues;\n}\n","export type ZoneType = \"frontmatter\" | \"prose\" | \"code-fence\" | \"inline-code\" | \"blockquote\" | \"html-comment\";\n\nexport interface Zone {\n type: ZoneType;\n content: string;\n startLine: number;\n endLine: number;\n}\n\ninterface BodySlice {\n bodyLines: string[];\n bodyStartLine: number;\n}\n\ninterface OpenCodeFence {\n delimiter: string;\n zone: Zone;\n}\n\nfunction splitLines(raw: string): string[] {\n return raw.split(/\\r?\\n/);\n}\n\nfunction stripTopFrontmatter(raw: string): BodySlice {\n const lines = splitLines(raw);\n if (lines[0] !== \"---\") {\n return {\n bodyLines: lines,\n bodyStartLine: 1\n };\n }\n\n for (let index = 1; index < lines.length; index += 1) {\n if (lines[index] === \"---\") {\n return {\n bodyLines: lines.slice(index + 1),\n bodyStartLine: index + 2\n };\n }\n }\n\n return {\n bodyLines: lines,\n bodyStartLine: 1\n };\n}\n\nfunction matchCodeFenceOpener(line: string): string | null {\n const match = line.match(/^\\s*(`{3,}|~{3,})(.*)$/);\n return match?.[1] ?? null;\n}\n\nfunction isExactCodeFenceCloser(line: string, delimiter: string): boolean {\n return line.trim() === delimiter;\n}\n\nfunction appendZone(zones: Zone[], type: ZoneType, content: string, startLine: number, endLine: number): void {\n if (content === \"\") {\n return;\n }\n\n const previous = zones[zones.length - 1];\n if (previous && previous.type === type && startLine <= previous.endLine + 1) {\n const separator = startLine > previous.endLine ? \"\\n\" : \"\";\n previous.content += `${separator}${content}`;\n previous.endLine = endLine;\n return;\n }\n\n zones.push({\n type,\n content,\n startLine,\n endLine\n });\n}\n\nfunction appendToOpenZone(zone: Zone, content: string, lineNumber: number): void {\n if (content === \"\") {\n if (lineNumber > zone.endLine) {\n zone.content += \"\\n\";\n zone.endLine = lineNumber;\n }\n return;\n }\n\n const separator = lineNumber > zone.endLine ? \"\\n\" : \"\";\n zone.content += `${separator}${content}`;\n zone.endLine = lineNumber;\n}\n\nfunction addInlineAwareText(zones: Zone[], text: string, lineNumber: number, baseType: \"prose\" | \"blockquote\"): void {\n if (text === \"\") {\n return;\n }\n\n let cursor = 0;\n while (cursor < text.length) {\n const inlineStart = text.indexOf(\"`\", cursor);\n if (inlineStart === -1) {\n appendZone(zones, baseType, text.slice(cursor), lineNumber, lineNumber);\n return;\n }\n\n if (inlineStart > cursor) {\n appendZone(zones, baseType, text.slice(cursor, inlineStart), lineNumber, lineNumber);\n }\n\n const inlineEnd = text.indexOf(\"`\", inlineStart + 1);\n if (inlineEnd === -1) {\n appendZone(zones, baseType, text.slice(inlineStart), lineNumber, lineNumber);\n return;\n }\n\n appendZone(zones, \"inline-code\", text.slice(inlineStart, inlineEnd + 1), lineNumber, lineNumber);\n cursor = inlineEnd + 1;\n }\n}\n\nexport function parseZones(raw: string): Zone[] {\n const { bodyLines, bodyStartLine } = stripTopFrontmatter(raw);\n const zones: Zone[] = [];\n let openCodeFence: OpenCodeFence | null = null;\n let openComment: Zone | null = null;\n\n for (const [index, line] of bodyLines.entries()) {\n const lineNumber = bodyStartLine + index;\n\n if (openCodeFence) {\n appendToOpenZone(openCodeFence.zone, line, lineNumber);\n if (isExactCodeFenceCloser(line, openCodeFence.delimiter)) {\n zones.push(openCodeFence.zone);\n openCodeFence = null;\n }\n continue;\n }\n\n if (!openComment) {\n const fenceDelimiter = matchCodeFenceOpener(line);\n if (fenceDelimiter) {\n openCodeFence = {\n delimiter: fenceDelimiter,\n zone: {\n type: \"code-fence\",\n content: line,\n startLine: lineNumber,\n endLine: lineNumber\n }\n };\n continue;\n }\n }\n\n const baseType: \"prose\" | \"blockquote\" = /^\\s*>/.test(line) ? \"blockquote\" : \"prose\";\n let cursor = 0;\n\n while (cursor < line.length || openComment) {\n if (openComment) {\n const closeIndex = line.indexOf(\"-->\", cursor);\n if (closeIndex === -1) {\n appendToOpenZone(openComment, line.slice(cursor), lineNumber);\n cursor = line.length;\n break;\n }\n\n appendToOpenZone(openComment, line.slice(cursor, closeIndex + 3), lineNumber);\n zones.push(openComment);\n openComment = null;\n cursor = closeIndex + 3;\n continue;\n }\n\n if (cursor >= line.length) {\n break;\n }\n\n const commentStart = line.indexOf(\"<!--\", cursor);\n const textEnd = commentStart === -1 ? line.length : commentStart;\n\n if (textEnd > cursor) {\n addInlineAwareText(zones, line.slice(cursor, textEnd), lineNumber, baseType);\n }\n\n if (commentStart === -1) {\n break;\n }\n\n const commentEnd = line.indexOf(\"-->\", commentStart + 4);\n if (commentEnd === -1) {\n openComment = {\n type: \"html-comment\",\n content: line.slice(commentStart),\n startLine: lineNumber,\n endLine: lineNumber\n };\n break;\n }\n\n appendZone(zones, \"html-comment\", line.slice(commentStart, commentEnd + 3), lineNumber, lineNumber);\n cursor = commentEnd + 3;\n }\n }\n\n if (openComment) {\n zones.push(openComment);\n }\n\n if (openCodeFence) {\n zones.push(openCodeFence.zone);\n }\n\n return zones;\n}\n","import { LintContext } from \"./context.js\";\nimport { parseZones, Zone } from \"./markdown-zones.js\";\nimport { LintIssue, LintSkippedPattern } from \"./types.js\";\n\nconst VAGUE_PATTERNS = [\n /\\bdo something appropriate\\b/i,\n /\\bhandle as needed\\b/i,\n /\\buse best judgment\\b/i,\n /\\bif possible\\b/i,\n /\\bwhen relevant\\b/i,\n /\\bdo what seems right\\b/i\n];\n\nconst SECRET_PATTERNS: Array<{ label: string; regex: RegExp }> = [\n { label: \"OpenAI key\", regex: /\\bsk-[A-Za-z0-9]{20,}\\b/ },\n { label: \"AWS access key\", regex: /\\bAKIA[0-9A-Z]{16}\\b/ },\n { label: \"GitHub token\", regex: /\\bghp_[A-Za-z0-9]{20,}\\b/ },\n { label: \"Slack token\", regex: /\\bxox[baprs]-[A-Za-z0-9-]{20,}\\b/ },\n { label: \"Generic private key header\", regex: /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/ }\n];\n\ninterface SecretOccurrence extends LintSkippedPattern {}\n\nfunction summarizeLineRange(matches: SecretOccurrence[]): Pick<LintIssue, \"startLine\" | \"endLine\"> {\n if (matches.length === 0) {\n return {};\n }\n\n return {\n startLine: Math.min(...matches.map((match) => match.startLine)),\n endLine: Math.max(...matches.map((match) => match.endLine))\n };\n}\n\nfunction uniqueLabels(matches: SecretOccurrence[]): string[] {\n const labels: string[] = [];\n const seen = new Set<string>();\n for (const match of matches) {\n if (seen.has(match.label)) {\n continue;\n }\n seen.add(match.label);\n labels.push(match.label);\n }\n return labels;\n}\n\nfunction collectSecretMatches(zones: Zone[]): { prose: SecretOccurrence[]; nonProse: SecretOccurrence[] } {\n const prose: SecretOccurrence[] = [];\n const nonProse: SecretOccurrence[] = [];\n\n for (const zone of zones) {\n for (const pattern of SECRET_PATTERNS) {\n if (!pattern.regex.test(zone.content)) {\n continue;\n }\n\n const occurrence: SecretOccurrence = {\n label: pattern.label,\n zoneType: zone.type,\n startLine: zone.startLine,\n endLine: zone.endLine\n };\n\n if (zone.type === \"prose\") {\n prose.push(occurrence);\n } else {\n nonProse.push(occurrence);\n }\n }\n }\n\n return { prose, nonProse };\n}\n\nfunction buildSkippedPatterns(matches: SecretOccurrence[]): LintSkippedPattern[] | undefined {\n if (matches.length === 0) {\n return undefined;\n }\n\n return matches.map((match) => ({\n label: match.label,\n zoneType: match.zoneType,\n startLine: match.startLine,\n endLine: match.endLine\n }));\n}\n\nfunction buildSecretsIssue(context: LintContext): LintIssue | null {\n if (context.suppressedCheckIds.has(\"content:secrets\")) {\n return null;\n }\n\n const { prose, nonProse } = collectSecretMatches(parseZones(context.skill.raw));\n const proseLabels = uniqueLabels(prose);\n const nonProseLabels = uniqueLabels(nonProse);\n const skippedPatterns = buildSkippedPatterns(nonProse);\n\n if (proseLabels.length > 0) {\n return {\n id: \"content.secrets\",\n checkId: \"content:secrets\",\n title: \"Hardcoded Secrets\",\n status: \"fail\",\n message: `Potential secrets detected (${proseLabels.join(\", \")}).`,\n suggestion: \"Remove secrets from skill files and use environment variables or secret managers.\",\n ...summarizeLineRange(prose),\n skippedPatterns\n };\n }\n\n if (nonProseLabels.length > 0) {\n const codeFenceOnly = nonProse.every((match) => match.zoneType === \"code-fence\");\n return {\n id: \"content.secrets\",\n checkId: \"content:secrets\",\n title: \"Hardcoded Secrets\",\n status: \"warn\",\n message: codeFenceOnly\n ? `Possible secret in code example — verify this is a placeholder, not a real key (${nonProseLabels.join(\", \")}).`\n : `Possible secrets found outside prose instructions (${nonProseLabels.join(\", \")}). Verify these are placeholders, not real credentials.`,\n suggestion: \"Replace real-looking credentials in examples with explicit placeholders such as YOUR_API_KEY.\",\n ...summarizeLineRange(nonProse),\n skippedPatterns\n };\n }\n\n return {\n id: \"content.secrets\",\n checkId: \"content:secrets\",\n title: \"Hardcoded Secrets\",\n status: \"pass\",\n message: \"No obvious API keys or secrets patterns were detected.\"\n };\n}\n\nexport function runContentChecks(context: LintContext): LintIssue[] {\n const issues: LintIssue[] = [];\n const body = context.frontmatter.content;\n const bodyLines = body\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n const description = typeof context.frontmatter.data?.description === \"string\" ? context.frontmatter.data.description : \"\";\n\n if (!/^#{1,6}\\s+\\S+/m.test(body)) {\n issues.push({\n id: \"content.headers\",\n checkId: \"content:headers\",\n title: \"Section Headers\",\n status: \"warn\",\n message: \"No markdown headers found in SKILL.md body.\",\n suggestion: \"Add section headers to improve scannability and maintenance.\"\n });\n } else {\n issues.push({\n id: \"content.headers\",\n checkId: \"content:headers\",\n title: \"Section Headers\",\n status: \"pass\",\n message: \"SKILL.md contains markdown section headers.\"\n });\n }\n\n const hasExamples = /example/i.test(body) || /```[\\s\\S]*?```/.test(body);\n if (!hasExamples) {\n issues.push({\n id: \"content.examples\",\n checkId: \"content:examples\",\n title: \"Examples\",\n status: \"warn\",\n message: \"No examples detected in SKILL.md body.\",\n suggestion: \"Add at least one concrete example to guide usage.\"\n });\n } else {\n issues.push({\n id: \"content.examples\",\n checkId: \"content:examples\",\n title: \"Examples\",\n status: \"pass\",\n message: \"Examples were detected in SKILL.md.\"\n });\n }\n\n const vagueMatches = VAGUE_PATTERNS.filter((pattern) => pattern.test(body));\n if (vagueMatches.length > 0) {\n issues.push({\n id: \"content.vagueness\",\n checkId: \"content:vagueness\",\n title: \"Instruction Specificity\",\n status: \"warn\",\n message: \"Potentially vague instruction phrases detected.\",\n suggestion: \"Replace vague guidance with explicit decision rules or step-by-step instructions.\"\n });\n } else {\n issues.push({\n id: \"content.vagueness\",\n checkId: \"content:vagueness\",\n title: \"Instruction Specificity\",\n status: \"pass\",\n message: \"No obvious vague placeholder phrasing found.\"\n });\n }\n\n const secretsIssue = buildSecretsIssue(context);\n if (secretsIssue) {\n issues.push(secretsIssue);\n }\n\n if (bodyLines.length < 10) {\n issues.push({\n id: \"content.body-length\",\n checkId: \"content:body-length\",\n title: \"Body Completeness\",\n status: \"warn\",\n message: `SKILL.md body has only ${bodyLines.length} non-empty lines.`,\n suggestion: \"Add more detailed instructions; short bodies are often incomplete.\"\n });\n } else {\n issues.push({\n id: \"content.body-length\",\n checkId: \"content:body-length\",\n title: \"Body Completeness\",\n status: \"pass\",\n message: `SKILL.md body has ${bodyLines.length} non-empty lines.`\n });\n }\n\n if (description && description.length < 50) {\n issues.push({\n id: \"content.description-length\",\n checkId: \"content:description-length\",\n title: \"Description Specificity\",\n status: \"warn\",\n message: `Description length is ${description.length} characters, which may be too vague for reliable triggering.`,\n suggestion: \"Expand description with concrete scope and activation conditions.\"\n });\n } else if (description) {\n issues.push({\n id: \"content.description-length\",\n checkId: \"content:description-length\",\n title: \"Description Specificity\",\n status: \"pass\",\n message: \"Description length is sufficient for triggerability heuristics.\"\n });\n }\n\n return issues;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n cleanReferenceTarget,\n extractRelativeFileReferences,\n isLikelyRelativePath\n} from \"../skill-parser.js\";\nimport { pathExists, toPosixPath } from \"../../utils/fs.js\";\nimport { LintContext } from \"./context.js\";\nimport { LintIssue } from \"./types.js\";\n\nfunction isPathInsideRoot(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return !relative.startsWith(\"..\") && !path.isAbsolute(relative);\n}\n\nasync function detectNestedReferenceChain(skillRoot: string, rootContent: string): Promise<number> {\n const initialReferences = extractRelativeFileReferences(rootContent);\n let maxDepth = 0;\n\n for (const reference of initialReferences) {\n const firstLevelPath = path.resolve(skillRoot, reference);\n if (!(await pathExists(firstLevelPath))) {\n continue;\n }\n const firstLevelRaw = await fs.readFile(firstLevelPath, \"utf8\");\n const secondLevelRefs = extractRelativeFileReferences(firstLevelRaw);\n if (secondLevelRefs.length > 0) {\n maxDepth = Math.max(maxDepth, 1);\n }\n\n for (const secondLevelReference of secondLevelRefs) {\n const secondLevelPath = path.resolve(path.dirname(firstLevelPath), secondLevelReference);\n if (!(await pathExists(secondLevelPath))) {\n continue;\n }\n const secondLevelRaw = await fs.readFile(secondLevelPath, \"utf8\");\n const thirdLevelRefs = extractRelativeFileReferences(secondLevelRaw);\n if (thirdLevelRefs.length > 0) {\n maxDepth = Math.max(maxDepth, 2);\n }\n }\n }\n\n return maxDepth;\n}\n\nexport async function runDisclosureChecks(context: LintContext): Promise<LintIssue[]> {\n const issues: LintIssue[] = [];\n const references = extractRelativeFileReferences(context.skill.raw);\n const referencesDir = path.join(context.skill.skillRoot, \"references\");\n\n if (context.skill.lineCount > 200 && !(await pathExists(referencesDir))) {\n issues.push({\n id: \"disclosure.skill-split\",\n checkId: \"disclosure:progressive-disclosure\",\n title: \"Progressive Disclosure\",\n status: \"warn\",\n message: \"SKILL.md exceeds 200 lines and no references/ directory is present.\",\n suggestion: \"Move detailed material into references/ files and keep SKILL.md focused.\"\n });\n } else {\n issues.push({\n id: \"disclosure.skill-split\",\n checkId: \"disclosure:progressive-disclosure\",\n title: \"Progressive Disclosure\",\n status: \"pass\",\n message: \"Top-level file length and references/ usage look reasonable.\"\n });\n }\n\n const nonRelativeOrEscaping: string[] = [];\n for (const rawReference of references) {\n const cleaned = cleanReferenceTarget(rawReference);\n if (!cleaned) {\n continue;\n }\n if (path.isAbsolute(cleaned) || /^[A-Za-z]:\\\\/.test(cleaned) || cleaned.startsWith(\"~\")) {\n nonRelativeOrEscaping.push(cleaned);\n continue;\n }\n if (!isLikelyRelativePath(cleaned)) {\n nonRelativeOrEscaping.push(cleaned);\n continue;\n }\n const resolved = path.resolve(context.skill.skillRoot, cleaned);\n if (!isPathInsideRoot(context.skill.skillRoot, resolved)) {\n nonRelativeOrEscaping.push(cleaned);\n }\n }\n\n if (nonRelativeOrEscaping.length > 0) {\n issues.push({\n id: \"disclosure.relative-path-root\",\n checkId: \"disclosure:path-scope\",\n title: \"Reference Path Scope\",\n status: \"fail\",\n message: `Found non-relative or out-of-root references: ${nonRelativeOrEscaping.join(\", \")}`,\n suggestion: \"Use relative paths that stay within the skill root directory.\"\n });\n } else {\n issues.push({\n id: \"disclosure.relative-path-root\",\n checkId: \"disclosure:path-scope\",\n title: \"Reference Path Scope\",\n status: \"pass\",\n message: \"All detected file references are relative and scoped to skill root.\"\n });\n }\n\n const chainDepth = await detectNestedReferenceChain(context.skill.skillRoot, context.skill.raw);\n if (chainDepth > 1) {\n issues.push({\n id: \"disclosure.reference-depth\",\n checkId: \"disclosure:reference-depth\",\n title: \"Reference Chain Depth\",\n status: \"warn\",\n message: \"Deep reference chains detected (>1 level).\",\n suggestion: \"Avoid linking from references to more nested references where possible.\"\n });\n } else {\n issues.push({\n id: \"disclosure.reference-depth\",\n checkId: \"disclosure:reference-depth\",\n title: \"Reference Chain Depth\",\n status: \"pass\",\n message: \"Reference depth is shallow and easy to navigate.\"\n });\n }\n\n const normalizedReferences = references.map((item) => toPosixPath(item));\n if (normalizedReferences.some((item) => item.includes(\"../\"))) {\n issues.push({\n id: \"disclosure.parent-traversal\",\n checkId: \"disclosure:parent-traversal\",\n title: \"Parent Traversal\",\n status: \"warn\",\n message: \"References include parent-directory traversal (../).\",\n suggestion: \"Prefer references rooted within the skill directory for portability.\"\n });\n } else {\n issues.push({\n id: \"disclosure.parent-traversal\",\n checkId: \"disclosure:parent-traversal\",\n title: \"Parent Traversal\",\n status: \"pass\",\n message: \"No parent-directory traversal references detected.\"\n });\n }\n\n return issues;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function pathExists(targetPath: string): Promise<boolean> {\n try {\n await fs.access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function listFilesRecursive(directory: string): Promise<string[]> {\n const entries = await fs.readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const absolutePath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listFilesRecursive(absolutePath)));\n continue;\n }\n if (entry.isFile()) {\n files.push(absolutePath);\n }\n }\n\n return files;\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nexport async function writeJsonFile(filePath: string, data: unknown): Promise<void> {\n const absolute = path.resolve(filePath);\n await fs.mkdir(path.dirname(absolute), { recursive: true });\n await fs.writeFile(absolute, `${JSON.stringify(data, null, 2)}\\n`, \"utf8\");\n}\n\nexport function toPosixPath(inputPath: string): string {\n return inputPath.split(path.sep).join(\"/\");\n}\n","import { LintContext } from \"./context.js\";\nimport { LintIssue } from \"./types.js\";\n\nconst SKILL_NAME_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nfunction getStringField(data: Record<string, unknown> | null, key: string): string | null {\n if (!data) {\n return null;\n }\n const value = data[key];\n if (typeof value !== \"string\") {\n return null;\n }\n return value;\n}\n\nfunction descriptionLooksActionable(description: string): boolean {\n const whatPattern =\n /\\b(create|build|generate|analyze|test|validate|review|refactor|debug|audit|compose|transform|summari[sz]e|plan)\\b/i;\n const whenPattern = /\\b(when|if|for|whenever|use this|ideal for|best for|should use)\\b/i;\n return whatPattern.test(description) && whenPattern.test(description);\n}\n\nexport function runFrontmatterChecks(context: LintContext): LintIssue[] {\n const issues: LintIssue[] = [];\n\n if (!context.frontmatter.hasFrontmatter) {\n issues.push({\n id: \"frontmatter.exists\",\n checkId: \"frontmatter:exists\",\n title: \"Frontmatter Presence\",\n status: \"fail\",\n message: \"SKILL.md is missing YAML frontmatter delimited by --- blocks.\",\n suggestion: \"Add YAML frontmatter at the top with at least name and description.\"\n });\n return issues;\n }\n\n if (context.frontmatter.error) {\n issues.push({\n id: \"frontmatter.valid-yaml\",\n checkId: \"frontmatter:yaml\",\n title: \"Frontmatter YAML\",\n status: \"fail\",\n message: `Frontmatter is not valid YAML: ${context.frontmatter.error}`,\n suggestion: \"Fix YAML syntax so the frontmatter parses as an object.\"\n });\n return issues;\n }\n\n issues.push({\n id: \"frontmatter.valid-yaml\",\n checkId: \"frontmatter:yaml\",\n title: \"Frontmatter YAML\",\n status: \"pass\",\n message: \"Frontmatter exists and parses correctly.\"\n });\n\n const data = context.frontmatter.data ?? {};\n const name = getStringField(data, \"name\");\n if (!name) {\n issues.push({\n id: \"frontmatter.name.required\",\n checkId: \"frontmatter:name\",\n title: \"Frontmatter Name\",\n status: \"fail\",\n message: \"Missing required frontmatter field: name.\",\n suggestion: \"Set name to lowercase words separated by single hyphens.\"\n });\n } else if (name.length > 64) {\n issues.push({\n id: \"frontmatter.name.length\",\n checkId: \"frontmatter:name\",\n title: \"Frontmatter Name Length\",\n status: \"fail\",\n message: `name is too long (${name.length} chars, max 64).`,\n suggestion: \"Shorten the skill name to 64 characters or fewer.\"\n });\n } else if (!SKILL_NAME_REGEX.test(name)) {\n issues.push({\n id: \"frontmatter.name.format\",\n checkId: \"frontmatter:name\",\n title: \"Frontmatter Name Format\",\n status: \"fail\",\n message: \"name must be lowercase alphanumeric with single hyphen separators only.\",\n suggestion: \"Use format like 'api-tester' or 'code-review'.\"\n });\n } else {\n issues.push({\n id: \"frontmatter.name.valid\",\n checkId: \"frontmatter:name\",\n title: \"Frontmatter Name\",\n status: \"pass\",\n message: \"name is present and follows naming conventions.\"\n });\n }\n\n const description = getStringField(data, \"description\");\n if (!description || description.trim() === \"\") {\n issues.push({\n id: \"frontmatter.description.required\",\n checkId: \"frontmatter:description\",\n title: \"Frontmatter Description\",\n status: \"fail\",\n message: \"Missing required frontmatter field: description.\",\n suggestion: \"Add a clear description of what the skill does and when to use it.\"\n });\n } else if (description.length > 1024) {\n issues.push({\n id: \"frontmatter.description.length\",\n checkId: \"frontmatter:description\",\n title: \"Frontmatter Description Length\",\n status: \"fail\",\n message: `description is too long (${description.length} chars, max 1024).`,\n suggestion: \"Keep description concise while still specific.\"\n });\n } else {\n issues.push({\n id: \"frontmatter.description.valid\",\n checkId: \"frontmatter:description\",\n title: \"Frontmatter Description\",\n status: \"pass\",\n message: \"description is present and within allowed length.\"\n });\n }\n\n const license = getStringField(data, \"license\");\n if (!license || license.trim() === \"\") {\n issues.push({\n id: \"frontmatter.license.recommended\",\n checkId: \"frontmatter:license\",\n title: \"Frontmatter License\",\n status: \"warn\",\n message: \"No license field found in frontmatter.\",\n suggestion: \"Add a license (for example: MIT) to clarify reuse terms.\"\n });\n } else {\n issues.push({\n id: \"frontmatter.license.present\",\n checkId: \"frontmatter:license\",\n title: \"Frontmatter License\",\n status: \"pass\",\n message: \"license field is present.\"\n });\n }\n\n if (context.frontmatter.rawFrontmatter && /[<>]/.test(context.frontmatter.rawFrontmatter)) {\n issues.push({\n id: \"frontmatter.angle-brackets\",\n checkId: \"frontmatter:angle-brackets\",\n title: \"Frontmatter Angle Brackets\",\n status: \"warn\",\n message: \"Frontmatter contains angle bracket characters (< or >), which can be misinterpreted in some agents.\",\n suggestion: \"Remove XML-like tags from frontmatter values when possible.\"\n });\n } else {\n issues.push({\n id: \"frontmatter.angle-brackets\",\n checkId: \"frontmatter:angle-brackets\",\n title: \"Frontmatter Angle Brackets\",\n status: \"pass\",\n message: \"No angle bracket tokens detected in frontmatter.\"\n });\n }\n\n if (description && description.trim() !== \"\" && !descriptionLooksActionable(description)) {\n issues.push({\n id: \"frontmatter.description.triggerability\",\n checkId: \"frontmatter:triggerability\",\n title: \"Description Trigger Clarity\",\n status: \"warn\",\n message: \"Description should explain both what the skill does and when it should be used.\",\n suggestion: \"Include explicit 'use when...' language plus concrete capability wording.\"\n });\n } else if (description) {\n issues.push({\n id: \"frontmatter.description.triggerability\",\n checkId: \"frontmatter:triggerability\",\n title: \"Description Trigger Clarity\",\n status: \"pass\",\n message: \"Description appears to cover both capability and usage context.\"\n });\n }\n\n return issues;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { LintContext } from \"./context.js\";\nimport { LintIssue } from \"./types.js\";\n\nexport interface LintRule {\n checkId: string;\n title: string;\n check: (context: LintContext) => LintIssue[] | Promise<LintIssue[]>;\n}\n\nexport interface LintPlugin {\n rules: LintRule[];\n}\n\nfunction normalizeRuleCheckId(checkId: string): string {\n return checkId.includes(\":\") ? checkId : `plugin:${checkId}`;\n}\n\nfunction buildPluginValidationError(filePath: string, message: string): Error {\n return new Error(`Invalid lint plugin at ${filePath}: ${message}`);\n}\n\nfunction validatePluginCandidate(candidate: unknown, filePath: string, exportName: string): LintPlugin {\n if (!candidate || typeof candidate !== \"object\" || !(\"rules\" in candidate)) {\n throw buildPluginValidationError(filePath, `${exportName} export must be an object with a rules array.`);\n }\n\n const rules = (candidate as { rules?: unknown }).rules;\n if (!Array.isArray(rules)) {\n throw buildPluginValidationError(filePath, `${exportName} export must include a rules array.`);\n }\n\n return {\n rules: rules.map((rule, index) => {\n if (!rule || typeof rule !== \"object\") {\n throw buildPluginValidationError(filePath, `rule at index ${index} must be an object.`);\n }\n\n const checkId = (rule as { checkId?: unknown }).checkId;\n if (typeof checkId !== \"string\" || checkId.trim() === \"\") {\n throw buildPluginValidationError(filePath, `rule at index ${index} must have a non-empty string checkId.`);\n }\n\n const title = (rule as { title?: unknown }).title;\n if (typeof title !== \"string\" || title.trim() === \"\") {\n throw buildPluginValidationError(filePath, `rule at index ${index} must have a non-empty string title.`);\n }\n\n const check = (rule as { check?: unknown }).check;\n if (typeof check !== \"function\") {\n throw buildPluginValidationError(filePath, `rule '${checkId}' must have a check function.`);\n }\n\n return {\n checkId: normalizeRuleCheckId(checkId),\n title,\n check: check as LintRule[\"check\"]\n };\n })\n };\n}\n\nexport async function loadPlugin(filePath: string): Promise<LintPlugin> {\n const absolutePath = path.resolve(filePath);\n\n try {\n await fs.access(absolutePath);\n } catch {\n throw new Error(`Failed to load lint plugin at ${absolutePath}: file does not exist.`);\n }\n\n let loadedModule: Record<string, unknown>;\n try {\n loadedModule = (await import(pathToFileURL(absolutePath).href)) as Record<string, unknown>;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load lint plugin at ${absolutePath}: ${message}`);\n }\n\n const validationErrors: string[] = [];\n for (const [exportName, candidate] of [\n [\"default\", loadedModule.default],\n [\"plugin\", loadedModule.plugin]\n ] as const) {\n if (candidate === undefined) {\n continue;\n }\n\n try {\n return validatePluginCandidate(candidate, absolutePath, exportName);\n } catch (error) {\n validationErrors.push(error instanceof Error ? error.message : String(error));\n }\n }\n\n if (validationErrors.length > 0) {\n throw new Error(validationErrors.join(\" \"));\n }\n\n throw buildPluginValidationError(\n absolutePath,\n \"expected a default export or named export 'plugin' containing a rules array.\"\n );\n}\n\nfunction buildRuleExecutionError(rule: LintRule, error: unknown): LintIssue {\n const message = error instanceof Error ? error.message : String(error);\n return {\n id: `plugin.load-error.${rule.checkId.replace(/[^A-Za-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\").toLowerCase()}`,\n checkId: \"plugin:load-error\",\n title: \"Plugin Rule Error\",\n status: \"fail\",\n message: `Plugin rule '${rule.checkId}' failed: ${message}`\n };\n}\n\nexport async function runPluginRules(plugin: LintPlugin, context: LintContext): Promise<LintIssue[]> {\n const issues: LintIssue[] = [];\n\n for (const rule of plugin.rules) {\n try {\n const result = await rule.check(context);\n if (!Array.isArray(result)) {\n throw new Error(\"check function must return an array of lint issues.\");\n }\n\n issues.push(\n ...result.map((issue) => ({\n ...issue,\n checkId: rule.checkId\n }))\n );\n } catch (error) {\n issues.push(buildRuleExecutionError(rule, error));\n }\n }\n\n return issues;\n}\n","import { LintContext } from \"./context.js\";\nimport { parseZones, Zone, ZoneType } from \"./markdown-zones.js\";\nimport { LintIssue, LintSkippedPattern } from \"./types.js\";\n\ninterface SecurityPattern {\n label: string;\n regex: RegExp;\n}\n\ninterface PatternOccurrence extends LintSkippedPattern {}\n\nconst DANGEROUS_COMMAND_PATTERNS: SecurityPattern[] = [\n {\n label: \"Destructive recursive delete\",\n regex: /\\b(?:sudo\\s+)?rm\\s+-rf\\s+(?:\\/|\\*|~\\/|\\.\\.\\/)/i\n },\n {\n label: \"Forceful recursive remove in PowerShell\",\n regex: /\\bRemove-Item\\b[^\\n]*\\b-Recurse\\b[^\\n]*\\b-Force\\b/i\n },\n {\n label: \"Remote script piped directly to shell\",\n regex: /\\b(?:curl|wget|Invoke-WebRequest)\\b[^\\n|]{0,220}\\|\\s*(?:bash|sh|zsh|pwsh|powershell|iex)\\b/i\n }\n];\n\nconst EXFILTRATION_PATTERNS: SecurityPattern[] = [\n {\n label: \"Reading SSH private keys\",\n regex: /\\b(?:cat|type|get-content)\\b[^\\n]*\\.ssh\\/id_(?:rsa|ed25519)\\b/i\n },\n {\n label: \"Reading cloud credential files\",\n regex: /\\b(?:cat|type|get-content)\\b[^\\n]*(?:\\.aws\\/credentials|\\.npmrc|\\.netrc)\\b/i\n },\n {\n label: \"Explicit credential exfiltration\",\n regex: /\\b(?:send|upload|post|exfiltrat(?:e|ion))\\b[^\\n]{0,200}\\b(?:api[_ -]?key|token|secret|credential|\\.env|id_rsa)\\b/i\n }\n];\n\nconst PRIVILEGE_ESCALATION_PATTERNS: SecurityPattern[] = [\n {\n label: \"Uses sudo/root escalation\",\n regex: /\\b(?:sudo|run as root|administrator privileges)\\b/i\n },\n {\n label: \"Asks to disable sandboxing or approvals\",\n regex: /\\b(?:disable sandbox|without approval|skip approval|require_escalated)\\b/i\n },\n {\n label: \"Inline expression execution\",\n regex: /\\b(?:Invoke-Expression|iex)\\b/i\n }\n];\n\nconst SHELL_ACTIVITY_PATTERNS: RegExp[] = [\n /```(?:bash|sh|zsh|pwsh|powershell|cmd)\\b[\\s\\S]*?```/i,\n /\\b(?:bash|sh|pwsh|powershell|cmd(?:\\.exe)?)\\b/i,\n /\\b(?:npm|pnpm|yarn|pip|git|docker|kubectl)\\s+[A-Za-z0-9-]/i\n];\n\nconst SAFETY_GUARDRAIL_PATTERN =\n /\\b(?:ask before|confirm|approval|dry[- ]run|sandbox|least privilege|redact|never expose|do not reveal)\\b/i;\n\nfunction buildOccurrence(zone: Zone, pattern: SecurityPattern): PatternOccurrence {\n return {\n label: pattern.label,\n zoneType: zone.type,\n startLine: zone.startLine,\n endLine: zone.endLine\n };\n}\n\nfunction collectZoneAwareMatches(zones: Zone[], patterns: SecurityPattern[]): { flagged: PatternOccurrence[]; skipped: PatternOccurrence[] } {\n const flagged: PatternOccurrence[] = [];\n const skipped: PatternOccurrence[] = [];\n\n for (const zone of zones) {\n for (const pattern of patterns) {\n if (!pattern.regex.test(zone.content)) {\n continue;\n }\n\n const occurrence = buildOccurrence(zone, pattern);\n if (zone.type === \"prose\") {\n flagged.push(occurrence);\n } else {\n skipped.push(occurrence);\n }\n }\n }\n\n return { flagged, skipped };\n}\n\nfunction uniqueLabels(matches: PatternOccurrence[]): string[] {\n const labels: string[] = [];\n const seen = new Set<string>();\n for (const match of matches) {\n if (seen.has(match.label)) {\n continue;\n }\n seen.add(match.label);\n labels.push(match.label);\n }\n return labels;\n}\n\nfunction summarizeLineRange(matches: PatternOccurrence[]): Pick<LintIssue, \"startLine\" | \"endLine\"> {\n if (matches.length === 0) {\n return {};\n }\n\n return {\n startLine: Math.min(...matches.map((match) => match.startLine)),\n endLine: Math.max(...matches.map((match) => match.endLine))\n };\n}\n\nfunction buildSkippedPatterns(matches: PatternOccurrence[]): LintSkippedPattern[] | undefined {\n if (matches.length === 0) {\n return undefined;\n }\n return matches.map((match) => ({\n label: match.label,\n zoneType: match.zoneType,\n startLine: match.startLine,\n endLine: match.endLine\n }));\n}\n\nfunction isSuppressed(context: LintContext, checkId: string): boolean {\n return context.suppressedCheckIds.has(checkId);\n}\n\nfunction runZoneAwareSecurityCheck(\n context: LintContext,\n zones: Zone[],\n options: {\n id: string;\n checkId: string;\n title: string;\n statusOnMatch: \"fail\" | \"warn\";\n patterns: SecurityPattern[];\n matchMessagePrefix: string;\n passMessage: string;\n suggestion: string;\n }\n): LintIssue | null {\n if (isSuppressed(context, options.checkId)) {\n return null;\n }\n\n const matches = collectZoneAwareMatches(zones, options.patterns);\n const labels = uniqueLabels(matches.flagged);\n const skippedPatterns = buildSkippedPatterns(matches.skipped);\n\n if (labels.length > 0) {\n return {\n id: options.id,\n checkId: options.checkId,\n title: options.title,\n status: options.statusOnMatch,\n message: `${options.matchMessagePrefix}: ${labels.join(\", \")}.`,\n suggestion: options.suggestion,\n ...summarizeLineRange(matches.flagged),\n skippedPatterns\n };\n }\n\n return {\n id: options.id,\n checkId: options.checkId,\n title: options.title,\n status: \"pass\",\n message: options.passMessage,\n skippedPatterns\n };\n}\n\nexport function runSecurityChecks(context: LintContext): LintIssue[] {\n const issues: LintIssue[] = [];\n const skillText = context.skill.raw;\n const needsZoneParsing =\n !isSuppressed(context, \"security:dangerous-commands\") ||\n !isSuppressed(context, \"security:exfiltration\") ||\n !isSuppressed(context, \"security:privilege-escalation\");\n const zones = needsZoneParsing ? parseZones(skillText) : [];\n\n const dangerousCommandsIssue = runZoneAwareSecurityCheck(context, zones, {\n id: \"security.dangerous-command-patterns\",\n checkId: \"security:dangerous-commands\",\n title: \"Dangerous Command Patterns\",\n statusOnMatch: \"fail\",\n patterns: DANGEROUS_COMMAND_PATTERNS,\n matchMessagePrefix: \"Potentially dangerous command instruction patterns found\",\n passMessage: \"No high-risk destructive or direct pipe-to-shell patterns detected.\",\n suggestion: \"Remove destructive/pipe-exec command examples or wrap them with explicit safety constraints.\"\n });\n if (dangerousCommandsIssue) {\n issues.push(dangerousCommandsIssue);\n }\n\n const exfiltrationIssue = runZoneAwareSecurityCheck(context, zones, {\n id: \"security.exfiltration-patterns\",\n checkId: \"security:exfiltration\",\n title: \"Sensitive Data Exfiltration\",\n statusOnMatch: \"fail\",\n patterns: EXFILTRATION_PATTERNS,\n matchMessagePrefix: \"Possible sensitive data exfiltration patterns found\",\n passMessage: \"No obvious credential access/exfiltration instructions detected.\",\n suggestion: \"Remove instructions that access or transmit secrets/credential files.\"\n });\n if (exfiltrationIssue) {\n issues.push(exfiltrationIssue);\n }\n\n const privilegeEscalationIssue = runZoneAwareSecurityCheck(context, zones, {\n id: \"security.privilege-escalation\",\n checkId: \"security:privilege-escalation\",\n title: \"Privilege Escalation Language\",\n statusOnMatch: \"warn\",\n patterns: PRIVILEGE_ESCALATION_PATTERNS,\n matchMessagePrefix: \"Potentially risky privilege/execution language detected\",\n passMessage: \"No obvious privilege-escalation language detected.\",\n suggestion: \"Prefer least-privilege execution and explicit approval steps for elevated commands.\"\n });\n if (privilegeEscalationIssue) {\n issues.push(privilegeEscalationIssue);\n }\n\n if (!isSuppressed(context, \"security:missing-guardrails\")) {\n const hasShellActivity = SHELL_ACTIVITY_PATTERNS.some((pattern) => pattern.test(skillText));\n if (hasShellActivity && !SAFETY_GUARDRAIL_PATTERN.test(skillText)) {\n issues.push({\n id: \"security.safety-guardrails\",\n checkId: \"security:missing-guardrails\",\n title: \"Execution Safety Guardrails\",\n status: \"warn\",\n message: \"Shell/tool execution is present, but no explicit safety guardrails were detected.\",\n suggestion: \"Add guidance such as approval requirements, dry-run mode, scope checks, and redaction rules.\"\n });\n } else {\n issues.push({\n id: \"security.safety-guardrails\",\n checkId: \"security:missing-guardrails\",\n title: \"Execution Safety Guardrails\",\n status: \"pass\",\n message: hasShellActivity\n ? \"Shell/tool execution instructions include at least one safety guardrail.\"\n : \"No shell/tool execution instructions detected.\"\n });\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { extractRelativeFileReferences } from \"../skill-parser.js\";\nimport { listFilesRecursive, pathExists, toPosixPath } from \"../../utils/fs.js\";\nimport { LintContext } from \"./context.js\";\nimport { LintIssue } from \"./types.js\";\n\nfunction hasTableOfContents(content: string): boolean {\n if (/^#{1,6}\\s+table of contents\\b/im.test(content)) {\n return true;\n }\n return /^\\s*[-*]\\s+\\[[^\\]]+\\]\\(#[^)]+\\)/im.test(content);\n}\n\nfunction classifyReferencePath(relativePath: string): \"scripts\" | \"references\" | \"assets\" | \"other\" {\n const normalized = toPosixPath(relativePath).replace(/^\\.\\//, \"\");\n if (normalized.startsWith(\"scripts/\")) {\n return \"scripts\";\n }\n if (normalized.startsWith(\"references/\")) {\n return \"references\";\n }\n if (normalized.startsWith(\"assets/\")) {\n return \"assets\";\n }\n return \"other\";\n}\n\nexport async function runStructureChecks(context: LintContext): Promise<LintIssue[]> {\n const issues: LintIssue[] = [];\n const references = extractRelativeFileReferences(context.skill.raw);\n\n if (context.skill.lineCount > 500) {\n issues.push({\n id: \"structure.skill-size\",\n checkId: \"structure:file-size\",\n title: \"SKILL.md Size\",\n status: \"warn\",\n message: `SKILL.md is ${context.skill.lineCount} lines (recommended max is 500).`,\n suggestion: \"Split detailed guidance into references/ files.\"\n });\n } else {\n issues.push({\n id: \"structure.skill-size\",\n checkId: \"structure:file-size\",\n title: \"SKILL.md Size\",\n status: \"pass\",\n message: `SKILL.md length is ${context.skill.lineCount} lines.`\n });\n }\n\n const referencesDir = path.join(context.skill.skillRoot, \"references\");\n if (await pathExists(referencesDir)) {\n const files = await listFilesRecursive(referencesDir);\n let oversizedWithoutToc = 0;\n for (const file of files) {\n const raw = await fs.readFile(file, \"utf8\");\n const lineCount = raw === \"\" ? 0 : raw.split(/\\r?\\n/).length;\n if (lineCount > 300 && !hasTableOfContents(raw)) {\n oversizedWithoutToc += 1;\n issues.push({\n id: `structure.references.toc.${toPosixPath(path.relative(context.skill.skillRoot, file))}`,\n checkId: \"structure:toc\",\n title: \"Reference File Navigation\",\n status: \"warn\",\n message: `${toPosixPath(path.relative(context.skill.skillRoot, file))} is ${lineCount} lines and has no table of contents.`,\n suggestion: \"Add a table of contents for long reference files.\"\n });\n }\n }\n\n if (oversizedWithoutToc === 0) {\n issues.push({\n id: \"structure.references.toc\",\n checkId: \"structure:toc\",\n title: \"Reference File Navigation\",\n status: \"pass\",\n message: \"No oversized reference files missing a table of contents.\"\n });\n }\n } else {\n issues.push({\n id: \"structure.references.toc\",\n checkId: \"structure:toc\",\n title: \"Reference File Navigation\",\n status: \"pass\",\n message: \"No references/ directory found, so no long reference files to validate.\"\n });\n }\n\n const missingByType: Record<string, string[]> = {\n scripts: [],\n references: [],\n assets: [],\n other: []\n };\n\n for (const reference of references) {\n const resolved = path.resolve(context.skill.skillRoot, reference);\n if (!(await pathExists(resolved))) {\n const kind = classifyReferencePath(reference);\n missingByType[kind].push(reference);\n }\n }\n\n const categories: Array<{ key: \"scripts\" | \"references\" | \"assets\"; title: string }> = [\n { key: \"scripts\", title: \"Script References\" },\n { key: \"references\", title: \"Reference File Links\" },\n { key: \"assets\", title: \"Asset References\" }\n ];\n\n for (const category of categories) {\n const missing = missingByType[category.key];\n if (missing.length > 0) {\n issues.push({\n id: `structure.${category.key}.exists`,\n checkId: \"structure:references\",\n title: category.title,\n status: \"fail\",\n message: `Missing referenced ${category.key} file(s): ${missing.join(\", \")}`,\n suggestion: \"Create the files or fix the paths in SKILL.md.\"\n });\n } else {\n issues.push({\n id: `structure.${category.key}.exists`,\n checkId: \"structure:references\",\n title: category.title,\n status: \"pass\",\n message: `All referenced ${category.key} files exist.`\n });\n }\n }\n\n const missingGeneric = missingByType.other;\n if (missingGeneric.length > 0) {\n issues.push({\n id: \"structure.relative-links.broken\",\n checkId: \"structure:references\",\n title: \"Relative Links\",\n status: \"fail\",\n message: `Broken relative path reference(s): ${missingGeneric.join(\", \")}`,\n suggestion: \"Fix or remove broken file links.\"\n });\n } else {\n issues.push({\n id: \"structure.relative-links.broken\",\n checkId: \"structure:references\",\n title: \"Relative Links\",\n status: \"pass\",\n message: \"No broken generic relative file references were found.\"\n });\n }\n\n return issues;\n}\n","import { loadSkillFile, parseFrontmatter } from \"../skill-parser.js\";\nimport { runCompatibilityChecks } from \"./compat.js\";\nimport { LintContext } from \"./context.js\";\nimport { runContentChecks } from \"./content.js\";\nimport { runDisclosureChecks } from \"./disclosure.js\";\nimport { runFrontmatterChecks } from \"./frontmatter.js\";\nimport { loadPlugin, runPluginRules } from \"./plugin.js\";\nimport { runSecurityChecks } from \"./security.js\";\nimport { runStructureChecks } from \"./structure.js\";\nimport { LintIssue, LintReport, LintSummary } from \"./types.js\";\nimport { LintFailOn } from \"../../utils/config.js\";\n\nfunction summarizeIssues(issues: LintIssue[]): LintSummary {\n const summary: LintSummary = {\n total: issues.length,\n passed: 0,\n warnings: 0,\n failures: 0\n };\n\n for (const issue of issues) {\n if (issue.status === \"pass\") {\n summary.passed += 1;\n continue;\n }\n if (issue.status === \"warn\") {\n summary.warnings += 1;\n continue;\n }\n summary.failures += 1;\n }\n\n return summary;\n}\n\nexport interface RunLinterOptions {\n suppress?: string[];\n plugins?: string[];\n}\n\nexport function lintFails(report: Pick<LintReport, \"summary\">, failOn: LintFailOn): boolean {\n if (report.summary.failures > 0) {\n return true;\n }\n return failOn === \"warn\" && report.summary.warnings > 0;\n}\n\nexport async function runLinter(inputPath: string, options: RunLinterOptions = {}): Promise<LintReport> {\n const skill = await loadSkillFile(inputPath);\n const frontmatter = parseFrontmatter(skill.raw);\n const suppressedCheckIds = new Set(options.suppress ?? []);\n const context: LintContext = {\n skill,\n frontmatter,\n suppressedCheckIds\n };\n\n const issues: LintIssue[] = [];\n issues.push(...runFrontmatterChecks(context));\n issues.push(...(await runStructureChecks(context)));\n issues.push(...runContentChecks(context));\n issues.push(...runSecurityChecks(context));\n issues.push(...(await runDisclosureChecks(context)));\n issues.push(...runCompatibilityChecks(context));\n\n for (const pluginPath of options.plugins ?? []) {\n const plugin = await loadPlugin(pluginPath);\n issues.push(...(await runPluginRules(plugin, context)));\n }\n\n const filteredIssues = issues.filter((issue) => !suppressedCheckIds.has(issue.checkId));\n\n return {\n target: inputPath,\n issues: filteredIssues,\n summary: summarizeIssues(filteredIssues)\n };\n}\n\nexport type { LintIssue, LintReport, LintSummary } from \"./types.js\";\n","import { CheckRunResult } from \"../core/check-runner.js\";\nimport { EvalPromptResult, EvalResult } from \"../core/eval-runner.js\";\nimport { LintIssue, LintReport } from \"../core/linter/index.js\";\nimport { TriggerTestCaseResult, TriggerTestResult } from \"../core/trigger-tester.js\";\n\ntype HtmlStatus = \"pass\" | \"warn\" | \"fail\" | \"skip\";\n\ninterface StatCard {\n label: string;\n value: string;\n note?: string;\n status?: HtmlStatus;\n}\n\ninterface MetaItem {\n label: string;\n value: string;\n}\n\nfunction escapeHtml(value: string | number | undefined | null): string {\n return String(value ?? \"\")\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(1)}%`;\n}\n\nfunction formatLineRange(startLine?: number, endLine?: number): string | null {\n if (startLine === undefined) {\n return null;\n }\n\n if (endLine === undefined || endLine === startLine) {\n return `line ${startLine}`;\n }\n\n return `lines ${startLine}-${endLine}`;\n}\n\nfunction badgeLabel(status: HtmlStatus): string {\n if (status === \"pass\") {\n return \"PASS\";\n }\n if (status === \"warn\") {\n return \"WARN\";\n }\n if (status === \"fail\") {\n return \"FAIL\";\n }\n return \"SKIP\";\n}\n\nfunction renderBadge(status: HtmlStatus): string {\n return `<span class=\"badge ${status}\">${badgeLabel(status)}</span>`;\n}\n\nfunction renderMetaBadge(label: string): string {\n return `<span class=\"meta-badge\">${escapeHtml(label)}</span>`;\n}\n\nfunction renderStatCards(stats: StatCard[]): string {\n return `<div class=\"stats-grid\">${stats\n .map(\n (stat) => `\n <div class=\"stat-card${stat.status ? ` status-${stat.status}` : \"\"}\">\n <div class=\"stat-label\">${escapeHtml(stat.label)}</div>\n <div class=\"stat-value\">${escapeHtml(stat.value)}</div>\n ${stat.note ? `<div class=\"stat-note\">${escapeHtml(stat.note)}</div>` : \"\"}\n </div>\n `\n )\n .join(\"\")}</div>`;\n}\n\nfunction renderMetaItems(items: MetaItem[]): string {\n if (items.length === 0) {\n return \"\";\n }\n\n return `<div class=\"meta-grid\">${items\n .map(\n (item) => `\n <div class=\"meta-item\">\n <span class=\"meta-label\">${escapeHtml(item.label)}</span>\n <span class=\"meta-value\">${escapeHtml(item.value)}</span>\n </div>\n `\n )\n .join(\"\")}</div>`;\n}\n\nfunction renderHeaderCard(\n commandName: string,\n heading: string,\n target: string,\n stats: StatCard[],\n metaItems: MetaItem[]\n): string {\n return `\n <section class=\"card header-card\">\n <div class=\"eyebrow\">skilltest ${escapeHtml(commandName)}</div>\n <h1>${escapeHtml(heading)}</h1>\n <div class=\"target-line\">target: ${escapeHtml(target)}</div>\n ${renderMetaItems(metaItems)}\n ${renderStatCards(stats)}\n </section>\n `;\n}\n\nfunction renderSectionCard(title: string, body: string): string {\n return `\n <section class=\"card\">\n <h2>${escapeHtml(title)}</h2>\n ${body}\n </section>\n `;\n}\n\nfunction renderMessageRow(status: HtmlStatus, title: string, message: string, details?: string): string {\n return `\n <div class=\"row\">\n <div class=\"row-header\">\n <div class=\"row-title\">${escapeHtml(title)}</div>\n ${renderBadge(status)}\n </div>\n <div class=\"row-body\">${escapeHtml(message)}</div>\n ${details ?? \"\"}\n </div>\n `;\n}\n\nfunction renderDetails(summary: string, content: string): string {\n return `\n <details class=\"detail-block\">\n <summary>${escapeHtml(summary)}</summary>\n <div class=\"detail-content\">${content}</div>\n </details>\n `;\n}\n\nfunction renderPreBlock(content: string): string {\n return `<pre>${escapeHtml(content)}</pre>`;\n}\n\nfunction renderDefinitionList(items: MetaItem[]): string {\n return `<div class=\"definition-list\">${items\n .map(\n (item) => `\n <div class=\"definition-item\">\n <div class=\"definition-label\">${escapeHtml(item.label)}</div>\n <div class=\"definition-value\">${escapeHtml(item.value)}</div>\n </div>\n `\n )\n .join(\"\")}</div>`;\n}\n\nfunction countSkippedSecurityPatterns(issues: LintIssue[]): number {\n return issues.reduce((total, issue) => total + (issue.skippedPatterns?.length ?? 0), 0);\n}\n\nfunction renderLintIssueRow(issue: LintIssue): string {\n const lineRange = formatLineRange(issue.startLine, issue.endLine);\n const detailBlocks: string[] = [];\n\n if (issue.suggestion) {\n detailBlocks.push(renderDetails(\"Suggestion\", `<p>${escapeHtml(issue.suggestion)}</p>`));\n }\n\n if (issue.skippedPatterns && issue.skippedPatterns.length > 0) {\n const patternItems = issue.skippedPatterns\n .map(\n (pattern) => `\n <div class=\"definition-item\">\n <div class=\"definition-label\">${escapeHtml(pattern.label)}</div>\n <div class=\"definition-value\">${escapeHtml(\n `${pattern.zoneType} lines ${pattern.startLine}-${pattern.endLine}`\n )}</div>\n </div>\n `\n )\n .join(\"\");\n detailBlocks.push(renderDetails(\"Skipped security patterns\", `<div class=\"definition-list\">${patternItems}</div>`));\n }\n\n return `\n <div class=\"row\">\n <div class=\"row-header\">\n <div>\n <div class=\"row-title\">${escapeHtml(issue.title)}</div>\n <div class=\"row-subtitle\">${escapeHtml(issue.checkId)}</div>\n </div>\n ${renderBadge(issue.status)}\n </div>\n <div class=\"row-body\">${escapeHtml(issue.message)}</div>\n ${renderDefinitionList(\n [\n lineRange ? { label: \"Location\", value: lineRange } : null,\n { label: \"Check ID\", value: issue.checkId }\n ].filter((item): item is MetaItem => item !== null)\n )}\n ${detailBlocks.join(\"\")}\n </div>\n `;\n}\n\nfunction renderLintIssueList(report: LintReport): string {\n const skippedSecurityPatterns = countSkippedSecurityPatterns(report.issues);\n const rows = report.issues.map((issue) => renderLintIssueRow(issue)).join(\"\");\n const info =\n skippedSecurityPatterns > 0\n ? `<p class=\"info-line\">Skipped security patterns in examples/comments: ${escapeHtml(skippedSecurityPatterns)}</p>`\n : \"\";\n\n return `<div class=\"row-list\">${rows}</div>${info}`;\n}\n\nfunction renderTriggerCaseRow(testCase: TriggerTestCaseResult, showSelectedCompetitor: boolean): string {\n const details = testCase.rawModelResponse\n ? renderDetails(\"Model response\", renderPreBlock(testCase.rawModelResponse))\n : \"\";\n\n return `\n <div class=\"row${testCase.selectedCompetitor ? \" competitor-selected\" : \"\"}\">\n <div class=\"row-header\">\n <div>\n <div class=\"row-title\">${escapeHtml(testCase.query)}</div>\n <div class=\"row-subtitle\">${escapeHtml(\n `expected=${testCase.expected} actual=${testCase.actual} should_trigger=${String(testCase.shouldTrigger)}`\n )}</div>\n </div>\n ${renderBadge(testCase.matched ? \"pass\" : \"fail\")}\n </div>\n ${renderDefinitionList([\n { label: \"Expected\", value: testCase.expected },\n { label: \"Actual\", value: testCase.actual },\n ...(showSelectedCompetitor ? [{ label: \"Selected competitor\", value: testCase.selectedCompetitor ?? \"none\" }] : [])\n ])}\n ${details}\n </div>\n `;\n}\n\nfunction renderCompetitorSkillsSection(result: TriggerTestResult): string {\n if (!result.competitors || result.competitors.length === 0) {\n return \"\";\n }\n\n return renderSectionCard(\n \"Competitor Skills\",\n `<div class=\"row-list\">${result.competitors\n .map((competitor) =>\n renderMessageRow(\n \"warn\",\n competitor.name,\n competitor.description,\n renderDefinitionList([{ label: \"Source\", value: competitor.sourcePath }])\n )\n )\n .join(\"\")}</div>`\n );\n}\n\nfunction promptStatus(promptResult: EvalPromptResult): HtmlStatus {\n if (promptResult.totalAssertions === 0) {\n return \"skip\";\n }\n if (promptResult.passedAssertions === promptResult.totalAssertions) {\n return \"pass\";\n }\n if (promptResult.passedAssertions === 0) {\n return \"fail\";\n }\n return \"warn\";\n}\n\nfunction renderAssertionRow(assertion: EvalPromptResult[\"assertions\"][number]): string {\n return `\n <details class=\"detail-block\">\n <summary>\n ${renderBadge(assertion.passed ? \"pass\" : \"fail\")}\n ${assertion.source === \"tool\" ? renderMetaBadge(\"Tool\") : \"\"}\n <span>${escapeHtml(assertion.assertion)}</span>\n </summary>\n <div class=\"detail-content\">${renderPreBlock(assertion.evidence)}</div>\n </details>\n `;\n}\n\nfunction renderToolCallsSection(promptResult: EvalPromptResult): string {\n if (!promptResult.toolCalls || promptResult.toolCalls.length === 0) {\n return \"\";\n }\n\n const toolRows = promptResult.toolCalls\n .map(\n (toolCall) => `\n <div class=\"tool-call\">\n <div class=\"row-header\">\n <div>\n <div class=\"row-title\">${escapeHtml(toolCall.name)}</div>\n <div class=\"row-subtitle\">${escapeHtml(`turn ${toolCall.turnIndex}`)}</div>\n </div>\n ${renderMetaBadge(\"Tool Call\")}\n </div>\n ${renderDefinitionList([{ label: \"Arguments\", value: JSON.stringify(toolCall.arguments) }])}\n ${renderDetails(\"Mock response\", renderPreBlock(toolCall.response))}\n </div>\n `\n )\n .join(\"\");\n\n return renderDetails(\"Tool Calls\", `<div class=\"tool-call-list\">${toolRows}</div>`);\n}\n\nfunction renderEvalPromptRow(promptResult: EvalPromptResult): string {\n const assertionDetails = promptResult.assertions.map((assertion) => renderAssertionRow(assertion)).join(\"\");\n const responseDetails = renderDetails(\"Full model response\", renderPreBlock(promptResult.response));\n\n return `\n <div class=\"row\">\n <div class=\"row-header\">\n <div>\n <div class=\"row-title\">${escapeHtml(promptResult.prompt)}</div>\n <div class=\"row-subtitle\">${escapeHtml(\n `${promptResult.passedAssertions}/${promptResult.totalAssertions} assertions passed`\n )}</div>\n </div>\n ${renderBadge(promptStatus(promptResult))}\n </div>\n <div class=\"row-body\">${escapeHtml(promptResult.responseSummary)}</div>\n ${renderDefinitionList([\n { label: \"Passed assertions\", value: String(promptResult.passedAssertions) },\n { label: \"Total assertions\", value: String(promptResult.totalAssertions) },\n ...(promptResult.toolCalls ? [{ label: \"Tool calls\", value: String(promptResult.toolCalls.length) }] : []),\n ...(promptResult.loopIterations !== undefined ? [{ label: \"Loop iterations\", value: String(promptResult.loopIterations) }] : [])\n ])}\n ${renderDetails(\"Assertion evidence\", assertionDetails || `<p>No assertions.</p>`)}\n ${renderToolCallsSection(promptResult)}\n ${responseDetails}\n </div>\n `;\n}\n\nfunction gateStatus(value: boolean | null): HtmlStatus {\n if (value === null) {\n return \"skip\";\n }\n return value ? \"pass\" : \"fail\";\n}\n\nfunction renderGateCard(title: string, status: HtmlStatus, message: string): string {\n return `\n <div class=\"gate-card\">\n <div class=\"row-header\">\n <div class=\"row-title\">${escapeHtml(title)}</div>\n ${renderBadge(status)}\n </div>\n <div class=\"row-body\">${escapeHtml(message)}</div>\n </div>\n `;\n}\n\nfunction renderCollapsibleSection(title: string, summary: string, body: string, status: HtmlStatus): string {\n return `\n <details class=\"section-card\" open>\n <summary>\n <span class=\"section-title\">${escapeHtml(title)}</span>\n <span class=\"section-summary\">${renderBadge(status)} ${escapeHtml(summary)}</span>\n </summary>\n <div class=\"section-body\">${body}</div>\n </details>\n `;\n}\n\nfunction resolveOptionalTarget(result: { target?: string }, fallback: string): string {\n return result.target ?? fallback;\n}\n\nfunction renderHtmlDocument(title: string, body: string): string {\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\">\n <title>${escapeHtml(title)}</title>\n <style>\n :root {\n color-scheme: light;\n --bg: #f5f5f5;\n --surface: #ffffff;\n --surface-muted: #fafafa;\n --border: #d4d4d8;\n --text: #111827;\n --muted: #6b7280;\n --pass: #22c55e;\n --warn: #eab308;\n --fail: #ef4444;\n --competitor: #f97316;\n --skip: #6b7280;\n --shadow: 0 10px 30px rgba(15, 23, 42, 0.08);\n }\n\n * {\n box-sizing: border-box;\n }\n\n body {\n margin: 0;\n background: linear-gradient(180deg, #fafafa 0%, #f4f4f5 100%);\n color: var(--text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n line-height: 1.5;\n }\n\n .container {\n max-width: 1120px;\n margin: 0 auto;\n padding: 24px 16px 40px;\n }\n\n .card,\n .section-card {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 16px;\n box-shadow: var(--shadow);\n margin-bottom: 16px;\n }\n\n .card {\n padding: 20px;\n }\n\n .header-card h1,\n .card h2 {\n margin: 0 0 10px;\n font-size: 1.25rem;\n }\n\n .eyebrow {\n margin-bottom: 10px;\n color: var(--muted);\n font-size: 0.78rem;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n .target-line,\n .info-line {\n color: var(--muted);\n overflow-wrap: anywhere;\n }\n\n .meta-grid,\n .stats-grid,\n .gate-grid,\n .definition-list {\n display: grid;\n gap: 12px;\n }\n\n .meta-grid,\n .gate-grid,\n .definition-list {\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n }\n\n .stats-grid {\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n margin-top: 16px;\n }\n\n .meta-grid {\n margin-top: 14px;\n }\n\n .meta-item,\n .definition-item,\n .stat-card,\n .gate-card {\n background: var(--surface-muted);\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 12px;\n }\n\n .meta-item,\n .definition-item {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n }\n\n .meta-label,\n .definition-label,\n .stat-label {\n color: var(--muted);\n font-size: 0.82rem;\n }\n\n .meta-value,\n .definition-value {\n text-align: right;\n overflow-wrap: anywhere;\n }\n\n .stat-value {\n margin-top: 4px;\n font-size: 1.3rem;\n font-weight: 700;\n }\n\n .stat-note {\n margin-top: 6px;\n color: var(--muted);\n font-size: 0.82rem;\n }\n\n .status-pass {\n border-color: rgba(34, 197, 94, 0.35);\n }\n\n .status-warn {\n border-color: rgba(234, 179, 8, 0.35);\n }\n\n .status-fail {\n border-color: rgba(239, 68, 68, 0.35);\n }\n\n .status-skip {\n border-color: rgba(107, 114, 128, 0.35);\n }\n\n .row-list {\n display: grid;\n gap: 12px;\n }\n\n .row {\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 14px;\n background: var(--surface-muted);\n }\n\n .row.competitor-selected {\n border-color: rgba(249, 115, 22, 0.45);\n background: rgba(249, 115, 22, 0.08);\n }\n\n .row-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 12px;\n }\n\n .row-title {\n font-weight: 700;\n overflow-wrap: anywhere;\n }\n\n .row-subtitle {\n margin-top: 4px;\n color: var(--muted);\n font-size: 0.84rem;\n overflow-wrap: anywhere;\n }\n\n .row-body {\n margin-top: 10px;\n overflow-wrap: anywhere;\n }\n\n .badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 58px;\n padding: 3px 10px;\n border-radius: 999px;\n border: 1px solid currentColor;\n font-size: 0.76rem;\n font-weight: 700;\n letter-spacing: 0.04em;\n white-space: nowrap;\n }\n\n .badge.pass {\n color: #15803d;\n background: rgba(34, 197, 94, 0.14);\n }\n\n .badge.warn {\n color: #a16207;\n background: rgba(234, 179, 8, 0.18);\n }\n\n .badge.fail {\n color: #b91c1c;\n background: rgba(239, 68, 68, 0.14);\n }\n\n .badge.skip {\n color: #4b5563;\n background: rgba(107, 114, 128, 0.14);\n }\n\n .meta-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px 10px;\n border-radius: 999px;\n border: 1px solid rgba(17, 24, 39, 0.16);\n background: rgba(17, 24, 39, 0.06);\n color: var(--text);\n font-size: 0.76rem;\n font-weight: 700;\n white-space: nowrap;\n }\n\n details {\n margin-top: 10px;\n }\n\n details summary {\n cursor: pointer;\n color: var(--muted);\n }\n\n .detail-block {\n border-top: 1px dashed var(--border);\n padding-top: 10px;\n }\n\n .detail-block summary {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .detail-content p {\n margin: 0;\n }\n\n .section-card summary {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n padding: 18px 20px;\n list-style: none;\n }\n\n .section-card summary::-webkit-details-marker {\n display: none;\n }\n\n .section-title {\n font-size: 1rem;\n font-weight: 700;\n color: var(--text);\n }\n\n .section-summary {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: var(--muted);\n text-align: right;\n }\n\n .section-body {\n padding: 0 20px 20px;\n }\n\n .gate-grid {\n margin-top: 12px;\n }\n\n pre {\n margin: 0;\n padding: 12px;\n background: #f8fafc;\n border: 1px solid var(--border);\n border-radius: 10px;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: anywhere;\n }\n\n .tool-call-list {\n display: grid;\n gap: 12px;\n }\n\n .tool-call {\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 14px;\n background: #fffaf0;\n }\n\n ul {\n margin: 0;\n padding-left: 20px;\n }\n\n @media (max-width: 720px) {\n .container {\n padding: 16px 12px 28px;\n }\n\n .row-header,\n .section-card summary,\n .meta-item,\n .definition-item {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .meta-value,\n .definition-value,\n .section-summary {\n text-align: left;\n }\n }\n </style>\n </head>\n <body>\n <main class=\"container\">\n ${body}\n </main>\n </body>\n</html>`;\n}\n\nexport function renderLintHtml(report: LintReport): string {\n const passRate = report.summary.total === 0 ? 0 : report.summary.passed / report.summary.total;\n const body = [\n renderHeaderCard(\n \"lint\",\n \"Static Analysis Report\",\n report.target,\n [\n { label: \"Pass rate\", value: formatPercent(passRate), note: `${report.summary.passed}/${report.summary.total} passed` },\n { label: \"Warnings\", value: String(report.summary.warnings), status: report.summary.warnings > 0 ? \"warn\" : \"pass\" },\n { label: \"Failures\", value: String(report.summary.failures), status: report.summary.failures > 0 ? \"fail\" : \"pass\" },\n { label: \"Checks\", value: String(report.summary.total) }\n ],\n [{ label: \"Target\", value: report.target }]\n ),\n renderSectionCard(\"Lint Issues\", renderLintIssueList(report))\n ].join(\"\");\n\n return renderHtmlDocument(`skilltest lint - ${report.target}`, body);\n}\n\nexport function renderTriggerHtml(result: TriggerTestResult): string {\n const htmlResult = result as TriggerTestResult & { target?: string };\n const target = resolveOptionalTarget(htmlResult, result.skillName);\n const matchedCount = result.cases.filter((testCase) => testCase.matched).length;\n const matchRate = result.cases.length === 0 ? 0 : matchedCount / result.cases.length;\n const hasCompetitors = Boolean(result.competitors && result.competitors.length > 0);\n const body = [\n renderHeaderCard(\n \"trigger\",\n result.skillName,\n target,\n [\n { label: \"Match rate\", value: formatPercent(matchRate), note: `${matchedCount}/${result.cases.length} matched` },\n { label: \"Precision\", value: formatPercent(result.metrics.precision) },\n { label: \"Recall\", value: formatPercent(result.metrics.recall) },\n { label: \"F1\", value: formatPercent(result.metrics.f1), status: result.metrics.f1 >= 0.8 ? \"pass\" : \"warn\" }\n ],\n [\n { label: \"Provider\", value: result.provider },\n { label: \"Model\", value: result.model },\n { label: \"Seed\", value: result.seed !== undefined ? String(result.seed) : \"none\" },\n ...(hasCompetitors ? [{ label: \"Competitors\", value: String(result.competitors?.length ?? 0) }] : []),\n { label: \"Queries\", value: String(result.queries.length) }\n ]\n ),\n renderCompetitorSkillsSection(result),\n renderSectionCard(\n \"Trigger Cases\",\n `<div class=\"row-list\">${result.cases.map((testCase) => renderTriggerCaseRow(testCase, hasCompetitors)).join(\"\")}</div>`\n ),\n renderSectionCard(\n \"Suggestions\",\n `<ul>${result.suggestions.map((suggestion) => `<li>${escapeHtml(suggestion)}</li>`).join(\"\")}</ul>`\n )\n ].join(\"\");\n\n return renderHtmlDocument(`skilltest trigger - ${result.skillName}`, body);\n}\n\nexport function renderEvalHtml(result: EvalResult): string {\n const htmlResult = result as EvalResult & { target?: string };\n const target = resolveOptionalTarget(htmlResult, result.skillName);\n const passRate = result.summary.totalAssertions === 0 ? 0 : result.summary.passedAssertions / result.summary.totalAssertions;\n const body = [\n renderHeaderCard(\n \"eval\",\n result.skillName,\n target,\n [\n {\n label: \"Assertion pass rate\",\n value: formatPercent(passRate),\n note: `${result.summary.passedAssertions}/${result.summary.totalAssertions} passed`\n },\n { label: \"Prompts\", value: String(result.summary.totalPrompts) },\n { label: \"Model\", value: result.model },\n { label: \"Grader\", value: result.graderModel }\n ],\n [\n { label: \"Provider\", value: result.provider },\n { label: \"Execution model\", value: result.model },\n { label: \"Grader model\", value: result.graderModel },\n { label: \"Prompts\", value: String(result.prompts.length) }\n ]\n ),\n renderSectionCard(\"Eval Prompts\", `<div class=\"row-list\">${result.results.map((promptResult) => renderEvalPromptRow(promptResult)).join(\"\")}</div>`)\n ].join(\"\");\n\n return renderHtmlDocument(`skilltest eval - ${result.skillName}`, body);\n}\n\nexport function renderCheckHtml(result: CheckRunResult): string {\n const skillName = result.trigger?.skillName ?? result.eval?.skillName ?? result.target;\n const triggerBody = result.trigger\n ? `${renderCompetitorSkillsSection(result.trigger)}\n <div class=\"row-list\">${result.trigger.cases\n .map((testCase) => renderTriggerCaseRow(testCase, Boolean(result.trigger?.competitors?.length)))\n .join(\"\")}</div>\n <div class=\"card\" style=\"margin-top: 16px;\">\n <h2>Trigger Suggestions</h2>\n <ul>${result.trigger.suggestions.map((suggestion) => `<li>${escapeHtml(suggestion)}</li>`).join(\"\")}</ul>\n </div>`\n : renderMessageRow(\"skip\", \"Trigger skipped\", result.triggerSkippedReason ?? \"Skipped.\");\n\n const evalBody = result.eval\n ? `<div class=\"row-list\">${result.eval.results.map((promptResult) => renderEvalPromptRow(promptResult)).join(\"\")}</div>`\n : renderMessageRow(\"skip\", \"Eval skipped\", result.evalSkippedReason ?? \"Skipped.\");\n\n const lintStatus: HtmlStatus = result.gates.lintPassed ? \"pass\" : \"fail\";\n const triggerStatus = gateStatus(result.gates.triggerPassed);\n const evalStatus = gateStatus(result.gates.evalPassed);\n const overallStatus: HtmlStatus = result.gates.overallPassed ? \"pass\" : \"fail\";\n\n const header = renderHeaderCard(\n \"check\",\n skillName,\n result.target,\n [\n { label: \"Overall gate\", value: badgeLabel(overallStatus), status: overallStatus },\n {\n label: \"Trigger F1\",\n value: result.gates.triggerF1 !== null ? formatPercent(result.gates.triggerF1) : \"skipped\",\n status: triggerStatus\n },\n {\n label: \"Eval pass rate\",\n value: result.gates.evalAssertPassRate !== null ? formatPercent(result.gates.evalAssertPassRate) : \"skipped\",\n status: evalStatus\n },\n {\n label: \"Lint result\",\n value: `${result.lint.summary.failures} fail / ${result.lint.summary.warnings} warn`,\n status: lintStatus\n }\n ],\n [\n { label: \"Provider\", value: result.provider },\n { label: \"Model\", value: result.model },\n { label: \"Grader model\", value: result.graderModel },\n {\n label: \"Thresholds\",\n value: `min-f1=${result.thresholds.minF1.toFixed(2)} min-assert-pass-rate=${result.thresholds.minAssertPassRate.toFixed(2)}`\n }\n ]\n );\n\n const lintSection = renderCollapsibleSection(\n \"Lint\",\n `${result.lint.summary.passed}/${result.lint.summary.total} passed, ${result.lint.summary.warnings} warnings, ${result.lint.summary.failures} failures`,\n renderLintIssueList(result.lint),\n lintStatus\n );\n\n const triggerSection = renderCollapsibleSection(\n \"Trigger\",\n result.trigger\n ? `f1=${formatPercent(result.trigger.metrics.f1)} precision=${formatPercent(result.trigger.metrics.precision)} recall=${formatPercent(result.trigger.metrics.recall)}`\n : result.triggerSkippedReason ?? \"Skipped.\",\n triggerBody,\n triggerStatus\n );\n\n const evalSection = renderCollapsibleSection(\n \"Eval\",\n result.eval\n ? `assertion pass rate=${formatPercent(result.gates.evalAssertPassRate ?? 0)} (${result.eval.summary.passedAssertions}/${result.eval.summary.totalAssertions})`\n : result.evalSkippedReason ?? \"Skipped.\",\n evalBody,\n evalStatus\n );\n\n const qualityGate = renderSectionCard(\n \"Quality Gate\",\n `<div class=\"gate-grid\">\n ${renderGateCard(\"Lint gate\", lintStatus, result.gates.lintPassed ? \"Lint passed.\" : \"Lint failed.\")}\n ${renderGateCard(\n \"Trigger gate\",\n triggerStatus,\n result.gates.triggerPassed === null\n ? result.triggerSkippedReason ?? \"Skipped.\"\n : `required ${result.thresholds.minF1.toFixed(2)}, actual ${result.gates.triggerF1?.toFixed(2) ?? \"n/a\"}`\n )}\n ${renderGateCard(\n \"Eval gate\",\n evalStatus,\n result.gates.evalPassed === null\n ? result.evalSkippedReason ?? \"Skipped.\"\n : `required ${result.thresholds.minAssertPassRate.toFixed(2)}, actual ${result.gates.evalAssertPassRate?.toFixed(2) ?? \"n/a\"}`\n )}\n ${renderGateCard(\"Overall\", overallStatus, result.gates.overallPassed ? \"All quality gates passed.\" : \"One or more gates failed.\")}\n </div>`\n );\n\n return renderHtmlDocument(`skilltest check - ${skillName}`, [header, lintSection, triggerSection, evalSection, qualityGate].join(\"\"));\n}\n","import { Chalk, ChalkInstance } from \"chalk\";\nimport { LintIssue, LintReport } from \"../core/linter/index.js\";\nimport { TriggerTestResult } from \"../core/trigger-tester.js\";\nimport { EvalResult } from \"../core/eval-runner.js\";\nimport { CheckRunResult } from \"../core/check-runner.js\";\nimport { ImproveRunResult } from \"../core/improver.js\";\n\nfunction getChalkInstance(enableColor: boolean): ChalkInstance {\n return new Chalk({ level: enableColor ? 1 : 0 });\n}\n\nfunction renderIssueLine(issue: LintIssue, c: ChalkInstance): string {\n const label =\n issue.status === \"pass\" ? c.green(\"PASS\") : issue.status === \"warn\" ? c.yellow(\"WARN\") : c.red(\"FAIL\");\n const detail = issue.suggestion ? `\\n suggestion: ${issue.suggestion}` : \"\";\n return ` ${label} ${issue.title}\\n ${issue.message}${detail}`;\n}\n\nfunction countSkippedSecurityPatterns(issues: LintIssue[]): number {\n return issues.reduce((total, issue) => {\n if (!issue.checkId.startsWith(\"security:\")) {\n return total;\n }\n return total + (issue.skippedPatterns?.length ?? 0);\n }, 0);\n}\n\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(1)}%`;\n}\n\nfunction formatSignedNumber(value: number, digits = 4): string {\n const prefix = value > 0 ? \"+\" : \"\";\n return `${prefix}${value.toFixed(digits)}`;\n}\n\nfunction diffChangedLines(beforeText: string, afterText: string): Array<{ type: \"+\" | \"-\"; line: string }> {\n const beforeLines = beforeText.split(/\\r?\\n/);\n const afterLines = afterText.split(/\\r?\\n/);\n const dp = Array.from({ length: beforeLines.length + 1 }, () => Array<number>(afterLines.length + 1).fill(0));\n\n for (let beforeIndex = beforeLines.length - 1; beforeIndex >= 0; beforeIndex -= 1) {\n for (let afterIndex = afterLines.length - 1; afterIndex >= 0; afterIndex -= 1) {\n if (beforeLines[beforeIndex] === afterLines[afterIndex]) {\n dp[beforeIndex]![afterIndex] = 1 + (dp[beforeIndex + 1]![afterIndex + 1] ?? 0);\n } else {\n dp[beforeIndex]![afterIndex] = Math.max(dp[beforeIndex + 1]![afterIndex] ?? 0, dp[beforeIndex]![afterIndex + 1] ?? 0);\n }\n }\n }\n\n const changedLines: Array<{ type: \"+\" | \"-\"; line: string }> = [];\n let beforeIndex = 0;\n let afterIndex = 0;\n\n while (beforeIndex < beforeLines.length && afterIndex < afterLines.length) {\n if (beforeLines[beforeIndex] === afterLines[afterIndex]) {\n beforeIndex += 1;\n afterIndex += 1;\n continue;\n }\n\n const skipBefore = dp[beforeIndex + 1]![afterIndex] ?? 0;\n const skipAfter = dp[beforeIndex]![afterIndex + 1] ?? 0;\n if (skipBefore >= skipAfter) {\n changedLines.push({ type: \"-\", line: beforeLines[beforeIndex] ?? \"\" });\n beforeIndex += 1;\n } else {\n changedLines.push({ type: \"+\", line: afterLines[afterIndex] ?? \"\" });\n afterIndex += 1;\n }\n }\n\n while (beforeIndex < beforeLines.length) {\n changedLines.push({ type: \"-\", line: beforeLines[beforeIndex] ?? \"\" });\n beforeIndex += 1;\n }\n\n while (afterIndex < afterLines.length) {\n changedLines.push({ type: \"+\", line: afterLines[afterIndex] ?? \"\" });\n afterIndex += 1;\n }\n\n return changedLines;\n}\n\nfunction renderDiffPreview(beforeText: string, afterText: string, maxLines = 40): string[] {\n const changedLines = diffChangedLines(beforeText, afterText);\n if (changedLines.length === 0) {\n return [\" (no content changes)\"];\n }\n\n const previewLines = changedLines.slice(0, maxLines).map((entry) => ` ${entry.type} ${entry.line}`);\n if (changedLines.length > maxLines) {\n previewLines.push(` ... ${changedLines.length - maxLines} more changed line(s)`);\n }\n return previewLines;\n}\n\nfunction summarizeToolCalls(toolCalls: NonNullable<EvalResult[\"results\"][number][\"toolCalls\"]>): string {\n const counts = new Map<string, number>();\n for (const toolCall of toolCalls) {\n counts.set(toolCall.name, (counts.get(toolCall.name) ?? 0) + 1);\n }\n\n return Array.from(counts.entries())\n .map(([name, count]) => `${name} x${count}`)\n .join(\", \");\n}\n\nexport function renderLintReport(report: LintReport, enableColor: boolean): string {\n const c = getChalkInstance(enableColor);\n const { passed, warnings, failures, total } = report.summary;\n const headerLines = [\n \"skilltest lint\",\n `target: ${report.target}`,\n `summary: ${passed}/${total} checks passed, ${warnings} warnings, ${failures} failures`\n ];\n\n const renderedIssues = report.issues.map((issue) => renderIssueLine(issue, c)).join(\"\\n\");\n const skippedSecurityPatterns = countSkippedSecurityPatterns(report.issues);\n const infoLine =\n skippedSecurityPatterns > 0\n ? `\\n ${c.cyan(\"INFO\")} ${skippedSecurityPatterns} security pattern(s) found in code examples/comments (not flagged)`\n : \"\";\n\n return `${headerLines.join(\"\\n\")}\\n${renderedIssues}${infoLine}`;\n}\n\nexport function renderTriggerReport(result: TriggerTestResult, enableColor: boolean, verbose: boolean): string {\n const c = getChalkInstance(enableColor);\n const lines: string[] = [\n \"skilltest trigger\",\n `skill: ${result.skillName}`,\n `provider/model: ${result.provider}/${result.model}`\n ];\n\n if (result.competitors && result.competitors.length > 0) {\n lines.push(`competitors: ${result.competitors.map((competitor) => competitor.name).join(\", \")}`);\n }\n\n lines.push(\n `precision: ${formatPercent(result.metrics.precision)} recall: ${formatPercent(result.metrics.recall)} f1: ${formatPercent(result.metrics.f1)}`\n );\n lines.push(\n `TP ${result.metrics.truePositives} TN ${result.metrics.trueNegatives} FP ${result.metrics.falsePositives} FN ${result.metrics.falseNegatives}`\n );\n\n for (const [index, testCase] of result.cases.entries()) {\n const status = testCase.matched ? c.green(\"PASS\") : c.red(\"FAIL\");\n lines.push(`${index + 1}. ${status} query: ${testCase.query}`);\n lines.push(` expected: ${testCase.expected} | actual: ${testCase.actual}`);\n if (verbose && testCase.selectedCompetitor) {\n lines.push(` competitor selected: ${testCase.selectedCompetitor}`);\n }\n if (verbose && testCase.rawModelResponse) {\n lines.push(` model: ${testCase.rawModelResponse.replace(/\\s+/g, \" \").trim()}`);\n }\n }\n\n lines.push(\"Suggestions:\");\n for (const suggestion of result.suggestions) {\n lines.push(`- ${suggestion}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function renderEvalReport(result: EvalResult, enableColor: boolean, verbose: boolean): string {\n const c = getChalkInstance(enableColor);\n const lines: string[] = [\n \"skilltest eval\",\n `skill: ${result.skillName}`,\n `provider/model: ${result.provider}/${result.model}`,\n `grader model: ${result.graderModel}`,\n `assertions passed: ${result.summary.passedAssertions}/${result.summary.totalAssertions}`\n ];\n\n for (const [index, promptResult] of result.results.entries()) {\n lines.push(`${index + 1}. prompt: ${promptResult.prompt}`);\n lines.push(` response summary: ${promptResult.responseSummary.replace(/\\s+/g, \" \").trim()}`);\n if (promptResult.toolCalls) {\n lines.push(` Tools: ${promptResult.toolCalls.length} calls (${summarizeToolCalls(promptResult.toolCalls)})`);\n if (promptResult.loopIterations !== undefined) {\n lines.push(` loop iterations: ${promptResult.loopIterations}`);\n }\n }\n for (const assertion of promptResult.assertions) {\n const status = assertion.passed ? c.green(\"PASS\") : c.red(\"FAIL\");\n lines.push(` ${status} ${assertion.assertion}`);\n lines.push(` evidence: ${assertion.evidence}`);\n }\n if (verbose) {\n if (promptResult.toolCalls) {\n for (const toolCall of promptResult.toolCalls) {\n lines.push(` tool ${toolCall.turnIndex}: ${toolCall.name}`);\n lines.push(` arguments: ${JSON.stringify(toolCall.arguments)}`);\n lines.push(` response: ${toolCall.response}`);\n }\n }\n lines.push(` full response: ${promptResult.response}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction gateStatusLabel(value: boolean | null, c: ChalkInstance): string {\n if (value === null) {\n return c.yellow(\"SKIP\");\n }\n return value ? c.green(\"PASS\") : c.red(\"FAIL\");\n}\n\nexport function renderCheckReport(result: CheckRunResult, enableColor: boolean, verbose: boolean): string {\n const c = getChalkInstance(enableColor);\n const lines: string[] = [];\n\n const lintGate = gateStatusLabel(result.gates.lintPassed, c);\n const triggerGate = gateStatusLabel(result.gates.triggerPassed, c);\n const evalGate = gateStatusLabel(result.gates.evalPassed, c);\n const overallGate = result.gates.overallPassed ? c.green(\"PASS\") : c.red(\"FAIL\");\n\n lines.push(\"skilltest check\");\n lines.push(`target: ${result.target}`);\n lines.push(`provider/model: ${result.provider}/${result.model}`);\n lines.push(`grader model: ${result.graderModel}`);\n lines.push(\n `thresholds: min-f1=${result.thresholds.minF1.toFixed(2)} min-assert-pass-rate=${result.thresholds.minAssertPassRate.toFixed(2)}`\n );\n\n lines.push(\"\");\n lines.push(\"Lint\");\n lines.push(\n `- ${lintGate} ${result.lint.summary.passed}/${result.lint.summary.total} checks passed (${result.lint.summary.warnings} warnings, ${result.lint.summary.failures} failures)`\n );\n\n const lintIssues = verbose ? result.lint.issues : result.lint.issues.filter((issue) => issue.status !== \"pass\");\n for (const issue of lintIssues) {\n lines.push(renderIssueLine(issue, c));\n }\n\n const skippedSecurityPatterns = countSkippedSecurityPatterns(result.lint.issues);\n if (skippedSecurityPatterns > 0) {\n lines.push(` ${c.cyan(\"INFO\")} ${skippedSecurityPatterns} security pattern(s) found in code examples/comments (not flagged)`);\n }\n\n lines.push(\"\");\n lines.push(\"Trigger\");\n if (result.trigger) {\n lines.push(\n `- ${triggerGate} f1=${formatPercent(result.trigger.metrics.f1)} (precision=${formatPercent(result.trigger.metrics.precision)} recall=${formatPercent(result.trigger.metrics.recall)})`\n );\n lines.push(\n ` TP ${result.trigger.metrics.truePositives} TN ${result.trigger.metrics.trueNegatives} FP ${result.trigger.metrics.falsePositives} FN ${result.trigger.metrics.falseNegatives}`\n );\n if (result.trigger.competitors && result.trigger.competitors.length > 0) {\n lines.push(` competitors: ${result.trigger.competitors.map((competitor) => competitor.name).join(\", \")}`);\n }\n\n const triggerCases = verbose ? result.trigger.cases : result.trigger.cases.filter((testCase) => !testCase.matched);\n for (const testCase of triggerCases) {\n const status = testCase.matched ? c.green(\"PASS\") : c.red(\"FAIL\");\n lines.push(` - ${status} ${testCase.query}`);\n lines.push(` expected=${testCase.expected} actual=${testCase.actual}`);\n if (testCase.selectedCompetitor) {\n lines.push(` competitor selected=${testCase.selectedCompetitor}`);\n }\n }\n } else {\n lines.push(`- ${triggerGate} ${result.triggerSkippedReason ?? \"Skipped.\"}`);\n }\n\n lines.push(\"\");\n lines.push(\"Eval\");\n if (result.eval) {\n const passRate = result.gates.evalAssertPassRate ?? 0;\n lines.push(\n `- ${evalGate} assertion pass rate=${formatPercent(passRate)} (${result.eval.summary.passedAssertions}/${result.eval.summary.totalAssertions})`\n );\n\n for (const promptResult of result.eval.results) {\n const failedAssertions = promptResult.assertions.filter((assertion) => !assertion.passed);\n if (!verbose && failedAssertions.length === 0) {\n continue;\n }\n lines.push(` - prompt: ${promptResult.prompt}`);\n lines.push(` response summary: ${promptResult.responseSummary.replace(/\\s+/g, \" \").trim()}`);\n if (promptResult.toolCalls) {\n lines.push(` Tools: ${promptResult.toolCalls.length} calls (${summarizeToolCalls(promptResult.toolCalls)})`);\n if (promptResult.loopIterations !== undefined) {\n lines.push(` loop iterations: ${promptResult.loopIterations}`);\n }\n }\n const assertionsToRender = verbose ? promptResult.assertions : failedAssertions;\n for (const assertion of assertionsToRender) {\n const assertionStatus = assertion.passed ? c.green(\"PASS\") : c.red(\"FAIL\");\n lines.push(` ${assertionStatus} ${assertion.assertion}`);\n lines.push(` evidence: ${assertion.evidence}`);\n }\n if (verbose) {\n if (promptResult.toolCalls) {\n for (const toolCall of promptResult.toolCalls) {\n lines.push(` tool ${toolCall.turnIndex}: ${toolCall.name}`);\n lines.push(` arguments: ${JSON.stringify(toolCall.arguments)}`);\n lines.push(` response: ${toolCall.response}`);\n }\n }\n lines.push(` full response: ${promptResult.response}`);\n }\n }\n } else {\n lines.push(`- ${evalGate} ${result.evalSkippedReason ?? \"Skipped.\"}`);\n }\n\n lines.push(\"\");\n lines.push(\"Quality Gate\");\n lines.push(`- lint gate: ${lintGate}`);\n lines.push(`- trigger gate: ${triggerGate}`);\n lines.push(`- eval gate: ${evalGate}`);\n lines.push(`- overall: ${overallGate}`);\n\n return lines.join(\"\\n\");\n}\n\nexport function renderImproveReport(result: ImproveRunResult, enableColor: boolean, verbose = false): string {\n const c = getChalkInstance(enableColor);\n const lines: string[] = [\n \"skilltest improve\",\n `target: ${result.target}`,\n `provider/model: ${result.provider}/${result.model}`,\n `thresholds: min-f1=${result.thresholds.minF1.toFixed(2)} min-assert-pass-rate=${result.thresholds.minAssertPassRate.toFixed(2)}`\n ];\n\n const statusLabel = result.blockedReason ? c.red(\"BLOCKED\") : result.applied ? c.green(\"APPLIED\") : c.green(\"VERIFIED\");\n lines.push(`status: ${statusLabel}`);\n\n if (result.candidate) {\n lines.push(\"\");\n lines.push(\"Change Summary\");\n for (const item of result.candidate.changeSummary) {\n lines.push(`- ${item}`);\n }\n\n lines.push(\"\");\n lines.push(\"Targeted Problems\");\n for (const item of result.candidate.targetedProblems) {\n lines.push(`- ${item}`);\n }\n }\n\n if (result.delta && result.verification) {\n lines.push(\"\");\n lines.push(\"Before / After\");\n lines.push(\n `- lint failures: ${result.delta.lintFailures.before} -> ${result.delta.lintFailures.after} (${formatSignedNumber(result.delta.lintFailures.delta, 0)})`\n );\n lines.push(\n `- lint warnings: ${result.delta.lintWarnings.before} -> ${result.delta.lintWarnings.after} (${formatSignedNumber(result.delta.lintWarnings.delta, 0)})`\n );\n lines.push(\n `- trigger f1: ${formatPercent(result.delta.triggerF1.before)} -> ${formatPercent(result.delta.triggerF1.after)} (${formatSignedNumber(result.delta.triggerF1.delta)})`\n );\n lines.push(\n `- eval assertion pass rate: ${formatPercent(result.delta.evalAssertPassRate.before)} -> ${formatPercent(result.delta.evalAssertPassRate.after)} (${formatSignedNumber(result.delta.evalAssertPassRate.delta)})`\n );\n lines.push(\n `- overall gate: ${result.delta.overallPassed.before ? c.green(\"PASS\") : c.red(\"FAIL\")} -> ${result.delta.overallPassed.after ? c.green(\"PASS\") : c.red(\"FAIL\")}`\n );\n }\n\n if (result.outputPath) {\n lines.push(\"\");\n lines.push(`output: ${result.outputPath}`);\n }\n\n if (result.blockedReason) {\n lines.push(\"\");\n lines.push(\"Blocked\");\n lines.push(`- ${result.blockedReason}`);\n }\n\n if (result.candidate) {\n lines.push(\"\");\n lines.push(\"Diff Preview\");\n lines.push(...renderDiffPreview(result.originalRaw, result.candidate.raw));\n }\n\n if (verbose) {\n lines.push(\"\");\n lines.push(\"Baseline\");\n lines.push(renderCheckReport(result.baseline, enableColor, true));\n if (result.verification) {\n lines.push(\"\");\n lines.push(\"Verification\");\n lines.push(renderCheckReport(result.verification, enableColor, true));\n }\n }\n\n return lines.join(\"\\n\");\n}\n","import fs from \"node:fs/promises\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { EvalPrompt, evalPromptArraySchema, evalPromptSchema } from \"../core/eval-runner.js\";\nimport { TriggerQuery, triggerQueryArraySchema } from \"../core/trigger-tester.js\";\nimport { renderJson } from \"../reporters/json.js\";\nimport { ResolvedConfigContext } from \"../utils/config.js\";\nimport { readJsonFile } from \"../utils/fs.js\";\n\nconst executionContextByCommand = new WeakMap<Command, ResolvedConfigContext>();\n\nconst singleEvalPromptSchema = evalPromptSchema;\n\nconst promptStringArraySchema = z.array(z.string().min(1));\nconst assertionsObjectSchema = z.object({\n assertions: z.array(z.string().min(1))\n});\n\nexport interface GlobalCliOptions {\n json: boolean;\n color: boolean;\n}\n\nfunction parseJsonIfPossible(raw: string): unknown {\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return raw;\n }\n}\n\nfunction normalizeEvalPrompts(value: unknown, sourceLabel: string): EvalPrompt[] {\n const promptArray = evalPromptArraySchema.safeParse(value);\n if (promptArray.success) {\n return promptArray.data;\n }\n\n const singlePrompt = singleEvalPromptSchema.safeParse(value);\n if (singlePrompt.success) {\n return [singlePrompt.data];\n }\n\n const promptStrings = promptStringArraySchema.safeParse(value);\n if (promptStrings.success) {\n return promptStrings.data.map((prompt) => ({ prompt }));\n }\n\n if (typeof value === \"string\" && value.trim() !== \"\") {\n return [{ prompt: value.trim() }];\n }\n\n throw new Error(\n `Invalid eval prompt source at ${sourceLabel}. Expected plain text, a JSON prompt object, or a JSON array of prompts.`\n );\n}\n\nfunction parseAssertionsFromText(raw: string): string[] {\n return raw\n .split(/\\r?\\n/)\n .map((line) => line.trim().replace(/^[-*]\\s+/, \"\").replace(/^\\d+\\.\\s+/, \"\"))\n .filter((line) => line.length > 0);\n}\n\nfunction cloneEvalPrompt(prompt: EvalPrompt): EvalPrompt {\n return {\n prompt: prompt.prompt,\n assertions: prompt.assertions ? [...prompt.assertions] : undefined,\n tools: prompt.tools\n ? prompt.tools.map((tool) => ({\n ...tool,\n parameters: tool.parameters ? tool.parameters.map((parameter) => ({ ...parameter })) : undefined,\n responses: { ...tool.responses }\n }))\n : undefined,\n toolAssertions: prompt.toolAssertions\n ? prompt.toolAssertions.map((toolAssertion) => ({\n ...toolAssertion,\n toolNames: toolAssertion.toolNames ? [...toolAssertion.toolNames] : undefined,\n expectedArgs: toolAssertion.expectedArgs ? { ...toolAssertion.expectedArgs } : undefined\n }))\n : undefined\n };\n}\n\nfunction normalizeAssertions(value: unknown, sourceLabel: string): string[] {\n const assertionArray = z.array(z.string().min(1)).safeParse(value);\n if (assertionArray.success) {\n return assertionArray.data;\n }\n\n const assertionObject = assertionsObjectSchema.safeParse(value);\n if (assertionObject.success) {\n return assertionObject.data.assertions;\n }\n\n if (typeof value === \"string\") {\n const assertions = parseAssertionsFromText(value);\n if (assertions.length > 0) {\n return assertions;\n }\n }\n\n throw new Error(\n `Invalid eval assertions source at ${sourceLabel}. Expected JSON string[], { assertions: string[] }, or newline-delimited text.`\n );\n}\n\nexport function setCommandExecutionContext(command: Command, context: ResolvedConfigContext): void {\n executionContextByCommand.set(command, context);\n}\n\nexport function getCommandExecutionContext(command: Command): ResolvedConfigContext {\n const context = executionContextByCommand.get(command);\n if (!context) {\n throw new Error(`Missing resolved config for command '${command.name()}'.`);\n }\n return context;\n}\n\nexport function getResolvedConfig(command: Command): ResolvedConfigContext[\"config\"] {\n return getCommandExecutionContext(command).config;\n}\n\nexport function getGlobalCliOptions(command: Command): GlobalCliOptions {\n const options = command.optsWithGlobals<{ json?: boolean; color?: boolean }>();\n const context = executionContextByCommand.get(command);\n\n return {\n json: context?.config.json ?? Boolean(options.json),\n color: options.color !== false\n };\n}\n\nexport async function loadTriggerQueriesFile(filePath: string): Promise<TriggerQuery[]> {\n const loaded = await readJsonFile<unknown>(filePath);\n const parsed = triggerQueryArraySchema.safeParse(loaded);\n if (!parsed.success) {\n throw new Error(`Invalid --queries JSON: ${parsed.error.issues[0]?.message ?? \"unknown format issue\"}`);\n }\n return parsed.data;\n}\n\nexport async function loadEvalPromptsJson(filePath: string): Promise<EvalPrompt[]> {\n const loaded = await readJsonFile<unknown>(filePath);\n const parsed = evalPromptArraySchema.safeParse(loaded);\n if (!parsed.success) {\n throw new Error(`Invalid --prompts JSON: ${parsed.error.issues[0]?.message ?? \"unknown format issue\"}`);\n }\n return parsed.data;\n}\n\nexport async function loadConfiguredEvalPrompts(command: Command): Promise<EvalPrompt[] | undefined> {\n const context = getCommandExecutionContext(command);\n const promptFile = context.config.eval.promptFile;\n const assertionsFile = context.config.eval.assertionsFile;\n\n if (!promptFile && !assertionsFile) {\n return undefined;\n }\n\n if (!promptFile && assertionsFile) {\n throw new Error(\"Config field eval.assertionsFile requires eval.promptFile.\");\n }\n\n const promptRaw = await fs.readFile(promptFile as string, \"utf8\");\n let prompts = normalizeEvalPrompts(parseJsonIfPossible(promptRaw), promptFile as string);\n\n if (assertionsFile) {\n const assertionsRaw = await fs.readFile(assertionsFile, \"utf8\");\n const assertions = normalizeAssertions(parseJsonIfPossible(assertionsRaw), assertionsFile);\n prompts = prompts.map((prompt) => ({\n ...cloneEvalPrompt(prompt),\n assertions: [...assertions]\n }));\n }\n\n const numRunsWasExplicit = context.configFile?.eval?.numRuns !== undefined;\n if (numRunsWasExplicit && prompts.length === 1 && context.config.eval.numRuns > 1) {\n const promptTemplate = prompts[0];\n prompts = Array.from({ length: context.config.eval.numRuns }, () => cloneEvalPrompt(promptTemplate));\n }\n\n return prompts;\n}\n\nexport function writeResult(value: unknown, asJson: boolean): void {\n if (asJson) {\n process.stdout.write(`${renderJson(value)}\\n`);\n return;\n }\n process.stdout.write(`${String(value)}\\n`);\n}\n\nexport function writeError(error: unknown, asJson: boolean): void {\n const message = error instanceof Error ? error.message : String(error);\n if (asJson) {\n process.stdout.write(`${renderJson({ error: message })}\\n`);\n return;\n }\n process.stderr.write(`Error: ${message}\\n`);\n}\n","import { z } from \"zod\";\nimport { gradeResponse, GradedAssertion } from \"./grader.js\";\nimport { ParsedSkill } from \"./skill-parser.js\";\nimport { LanguageModelProvider } from \"../providers/types.js\";\nimport { pMap } from \"../utils/concurrency.js\";\nimport {\n matchesArgumentSubset,\n MockToolDefinition,\n runWithTools,\n ToolCall,\n ToolParameter\n} from \"./tool-environment.js\";\n\nexport interface EvalPrompt {\n prompt: string;\n assertions?: string[];\n tools?: MockToolDefinition[];\n toolAssertions?: ToolAssertion[];\n}\n\nexport interface ToolAssertion {\n type: \"tool_called\" | \"tool_not_called\" | \"tool_call_order\" | \"tool_argument_match\";\n toolName?: string;\n toolNames?: string[];\n expectedArgs?: Record<string, unknown>;\n description: string;\n}\n\nexport interface EvalPromptResult {\n prompt: string;\n assertions: GradedAssertion[];\n responseSummary: string;\n response: string;\n passedAssertions: number;\n totalAssertions: number;\n toolCalls?: ToolCall[];\n loopIterations?: number;\n}\n\nexport interface EvalResultSummary {\n totalPrompts: number;\n totalAssertions: number;\n passedAssertions: number;\n}\n\nexport interface EvalResult {\n skillName: string;\n model: string;\n graderModel: string;\n provider: string;\n prompts: EvalPrompt[];\n results: EvalPromptResult[];\n summary: EvalResultSummary;\n}\n\nconst toolParameterSchema: z.ZodType<ToolParameter> = z.object({\n name: z.string().min(1),\n type: z.enum([\"string\", \"number\", \"boolean\", \"object\", \"array\"]),\n description: z.string().min(1),\n required: z.boolean().optional()\n});\n\nconst mockToolDefinitionSchema: z.ZodType<MockToolDefinition> = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n parameters: z.array(toolParameterSchema).optional(),\n responses: z.record(z.string())\n});\n\nconst toolAssertionSchema: z.ZodType<ToolAssertion> = z\n .object({\n type: z.enum([\"tool_called\", \"tool_not_called\", \"tool_call_order\", \"tool_argument_match\"]),\n toolName: z.string().min(1).optional(),\n toolNames: z.array(z.string().min(1)).optional(),\n expectedArgs: z.record(z.unknown()).optional(),\n description: z.string().min(1)\n })\n .superRefine((value, context) => {\n if ((value.type === \"tool_called\" || value.type === \"tool_not_called\" || value.type === \"tool_argument_match\") && !value.toolName) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${value.type} requires toolName.`\n });\n }\n\n if (value.type === \"tool_call_order\" && (!value.toolNames || value.toolNames.length === 0)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"tool_call_order requires toolNames.\"\n });\n }\n\n if (value.type === \"tool_argument_match\" && !value.expectedArgs) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"tool_argument_match requires expectedArgs.\"\n });\n }\n });\n\nexport const evalPromptSchema = z.object({\n prompt: z.string().min(1),\n assertions: z.array(z.string().min(1)).optional(),\n tools: z.array(mockToolDefinitionSchema).optional(),\n toolAssertions: z.array(toolAssertionSchema).optional()\n});\n\nexport const evalPromptArraySchema = z.array(evalPromptSchema);\n\nfunction formatToolCallCounts(toolCalls: ToolCall[]): string {\n const counts = new Map<string, number>();\n for (const toolCall of toolCalls) {\n counts.set(toolCall.name, (counts.get(toolCall.name) ?? 0) + 1);\n }\n\n return Array.from(counts.entries())\n .map(([name, count]) => `${name} x${count}`)\n .join(\", \");\n}\n\nfunction formatExpectedOrder(toolNames: string[]): string {\n return `[${toolNames.join(\", \")}]`;\n}\n\nfunction formatActualOrder(toolCalls: ToolCall[], toolNames: string[]): string {\n const relevantNames = new Set(toolNames);\n const actualOrder = toolCalls.filter((toolCall) => relevantNames.has(toolCall.name)).map((toolCall) => toolCall.name);\n return `[${actualOrder.join(\", \")}]`;\n}\n\nexport function evaluateToolAssertions(toolAssertions: ToolAssertion[], toolCalls: ToolCall[]): GradedAssertion[] {\n return toolAssertions.map((toolAssertion) => {\n if (toolAssertion.type === \"tool_called\") {\n const matchingCalls = toolCalls.filter((toolCall) => toolCall.name === toolAssertion.toolName);\n return {\n assertion: toolAssertion.description,\n passed: matchingCalls.length > 0,\n evidence:\n matchingCalls.length > 0\n ? `Tool '${toolAssertion.toolName}' was called ${matchingCalls.length} time${matchingCalls.length === 1 ? \"\" : \"s\"}.`\n : `Tool '${toolAssertion.toolName}' was not called.`,\n source: \"tool\"\n };\n }\n\n if (toolAssertion.type === \"tool_not_called\") {\n const matchingCalls = toolCalls.filter((toolCall) => toolCall.name === toolAssertion.toolName);\n return {\n assertion: toolAssertion.description,\n passed: matchingCalls.length === 0,\n evidence:\n matchingCalls.length === 0\n ? `Tool '${toolAssertion.toolName}' was not called.`\n : `Tool '${toolAssertion.toolName}' was called ${matchingCalls.length} time${matchingCalls.length === 1 ? \"\" : \"s\"}.`,\n source: \"tool\"\n };\n }\n\n if (toolAssertion.type === \"tool_call_order\") {\n const expectedOrder = toolAssertion.toolNames ?? [];\n let nextExpectedIndex = 0;\n for (const toolCall of toolCalls) {\n if (toolCall.name === expectedOrder[nextExpectedIndex]) {\n nextExpectedIndex += 1;\n }\n }\n\n return {\n assertion: toolAssertion.description,\n passed: nextExpectedIndex === expectedOrder.length,\n evidence:\n nextExpectedIndex === expectedOrder.length\n ? `Observed tool call order ${formatExpectedOrder(expectedOrder)}.`\n : `Expected call order ${formatExpectedOrder(expectedOrder)} but got ${formatActualOrder(toolCalls, expectedOrder)}.`,\n source: \"tool\"\n };\n }\n\n const matchingCall = toolCalls.find(\n (toolCall) =>\n toolCall.name === toolAssertion.toolName &&\n matchesArgumentSubset(toolCall.arguments, toolAssertion.expectedArgs ?? {})\n );\n\n return {\n assertion: toolAssertion.description,\n passed: Boolean(matchingCall),\n evidence: matchingCall\n ? `Tool '${toolAssertion.toolName}' was called with arguments matching ${JSON.stringify(toolAssertion.expectedArgs ?? {})}.`\n : `No '${toolAssertion.toolName}' call matched ${JSON.stringify(toolAssertion.expectedArgs ?? {})}.`,\n source: \"tool\"\n };\n });\n}\n\nfunction extractJsonArray(raw: string): unknown[] {\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n return JSON.parse(trimmed) as unknown[];\n }\n\n const start = trimmed.indexOf(\"[\");\n const end = trimmed.lastIndexOf(\"]\");\n if (start >= 0 && end > start) {\n return JSON.parse(trimmed.slice(start, end + 1)) as unknown[];\n }\n\n throw new Error(\"Model did not return a JSON array.\");\n}\n\nasync function generatePrompts(\n skill: ParsedSkill,\n provider: LanguageModelProvider,\n model: string,\n count: number\n): Promise<EvalPrompt[]> {\n const systemPrompt = [\n \"You generate realistic evaluation prompts for an agent skill.\",\n \"Return JSON only.\",\n \"Format: [{\\\"prompt\\\":\\\"...\\\",\\\"assertions\\\":[\\\"...\\\", \\\"...\\\"]}]\",\n \"Assertions should be concrete and checkable.\"\n ].join(\" \");\n\n const userPrompt = [\n `Skill name: ${skill.frontmatter.name}`,\n `Skill description: ${skill.frontmatter.description}`,\n \"Skill instructions:\",\n skill.content,\n \"\",\n `Generate ${count} prompts that stress the main capabilities and likely edge cases.`,\n // Tool-aware prompts require user-defined mock responses and are not auto-generated.\n \"Each prompt should include 2-4 assertions.\"\n ].join(\"\\n\");\n\n const raw = await provider.sendMessage(systemPrompt, userPrompt, { model });\n const parsed = evalPromptArraySchema.safeParse(extractJsonArray(raw));\n if (!parsed.success) {\n throw new Error(`Failed to parse generated eval prompts: ${parsed.error.issues[0]?.message ?? \"invalid prompt JSON\"}`);\n }\n\n if (parsed.data.length !== count) {\n throw new Error(`Expected ${count} prompts, got ${parsed.data.length}.`);\n }\n\n return parsed.data;\n}\n\nexport interface RunEvalOptions {\n provider: LanguageModelProvider;\n model: string;\n graderModel: string;\n numRuns: number;\n prompts?: EvalPrompt[];\n concurrency?: number;\n maxToolIterations?: number;\n}\n\nexport async function runEval(skill: ParsedSkill, options: RunEvalOptions): Promise<EvalResult> {\n const prompts =\n options.prompts && options.prompts.length > 0\n ? evalPromptArraySchema.parse(options.prompts)\n : await generatePrompts(skill, options.provider, options.model, options.numRuns);\n\n const systemPrompt = [\n \"You are an AI assistant with an activated skill.\",\n \"Follow this SKILL.md content exactly where applicable.\",\n \"\",\n skill.raw\n ].join(\"\\n\");\n\n const results = await pMap(\n prompts,\n async (evalPrompt) => {\n let response: string;\n let toolCalls: ToolCall[] | undefined;\n let loopIterations: number | undefined;\n\n if (evalPrompt.tools && evalPrompt.tools.length > 0) {\n const toolRun = await runWithTools({\n provider: options.provider,\n model: options.model,\n systemPrompt,\n userMessage: evalPrompt.prompt,\n tools: evalPrompt.tools,\n maxIterations: options.maxToolIterations\n });\n\n response = toolRun.finalResponse;\n toolCalls = toolRun.toolCalls;\n loopIterations = toolRun.loopIterations;\n } else {\n response = await options.provider.sendMessage(systemPrompt, evalPrompt.prompt, { model: options.model });\n }\n\n const gradedAssertions = await gradeResponse({\n provider: options.provider,\n model: options.graderModel,\n skillName: skill.frontmatter.name,\n skillBody: skill.content,\n userPrompt: evalPrompt.prompt,\n modelResponse: response,\n assertions: evalPrompt.assertions\n });\n const structuralAssertions =\n evalPrompt.toolAssertions && evalPrompt.toolAssertions.length > 0\n ? evaluateToolAssertions(evalPrompt.toolAssertions, toolCalls ?? [])\n : [];\n const assertions = [...gradedAssertions, ...structuralAssertions];\n\n const passedAssertions = assertions.filter((assertion) => assertion.passed).length;\n return {\n prompt: evalPrompt.prompt,\n assertions,\n responseSummary: response.slice(0, 200),\n response,\n passedAssertions,\n totalAssertions: assertions.length,\n ...(toolCalls ? { toolCalls } : {}),\n ...(loopIterations !== undefined ? { loopIterations } : {})\n };\n },\n options.concurrency ?? 5\n );\n\n const totalAssertions = results.reduce((total, result) => total + result.totalAssertions, 0);\n const passedAssertions = results.reduce((total, result) => total + result.passedAssertions, 0);\n\n return {\n skillName: skill.frontmatter.name,\n model: options.model,\n graderModel: options.graderModel,\n provider: options.provider.name,\n prompts,\n results,\n summary: {\n totalPrompts: results.length,\n totalAssertions,\n passedAssertions\n }\n };\n}\n","import { z } from \"zod\";\nimport { LanguageModelProvider } from \"../providers/types.js\";\n\nexport interface GradedAssertion {\n assertion: string;\n passed: boolean;\n evidence: string;\n source?: \"grader\" | \"tool\";\n}\n\nconst gradedAssertionSchema = z.object({\n assertion: z.string(),\n passed: z.boolean(),\n evidence: z.string()\n});\n\nconst graderOutputSchema = z.object({\n assertions: z.array(gradedAssertionSchema)\n});\n\nfunction extractJsonObject(raw: string): Record<string, unknown> {\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n return JSON.parse(trimmed) as Record<string, unknown>;\n }\n\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n return JSON.parse(trimmed.slice(start, end + 1)) as Record<string, unknown>;\n }\n\n throw new Error(\"Grader did not return a JSON object.\");\n}\n\nexport interface GradeResponseOptions {\n provider: LanguageModelProvider;\n model: string;\n skillName: string;\n skillBody: string;\n userPrompt: string;\n modelResponse: string;\n assertions?: string[];\n}\n\nconst DEFAULT_ASSERTIONS = [\n \"The response follows the skill instructions faithfully.\",\n \"The response is well-structured and actionable.\",\n \"The response addresses the user prompt directly.\"\n];\n\nexport interface GraderPrompts {\n assertions: string[];\n systemPrompt: string;\n userPrompt: string;\n}\n\nexport function buildGraderPrompts(\n options: Omit<GradeResponseOptions, \"provider\" | \"model\">\n): GraderPrompts {\n const assertions =\n options.assertions && options.assertions.length > 0 ? options.assertions : DEFAULT_ASSERTIONS;\n\n const systemPrompt = [\n \"You are a strict evaluator for agent skill outputs.\",\n \"Assess each assertion and return JSON only.\",\n \"Required output format: {\\\"assertions\\\":[{\\\"assertion\\\":\\\"...\\\",\\\"passed\\\":true|false,\\\"evidence\\\":\\\"...\\\"}]}\"\n ].join(\" \");\n\n const userPrompt = [\n `Skill: ${options.skillName}`,\n \"Skill instructions:\",\n options.skillBody,\n \"\",\n `User prompt: ${options.userPrompt}`,\n \"\",\n \"Model response:\",\n options.modelResponse,\n \"\",\n \"Assertions to evaluate:\",\n assertions.map((assertion, index) => `${index + 1}. ${assertion}`).join(\"\\n\")\n ].join(\"\\n\");\n\n return {\n assertions,\n systemPrompt,\n userPrompt\n };\n}\n\nexport function parseGraderOutput(raw: string): GradedAssertion[] {\n const parsed = graderOutputSchema.safeParse(extractJsonObject(raw));\n\n if (!parsed.success) {\n throw new Error(`Failed to parse grader output: ${parsed.error.issues[0]?.message ?? \"invalid grader JSON\"}`);\n }\n\n return parsed.data.assertions;\n}\n\nexport async function gradeResponse(options: GradeResponseOptions): Promise<GradedAssertion[]> {\n const prompts = buildGraderPrompts(options);\n const raw = await options.provider.sendMessage(prompts.systemPrompt, prompts.userPrompt, { model: options.model });\n return parseGraderOutput(raw).map((assertion) => ({\n ...assertion,\n source: \"grader\"\n }));\n}\n","export async function pMap<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<R[]> {\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new Error(\"pMap concurrency must be an integer greater than or equal to 1.\");\n }\n\n if (items.length === 0) {\n return [];\n }\n\n const results = new Array<R>(items.length);\n\n return new Promise<R[]>((resolve, reject) => {\n let nextIndex = 0;\n let completed = 0;\n let rejected = false;\n\n const launchNext = (): void => {\n if (rejected) {\n return;\n }\n\n if (completed === items.length) {\n resolve(results);\n return;\n }\n\n if (nextIndex >= items.length) {\n return;\n }\n\n const currentIndex = nextIndex;\n nextIndex += 1;\n\n Promise.resolve()\n .then(() => fn(items[currentIndex], currentIndex))\n .then((result) => {\n if (rejected) {\n return;\n }\n\n results[currentIndex] = result;\n completed += 1;\n\n if (completed === items.length) {\n resolve(results);\n return;\n }\n\n launchNext();\n })\n .catch((error: unknown) => {\n if (rejected) {\n return;\n }\n\n rejected = true;\n reject(error);\n });\n };\n\n const initialWorkers = Math.min(concurrency, items.length);\n for (let workerIndex = 0; workerIndex < initialWorkers; workerIndex += 1) {\n launchNext();\n }\n });\n}\n","import {\n ConversationBlock,\n LanguageModelProvider,\n ToolDefinition,\n ToolUseBlock\n} from \"../providers/types.js\";\n\nexport interface ToolParameter {\n name: string;\n type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n description: string;\n required?: boolean;\n}\n\nexport interface MockToolDefinition {\n name: string;\n description: string;\n parameters?: ToolParameter[];\n responses: Record<string, string>;\n}\n\nexport interface ToolCall {\n name: string;\n arguments: Record<string, unknown>;\n response: string;\n turnIndex: number;\n}\n\nexport interface ToolEnvironmentResult {\n finalResponse: string;\n toolCalls: ToolCall[];\n loopIterations: number;\n}\n\nexport interface RunWithToolsOptions {\n provider: LanguageModelProvider;\n model: string;\n systemPrompt: string;\n userMessage: string;\n tools: MockToolDefinition[];\n maxIterations?: number;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction deepEqual(left: unknown, right: unknown): boolean {\n if (Array.isArray(left) && Array.isArray(right)) {\n if (left.length !== right.length) {\n return false;\n }\n\n return left.every((item, index) => deepEqual(item, right[index]));\n }\n\n if (isPlainObject(left) && isPlainObject(right)) {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n return leftKeys.every((key) => deepEqual(left[key], right[key]));\n }\n\n return left === right;\n}\n\nexport function matchesArgumentSubset(actual: unknown, expected: unknown): boolean {\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual) || actual.length !== expected.length) {\n return false;\n }\n\n return expected.every((value, index) => matchesArgumentSubset(actual[index], value));\n }\n\n if (isPlainObject(expected)) {\n if (!isPlainObject(actual)) {\n return false;\n }\n\n return Object.entries(expected).every(([key, value]) => matchesArgumentSubset(actual[key], value));\n }\n\n return deepEqual(actual, expected);\n}\n\nfunction parseResponsePattern(pattern: string): Record<string, unknown> | null {\n if (pattern === \"*\") {\n return null;\n }\n\n try {\n const parsed = JSON.parse(pattern) as unknown;\n return isPlainObject(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction renderFallbackResponse(tool: MockToolDefinition, args: Record<string, unknown>): string {\n return `[mock] No mock response configured for tool '${tool.name}' with arguments: ${JSON.stringify(args)}`;\n}\n\nexport function resolveToolResponse(tool: MockToolDefinition, args: Record<string, unknown>): string {\n const exactMatchKey = JSON.stringify(args);\n const exactMatch = tool.responses[exactMatchKey];\n if (exactMatch !== undefined) {\n return exactMatch;\n }\n\n let bestPartialMatch: { specificity: number; response: string } | null = null;\n for (const [pattern, response] of Object.entries(tool.responses)) {\n if (pattern === \"*\") {\n continue;\n }\n\n const parsedPattern = parseResponsePattern(pattern);\n if (!parsedPattern) {\n continue;\n }\n\n if (!matchesArgumentSubset(args, parsedPattern)) {\n continue;\n }\n\n const specificity = Object.keys(parsedPattern).length;\n if (!bestPartialMatch || specificity > bestPartialMatch.specificity) {\n bestPartialMatch = { specificity, response };\n }\n }\n\n if (bestPartialMatch) {\n return bestPartialMatch.response;\n }\n\n const wildcardMatch = tool.responses[\"*\"];\n if (wildcardMatch !== undefined) {\n return wildcardMatch;\n }\n\n return renderFallbackResponse(tool, args);\n}\n\nexport function toProviderToolDefinitions(mockTools: MockToolDefinition[]): ToolDefinition[] {\n return mockTools.map((tool) => {\n const parameters = tool.parameters ?? [];\n return {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties: Object.fromEntries(\n parameters.map((parameter) => [\n parameter.name,\n {\n type: parameter.type,\n description: parameter.description\n }\n ])\n ),\n required: parameters.filter((parameter) => parameter.required).map((parameter) => parameter.name)\n }\n };\n });\n}\n\nfunction toAssistantConversationBlocks(response: { textContent: string; toolUseBlocks: ToolUseBlock[] }): ConversationBlock[] {\n const contentBlocks = [];\n\n if (response.textContent.trim().length > 0) {\n contentBlocks.push({\n type: \"text\",\n text: response.textContent\n });\n }\n\n for (const block of response.toolUseBlocks) {\n contentBlocks.push({\n type: \"tool_use\",\n id: block.id,\n name: block.name,\n input: block.arguments\n });\n }\n\n return contentBlocks.length === 0\n ? []\n : [\n {\n role: \"assistant\" as const,\n content: contentBlocks\n }\n ];\n}\n\nexport async function runWithTools(options: RunWithToolsOptions): Promise<ToolEnvironmentResult> {\n const maxIterations = options.maxIterations ?? 10;\n const toolsByName = new Map(options.tools.map((tool) => [tool.name, tool]));\n const providerTools = toProviderToolDefinitions(options.tools);\n const messages: ConversationBlock[] = [{ role: \"user\", content: options.userMessage }];\n const toolCalls: ToolCall[] = [];\n let finalResponse = \"\";\n let loopIterations = 0;\n\n while (loopIterations < maxIterations) {\n loopIterations += 1;\n\n const response = await options.provider.sendWithTools(options.systemPrompt, messages, {\n model: options.model,\n tools: providerTools\n });\n\n if (response.textContent.trim().length > 0) {\n finalResponse = response.textContent;\n }\n\n if (response.toolUseBlocks.length === 0) {\n return {\n finalResponse,\n toolCalls,\n loopIterations\n };\n }\n\n messages.push(...toAssistantConversationBlocks(response));\n\n const toolResultBlocks = [];\n for (const toolUse of response.toolUseBlocks) {\n const tool = toolsByName.get(toolUse.name);\n const resolvedResponse = tool\n ? resolveToolResponse(tool, toolUse.arguments)\n : `[mock] No tool named '${toolUse.name}' is registered.`;\n\n toolCalls.push({\n name: toolUse.name,\n arguments: toolUse.arguments,\n response: resolvedResponse,\n turnIndex: loopIterations\n });\n\n toolResultBlocks.push({\n type: \"tool_result\",\n tool_use_id: toolUse.id,\n content: resolvedResponse\n });\n }\n\n messages.push({\n role: \"user\",\n content: toolResultBlocks\n });\n }\n\n const terminationNote = `[skilltest: tool loop terminated after ${maxIterations} iterations]`;\n finalResponse = finalResponse ? `${finalResponse}\\n\\n${terminationNote}` : terminationNote;\n\n return {\n finalResponse,\n toolCalls,\n loopIterations\n };\n}\n","import { z } from \"zod\";\nimport { ParsedSkill, parseSkillStrict } from \"./skill-parser.js\";\nimport { LanguageModelProvider } from \"../providers/types.js\";\nimport { pMap } from \"../utils/concurrency.js\";\n\nexport interface TriggerQuery {\n query: string;\n should_trigger: boolean;\n}\n\nexport interface TriggerTestCaseResult {\n query: string;\n shouldTrigger: boolean;\n expected: string;\n actual: string;\n matched: boolean;\n selectedCompetitor?: string;\n rawModelResponse?: string;\n}\n\nexport interface TriggerMetrics {\n truePositives: number;\n trueNegatives: number;\n falsePositives: number;\n falseNegatives: number;\n precision: number;\n recall: number;\n f1: number;\n}\n\nexport interface TriggerTestResult {\n skillName: string;\n model: string;\n provider: string;\n seed?: number;\n competitors?: CompetitorSkill[];\n queries: TriggerQuery[];\n cases: TriggerTestCaseResult[];\n metrics: TriggerMetrics;\n suggestions: string[];\n}\n\nexport interface CompetitorSkill {\n name: string;\n description: string;\n sourcePath: string;\n}\n\nconst triggerQuerySchema = z.object({\n query: z.string().min(1),\n should_trigger: z.boolean()\n});\n\nexport const triggerQueryArraySchema = z.array(triggerQuerySchema);\nexport const triggerNumQueriesSchema = z\n .number()\n .int()\n .min(2)\n .refine((value) => value % 2 === 0, \"numQueries must be an even number.\");\n\nconst FAKE_SKILLS: Array<{ name: string; description: string }> = [\n { name: \"code-review\", description: \"Reviews code changes for bugs, regressions, and maintainability issues.\" },\n { name: \"api-tester\", description: \"Designs and runs REST API tests, validating status codes and response shapes.\" },\n { name: \"db-migrator\", description: \"Plans and generates safe database migration scripts with rollback guidance.\" },\n { name: \"bug-repro\", description: \"Reproduces reported bugs by building deterministic minimal test cases.\" },\n { name: \"release-notes\", description: \"Drafts release notes from commits and PR metadata for stakeholders.\" },\n { name: \"log-analyzer\", description: \"Analyzes service logs to identify error clusters and likely root causes.\" },\n { name: \"performance-audit\", description: \"Finds hotspots in runtime and suggests profiling-driven optimizations.\" },\n { name: \"security-audit\", description: \"Checks code and config for common security vulnerabilities and risky defaults.\" },\n { name: \"refactor-planner\", description: \"Breaks large refactors into safe incremental steps with validation plans.\" },\n { name: \"schema-designer\", description: \"Designs JSON schemas and validates data contracts for integrations.\" },\n { name: \"docs-writer\", description: \"Writes developer documentation, tutorials, and API usage examples.\" },\n { name: \"cli-scaffolder\", description: \"Creates CLI project skeletons with argument parsing and help text.\" },\n { name: \"incident-triage\", description: \"Triage production incidents with severity tagging and next-action checklists.\" },\n { name: \"test-generator\", description: \"Generates unit and integration test cases from feature requirements.\" },\n { name: \"prompt-tuner\", description: \"Improves prompts for reliability, formatting, and failure handling.\" }\n];\n\nexport interface PreparedTriggerQuery {\n testQuery: TriggerQuery;\n fakeSkills: Array<{ name: string; description: string }>;\n allSkills: Array<{ name: string; description: string }>;\n skillListText: string;\n}\n\nfunction mulberry32(seed: number): () => number {\n return () => {\n seed |= 0;\n seed = (seed + 0x6d2b79f5) | 0;\n let t = Math.imul(seed ^ (seed >>> 15), 1 | seed);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nfunction createRng(seed?: number): () => number {\n return seed !== undefined ? mulberry32(seed) : Math.random;\n}\n\nfunction shuffle<T>(values: T[], rng: () => number): T[] {\n const copy = [...values];\n for (let index = copy.length - 1; index > 0; index -= 1) {\n const swapIndex = Math.floor(rng() * (index + 1));\n [copy[index], copy[swapIndex]] = [copy[swapIndex], copy[index]];\n }\n return copy;\n}\n\nfunction sample<T>(values: T[], count: number, rng: () => number): T[] {\n return shuffle(values, rng).slice(0, Math.max(0, Math.min(count, values.length)));\n}\n\nexport function validateNumQueries(numQueries: number): number {\n return triggerNumQueriesSchema.parse(numQueries);\n}\n\nfunction parseJsonArrayFromModelOutput(raw: string): unknown[] {\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n return JSON.parse(trimmed) as unknown[];\n }\n\n const start = trimmed.indexOf(\"[\");\n const end = trimmed.lastIndexOf(\"]\");\n if (start >= 0 && end > start) {\n const possibleJson = trimmed.slice(start, end + 1);\n return JSON.parse(possibleJson) as unknown[];\n }\n\n throw new Error(\"Model did not return a JSON array.\");\n}\n\nasync function generateQueriesWithModel(\n skill: ParsedSkill,\n provider: LanguageModelProvider,\n model: string,\n numQueries: number,\n competitors?: CompetitorSkill[]\n): Promise<TriggerQuery[]> {\n validateNumQueries(numQueries);\n const shouldTriggerCount = Math.floor(numQueries / 2);\n const shouldNotTriggerCount = numQueries - shouldTriggerCount;\n\n const systemPrompt = [\n \"You generate realistic user prompts to test whether a specific agent skill triggers.\",\n \"Return JSON only. No markdown, no comments.\",\n \"Each entry must be an object: {\\\"query\\\": string, \\\"should_trigger\\\": boolean}.\",\n \"Create substantive prompts, not toy one-liners.\"\n ].join(\" \");\n\n const userPrompt = [\n `Skill name: ${skill.frontmatter.name}`,\n `Skill description: ${skill.frontmatter.description}`,\n ...(competitors && competitors.length > 0\n ? [\n \"\",\n \"Competitor skills in the same domain:\",\n ...competitors.map((competitor) => `- ${competitor.name}: ${competitor.description}`),\n \"\",\n \"Generate queries that test whether the target skill triggers correctly even when these similar skills exist.\",\n \"Positive queries should clearly belong to the target skill, not the competitors.\",\n \"Negative queries should belong to a competitor or to no skill at all.\"\n ]\n : []),\n `Generate ${numQueries} prompts total.`,\n `Exactly ${shouldTriggerCount} should have should_trigger=true.`,\n `Exactly ${shouldNotTriggerCount} should have should_trigger=false.`,\n \"Prompts should look like real user requests with enough context to drive a trigger decision.\"\n ].join(\"\\n\");\n\n const raw = await provider.sendMessage(systemPrompt, userPrompt, { model });\n const parsed = triggerQueryArraySchema.safeParse(parseJsonArrayFromModelOutput(raw));\n if (!parsed.success) {\n throw new Error(`Failed to parse generated queries: ${parsed.error.issues[0]?.message ?? \"invalid format\"}`);\n }\n\n const trueCount = parsed.data.filter((item) => item.should_trigger).length;\n const falseCount = parsed.data.length - trueCount;\n if (parsed.data.length !== numQueries || trueCount !== shouldTriggerCount || falseCount !== shouldNotTriggerCount) {\n throw new Error(\n `Generated query split mismatch. Expected ${numQueries} (${shouldTriggerCount}/${shouldNotTriggerCount}), got ${parsed.data.length} (${trueCount}/${falseCount}).`\n );\n }\n\n return parsed.data;\n}\n\nfunction parseDecision(rawResponse: string, skillNames: string[]): string {\n const normalized = rawResponse.trim().toLowerCase();\n if (normalized === \"none\" || normalized.startsWith(\"none\")) {\n return \"none\";\n }\n\n for (const skillName of skillNames) {\n const escaped = skillName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regex = new RegExp(`\\\\b${escaped}\\\\b`, \"i\");\n if (regex.test(rawResponse)) {\n return skillName;\n }\n }\n\n return \"unrecognized\";\n}\n\nexport function prepareTriggerQueries(\n skill: Pick<ParsedSkill, \"frontmatter\">,\n queries: TriggerQuery[],\n seed?: number,\n competitors?: CompetitorSkill[]\n): PreparedTriggerQuery[] {\n const rng = createRng(seed);\n const competitorCandidates = (competitors ?? []).map((competitor) => ({\n name: competitor.name,\n description: competitor.description\n }));\n\n return queries.map((testQuery) => {\n const usingCompetitors = competitorCandidates.length > 0;\n const fakeCount = usingCompetitors\n ? testQuery.should_trigger\n ? 2 + Math.floor(rng() * 3)\n : 3 + Math.floor(rng() * 3)\n : 5 + Math.floor(rng() * 5);\n const fakeSkills = sample(FAKE_SKILLS, fakeCount, rng);\n const allSkills = usingCompetitors\n ? shuffle(\n [\n ...competitorCandidates,\n ...fakeSkills,\n ...(testQuery.should_trigger\n ? [\n {\n name: skill.frontmatter.name,\n description: skill.frontmatter.description\n }\n ]\n : [])\n ],\n rng\n )\n : shuffle(\n [\n ...fakeSkills,\n {\n name: skill.frontmatter.name,\n description: skill.frontmatter.description\n }\n ],\n rng\n );\n\n return {\n testQuery,\n fakeSkills,\n allSkills,\n skillListText: allSkills.map((entry) => `- ${entry.name}: ${entry.description}`).join(\"\\n\")\n };\n });\n}\n\nexport function calculateMetrics(skillName: string, cases: TriggerTestCaseResult[]): TriggerMetrics {\n let truePositives = 0;\n let trueNegatives = 0;\n let falsePositives = 0;\n let falseNegatives = 0;\n\n for (const testCase of cases) {\n const choseTargetSkill = testCase.actual === skillName;\n if (testCase.shouldTrigger && choseTargetSkill) {\n truePositives += 1;\n continue;\n }\n if (testCase.shouldTrigger && !choseTargetSkill) {\n falseNegatives += 1;\n continue;\n }\n if (!testCase.shouldTrigger && choseTargetSkill) {\n falsePositives += 1;\n continue;\n }\n trueNegatives += 1;\n }\n\n const precisionDenominator = truePositives + falsePositives;\n const recallDenominator = truePositives + falseNegatives;\n const precision = precisionDenominator === 0 ? 0 : truePositives / precisionDenominator;\n const recall = recallDenominator === 0 ? 0 : truePositives / recallDenominator;\n const f1 = precision + recall === 0 ? 0 : (2 * precision * recall) / (precision + recall);\n\n return {\n truePositives,\n trueNegatives,\n falsePositives,\n falseNegatives,\n precision,\n recall,\n f1\n };\n}\n\nexport function assertCompetitorNamesDistinct(skillName: string, competitors: CompetitorSkill[]): void {\n for (const competitor of competitors) {\n if (competitor.name === skillName) {\n throw new Error(`Competitor skill '${competitor.name}' has the same name as the skill under test.`);\n }\n }\n}\n\nexport function buildTriggerCaseResult(options: {\n testQuery: TriggerQuery;\n skillName: string;\n decision: string;\n competitorNames?: string[];\n rawModelResponse?: string;\n}): TriggerTestCaseResult {\n const expected = options.testQuery.should_trigger ? options.skillName : \"none\";\n const matched = options.testQuery.should_trigger ? options.decision === options.skillName : options.decision !== options.skillName;\n const selectedCompetitor = options.competitorNames?.includes(options.decision) ? options.decision : undefined;\n\n return {\n query: options.testQuery.query,\n shouldTrigger: options.testQuery.should_trigger,\n expected,\n actual: options.decision,\n matched,\n selectedCompetitor,\n rawModelResponse: options.rawModelResponse\n };\n}\n\nfunction buildSuggestions(\n skillName: string,\n metrics: TriggerMetrics,\n cases: TriggerTestCaseResult[],\n competitors?: CompetitorSkill[]\n): string[] {\n const suggestions: string[] = [];\n if (metrics.falseNegatives > 0) {\n suggestions.push(\n \"False negatives found: clarify capability keywords and add explicit 'use when ...' phrasing in description.\"\n );\n if (competitors && competitors.length > 0) {\n const competitorCounts = new Map<string, number>();\n for (const testCase of cases) {\n if (!testCase.shouldTrigger || testCase.actual === skillName || !testCase.selectedCompetitor) {\n continue;\n }\n competitorCounts.set(testCase.selectedCompetitor, (competitorCounts.get(testCase.selectedCompetitor) ?? 0) + 1);\n }\n\n for (const [competitorName, count] of competitorCounts.entries()) {\n suggestions.push(\n `Skill '${competitorName}' was selected instead of '${skillName}' for ${count} quer${count === 1 ? \"y\" : \"ies\"}. Differentiate your description from '${competitorName}'.`\n );\n }\n }\n }\n if (metrics.falsePositives > 0) {\n suggestions.push(\"False positives found: narrow scope boundaries and add explicit non-goals in description.\");\n if (competitors && competitors.length > 0) {\n suggestions.push(\n `With competitor skills present, ${metrics.falsePositives} negative quer${metrics.falsePositives === 1 ? \"y still\" : \"ies still\"} triggered '${skillName}'. Narrow your description's scope boundaries.`\n );\n }\n }\n if (suggestions.length === 0) {\n suggestions.push(\"Trigger behavior looks clean on this sample. Keep monitoring with domain-specific custom queries.\");\n }\n return suggestions;\n}\n\nexport interface RunTriggerTestOptions {\n model: string;\n provider: LanguageModelProvider;\n queries?: TriggerQuery[];\n numQueries: number;\n compare?: string[];\n seed?: number;\n concurrency?: number;\n verbose?: boolean;\n}\n\nasync function loadCompetitorSkills(comparePaths: string[]): Promise<CompetitorSkill[]> {\n const competitors: CompetitorSkill[] = [];\n\n for (const comparePath of comparePaths) {\n const parsed = await parseSkillStrict(comparePath);\n competitors.push({\n name: parsed.frontmatter.name,\n description: parsed.frontmatter.description,\n sourcePath: comparePath\n });\n }\n\n return competitors;\n}\n\nexport async function runTriggerTest(skill: ParsedSkill, options: RunTriggerTestOptions): Promise<TriggerTestResult> {\n const competitors =\n options.compare && options.compare.length > 0 ? await loadCompetitorSkills(options.compare) : undefined;\n if (competitors && competitors.length > 0) {\n assertCompetitorNamesDistinct(skill.frontmatter.name, competitors);\n }\n\n const queries =\n options.queries && options.queries.length > 0\n ? triggerQueryArraySchema.parse(options.queries)\n : await generateQueriesWithModel(skill, options.provider, options.model, options.numQueries, competitors);\n\n const skillName = skill.frontmatter.name;\n const preparedQueries = prepareTriggerQueries(skill, queries, options.seed, competitors);\n const competitorNames = competitors?.map((competitor) => competitor.name) ?? [];\n\n const systemPrompt = [\n \"You are selecting one skill to activate for a user query.\",\n \"Choose the single best matching skill name from the provided list, or 'none' if no skill is a good fit.\",\n \"Respond with only the skill name or 'none'.\"\n ].join(\" \");\n\n const results = await pMap(\n preparedQueries,\n async ({ testQuery, allSkills, skillListText }) => {\n const userPrompt = [`Available skills:`, skillListText, \"\", `User query: ${testQuery.query}`].join(\"\\n\");\n const rawResponse = await options.provider.sendMessage(systemPrompt, userPrompt, { model: options.model });\n const decision = parseDecision(\n rawResponse,\n Array.from(new Set([skillName, ...allSkills.map((entry) => entry.name)]))\n );\n\n return buildTriggerCaseResult({\n testQuery,\n skillName,\n decision,\n competitorNames,\n rawModelResponse: options.verbose ? rawResponse : undefined\n });\n },\n options.concurrency ?? 5\n );\n\n const metrics = calculateMetrics(skillName, results);\n\n return {\n skillName,\n model: options.model,\n provider: options.provider.name,\n seed: options.seed,\n competitors,\n queries,\n cases: results,\n metrics,\n suggestions: buildSuggestions(skillName, metrics, results, competitors)\n };\n}\n","export function renderJson(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n","import fs from \"node:fs/promises\";\nimport ora from \"ora\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { runTriggerTest } from \"../core/trigger-tester.js\";\nimport { parseSkillStrict } from \"../core/skill-parser.js\";\nimport { createProvider } from \"../providers/index.js\";\nimport { renderTriggerHtml } from \"../reporters/html.js\";\nimport { renderTriggerReport } from \"../reporters/terminal.js\";\nimport { getGlobalCliOptions, getResolvedConfig, loadTriggerQueriesFile, writeError, writeResult } from \"./common.js\";\nimport { writeJsonFile } from \"../utils/fs.js\";\n\nconst triggerCliSchema = z.object({\n queries: z.string().optional(),\n saveQueries: z.string().optional(),\n compare: z.array(z.string().min(1)).optional(),\n seed: z.number().int().optional(),\n concurrency: z.number().int().min(1).optional(),\n html: z.string().optional(),\n verbose: z.boolean().optional(),\n apiKey: z.string().optional()\n});\n\nconst DEFAULT_ANTHROPIC_MODEL = \"claude-sonnet-4-5-20250929\";\nconst DEFAULT_OPENAI_MODEL = \"gpt-4.1-mini\";\n\ninterface TriggerCommandOptions {\n json: boolean;\n color: boolean;\n model: string;\n provider: \"anthropic\" | \"openai\";\n queries?: string;\n numQueries: number;\n compare: string[];\n saveQueries?: string;\n seed?: number;\n concurrency: number;\n html?: string;\n verbose: boolean;\n apiKey?: string;\n}\n\nfunction resolveModel(provider: \"anthropic\" | \"openai\", model: string): string {\n if (provider === \"openai\" && model === DEFAULT_ANTHROPIC_MODEL) {\n return DEFAULT_OPENAI_MODEL;\n }\n return model;\n}\n\nfunction renderTriggerOutputWithSeed(output: string, seed?: number): string {\n if (seed === undefined) {\n return output;\n }\n return `${output}\\nSeed: ${seed}`;\n}\n\nasync function handleTriggerCommand(targetPath: string, options: TriggerCommandOptions): Promise<void> {\n const spinner = options.json || !process.stdout.isTTY ? null : ora(\"Preparing trigger evaluation...\").start();\n\n try {\n if (spinner) {\n spinner.text = \"Parsing skill...\";\n }\n const skill = await parseSkillStrict(targetPath);\n\n if (spinner) {\n spinner.text = \"Initializing model provider...\";\n }\n const provider = createProvider(options.provider, options.apiKey);\n\n let queries = undefined;\n if (options.queries) {\n if (spinner) {\n spinner.text = \"Loading custom trigger queries...\";\n }\n queries = await loadTriggerQueriesFile(options.queries);\n }\n\n if (spinner) {\n spinner.text = \"Running trigger simulations...\";\n }\n const model = resolveModel(options.provider, options.model);\n const result = await runTriggerTest(skill, {\n model,\n provider,\n queries,\n numQueries: options.numQueries,\n compare: options.compare,\n seed: options.seed,\n concurrency: options.concurrency,\n verbose: options.verbose\n });\n\n if (options.saveQueries) {\n await writeJsonFile(options.saveQueries, result.queries);\n }\n\n spinner?.stop();\n if (options.json) {\n writeResult(result, true);\n } else {\n writeResult(renderTriggerOutputWithSeed(renderTriggerReport(result, options.color, options.verbose), result.seed), false);\n }\n\n if (options.html) {\n const htmlResult: typeof result & { target: string } = {\n ...result,\n target: targetPath\n };\n await fs.writeFile(options.html, renderTriggerHtml(htmlResult), \"utf8\");\n }\n } catch (error) {\n spinner?.stop();\n writeError(error, options.json);\n process.exitCode = 2;\n }\n}\n\nexport function registerTriggerCommand(program: Command): void {\n program\n .command(\"trigger\")\n .description(\"Evaluate whether a skill description triggers correctly.\")\n .argument(\"<path-to-skill>\", \"Path to SKILL.md or skill directory\")\n .option(\"--model <model>\", \"Model to use\")\n .option(\"--provider <provider>\", \"LLM provider: anthropic|openai\")\n .option(\"--queries <path>\", \"Path to custom test queries JSON\")\n .option(\"--compare <path...>\", \"Path(s) to sibling skill directories to include as competitors\")\n .option(\"--num-queries <n>\", \"Number of auto-generated queries\", (value) => Number.parseInt(value, 10))\n .option(\"--seed <number>\", \"RNG seed for reproducible results\", (value) => Number.parseInt(value, 10))\n .option(\"--concurrency <n>\", \"Maximum in-flight trigger requests\", (value) => Number.parseInt(value, 10))\n .option(\"--html <path>\", \"Write an HTML report to the given file path\")\n .option(\"--save-queries <path>\", \"Save generated queries to a JSON file\")\n .option(\"--api-key <key>\", \"API key override\")\n .option(\"--verbose\", \"Show full model decisions\")\n .action(async (targetPath: string, _commandOptions: unknown, command: Command) => {\n const globalOptions = getGlobalCliOptions(command);\n const config = getResolvedConfig(command);\n const parsedCli = triggerCliSchema.safeParse(command.opts());\n if (!parsedCli.success) {\n writeError(new Error(parsedCli.error.issues[0]?.message ?? \"Invalid trigger options.\"), globalOptions.json);\n process.exitCode = 2;\n return;\n }\n\n await handleTriggerCommand(targetPath, {\n ...globalOptions,\n model: config.model,\n provider: config.provider,\n queries: parsedCli.data.queries,\n numQueries: config.trigger.numQueries,\n compare: config.trigger.compare,\n saveQueries: parsedCli.data.saveQueries,\n seed: parsedCli.data.seed ?? config.trigger.seed,\n concurrency: config.concurrency,\n html: parsedCli.data.html,\n verbose: Boolean(parsedCli.data.verbose),\n apiKey: parsedCli.data.apiKey\n });\n });\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { resolveSkillPath } from \"../core/skill-parser.js\";\nimport { ProviderName } from \"../providers/types.js\";\nimport { pathExists } from \"./fs.js\";\n\nconst providerNameSchema = z.enum([\"anthropic\", \"openai\"]);\nconst lintFailOnSchema = z.enum([\"error\", \"warn\"]);\n\nconst lintConfigSchema = z\n .object({\n failOn: lintFailOnSchema.optional(),\n suppress: z.array(z.string().min(1)).optional(),\n plugins: z.array(z.string().min(1)).optional()\n })\n .strict();\n\nconst triggerConfigSchema = z\n .object({\n numQueries: z\n .number()\n .int()\n .min(2)\n .refine((value) => value % 2 === 0, \"trigger.numQueries must be an even number.\"),\n threshold: z.number().min(0).max(1).optional(),\n seed: z.number().int().optional(),\n compare: z.array(z.string().min(1)).optional()\n })\n .strict()\n .partial();\n\nconst evalConfigSchema = z\n .object({\n numRuns: z.number().int().min(1).optional(),\n threshold: z.number().min(0).max(1).optional(),\n promptFile: z.string().min(1).optional(),\n assertionsFile: z.string().min(1).optional(),\n maxToolIterations: z.number().int().min(1).max(50).optional()\n })\n .strict()\n .partial();\n\nexport const skilltestConfigSchema = z\n .object({\n provider: providerNameSchema.optional(),\n model: z.string().min(1).optional(),\n json: z.boolean().optional(),\n concurrency: z.number().int().min(1).optional(),\n lint: lintConfigSchema.optional(),\n trigger: triggerConfigSchema.optional(),\n eval: evalConfigSchema.optional()\n })\n .strict();\n\nconst resolvedSkilltestConfigSchema = z.object({\n provider: providerNameSchema,\n model: z.string().min(1),\n json: z.boolean(),\n concurrency: z.number().int().min(1),\n lint: z.object({\n failOn: lintFailOnSchema,\n suppress: z.array(z.string().min(1)),\n plugins: z.array(z.string().min(1))\n }),\n trigger: z.object({\n numQueries: z.number().int().min(2).refine((value) => value % 2 === 0, \"trigger.numQueries must be an even number.\"),\n threshold: z.number().min(0).max(1),\n seed: z.number().int().optional(),\n compare: z.array(z.string().min(1))\n }),\n eval: z.object({\n numRuns: z.number().int().min(1),\n threshold: z.number().min(0).max(1),\n promptFile: z.string().min(1).optional(),\n assertionsFile: z.string().min(1).optional(),\n maxToolIterations: z.number().int().min(1).max(50)\n })\n});\n\nexport type SkilltestConfigFile = z.infer<typeof skilltestConfigSchema>;\nexport type LintFailOn = z.infer<typeof lintFailOnSchema>;\nexport type ResolvedSkilltestConfig = z.infer<typeof resolvedSkilltestConfigSchema>;\n\nexport interface ResolvedConfigContext {\n configFile: SkilltestConfigFile | null;\n config: ResolvedSkilltestConfig;\n sourcePath: string | null;\n sourceDirectory: string;\n}\n\ninterface LoadedConfigFile {\n configFile: SkilltestConfigFile;\n sourcePath: string;\n sourceDirectory: string;\n}\n\nexport const DEFAULT_SKILLTEST_CONFIG: ResolvedSkilltestConfig = {\n provider: \"anthropic\",\n model: \"claude-sonnet-4-5-20250929\",\n json: false,\n concurrency: 5,\n lint: {\n failOn: \"error\",\n suppress: [],\n plugins: []\n },\n trigger: {\n numQueries: 20,\n threshold: 0.8,\n compare: []\n },\n eval: {\n numRuns: 5,\n threshold: 0.9,\n maxToolIterations: 10\n }\n};\n\nfunction formatIssuePath(issuePath: Array<string | number>): string {\n if (issuePath.length === 0) {\n return \"root\";\n }\n return issuePath.map(String).join(\".\");\n}\n\nfunction buildConfigValidationError(error: z.ZodError, sourceLabel: string): Error {\n const issue = error.issues[0];\n const issuePath = formatIssuePath(issue?.path ?? []);\n const issueMessage = issue?.message ?? \"Invalid config value.\";\n return new Error(`Invalid skilltest config in ${sourceLabel} at ${issuePath}: ${issueMessage}`);\n}\n\nasync function readJsonObject(filePath: string, label: string): Promise<unknown> {\n let raw: string;\n try {\n raw = await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to read ${label}: ${message}`);\n }\n\n try {\n return JSON.parse(raw) as unknown;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid JSON in ${label}: ${message}`);\n }\n}\n\nasync function loadConfigFromJsonFile(filePath: string): Promise<LoadedConfigFile | null> {\n if (!(await pathExists(filePath))) {\n return null;\n }\n\n const raw = await readJsonObject(filePath, filePath);\n const parsed = skilltestConfigSchema.safeParse(raw);\n if (!parsed.success) {\n throw buildConfigValidationError(parsed.error, filePath);\n }\n\n return {\n configFile: parsed.data,\n sourcePath: filePath,\n sourceDirectory: path.dirname(filePath)\n };\n}\n\nasync function loadConfigFromNearestPackageJson(startDirectory: string): Promise<LoadedConfigFile | null> {\n let currentDirectory = path.resolve(startDirectory);\n\n while (true) {\n const packageJsonPath = path.join(currentDirectory, \"package.json\");\n if (await pathExists(packageJsonPath)) {\n const raw = await readJsonObject(packageJsonPath, packageJsonPath);\n const packageJsonSchema = z\n .object({\n skilltestrc: skilltestConfigSchema.optional()\n })\n .passthrough();\n const parsed = packageJsonSchema.safeParse(raw);\n if (!parsed.success) {\n throw buildConfigValidationError(parsed.error, `${packageJsonPath}#skilltestrc`);\n }\n\n if (!parsed.data.skilltestrc) {\n return null;\n }\n\n return {\n configFile: parsed.data.skilltestrc,\n sourcePath: packageJsonPath,\n sourceDirectory: currentDirectory\n };\n }\n\n const parentDirectory = path.dirname(currentDirectory);\n if (parentDirectory === currentDirectory) {\n return null;\n }\n currentDirectory = parentDirectory;\n }\n}\n\nasync function resolveSkillDirectoryConfig(targetPath?: string): Promise<LoadedConfigFile | null> {\n if (!targetPath) {\n return null;\n }\n\n try {\n const { skillRoot } = await resolveSkillPath(targetPath);\n return loadConfigFromJsonFile(path.join(skillRoot, \".skilltestrc\"));\n } catch {\n return null;\n }\n}\n\nfunction resolveConfigRelativePath(baseDirectory: string, value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n return path.resolve(baseDirectory, value);\n}\n\nfunction resolveConfigRelativePaths(baseDirectory: string, values: string[] | undefined): string[] {\n if (!values || values.length === 0) {\n return [];\n }\n return values.map((value) => path.resolve(baseDirectory, value));\n}\n\nexport function mergeConfigLayers(\n configFile: SkilltestConfigFile = {},\n cliFlags: SkilltestConfigFile = {},\n baseDirectory = process.cwd()\n): ResolvedSkilltestConfig {\n const merged = {\n provider: cliFlags.provider ?? configFile.provider ?? DEFAULT_SKILLTEST_CONFIG.provider,\n model: cliFlags.model ?? configFile.model ?? DEFAULT_SKILLTEST_CONFIG.model,\n json: cliFlags.json ?? configFile.json ?? DEFAULT_SKILLTEST_CONFIG.json,\n concurrency: cliFlags.concurrency ?? configFile.concurrency ?? DEFAULT_SKILLTEST_CONFIG.concurrency,\n lint: {\n failOn: cliFlags.lint?.failOn ?? configFile.lint?.failOn ?? DEFAULT_SKILLTEST_CONFIG.lint.failOn,\n suppress: cliFlags.lint?.suppress ?? configFile.lint?.suppress ?? DEFAULT_SKILLTEST_CONFIG.lint.suppress,\n plugins: resolveConfigRelativePaths(\n baseDirectory,\n cliFlags.lint?.plugins ?? configFile.lint?.plugins ?? DEFAULT_SKILLTEST_CONFIG.lint.plugins\n )\n },\n trigger: {\n numQueries:\n cliFlags.trigger?.numQueries ?? configFile.trigger?.numQueries ?? DEFAULT_SKILLTEST_CONFIG.trigger.numQueries,\n threshold:\n cliFlags.trigger?.threshold ?? configFile.trigger?.threshold ?? DEFAULT_SKILLTEST_CONFIG.trigger.threshold,\n seed: cliFlags.trigger?.seed ?? configFile.trigger?.seed,\n compare: resolveConfigRelativePaths(\n baseDirectory,\n cliFlags.trigger?.compare ?? configFile.trigger?.compare ?? DEFAULT_SKILLTEST_CONFIG.trigger.compare\n )\n },\n eval: {\n numRuns: cliFlags.eval?.numRuns ?? configFile.eval?.numRuns ?? DEFAULT_SKILLTEST_CONFIG.eval.numRuns,\n threshold: cliFlags.eval?.threshold ?? configFile.eval?.threshold ?? DEFAULT_SKILLTEST_CONFIG.eval.threshold,\n promptFile: resolveConfigRelativePath(\n baseDirectory,\n cliFlags.eval?.promptFile ?? configFile.eval?.promptFile ?? DEFAULT_SKILLTEST_CONFIG.eval.promptFile\n ),\n assertionsFile: resolveConfigRelativePath(\n baseDirectory,\n cliFlags.eval?.assertionsFile ?? configFile.eval?.assertionsFile ?? DEFAULT_SKILLTEST_CONFIG.eval.assertionsFile\n ),\n maxToolIterations:\n cliFlags.eval?.maxToolIterations ??\n configFile.eval?.maxToolIterations ??\n DEFAULT_SKILLTEST_CONFIG.eval.maxToolIterations\n }\n };\n\n return resolvedSkilltestConfigSchema.parse(merged);\n}\n\nfunction getTypedOptionValue<T extends string | number | boolean | string[]>(command: Command, key: string): T | undefined {\n const options = command.optsWithGlobals<Record<string, unknown>>();\n const value = options[key];\n if (value === undefined) {\n return undefined;\n }\n return value as T;\n}\n\nexport function extractCliConfigOverrides(command: Command): SkilltestConfigFile {\n const overrides: SkilltestConfigFile = {};\n\n if (command.getOptionValueSourceWithGlobals(\"json\") === \"cli\") {\n overrides.json = Boolean(getTypedOptionValue<boolean>(command, \"json\"));\n }\n\n if (command.getOptionValueSource(\"provider\") === \"cli\") {\n overrides.provider = getTypedOptionValue<ProviderName>(command, \"provider\");\n }\n\n if (command.getOptionValueSource(\"model\") === \"cli\") {\n overrides.model = getTypedOptionValue<string>(command, \"model\");\n }\n\n if (\n (command.name() === \"trigger\" || command.name() === \"eval\" || command.name() === \"check\" || command.name() === \"improve\") &&\n command.getOptionValueSource(\"concurrency\") === \"cli\"\n ) {\n overrides.concurrency = getTypedOptionValue<number>(command, \"concurrency\");\n }\n\n if (\n (command.name() === \"trigger\" || command.name() === \"check\" || command.name() === \"improve\") &&\n command.getOptionValueSource(\"numQueries\") === \"cli\"\n ) {\n overrides.trigger = {\n ...overrides.trigger,\n numQueries: getTypedOptionValue<number>(command, \"numQueries\")\n };\n }\n\n if (\n (command.name() === \"trigger\" || command.name() === \"check\" || command.name() === \"improve\") &&\n command.getOptionValueSource(\"compare\") === \"cli\"\n ) {\n overrides.trigger = {\n ...overrides.trigger,\n compare: getTypedOptionValue<string[]>(command, \"compare\")\n };\n }\n\n if (\n (command.name() === \"lint\" || command.name() === \"check\" || command.name() === \"improve\") &&\n command.getOptionValueSource(\"plugin\") === \"cli\"\n ) {\n overrides.lint = {\n ...overrides.lint,\n plugins: getTypedOptionValue<string[]>(command, \"plugin\")\n };\n }\n\n if ((command.name() === \"check\" || command.name() === \"improve\") && command.getOptionValueSource(\"minF1\") === \"cli\") {\n overrides.trigger = {\n ...overrides.trigger,\n threshold: getTypedOptionValue<number>(command, \"minF1\")\n };\n }\n\n if (\n (command.name() === \"check\" || command.name() === \"improve\") &&\n command.getOptionValueSource(\"minAssertPassRate\") === \"cli\"\n ) {\n overrides.eval = {\n ...overrides.eval,\n threshold: getTypedOptionValue<number>(command, \"minAssertPassRate\")\n };\n }\n\n const parsed = skilltestConfigSchema.safeParse(overrides);\n if (!parsed.success) {\n throw buildConfigValidationError(parsed.error, \"CLI flags\");\n }\n return parsed.data;\n}\n\nexport async function resolveConfigContext(targetPath: string | undefined, cliFlags: SkilltestConfigFile): Promise<ResolvedConfigContext> {\n const cwd = process.cwd();\n const skillDirectoryConfig = await resolveSkillDirectoryConfig(targetPath);\n if (skillDirectoryConfig) {\n return {\n ...skillDirectoryConfig,\n config: mergeConfigLayers(skillDirectoryConfig.configFile, cliFlags, skillDirectoryConfig.sourceDirectory)\n };\n }\n\n const cwdConfigPath = path.join(cwd, \".skilltestrc\");\n const cwdConfig = await loadConfigFromJsonFile(cwdConfigPath);\n if (cwdConfig) {\n return {\n ...cwdConfig,\n config: mergeConfigLayers(cwdConfig.configFile, cliFlags, cwdConfig.sourceDirectory)\n };\n }\n\n const packageJsonConfig = await loadConfigFromNearestPackageJson(cwd);\n if (packageJsonConfig) {\n return {\n ...packageJsonConfig,\n config: mergeConfigLayers(packageJsonConfig.configFile, cliFlags, packageJsonConfig.sourceDirectory)\n };\n }\n\n return {\n configFile: null,\n config: mergeConfigLayers({}, cliFlags, cwd),\n sourcePath: null,\n sourceDirectory: cwd\n };\n}\n\nexport function resolveApiKey(provider: ProviderName, override?: string): string {\n if (override && override.trim() !== \"\") {\n return override.trim();\n }\n\n if (provider === \"anthropic\") {\n const envValue = process.env.ANTHROPIC_API_KEY?.trim();\n if (envValue) {\n return envValue;\n }\n throw new Error(\n \"No Anthropic API key found. Set ANTHROPIC_API_KEY environment variable or pass --api-key flag.\"\n );\n }\n\n const envValue = process.env.OPENAI_API_KEY?.trim();\n if (envValue) {\n return envValue;\n }\n throw new Error(\"No OpenAI API key found. Set OPENAI_API_KEY environment variable or pass --api-key flag.\");\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport {\n ConversationBlock,\n ConversationContentBlock,\n LanguageModelProvider,\n ProviderToolResponse,\n SendMessageOptions,\n SendWithToolsOptions\n} from \"./types.js\";\n\ninterface AnthropicTextBlock {\n type: \"text\";\n text: string;\n}\n\ninterface AnthropicToolUseBlock {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\ntype AnthropicResponseBlock = AnthropicTextBlock | AnthropicToolUseBlock | { type: string; [key: string]: unknown };\n\ninterface AnthropicMessageResponse {\n content: AnthropicResponseBlock[];\n stop_reason: string | null;\n}\n\nfunction isAnthropicTextBlock(block: AnthropicResponseBlock): block is AnthropicTextBlock {\n return block.type === \"text\";\n}\n\nfunction isAnthropicToolUseBlock(block: AnthropicResponseBlock): block is AnthropicToolUseBlock {\n return block.type === \"tool_use\";\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isRateLimitError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n\n const maybeStatus = (error as { status?: number }).status;\n if (maybeStatus === 429) {\n return true;\n }\n\n const maybeMessage = (error as { message?: string }).message;\n if (typeof maybeMessage === \"string\" && /rate limit/i.test(maybeMessage)) {\n return true;\n }\n\n return false;\n}\n\nexport class AnthropicProvider implements LanguageModelProvider {\n public readonly name = \"anthropic\" as const;\n private readonly client: Anthropic;\n\n public constructor(apiKey: string) {\n this.client = new Anthropic({ apiKey });\n }\n\n private async createMessage(\n request: Record<string, unknown>\n ): Promise<AnthropicMessageResponse> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n try {\n return (await this.client.messages.create(request as never)) as unknown as AnthropicMessageResponse;\n } catch (error) {\n lastError = error;\n if (!isRateLimitError(error) || attempt === 2) {\n break;\n }\n\n const delay = Math.min(4000, 500 * 2 ** attempt) + Math.floor(Math.random() * 250);\n await wait(delay);\n }\n }\n\n if (lastError instanceof Error) {\n throw new Error(`Anthropic API call failed: ${lastError.message}`);\n }\n throw new Error(\"Anthropic API call failed with an unknown error.\");\n }\n\n private toAnthropicMessages(messages: ConversationBlock[]): Array<{\n role: \"user\" | \"assistant\";\n content: string | ConversationContentBlock[];\n }> {\n return messages.map((message) => ({\n role: message.role,\n content: message.content\n }));\n }\n\n public async sendMessage(systemPrompt: string, userMessage: string, options: SendMessageOptions): Promise<string> {\n const response = await this.createMessage({\n model: options.model,\n max_tokens: 2048,\n system: systemPrompt,\n messages: [\n {\n role: \"user\",\n content: userMessage\n }\n ]\n });\n\n const textBlocks = response.content.filter(isAnthropicTextBlock);\n const text = textBlocks.map((block) => block.text).join(\"\\n\").trim();\n if (text.length === 0) {\n throw new Error(\"Model returned an empty response.\");\n }\n return text;\n }\n\n public async sendWithTools(\n systemPrompt: string,\n messages: ConversationBlock[],\n options: SendWithToolsOptions\n ): Promise<ProviderToolResponse> {\n const response = await this.createMessage({\n model: options.model,\n max_tokens: 2048,\n system: systemPrompt,\n messages: this.toAnthropicMessages(messages),\n tools: options.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.parameters ?? { type: \"object\", properties: {} }) as Record<string, unknown> & { type: string }\n }))\n });\n\n const textContent = response.content\n .filter(isAnthropicTextBlock)\n .map((block) => block.text)\n .join(\"\\n\")\n .trim();\n\n const toolUseBlocks = response.content\n .filter(isAnthropicToolUseBlock)\n .map((block) => ({\n id: block.id,\n name: block.name,\n arguments: block.input\n }));\n\n return {\n textContent,\n toolUseBlocks,\n stopReason: response.stop_reason ?? \"end_turn\"\n };\n }\n}\n","import {\n ConversationBlock,\n ConversationContentBlock,\n LanguageModelProvider,\n ProviderToolResponse,\n SendMessageOptions,\n SendWithToolsOptions\n} from \"./types.js\";\n\ntype OpenAIClient = {\n chat: {\n completions: {\n create(input: {\n model: string;\n messages: OpenAIMessage[];\n max_tokens?: number;\n tools?: Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters?: Record<string, unknown>;\n };\n }>;\n }): Promise<{\n choices?: Array<{\n message?: {\n content?: string | Array<{ type?: string; text?: string }>;\n tool_calls?: Array<{\n id?: string;\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n };\n finish_reason?: string | null;\n }>;\n }>;\n };\n };\n};\n\ntype OpenAIMessage =\n | { role: \"system\" | \"user\"; content: string }\n | { role: \"assistant\"; content?: string | null; tool_calls?: OpenAIAssistantToolCall[] }\n | { role: \"tool\"; tool_call_id: string; content: string };\n\ninterface OpenAIAssistantToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isRetriableError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n\n const maybeStatus = (error as { status?: number }).status;\n if (maybeStatus === 429 || (typeof maybeStatus === \"number\" && maybeStatus >= 500)) {\n return true;\n }\n\n const maybeCode = (error as { code?: string }).code;\n if (typeof maybeCode === \"string\" && /timeout|econnreset|enotfound|eai_again/i.test(maybeCode)) {\n return true;\n }\n\n const maybeMessage = (error as { message?: string }).message;\n if (typeof maybeMessage === \"string\" && /(rate limit|timeout|temporarily unavailable|connection)/i.test(maybeMessage)) {\n return true;\n }\n\n return false;\n}\n\nfunction extractTextContent(content: string | Array<{ type?: string; text?: string }> | undefined): string {\n if (!content) {\n return \"\";\n }\n if (typeof content === \"string\") {\n return content.trim();\n }\n\n const text = content\n .map((item) => (item.type === \"text\" || !item.type ? item.text ?? \"\" : \"\"))\n .join(\"\\n\")\n .trim();\n return text;\n}\n\nfunction parseToolArguments(raw: string | undefined, toolName: string): Record<string, unknown> {\n if (!raw || raw.trim() === \"\") {\n return {};\n }\n\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Tool arguments must be a JSON object.\");\n }\n return parsed as Record<string, unknown>;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`OpenAI tool call arguments for '${toolName}' were not valid JSON: ${message}`);\n }\n}\n\nfunction getBlockText(blocks: ConversationContentBlock[]): string {\n return blocks\n .filter((block) => block.type === \"text\")\n .map((block) => String(block.text ?? \"\"))\n .join(\"\\n\")\n .trim();\n}\n\nfunction mapAssistantBlocksToMessage(blocks: ConversationContentBlock[]): OpenAIMessage {\n const textContent = getBlockText(blocks);\n const toolCalls = blocks\n .filter((block) => block.type === \"tool_use\")\n .map((block) => ({\n id: String(block.id ?? \"\"),\n type: \"function\" as const,\n function: {\n name: String(block.name ?? \"\"),\n arguments: JSON.stringify(block.input ?? {})\n }\n }));\n\n return {\n role: \"assistant\",\n content: textContent.length > 0 ? textContent : null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {})\n };\n}\n\nfunction mapUserBlocksToMessages(blocks: ConversationContentBlock[]): OpenAIMessage[] {\n const toolResults = blocks.filter((block) => block.type === \"tool_result\");\n if (toolResults.length > 0) {\n return toolResults.map((block) => ({\n role: \"tool\",\n tool_call_id: String(block.tool_use_id ?? \"\"),\n content: String(block.content ?? \"\")\n }));\n }\n\n const textContent = getBlockText(blocks);\n return [\n {\n role: \"user\",\n content: textContent\n }\n ];\n}\n\nfunction mapConversationBlockToMessages(block: ConversationBlock): OpenAIMessage[] {\n if (typeof block.content === \"string\") {\n return [\n {\n role: block.role,\n content: block.content\n }\n ];\n }\n\n if (block.role === \"assistant\") {\n return [mapAssistantBlocksToMessage(block.content)];\n }\n\n return mapUserBlocksToMessages(block.content);\n}\n\nexport class OpenAIProvider implements LanguageModelProvider {\n public readonly name = \"openai\" as const;\n private readonly apiKey: string;\n private client: OpenAIClient | null;\n\n public constructor(apiKey: string) {\n this.apiKey = apiKey;\n this.client = null;\n }\n\n private async ensureClient(): Promise<OpenAIClient> {\n if (this.client) {\n return this.client;\n }\n\n let openAiModule: unknown;\n try {\n const moduleName = \"openai\";\n openAiModule = await import(moduleName);\n } catch {\n throw new Error(\n \"OpenAI SDK is not installed. Install optional dependency 'openai' or run 'npm install' with optional dependencies enabled.\"\n );\n }\n\n const OpenAIConstructor = (openAiModule as { default?: new (config: { apiKey: string }) => OpenAIClient }).default;\n if (!OpenAIConstructor) {\n throw new Error(\"OpenAI SDK loaded but no default client export was found.\");\n }\n\n this.client = new OpenAIConstructor({ apiKey: this.apiKey });\n return this.client;\n }\n\n private async createCompletion(\n input: Parameters<OpenAIClient[\"chat\"][\"completions\"][\"create\"]>[0]\n ): Promise<Awaited<ReturnType<OpenAIClient[\"chat\"][\"completions\"][\"create\"]>>> {\n const client = await this.ensureClient();\n let lastError: unknown;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n try {\n return await client.chat.completions.create(input);\n } catch (error) {\n lastError = error;\n if (!isRetriableError(error) || attempt === 2) {\n break;\n }\n\n const delay = Math.min(4000, 500 * 2 ** attempt) + Math.floor(Math.random() * 250);\n await wait(delay);\n }\n }\n\n if (lastError instanceof Error) {\n throw new Error(`OpenAI API call failed: ${lastError.message}`);\n }\n throw new Error(\"OpenAI API call failed with an unknown error.\");\n }\n\n private toOpenAiMessages(systemPrompt: string, messages: ConversationBlock[]): OpenAIMessage[] {\n return [\n {\n role: \"system\",\n content: systemPrompt\n },\n ...messages.flatMap((message) => mapConversationBlockToMessages(message))\n ];\n }\n\n public async sendMessage(systemPrompt: string, userMessage: string, options: SendMessageOptions): Promise<string> {\n const response = await this.createCompletion({\n model: options.model,\n max_tokens: 2048,\n messages: this.toOpenAiMessages(systemPrompt, [{ role: \"user\", content: userMessage }])\n });\n\n const text = (response.choices ?? [])\n .map((choice) => extractTextContent(choice.message?.content))\n .join(\"\\n\")\n .trim();\n\n if (text.length === 0) {\n throw new Error(\"Model returned an empty response.\");\n }\n\n return text;\n }\n\n public async sendWithTools(\n systemPrompt: string,\n messages: ConversationBlock[],\n options: SendWithToolsOptions\n ): Promise<ProviderToolResponse> {\n const response = await this.createCompletion({\n model: options.model,\n max_tokens: 2048,\n messages: this.toOpenAiMessages(systemPrompt, messages),\n tools: options.tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters\n }\n }))\n });\n\n const choice = response.choices?.[0];\n const message = choice?.message;\n const toolUseBlocks = (message?.tool_calls ?? []).map((toolCall, index) => {\n const toolName = toolCall.function?.name ?? `tool-${index + 1}`;\n return {\n id: toolCall.id ?? `${toolName}-${index + 1}`,\n name: toolName,\n arguments: parseToolArguments(toolCall.function?.arguments, toolName)\n };\n });\n\n return {\n textContent: extractTextContent(message?.content),\n toolUseBlocks,\n stopReason:\n choice?.finish_reason === \"stop\"\n ? \"end_turn\"\n : choice?.finish_reason === \"tool_calls\"\n ? \"tool_use\"\n : choice?.finish_reason ?? \"end_turn\"\n };\n }\n}\n","import { resolveApiKey } from \"../utils/config.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { OpenAIProvider } from \"./openai.js\";\nimport { LanguageModelProvider, ProviderName } from \"./types.js\";\n\nexport function createProvider(providerName: ProviderName, apiKeyOverride?: string): LanguageModelProvider {\n const apiKey = resolveApiKey(providerName, apiKeyOverride);\n if (providerName === \"anthropic\") {\n return new AnthropicProvider(apiKey);\n }\n return new OpenAIProvider(apiKey);\n}\n\nexport type { LanguageModelProvider, ProviderName };\n","import fs from \"node:fs/promises\";\nimport ora from \"ora\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { runEval } from \"../core/eval-runner.js\";\nimport { parseSkillStrict } from \"../core/skill-parser.js\";\nimport { createProvider } from \"../providers/index.js\";\nimport { renderEvalHtml } from \"../reporters/html.js\";\nimport { renderEvalReport } from \"../reporters/terminal.js\";\nimport {\n getGlobalCliOptions,\n getResolvedConfig,\n loadConfiguredEvalPrompts,\n loadEvalPromptsJson,\n writeError,\n writeResult\n} from \"./common.js\";\nimport { writeJsonFile } from \"../utils/fs.js\";\n\nconst evalCliSchema = z.object({\n prompts: z.string().optional(),\n graderModel: z.string().optional(),\n saveResults: z.string().optional(),\n concurrency: z.number().int().min(1).optional(),\n html: z.string().optional(),\n verbose: z.boolean().optional(),\n apiKey: z.string().optional()\n});\n\nconst DEFAULT_ANTHROPIC_MODEL = \"claude-sonnet-4-5-20250929\";\nconst DEFAULT_OPENAI_MODEL = \"gpt-4.1-mini\";\n\ninterface EvalCommandOptions {\n json: boolean;\n color: boolean;\n prompts?: string;\n model: string;\n graderModel?: string;\n provider: \"anthropic\" | \"openai\";\n saveResults?: string;\n verbose: boolean;\n apiKey?: string;\n numRuns: number;\n concurrency: number;\n maxToolIterations: number;\n html?: string;\n}\n\nfunction resolveModel(provider: \"anthropic\" | \"openai\", model: string): string {\n if (provider === \"openai\" && model === DEFAULT_ANTHROPIC_MODEL) {\n return DEFAULT_OPENAI_MODEL;\n }\n return model;\n}\n\nasync function handleEvalCommand(targetPath: string, options: EvalCommandOptions, command: Command): Promise<void> {\n const spinner = options.json || !process.stdout.isTTY ? null : ora(\"Preparing evaluation...\").start();\n\n try {\n if (spinner) {\n spinner.text = \"Parsing skill...\";\n }\n const skill = await parseSkillStrict(targetPath);\n\n if (spinner) {\n spinner.text = \"Initializing model provider...\";\n }\n const provider = createProvider(options.provider, options.apiKey);\n\n let prompts = undefined;\n if (options.prompts) {\n if (spinner) {\n spinner.text = \"Loading test prompts...\";\n }\n prompts = await loadEvalPromptsJson(options.prompts);\n } else {\n prompts = await loadConfiguredEvalPrompts(command);\n }\n\n if (spinner) {\n spinner.text = \"Running eval prompts and grading responses...\";\n }\n const model = resolveModel(options.provider, options.model);\n const graderModel = options.graderModel ?? model;\n const result = await runEval(skill, {\n provider,\n model,\n graderModel,\n numRuns: options.numRuns,\n concurrency: options.concurrency,\n prompts,\n maxToolIterations: options.maxToolIterations\n });\n\n if (options.saveResults) {\n await writeJsonFile(options.saveResults, result);\n }\n\n spinner?.stop();\n if (options.json) {\n writeResult(result, true);\n } else {\n writeResult(renderEvalReport(result, options.color, options.verbose), false);\n }\n\n if (options.html) {\n const htmlResult: typeof result & { target: string } = {\n ...result,\n target: targetPath\n };\n await fs.writeFile(options.html, renderEvalHtml(htmlResult), \"utf8\");\n }\n } catch (error) {\n spinner?.stop();\n writeError(error, options.json);\n process.exitCode = 2;\n }\n}\n\nexport function registerEvalCommand(program: Command): void {\n program\n .command(\"eval\")\n .description(\"Run end-to-end skill execution and quality evaluation.\")\n .argument(\"<path-to-skill>\", \"Path to SKILL.md or skill directory\")\n .option(\"--prompts <path>\", \"Path to eval prompts JSON\")\n .option(\"--model <model>\", \"Model to execute prompts\")\n .option(\"--grader-model <model>\", \"Model used for grading (defaults to --model)\")\n .option(\"--provider <provider>\", \"LLM provider: anthropic|openai\")\n .option(\"--concurrency <n>\", \"Maximum in-flight eval prompt runs\", (value) => Number.parseInt(value, 10))\n .option(\"--html <path>\", \"Write an HTML report to the given file path\")\n .option(\"--save-results <path>\", \"Save full evaluation results to JSON\")\n .option(\"--api-key <key>\", \"API key override\")\n .option(\"--verbose\", \"Show full model responses\")\n .action(async (targetPath: string, _commandOptions: unknown, command: Command) => {\n const globalOptions = getGlobalCliOptions(command);\n const config = getResolvedConfig(command);\n const parsedCli = evalCliSchema.safeParse(command.opts());\n if (!parsedCli.success) {\n writeError(new Error(parsedCli.error.issues[0]?.message ?? \"Invalid eval options.\"), globalOptions.json);\n process.exitCode = 2;\n return;\n }\n\n await handleEvalCommand(\n targetPath,\n {\n ...globalOptions,\n prompts: parsedCli.data.prompts,\n model: config.model,\n graderModel: parsedCli.data.graderModel,\n provider: config.provider,\n saveResults: parsedCli.data.saveResults,\n html: parsedCli.data.html,\n verbose: Boolean(parsedCli.data.verbose),\n apiKey: parsedCli.data.apiKey,\n numRuns: config.eval.numRuns,\n concurrency: config.concurrency,\n maxToolIterations: config.eval.maxToolIterations\n },\n command\n );\n });\n}\n","import fs from \"node:fs/promises\";\nimport ora from \"ora\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { runCheck } from \"../core/check-runner.js\";\nimport { createProvider } from \"../providers/index.js\";\nimport { renderCheckHtml } from \"../reporters/html.js\";\nimport { renderCheckReport } from \"../reporters/terminal.js\";\nimport {\n getGlobalCliOptions,\n getResolvedConfig,\n loadConfiguredEvalPrompts,\n loadEvalPromptsJson,\n loadTriggerQueriesFile,\n writeError,\n writeResult\n} from \"./common.js\";\nimport { writeJsonFile } from \"../utils/fs.js\";\n\nconst checkCliSchema = z.object({\n graderModel: z.string().optional(),\n apiKey: z.string().optional(),\n queries: z.string().optional(),\n compare: z.array(z.string().min(1)).optional(),\n seed: z.number().int().optional(),\n prompts: z.string().optional(),\n plugin: z.array(z.string().min(1)).optional(),\n concurrency: z.number().int().min(1).optional(),\n html: z.string().optional(),\n saveResults: z.string().optional(),\n continueOnLintFail: z.boolean().optional(),\n verbose: z.boolean().optional()\n});\n\nconst DEFAULT_ANTHROPIC_MODEL = \"claude-sonnet-4-5-20250929\";\nconst DEFAULT_OPENAI_MODEL = \"gpt-4.1-mini\";\n\ninterface CheckCommandOptions {\n json: boolean;\n color: boolean;\n provider: \"anthropic\" | \"openai\";\n model: string;\n graderModel?: string;\n apiKey?: string;\n queries?: string;\n compare: string[];\n numQueries: number;\n prompts?: string;\n minF1: number;\n minAssertPassRate: number;\n numRuns: number;\n maxToolIterations: number;\n concurrency: number;\n html?: string;\n lintFailOn: \"error\" | \"warn\";\n lintSuppress: string[];\n lintPlugins: string[];\n triggerSeed?: number;\n saveResults?: string;\n continueOnLintFail: boolean;\n verbose: boolean;\n}\n\nfunction collectPluginPaths(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nfunction resolveModel(provider: \"anthropic\" | \"openai\", model: string): string {\n if (provider === \"openai\" && model === DEFAULT_ANTHROPIC_MODEL) {\n return DEFAULT_OPENAI_MODEL;\n }\n return model;\n}\n\nfunction renderCheckOutputWithSeed(output: string, seed?: number): string {\n if (seed === undefined) {\n return output;\n }\n\n const lines = output.split(\"\\n\");\n const triggerIndex = lines.indexOf(\"Trigger\");\n if (triggerIndex === -1) {\n return `${output}\\nSeed: ${seed}`;\n }\n\n lines.splice(triggerIndex + 1, 0, `Seed: ${seed}`);\n return lines.join(\"\\n\");\n}\n\nasync function handleCheckCommand(targetPath: string, options: CheckCommandOptions, command: Command): Promise<void> {\n const spinner = options.json || !process.stdout.isTTY ? null : ora(\"Preparing check run...\").start();\n\n try {\n if (spinner) {\n spinner.text = \"Initializing model provider...\";\n }\n const provider = createProvider(options.provider, options.apiKey);\n\n let queries = undefined;\n if (options.queries) {\n if (spinner) {\n spinner.text = \"Loading custom trigger queries...\";\n }\n queries = await loadTriggerQueriesFile(options.queries);\n }\n\n let prompts = undefined;\n if (options.prompts) {\n if (spinner) {\n spinner.text = \"Loading eval prompts...\";\n }\n prompts = await loadEvalPromptsJson(options.prompts);\n } else {\n prompts = await loadConfiguredEvalPrompts(command);\n }\n\n const model = resolveModel(options.provider, options.model);\n const graderModel = options.graderModel ?? model;\n\n const result = await runCheck(targetPath, {\n provider,\n model,\n graderModel,\n lintFailOn: options.lintFailOn,\n lintSuppress: options.lintSuppress,\n lintPlugins: options.lintPlugins,\n queries,\n compare: options.compare,\n numQueries: options.numQueries,\n triggerSeed: options.triggerSeed,\n prompts,\n evalNumRuns: options.numRuns,\n evalMaxToolIterations: options.maxToolIterations,\n concurrency: options.concurrency,\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate,\n continueOnLintFail: options.continueOnLintFail,\n verbose: options.verbose,\n onStage: (stage) => {\n if (!spinner) {\n return;\n }\n if (stage === \"lint\") {\n spinner.text = \"Running lint checks...\";\n } else if (stage === \"parse\") {\n spinner.text = \"Parsing skill for model evaluations...\";\n } else if (stage === \"trigger\" || stage === \"eval\") {\n spinner.text = \"Running trigger and eval suites...\";\n }\n }\n });\n\n if (options.saveResults) {\n await writeJsonFile(options.saveResults, result);\n }\n\n spinner?.stop();\n if (options.json) {\n writeResult(result, true);\n } else {\n writeResult(\n renderCheckOutputWithSeed(renderCheckReport(result, options.color, options.verbose), result.trigger?.seed),\n false\n );\n }\n\n if (options.html) {\n await fs.writeFile(options.html, renderCheckHtml(result), \"utf8\");\n }\n\n process.exitCode = result.gates.overallPassed ? 0 : 1;\n } catch (error) {\n spinner?.stop();\n writeError(error, options.json);\n process.exitCode = 2;\n }\n}\n\nexport function registerCheckCommand(program: Command): void {\n program\n .command(\"check\")\n .description(\"Run lint + trigger + eval with threshold-based quality gates.\")\n .argument(\"<path-to-skill>\", \"Path to SKILL.md or skill directory\")\n .option(\"--provider <provider>\", \"LLM provider: anthropic|openai\")\n .option(\"--model <model>\", \"Model for trigger/eval runs\")\n .option(\"--grader-model <model>\", \"Model used for grading (defaults to --model)\")\n .option(\"--api-key <key>\", \"API key override\")\n .option(\"--queries <path>\", \"Path to custom trigger queries JSON\")\n .option(\"--compare <path...>\", \"Path(s) to sibling skill directories to include as competitors\")\n .option(\"--num-queries <n>\", \"Number of auto-generated trigger queries\", (value) => Number.parseInt(value, 10))\n .option(\"--seed <number>\", \"RNG seed for reproducible results\", (value) => Number.parseInt(value, 10))\n .option(\"--prompts <path>\", \"Path to eval prompts JSON\")\n .option(\"--plugin <path>\", \"Load a custom lint plugin file\", collectPluginPaths, [])\n .option(\"--concurrency <n>\", \"Maximum in-flight trigger/eval tasks\", (value) => Number.parseInt(value, 10))\n .option(\"--html <path>\", \"Write an HTML report to the given file path\")\n .option(\"--min-f1 <n>\", \"Minimum required trigger F1 score (0-1)\", (value) => Number.parseFloat(value))\n .option(\"--min-assert-pass-rate <n>\", \"Minimum required eval assertion pass rate (0-1)\", (value) => Number.parseFloat(value))\n .option(\"--save-results <path>\", \"Save combined check results to JSON\")\n .option(\"--continue-on-lint-fail\", \"Continue trigger/eval stages even when lint has failures\")\n .option(\"--verbose\", \"Show detailed trigger/eval output sections\")\n .action(async (targetPath: string, _commandOptions: unknown, command: Command) => {\n const globalOptions = getGlobalCliOptions(command);\n const config = getResolvedConfig(command);\n const parsedCli = checkCliSchema.safeParse(command.opts());\n if (!parsedCli.success) {\n writeError(new Error(parsedCli.error.issues[0]?.message ?? \"Invalid check options.\"), globalOptions.json);\n process.exitCode = 2;\n return;\n }\n\n await handleCheckCommand(\n targetPath,\n {\n ...globalOptions,\n provider: config.provider,\n model: config.model,\n graderModel: parsedCli.data.graderModel,\n apiKey: parsedCli.data.apiKey,\n queries: parsedCli.data.queries,\n compare: config.trigger.compare,\n numQueries: config.trigger.numQueries,\n prompts: parsedCli.data.prompts,\n minF1: config.trigger.threshold,\n minAssertPassRate: config.eval.threshold,\n numRuns: config.eval.numRuns,\n maxToolIterations: config.eval.maxToolIterations,\n concurrency: config.concurrency,\n html: parsedCli.data.html,\n lintFailOn: config.lint.failOn,\n lintSuppress: config.lint.suppress,\n lintPlugins: config.lint.plugins,\n triggerSeed: parsedCli.data.seed ?? config.trigger.seed,\n saveResults: parsedCli.data.saveResults,\n continueOnLintFail: Boolean(parsedCli.data.continueOnLintFail),\n verbose: Boolean(parsedCli.data.verbose)\n },\n command\n );\n });\n}\n","import { runEval, EvalPrompt, EvalResult } from \"./eval-runner.js\";\nimport { lintFails, runLinter, LintReport } from \"./linter/index.js\";\nimport { parseSkillStrict } from \"./skill-parser.js\";\nimport { runTriggerTest, TriggerQuery, TriggerTestResult } from \"./trigger-tester.js\";\nimport { LanguageModelProvider } from \"../providers/types.js\";\nimport { LintFailOn } from \"../utils/config.js\";\n\nexport interface CheckThresholds {\n minF1: number;\n minAssertPassRate: number;\n}\n\nexport interface CheckGates {\n lintPassed: boolean;\n triggerPassed: boolean | null;\n evalPassed: boolean | null;\n triggerF1: number | null;\n evalAssertPassRate: number | null;\n overallPassed: boolean;\n}\n\nexport interface CheckRunResult {\n target: string;\n provider: string;\n model: string;\n graderModel: string;\n thresholds: CheckThresholds;\n continueOnLintFail: boolean;\n lint: LintReport;\n trigger: TriggerTestResult | null;\n eval: EvalResult | null;\n triggerSkippedReason?: string;\n evalSkippedReason?: string;\n gates: CheckGates;\n}\n\nexport interface RunCheckOptions {\n provider: LanguageModelProvider;\n model: string;\n graderModel: string;\n lintFailOn: LintFailOn;\n lintSuppress: string[];\n lintPlugins: string[];\n compare?: string[];\n numQueries: number;\n concurrency?: number;\n triggerSeed?: number;\n queries?: TriggerQuery[];\n evalNumRuns: number;\n prompts?: EvalPrompt[];\n evalMaxToolIterations: number;\n minF1: number;\n minAssertPassRate: number;\n continueOnLintFail: boolean;\n verbose?: boolean;\n onStage?: (stage: string) => void;\n}\n\nfunction calculateEvalAssertPassRate(result: EvalResult): number {\n if (result.summary.totalAssertions === 0) {\n return 0;\n }\n return result.summary.passedAssertions / result.summary.totalAssertions;\n}\n\nexport async function runCheck(inputPath: string, options: RunCheckOptions): Promise<CheckRunResult> {\n options.onStage?.(\"lint\");\n const lint = await runLinter(inputPath, { suppress: options.lintSuppress, plugins: options.lintPlugins });\n const lintPassed = !lintFails(lint, options.lintFailOn);\n\n let trigger: TriggerTestResult | null = null;\n let evalResult: EvalResult | null = null;\n let triggerSkippedReason: string | undefined;\n let evalSkippedReason: string | undefined;\n\n if (!lintPassed && !options.continueOnLintFail) {\n triggerSkippedReason = \"Skipped because lint has failures (use --continue-on-lint-fail to override).\";\n evalSkippedReason = \"Skipped because lint has failures (use --continue-on-lint-fail to override).\";\n } else {\n options.onStage?.(\"parse\");\n let parsedSkill = null;\n try {\n parsedSkill = await parseSkillStrict(inputPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n triggerSkippedReason = `Skipped: skill could not be parsed strictly (${message}).`;\n evalSkippedReason = `Skipped: skill could not be parsed strictly (${message}).`;\n }\n\n if (parsedSkill) {\n const triggerOptions = {\n provider: options.provider,\n model: options.model,\n queries: options.queries,\n compare: options.compare,\n numQueries: options.numQueries,\n seed: options.triggerSeed,\n concurrency: options.concurrency,\n verbose: options.verbose\n };\n const evalOptions = {\n provider: options.provider,\n model: options.model,\n graderModel: options.graderModel,\n numRuns: options.evalNumRuns,\n prompts: options.prompts,\n concurrency: options.concurrency,\n maxToolIterations: options.evalMaxToolIterations\n };\n\n if ((options.concurrency ?? 5) === 1) {\n options.onStage?.(\"trigger\");\n trigger = await runTriggerTest(parsedSkill, triggerOptions);\n\n options.onStage?.(\"eval\");\n evalResult = await runEval(parsedSkill, evalOptions);\n } else {\n options.onStage?.(\"trigger\");\n options.onStage?.(\"eval\");\n [trigger, evalResult] = await Promise.all([runTriggerTest(parsedSkill, triggerOptions), runEval(parsedSkill, evalOptions)]);\n }\n }\n }\n\n const triggerF1 = trigger ? trigger.metrics.f1 : null;\n const evalAssertPassRate = evalResult ? calculateEvalAssertPassRate(evalResult) : null;\n const triggerPassed = triggerF1 === null ? null : triggerF1 >= options.minF1;\n const evalPassed = evalAssertPassRate === null ? null : evalAssertPassRate >= options.minAssertPassRate;\n const overallPassed = lintPassed && triggerPassed === true && evalPassed === true;\n\n return {\n target: inputPath,\n provider: options.provider.name,\n model: options.model,\n graderModel: options.graderModel,\n thresholds: {\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate\n },\n continueOnLintFail: options.continueOnLintFail,\n lint,\n trigger,\n eval: evalResult,\n triggerSkippedReason,\n evalSkippedReason,\n gates: {\n lintPassed,\n triggerPassed,\n evalPassed,\n triggerF1,\n evalAssertPassRate,\n overallPassed\n }\n };\n}\n","import fs from \"node:fs/promises\";\nimport ora from \"ora\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { runImprove } from \"../core/improver.js\";\nimport { createProvider } from \"../providers/index.js\";\nimport {\n getGlobalCliOptions,\n getResolvedConfig,\n loadConfiguredEvalPrompts,\n loadEvalPromptsJson,\n loadTriggerQueriesFile,\n writeError,\n writeResult\n} from \"./common.js\";\nimport { renderImproveReport } from \"../reporters/terminal.js\";\nimport { writeJsonFile } from \"../utils/fs.js\";\n\nconst improveCliSchema = z.object({\n apiKey: z.string().optional(),\n queries: z.string().optional(),\n compare: z.array(z.string().min(1)).optional(),\n seed: z.number().int().optional(),\n prompts: z.string().optional(),\n plugin: z.array(z.string().min(1)).optional(),\n concurrency: z.number().int().min(1).optional(),\n output: z.string().optional(),\n saveResults: z.string().optional(),\n apply: z.boolean().optional(),\n verbose: z.boolean().optional()\n});\n\nconst DEFAULT_ANTHROPIC_MODEL = \"claude-sonnet-4-5-20250929\";\nconst DEFAULT_OPENAI_MODEL = \"gpt-4.1-mini\";\n\ninterface ImproveCommandOptions {\n json: boolean;\n color: boolean;\n provider: \"anthropic\" | \"openai\";\n model: string;\n apiKey?: string;\n queries?: string;\n compare: string[];\n numQueries: number;\n prompts?: string;\n minF1: number;\n minAssertPassRate: number;\n numRuns: number;\n maxToolIterations: number;\n concurrency: number;\n lintFailOn: \"error\" | \"warn\";\n lintSuppress: string[];\n lintPlugins: string[];\n triggerSeed?: number;\n output?: string;\n saveResults?: string;\n apply: boolean;\n verbose: boolean;\n}\n\nfunction collectPluginPaths(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nfunction resolveModel(provider: \"anthropic\" | \"openai\", model: string): string {\n if (provider === \"openai\" && model === DEFAULT_ANTHROPIC_MODEL) {\n return DEFAULT_OPENAI_MODEL;\n }\n\n return model;\n}\n\nasync function handleImproveCommand(targetPath: string, options: ImproveCommandOptions, command: Command): Promise<void> {\n const spinner = options.json || !process.stdout.isTTY ? null : ora(\"Preparing improvement run...\").start();\n\n try {\n if (spinner) {\n spinner.text = \"Initializing model provider...\";\n }\n const provider = createProvider(options.provider, options.apiKey);\n\n let queries = undefined;\n if (options.queries) {\n if (spinner) {\n spinner.text = \"Loading frozen trigger queries...\";\n }\n queries = await loadTriggerQueriesFile(options.queries);\n }\n\n let prompts = undefined;\n if (options.prompts) {\n if (spinner) {\n spinner.text = \"Loading eval prompts...\";\n }\n prompts = await loadEvalPromptsJson(options.prompts);\n } else {\n prompts = await loadConfiguredEvalPrompts(command);\n }\n\n const model = resolveModel(options.provider, options.model);\n const result = await runImprove(targetPath, {\n provider,\n model,\n lintFailOn: options.lintFailOn,\n lintSuppress: options.lintSuppress,\n lintPlugins: options.lintPlugins,\n compare: options.compare,\n numQueries: options.numQueries,\n triggerSeed: options.triggerSeed,\n queries,\n prompts,\n evalNumRuns: options.numRuns,\n evalMaxToolIterations: options.maxToolIterations,\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate,\n concurrency: options.concurrency,\n apply: options.apply,\n outputPath: options.output,\n verbose: options.verbose,\n onStage: (stage) => {\n if (!spinner) {\n return;\n }\n\n if (stage === \"baseline\") {\n spinner.text = \"Running baseline check...\";\n } else if (stage === \"generate\") {\n spinner.text = \"Generating candidate rewrite...\";\n } else if (stage === \"validate\") {\n spinner.text = \"Validating candidate rewrite...\";\n } else if (stage === \"verify\") {\n spinner.text = \"Verifying candidate against frozen test inputs...\";\n } else if (stage === \"write\") {\n spinner.text = options.apply ? \"Writing improved SKILL.md...\" : \"Writing candidate output...\";\n }\n }\n });\n\n if (options.saveResults) {\n await writeJsonFile(options.saveResults, result);\n }\n\n spinner?.stop();\n if (options.json) {\n writeResult(result, true);\n } else {\n writeResult(renderImproveReport(result, options.color, options.verbose), false);\n }\n\n process.exitCode = result.blockedReason ? 1 : 0;\n } catch (error) {\n spinner?.stop();\n writeError(error, options.json);\n process.exitCode = 2;\n }\n}\n\nexport function registerImproveCommand(program: Command): void {\n program\n .command(\"improve\")\n .description(\"Rewrite SKILL.md, verify it on frozen test inputs, and optionally apply it.\")\n .argument(\"<path-to-skill>\", \"Path to SKILL.md or skill directory\")\n .option(\"--provider <provider>\", \"LLM provider: anthropic|openai\")\n .option(\"--model <model>\", \"Model for baseline, rewrite, and verification runs\")\n .option(\"--api-key <key>\", \"API key override\")\n .option(\"--queries <path>\", \"Path to custom trigger queries JSON\")\n .option(\"--compare <path...>\", \"Path(s) to sibling skill directories to include as competitors\")\n .option(\"--num-queries <n>\", \"Number of auto-generated trigger queries\", (value) => Number.parseInt(value, 10))\n .option(\"--seed <number>\", \"RNG seed for reproducible trigger results\", (value) => Number.parseInt(value, 10))\n .option(\"--prompts <path>\", \"Path to eval prompts JSON\")\n .option(\"--plugin <path>\", \"Load a custom lint plugin file\", collectPluginPaths, [])\n .option(\"--concurrency <n>\", \"Maximum in-flight trigger/eval tasks\", (value) => Number.parseInt(value, 10))\n .option(\"--output <path>\", \"Write the verified candidate SKILL.md to a separate file\")\n .option(\"--save-results <path>\", \"Save the full improve result JSON\")\n .option(\"--min-f1 <n>\", \"Minimum required trigger F1 score (0-1)\", (value) => Number.parseFloat(value))\n .option(\"--min-assert-pass-rate <n>\", \"Minimum required eval assertion pass rate (0-1)\", (value) =>\n Number.parseFloat(value)\n )\n .option(\"--apply\", \"Apply the verified rewrite to the source SKILL.md\")\n .option(\"--verbose\", \"Include detailed baseline and verification reports\")\n .action(async (targetPath: string, _commandOptions: unknown, command: Command) => {\n const globalOptions = getGlobalCliOptions(command);\n const config = getResolvedConfig(command);\n const parsedCli = improveCliSchema.safeParse(command.opts());\n if (!parsedCli.success) {\n writeError(new Error(parsedCli.error.issues[0]?.message ?? \"Invalid improve options.\"), globalOptions.json);\n process.exitCode = 2;\n return;\n }\n\n await handleImproveCommand(\n targetPath,\n {\n ...globalOptions,\n provider: config.provider,\n model: config.model,\n apiKey: parsedCli.data.apiKey,\n queries: parsedCli.data.queries,\n compare: config.trigger.compare,\n numQueries: config.trigger.numQueries,\n prompts: parsedCli.data.prompts,\n minF1: config.trigger.threshold,\n minAssertPassRate: config.eval.threshold,\n numRuns: config.eval.numRuns,\n maxToolIterations: config.eval.maxToolIterations,\n concurrency: config.concurrency,\n lintFailOn: config.lint.failOn,\n lintSuppress: config.lint.suppress,\n lintPlugins: config.lint.plugins,\n triggerSeed: parsedCli.data.seed ?? config.trigger.seed,\n output: parsedCli.data.output,\n saveResults: parsedCli.data.saveResults,\n apply: Boolean(parsedCli.data.apply),\n verbose: Boolean(parsedCli.data.verbose)\n },\n command\n );\n });\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport yaml from \"js-yaml\";\nimport { z } from \"zod\";\nimport { EvalPrompt } from \"./eval-runner.js\";\nimport { CheckRunResult, runCheck } from \"./check-runner.js\";\nimport {\n extractRelativeFileReferences,\n ParsedSkill,\n parseSkillDocumentStrict,\n parseSkillStrict\n} from \"./skill-parser.js\";\nimport { TriggerQuery } from \"./trigger-tester.js\";\nimport { pathExists } from \"../utils/fs.js\";\nimport { LintFailOn } from \"../utils/config.js\";\nimport { LanguageModelProvider } from \"../providers/types.js\";\n\nconst improveRewriteSchema = z.object({\n frontmatter: z.record(z.unknown()),\n content: z.string().min(1),\n changeSummary: z.array(z.string().min(1)).min(1),\n targetedProblems: z.array(z.string().min(1)).min(1)\n});\n\nexport interface ImprovementBrief {\n lintIssues: Array<{\n checkId: string;\n title: string;\n status: \"warn\" | \"fail\";\n message: string;\n suggestion?: string;\n startLine?: number;\n endLine?: number;\n }>;\n triggerFailures: Array<{\n query: string;\n expected: string;\n actual: string;\n selectedCompetitor?: string;\n rawModelResponse?: string;\n }>;\n evalFailures: Array<{\n prompt: string;\n assertion: string;\n evidence: string;\n source: \"grader\" | \"tool\" | \"unknown\";\n }>;\n triggerSuggestions: string[];\n}\n\nexport interface ImproveCandidate {\n frontmatter: Record<string, unknown>;\n content: string;\n raw: string;\n changeSummary: string[];\n targetedProblems: string[];\n}\n\nexport interface ImproveMetricDelta {\n before: number;\n after: number;\n delta: number;\n}\n\nexport interface ImproveBooleanDelta {\n before: boolean;\n after: boolean;\n}\n\nexport interface ImproveDelta {\n lintFailures: ImproveMetricDelta;\n lintWarnings: ImproveMetricDelta;\n triggerF1: ImproveMetricDelta;\n evalAssertPassRate: ImproveMetricDelta;\n overallPassed: ImproveBooleanDelta;\n improved: boolean;\n hasRegression: boolean;\n}\n\nexport interface ImproveRunResult {\n target: string;\n provider: string;\n model: string;\n originalRaw: string;\n thresholds: {\n minF1: number;\n minAssertPassRate: number;\n };\n baseline: CheckRunResult;\n candidate: ImproveCandidate | null;\n verification: CheckRunResult | null;\n delta: ImproveDelta | null;\n applied: boolean;\n outputPath?: string;\n blockedReason?: string;\n}\n\nexport interface RunImproveOptions {\n provider: LanguageModelProvider;\n model: string;\n lintFailOn: LintFailOn;\n lintSuppress: string[];\n lintPlugins: string[];\n compare?: string[];\n numQueries: number;\n triggerSeed?: number;\n queries?: TriggerQuery[];\n prompts?: EvalPrompt[];\n evalNumRuns: number;\n evalMaxToolIterations: number;\n minF1: number;\n minAssertPassRate: number;\n concurrency?: number;\n verbose?: boolean;\n apply?: boolean;\n outputPath?: string;\n onStage?: (stage: \"baseline\" | \"generate\" | \"validate\" | \"verify\" | \"write\") => void;\n}\n\nfunction calculateEvalAssertPassRate(result: CheckRunResult[\"eval\"]): number {\n if (!result || result.summary.totalAssertions === 0) {\n return 0;\n }\n\n return result.summary.passedAssertions / result.summary.totalAssertions;\n}\n\nfunction extractJsonObject(raw: string): Record<string, unknown> {\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n return JSON.parse(trimmed) as Record<string, unknown>;\n }\n\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n return JSON.parse(trimmed.slice(start, end + 1)) as Record<string, unknown>;\n }\n\n throw new Error(\"Improver did not return a JSON object.\");\n}\n\nfunction orderFrontmatter(frontmatter: Record<string, unknown>): Record<string, unknown> {\n const ordered: Record<string, unknown> = {};\n\n for (const key of [\"name\", \"description\", \"license\"]) {\n if (Object.prototype.hasOwnProperty.call(frontmatter, key)) {\n ordered[key] = frontmatter[key];\n }\n }\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (!Object.prototype.hasOwnProperty.call(ordered, key)) {\n ordered[key] = value;\n }\n }\n\n return ordered;\n}\n\nfunction detectLineEnding(raw: string): string {\n return raw.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n}\n\nfunction buildSkillMarkdown(frontmatter: Record<string, unknown>, content: string, lineEnding: string): string {\n const normalizedBody = content.trim();\n if (normalizedBody.length === 0) {\n throw new Error(\"Candidate rewrite produced an empty SKILL.md body.\");\n }\n\n const frontmatterBlock = yaml\n .dump(orderFrontmatter(frontmatter), {\n lineWidth: 0,\n noRefs: true,\n sortKeys: false\n })\n .replace(/\\n/g, lineEnding);\n\n return `---${lineEnding}${frontmatterBlock}---${lineEnding}${lineEnding}${normalizedBody.replace(/\\n/g, lineEnding)}${lineEnding}`;\n}\n\nasync function validateRelativeReferences(raw: string, skillRoot: string): Promise<void> {\n for (const reference of extractRelativeFileReferences(raw)) {\n const resolved = path.resolve(skillRoot, reference);\n const relativeToRoot = path.relative(skillRoot, resolved);\n const escapesRoot =\n relativeToRoot === \"\" ? false : relativeToRoot.startsWith(\"..\") || path.isAbsolute(relativeToRoot);\n\n if (escapesRoot) {\n throw new Error(`Candidate rewrite introduced an out-of-root reference: ${reference}`);\n }\n\n if (!(await pathExists(resolved))) {\n throw new Error(`Candidate rewrite introduced a broken relative reference: ${reference}`);\n }\n }\n}\n\nasync function buildCandidate(skill: ParsedSkill, rewrite: z.infer<typeof improveRewriteSchema>): Promise<ImproveCandidate> {\n if (typeof rewrite.frontmatter.name === \"string\" && rewrite.frontmatter.name !== skill.frontmatter.name) {\n throw new Error(`Candidate rewrite attempted to rename skill '${skill.frontmatter.name}' to '${rewrite.frontmatter.name}'.`);\n }\n\n if (\n skill.frontmatter.license &&\n typeof rewrite.frontmatter.license === \"string\" &&\n rewrite.frontmatter.license !== skill.frontmatter.license\n ) {\n throw new Error(\n `Candidate rewrite attempted to change license '${skill.frontmatter.license}' to '${rewrite.frontmatter.license}'.`\n );\n }\n\n const mergedFrontmatter = {\n ...skill.frontmatter,\n ...rewrite.frontmatter,\n name: skill.frontmatter.name,\n ...(skill.frontmatter.license ? { license: skill.frontmatter.license } : {})\n };\n\n const raw = buildSkillMarkdown(mergedFrontmatter, rewrite.content, detectLineEnding(skill.raw));\n parseSkillDocumentStrict(raw, skill.skillRoot, skill.skillFile);\n await validateRelativeReferences(raw, skill.skillRoot);\n\n return {\n frontmatter: mergedFrontmatter,\n content: rewrite.content.trim(),\n raw,\n changeSummary: rewrite.changeSummary,\n targetedProblems: rewrite.targetedProblems\n };\n}\n\nfunction extractActionableIssues(result: CheckRunResult): ImprovementBrief {\n const lintIssues = result.lint.issues\n .filter((issue) => issue.status !== \"pass\")\n .map((issue) => ({\n checkId: issue.checkId,\n title: issue.title,\n status: issue.status === \"warn\" ? (\"warn\" as const) : (\"fail\" as const),\n message: issue.message,\n suggestion: issue.suggestion,\n startLine: issue.startLine,\n endLine: issue.endLine\n }));\n\n const triggerFailures =\n result.trigger?.cases.filter((testCase) => !testCase.matched).map((testCase) => ({\n query: testCase.query,\n expected: testCase.expected,\n actual: testCase.actual,\n selectedCompetitor: testCase.selectedCompetitor,\n rawModelResponse: testCase.rawModelResponse\n })) ?? [];\n\n const evalFailures =\n result.eval?.results.flatMap((promptResult) =>\n promptResult.assertions\n .filter((assertion) => !assertion.passed)\n .map((assertion) => ({\n prompt: promptResult.prompt,\n assertion: assertion.assertion,\n evidence: assertion.evidence,\n source:\n assertion.source === \"grader\" || assertion.source === \"tool\"\n ? assertion.source\n : (\"unknown\" as const)\n }))\n ) ?? [];\n\n return {\n lintIssues,\n triggerFailures,\n evalFailures,\n triggerSuggestions: result.trigger?.suggestions ?? []\n };\n}\n\nfunction hasActionableProblems(brief: ImprovementBrief): boolean {\n return (\n brief.lintIssues.length > 0 ||\n brief.triggerFailures.length > 0 ||\n brief.evalFailures.length > 0 ||\n brief.triggerSuggestions.length > 0\n );\n}\n\nasync function listSkillFiles(skillRoot: string): Promise<string[]> {\n const entries = await fs.readdir(skillRoot, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const absolutePath = path.join(skillRoot, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listSkillFiles(absolutePath)));\n continue;\n }\n\n if (entry.isFile()) {\n files.push(path.relative(skillRoot, absolutePath).split(path.sep).join(\"/\"));\n }\n }\n\n return files.sort();\n}\n\nasync function requestRewrite(\n skill: ParsedSkill,\n baseline: CheckRunResult,\n brief: ImprovementBrief,\n provider: LanguageModelProvider,\n model: string\n): Promise<z.infer<typeof improveRewriteSchema>> {\n const availableFiles = await listSkillFiles(skill.skillRoot);\n const systemPrompt = [\n \"You rewrite Agent Skill files to improve measured quality.\",\n \"Return JSON only.\",\n \"Required format:\",\n '{\"frontmatter\": {...}, \"content\": \"...\", \"changeSummary\": [\"...\"], \"targetedProblems\": [\"...\"]}',\n \"The content field must contain only the markdown body of SKILL.md, without YAML frontmatter fences.\",\n `Keep the skill name exactly '${skill.frontmatter.name}'.`,\n skill.frontmatter.license ? `Keep the license exactly '${skill.frontmatter.license}'.` : \"Do not remove any valid existing frontmatter fields.\",\n \"Do not invent new scripts, assets, references, APIs, or tools.\",\n \"Only reference files that already exist under the skill root.\",\n \"Optimize for trigger clarity, explicit scope boundaries, concrete examples, safety guidance, and tool usage instructions.\"\n ].join(\" \");\n\n const baselineTriggerF1 = baseline.trigger?.metrics.f1 ?? 0;\n const baselineEvalPassRate = calculateEvalAssertPassRate(baseline.eval);\n const userPrompt = [\n `Skill file: ${skill.skillFile}`,\n `Current trigger F1: ${baselineTriggerF1.toFixed(4)}`,\n `Current eval assertion pass rate: ${baselineEvalPassRate.toFixed(4)}`,\n `Lint failures: ${baseline.lint.summary.failures}`,\n `Lint warnings: ${baseline.lint.summary.warnings}`,\n \"\",\n \"Available files under the skill root:\",\n ...availableFiles.map((file) => `- ${file}`),\n \"\",\n \"Current SKILL.md:\",\n \"```markdown\",\n skill.raw,\n \"```\",\n \"\",\n \"Actionable problems to fix:\",\n JSON.stringify(brief, null, 2),\n \"\",\n \"Rewrite the skill to address only these evidenced problems. Keep the instructions tight and practical.\"\n ].join(\"\\n\");\n\n const raw = await provider.sendMessage(systemPrompt, userPrompt, { model });\n const parsed = improveRewriteSchema.safeParse(extractJsonObject(raw));\n if (!parsed.success) {\n throw new Error(`Failed to parse improve output: ${parsed.error.issues[0]?.message ?? \"invalid improve JSON\"}`);\n }\n\n return parsed.data;\n}\n\nasync function createVerificationDirectory(skillRoot: string, candidateRaw: string): Promise<{ tempRoot: string; skillPath: string }> {\n const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), \"skilltest-improve-\"));\n const tempSkillRoot = path.join(tempRoot, path.basename(skillRoot));\n await fs.cp(skillRoot, tempSkillRoot, { recursive: true });\n await fs.writeFile(path.join(tempSkillRoot, \"SKILL.md\"), candidateRaw, \"utf8\");\n return {\n tempRoot,\n skillPath: tempSkillRoot\n };\n}\n\nfunction buildDelta(baseline: CheckRunResult, verification: CheckRunResult): ImproveDelta {\n const baselineTriggerF1 = baseline.trigger?.metrics.f1 ?? 0;\n const verificationTriggerF1 = verification.trigger?.metrics.f1 ?? 0;\n const baselineEvalPassRate = calculateEvalAssertPassRate(baseline.eval);\n const verificationEvalPassRate = calculateEvalAssertPassRate(verification.eval);\n\n const lintFailuresDelta = baseline.lint.summary.failures - verification.lint.summary.failures;\n const lintWarningsDelta = baseline.lint.summary.warnings - verification.lint.summary.warnings;\n const triggerF1Delta = verificationTriggerF1 - baselineTriggerF1;\n const evalPassRateDelta = verificationEvalPassRate - baselineEvalPassRate;\n\n const hasRegression =\n verification.lint.summary.failures > baseline.lint.summary.failures ||\n verification.lint.summary.warnings > baseline.lint.summary.warnings ||\n verificationTriggerF1 < baselineTriggerF1 ||\n verificationEvalPassRate < baselineEvalPassRate;\n\n const improved =\n verification.gates.overallPassed !== baseline.gates.overallPassed\n ? verification.gates.overallPassed\n : lintFailuresDelta > 0 || lintWarningsDelta > 0 || triggerF1Delta > 0 || evalPassRateDelta > 0;\n\n return {\n lintFailures: {\n before: baseline.lint.summary.failures,\n after: verification.lint.summary.failures,\n delta: lintFailuresDelta\n },\n lintWarnings: {\n before: baseline.lint.summary.warnings,\n after: verification.lint.summary.warnings,\n delta: lintWarningsDelta\n },\n triggerF1: {\n before: baselineTriggerF1,\n after: verificationTriggerF1,\n delta: triggerF1Delta\n },\n evalAssertPassRate: {\n before: baselineEvalPassRate,\n after: verificationEvalPassRate,\n delta: evalPassRateDelta\n },\n overallPassed: {\n before: baseline.gates.overallPassed,\n after: verification.gates.overallPassed\n },\n improved,\n hasRegression\n };\n}\n\nfunction normalizeVerificationTarget(result: CheckRunResult, target: string): CheckRunResult {\n return {\n ...result,\n target\n };\n}\n\nfunction buildBlockingReason(delta: ImproveDelta, verification: CheckRunResult): string | undefined {\n if (delta.hasRegression) {\n return \"Candidate rewrite regressed one or more quality metrics on the frozen test set.\";\n }\n\n if (!delta.improved) {\n return \"Candidate rewrite did not produce a measurable improvement on the frozen test set.\";\n }\n\n if (!verification.gates.overallPassed) {\n return \"Candidate rewrite improved the skill but still failed the configured quality gates.\";\n }\n\n return undefined;\n}\n\nasync function maybeWriteOutput(outputPath: string, raw: string): Promise<string> {\n const absolutePath = path.resolve(outputPath);\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(absolutePath, raw, \"utf8\");\n return absolutePath;\n}\n\nexport async function runImprove(inputPath: string, options: RunImproveOptions): Promise<ImproveRunResult> {\n options.onStage?.(\"baseline\");\n const baseline = await runCheck(inputPath, {\n provider: options.provider,\n model: options.model,\n graderModel: options.model,\n lintFailOn: options.lintFailOn,\n lintSuppress: options.lintSuppress,\n lintPlugins: options.lintPlugins,\n compare: options.compare,\n numQueries: options.numQueries,\n triggerSeed: options.triggerSeed,\n queries: options.queries,\n evalNumRuns: options.evalNumRuns,\n prompts: options.prompts,\n evalMaxToolIterations: options.evalMaxToolIterations,\n concurrency: options.concurrency,\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate,\n continueOnLintFail: true,\n verbose: options.verbose\n });\n\n if (!baseline.trigger || !baseline.eval) {\n return {\n target: inputPath,\n provider: options.provider.name,\n model: options.model,\n originalRaw: \"\",\n thresholds: {\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate\n },\n baseline,\n candidate: null,\n verification: null,\n delta: null,\n applied: false,\n blockedReason:\n baseline.triggerSkippedReason ??\n baseline.evalSkippedReason ??\n \"Improve requires a strictly parseable skill so trigger and eval can be frozen.\"\n };\n }\n\n const skill = await parseSkillStrict(inputPath);\n const brief = extractActionableIssues(baseline);\n if (!hasActionableProblems(brief)) {\n return {\n target: inputPath,\n provider: options.provider.name,\n model: options.model,\n originalRaw: skill.raw,\n thresholds: {\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate\n },\n baseline,\n candidate: null,\n verification: null,\n delta: null,\n applied: false,\n blockedReason: \"No actionable failures, warnings, or mismatches were found to improve.\"\n };\n }\n\n options.onStage?.(\"generate\");\n const rewrite = await requestRewrite(skill, baseline, brief, options.provider, options.model);\n\n options.onStage?.(\"validate\");\n const candidate = await buildCandidate(skill, rewrite);\n\n if (candidate.raw === skill.raw) {\n return {\n target: inputPath,\n provider: options.provider.name,\n model: options.model,\n originalRaw: skill.raw,\n thresholds: {\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate\n },\n baseline,\n candidate,\n verification: null,\n delta: null,\n applied: false,\n blockedReason: \"Candidate rewrite produced no changes.\"\n };\n }\n\n options.onStage?.(\"verify\");\n const verificationDirectory = await createVerificationDirectory(skill.skillRoot, candidate.raw);\n let verification: CheckRunResult;\n\n try {\n verification = normalizeVerificationTarget(\n await runCheck(verificationDirectory.skillPath, {\n provider: options.provider,\n model: options.model,\n graderModel: options.model,\n lintFailOn: options.lintFailOn,\n lintSuppress: options.lintSuppress,\n lintPlugins: options.lintPlugins,\n compare: options.compare,\n numQueries: baseline.trigger.queries.length,\n triggerSeed: options.triggerSeed,\n queries: baseline.trigger.queries,\n evalNumRuns: baseline.eval.prompts.length,\n prompts: baseline.eval.prompts,\n evalMaxToolIterations: options.evalMaxToolIterations,\n concurrency: options.concurrency,\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate,\n continueOnLintFail: true,\n verbose: options.verbose\n }),\n inputPath\n );\n } finally {\n await fs.rm(verificationDirectory.tempRoot, { recursive: true, force: true });\n }\n\n const delta = buildDelta(baseline, verification);\n const blockedReason = buildBlockingReason(delta, verification);\n let applied = false;\n let outputPath: string | undefined;\n\n if (!blockedReason) {\n if (options.outputPath) {\n options.onStage?.(\"write\");\n outputPath = await maybeWriteOutput(options.outputPath, candidate.raw);\n }\n\n if (options.apply) {\n options.onStage?.(\"write\");\n await fs.writeFile(skill.skillFile, candidate.raw, \"utf8\");\n applied = true;\n }\n }\n\n return {\n target: inputPath,\n provider: options.provider.name,\n model: options.model,\n originalRaw: skill.raw,\n thresholds: {\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate\n },\n baseline,\n candidate,\n verification,\n delta,\n applied,\n ...(outputPath ? { outputPath } : {}),\n ...(blockedReason ? { blockedReason } : {})\n };\n}\n\nexport { improveRewriteSchema, extractActionableIssues as buildImprovementBrief };\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QA8VtB,IAAI;AAAA;AAAA;AAAA;AAIZ;AAEO,SAAS,eAAe,QAA4B;AACzD,QAAM,WAAW,OAAO,QAAQ,UAAU,IAAI,IAAI,OAAO,QAAQ,SAAS,OAAO,QAAQ;AACzF,QAAM,OAAO;AAAA,IACX;AAAA,MACE;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,QACE,EAAE,OAAO,aAAa,OAAO,cAAc,QAAQ,GAAG,MAAM,GAAG,OAAO,QAAQ,MAAM,IAAI,OAAO,QAAQ,KAAK,UAAU;AAAA,QACtH,EAAE,OAAO,YAAY,OAAO,OAAO,OAAO,QAAQ,QAAQ,GAAG,QAAQ,OAAO,QAAQ,WAAW,IAAI,SAAS,OAAO;AAAA,QACnH,EAAE,OAAO,YAAY,OAAO,OAAO,OAAO,QAAQ,QAAQ,GAAG,QAAQ,OAAO,QAAQ,WAAW,IAAI,SAAS,OAAO;AAAA,QACnH,EAAE,OAAO,UAAU,OAAO,OAAO,OAAO,QAAQ,KAAK,EAAE;AAAA,MACzD;AAAA,MACA,CAAC,EAAE,OAAO,UAAU,OAAO,OAAO,OAAO,CAAC;AAAA,IAC5C;AAAA,IACA,kBAAkB,eAAe,oBAAoB,MAAM,CAAC;AAAA,EAC9D,EAAE,KAAK,EAAE;AAET,SAAO,mBAAmB,oBAAoB,OAAO,MAAM,IAAI,IAAI;AACrE;AAEO,SAAS,kBAAkB,QAAmC;AACnE,QAAM,aAAa;AACnB,QAAM,SAAS,sBAAsB,YAAY,OAAO,SAAS;AACjE,QAAM,eAAe,OAAO,MAAM,OAAO,CAAC,aAAa,SAAS,OAAO,EAAE;AACzE,QAAM,YAAY,OAAO,MAAM,WAAW,IAAI,IAAI,eAAe,OAAO,MAAM;AAC9E,QAAM,iBAAiB,QAAQ,OAAO,eAAe,OAAO,YAAY,SAAS,CAAC;AAClF,QAAM,OAAO;AAAA,IACX;AAAA,MACE;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,QACE,EAAE,OAAO,cAAc,OAAO,cAAc,SAAS,GAAG,MAAM,GAAG,YAAY,IAAI,OAAO,MAAM,MAAM,WAAW;AAAA,QAC/G,EAAE,OAAO,aAAa,OAAO,cAAc,OAAO,QAAQ,SAAS,EAAE;AAAA,QACrE,EAAE,OAAO,UAAU,OAAO,cAAc,OAAO,QAAQ,MAAM,EAAE;AAAA,QAC/D,EAAE,OAAO,MAAM,OAAO,cAAc,OAAO,QAAQ,EAAE,GAAG,QAAQ,OAAO,QAAQ,MAAM,MAAM,SAAS,OAAO;AAAA,MAC7G;AAAA,MACA;AAAA,QACE,EAAE,OAAO,YAAY,OAAO,OAAO,SAAS;AAAA,QAC5C,EAAE,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,QACtC,EAAE,OAAO,QAAQ,OAAO,OAAO,SAAS,SAAY,OAAO,OAAO,IAAI,IAAI,OAAO;AAAA,QACjF,GAAI,iBAAiB,CAAC,EAAE,OAAO,eAAe,OAAO,OAAO,OAAO,aAAa,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC;AAAA,QACnG,EAAE,OAAO,WAAW,OAAO,OAAO,OAAO,QAAQ,MAAM,EAAE;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,8BAA8B,MAAM;AAAA,IACpC;AAAA,MACE;AAAA,MACA,yBAAyB,OAAO,MAAM,IAAI,CAAC,aAAa,qBAAqB,UAAU,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,IAClH;AAAA,IACA;AAAA,MACE;AAAA,MACA,OAAO,OAAO,YAAY,IAAI,CAAC,eAAe,OAAO,WAAW,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;AAAA,IAC9F;AAAA,EACF,EAAE,KAAK,EAAE;AAET,SAAO,mBAAmB,uBAAuB,OAAO,SAAS,IAAI,IAAI;AAC3E;AAEO,SAAS,eAAe,QAA4B;AACzD,QAAM,aAAa;AACnB,QAAM,SAAS,sBAAsB,YAAY,OAAO,SAAS;AACjE,QAAM,WAAW,OAAO,QAAQ,oBAAoB,IAAI,IAAI,OAAO,QAAQ,mBAAmB,OAAO,QAAQ;AAC7G,QAAM,OAAO;AAAA,IACX;AAAA,MACE;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,QACE;AAAA,UACE,OAAO;AAAA,UACP,OAAO,cAAc,QAAQ;AAAA,UAC7B,MAAM,GAAG,OAAO,QAAQ,gBAAgB,IAAI,OAAO,QAAQ,eAAe;AAAA,QAC5E;AAAA,QACA,EAAE,OAAO,WAAW,OAAO,OAAO,OAAO,QAAQ,YAAY,EAAE;AAAA,QAC/D,EAAE,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,QACtC,EAAE,OAAO,UAAU,OAAO,OAAO,YAAY;AAAA,MAC/C;AAAA,MACA;AAAA,QACE,EAAE,OAAO,YAAY,OAAO,OAAO,SAAS;AAAA,QAC5C,EAAE,OAAO,mBAAmB,OAAO,OAAO,MAAM;AAAA,QAChD,EAAE,OAAO,gBAAgB,OAAO,OAAO,YAAY;AAAA,QACnD,EAAE,OAAO,WAAW,OAAO,OAAO,OAAO,QAAQ,MAAM,EAAE;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,kBAAkB,gBAAgB,yBAAyB,OAAO,QAAQ,IAAI,CAAC,iBAAiB,oBAAoB,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ;AAAA,EACrJ,EAAE,KAAK,EAAE;AAET,SAAO,mBAAmB,oBAAoB,OAAO,SAAS,IAAI,IAAI;AACxE;AAEO,SAAS,gBAAgB,QAAgC;AAC9D,QAAM,YAAY,OAAO,SAAS,aAAa,OAAO,MAAM,aAAa,OAAO;AAChF,QAAM,cAAc,OAAO,UACvB,GAAG,8BAA8B,OAAO,OAAO,CAAC;AAAA,+BACvB,OAAO,QAAQ,MACpC,IAAI,CAAC,aAAa,qBAAqB,UAAU,QAAQ,OAAO,SAAS,aAAa,MAAM,CAAC,CAAC,EAC9F,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,eAGH,OAAO,QAAQ,YAAY,IAAI,CAAC,eAAe,OAAO,WAAW,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;AAAA,iBAEtG,iBAAiB,QAAQ,mBAAmB,OAAO,wBAAwB,UAAU;AAEzF,QAAM,WAAW,OAAO,OACpB,yBAAyB,OAAO,KAAK,QAAQ,IAAI,CAAC,iBAAiB,oBAAoB,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,WAC9G,iBAAiB,QAAQ,gBAAgB,OAAO,qBAAqB,UAAU;AAEnF,QAAM,aAAyB,OAAO,MAAM,aAAa,SAAS;AAClE,QAAM,gBAAgB,WAAW,OAAO,MAAM,aAAa;AAC3D,QAAM,aAAa,WAAW,OAAO,MAAM,UAAU;AACrD,QAAM,gBAA4B,OAAO,MAAM,gBAAgB,SAAS;AAExE,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,MACE,EAAE,OAAO,gBAAgB,OAAO,WAAW,aAAa,GAAG,QAAQ,cAAc;AAAA,MACjF;AAAA,QACE,OAAO;AAAA,QACP,OAAO,OAAO,MAAM,cAAc,OAAO,cAAc,OAAO,MAAM,SAAS,IAAI;AAAA,QACjF,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO,OAAO,MAAM,uBAAuB,OAAO,cAAc,OAAO,MAAM,kBAAkB,IAAI;AAAA,QACnG,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO,GAAG,OAAO,KAAK,QAAQ,QAAQ,WAAW,OAAO,KAAK,QAAQ,QAAQ;AAAA,QAC7E,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA;AAAA,MACE,EAAE,OAAO,YAAY,OAAO,OAAO,SAAS;AAAA,MAC5C,EAAE,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,MACtC,EAAE,OAAO,gBAAgB,OAAO,OAAO,YAAY;AAAA,MACnD;AAAA,QACE,OAAO;AAAA,QACP,OAAO,UAAU,OAAO,WAAW,MAAM,QAAQ,CAAC,CAAC,yBAAyB,OAAO,WAAW,kBAAkB,QAAQ,CAAC,CAAC;AAAA,MAC5H;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,GAAG,OAAO,KAAK,QAAQ,MAAM,IAAI,OAAO,KAAK,QAAQ,KAAK,YAAY,OAAO,KAAK,QAAQ,QAAQ,cAAc,OAAO,KAAK,QAAQ,QAAQ;AAAA,IAC5I,oBAAoB,OAAO,IAAI;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA,OAAO,UACH,MAAM,cAAc,OAAO,QAAQ,QAAQ,EAAE,CAAC,cAAc,cAAc,OAAO,QAAQ,QAAQ,SAAS,CAAC,WAAW,cAAc,OAAO,QAAQ,QAAQ,MAAM,CAAC,KAClK,OAAO,wBAAwB;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,OAAO,OACH,uBAAuB,cAAc,OAAO,MAAM,sBAAsB,CAAC,CAAC,KAAK,OAAO,KAAK,QAAQ,gBAAgB,IAAI,OAAO,KAAK,QAAQ,eAAe,MAC1J,OAAO,qBAAqB;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,QACI,eAAe,aAAa,YAAY,OAAO,MAAM,aAAa,iBAAiB,cAAc,CAAC;AAAA,QAClG;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,MAAM,kBAAkB,OAC3B,OAAO,wBAAwB,aAC/B,YAAY,OAAO,WAAW,MAAM,QAAQ,CAAC,CAAC,YAAY,OAAO,MAAM,WAAW,QAAQ,CAAC,KAAK,KAAK;AAAA,IAC3G,CAAC;AAAA,QACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,MAAM,eAAe,OACxB,OAAO,qBAAqB,aAC5B,YAAY,OAAO,WAAW,kBAAkB,QAAQ,CAAC,CAAC,YAAY,OAAO,MAAM,oBAAoB,QAAQ,CAAC,KAAK,KAAK;AAAA,IAChI,CAAC;AAAA,QACC,eAAe,WAAW,eAAe,OAAO,MAAM,gBAAgB,8BAA8B,2BAA2B,CAAC;AAAA;AAAA,EAEtI;AAEA,SAAO,mBAAmB,qBAAqB,SAAS,IAAI,CAAC,QAAQ,aAAa,gBAAgB,aAAa,WAAW,EAAE,KAAK,EAAE,CAAC;AACtI;;;AC76BA,SAAS,aAA4B;AAOrC,SAAS,iBAAiB,aAAqC;AAC7D,SAAO,IAAI,MAAM,EAAE,OAAO,cAAc,IAAI,EAAE,CAAC;AACjD;AAEA,SAAS,gBAAgB,OAAkB,GAA0B;AACnE,QAAM,QACJ,MAAM,WAAW,SAAS,EAAE,MAAM,MAAM,IAAI,MAAM,WAAW,SAAS,EAAE,OAAO,MAAM,IAAI,EAAE,IAAI,MAAM;AACvG,QAAM,SAAS,MAAM,aAAa;AAAA,oBAAuB,MAAM,UAAU,KAAK;AAC9E,SAAO,KAAK,KAAK,IAAI,MAAM,KAAK;AAAA,QAAW,MAAM,OAAO,GAAG,MAAM;AACnE;AAEA,SAASE,8BAA6B,QAA6B;AACjE,SAAO,OAAO,OAAO,CAAC,OAAO,UAAU;AACrC,QAAI,CAAC,MAAM,QAAQ,WAAW,WAAW,GAAG;AAC1C,aAAO;AAAA,IACT;AACA,WAAO,SAAS,MAAM,iBAAiB,UAAU;AAAA,EACnD,GAAG,CAAC;AACN;AAEA,SAASC,eAAc,OAAuB;AAC5C,SAAO,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACpC;AAEA,SAAS,mBAAmB,OAAe,SAAS,GAAW;AAC7D,QAAM,SAAS,QAAQ,IAAI,MAAM;AACjC,SAAO,GAAG,MAAM,GAAG,MAAM,QAAQ,MAAM,CAAC;AAC1C;AAEA,SAAS,iBAAiB,YAAoB,WAA6D;AACzG,QAAM,cAAc,WAAW,MAAM,OAAO;AAC5C,QAAM,aAAa,UAAU,MAAM,OAAO;AAC1C,QAAM,KAAK,MAAM,KAAK,EAAE,QAAQ,YAAY,SAAS,EAAE,GAAG,MAAM,MAAc,WAAW,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;AAE5G,WAASC,eAAc,YAAY,SAAS,GAAGA,gBAAe,GAAGA,gBAAe,GAAG;AACjF,aAASC,cAAa,WAAW,SAAS,GAAGA,eAAc,GAAGA,eAAc,GAAG;AAC7E,UAAI,YAAYD,YAAW,MAAM,WAAWC,WAAU,GAAG;AACvD,WAAGD,YAAW,EAAGC,WAAU,IAAI,KAAK,GAAGD,eAAc,CAAC,EAAGC,cAAa,CAAC,KAAK;AAAA,MAC9E,OAAO;AACL,WAAGD,YAAW,EAAGC,WAAU,IAAI,KAAK,IAAI,GAAGD,eAAc,CAAC,EAAGC,WAAU,KAAK,GAAG,GAAGD,YAAW,EAAGC,cAAa,CAAC,KAAK,CAAC;AAAA,MACtH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAyD,CAAC;AAChE,MAAI,cAAc;AAClB,MAAI,aAAa;AAEjB,SAAO,cAAc,YAAY,UAAU,aAAa,WAAW,QAAQ;AACzE,QAAI,YAAY,WAAW,MAAM,WAAW,UAAU,GAAG;AACvD,qBAAe;AACf,oBAAc;AACd;AAAA,IACF;AAEA,UAAM,aAAa,GAAG,cAAc,CAAC,EAAG,UAAU,KAAK;AACvD,UAAM,YAAY,GAAG,WAAW,EAAG,aAAa,CAAC,KAAK;AACtD,QAAI,cAAc,WAAW;AAC3B,mBAAa,KAAK,EAAE,MAAM,KAAK,MAAM,YAAY,WAAW,KAAK,GAAG,CAAC;AACrE,qBAAe;AAAA,IACjB,OAAO;AACL,mBAAa,KAAK,EAAE,MAAM,KAAK,MAAM,WAAW,UAAU,KAAK,GAAG,CAAC;AACnE,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,SAAO,cAAc,YAAY,QAAQ;AACvC,iBAAa,KAAK,EAAE,MAAM,KAAK,MAAM,YAAY,WAAW,KAAK,GAAG,CAAC;AACrE,mBAAe;AAAA,EACjB;AAEA,SAAO,aAAa,WAAW,QAAQ;AACrC,iBAAa,KAAK,EAAE,MAAM,KAAK,MAAM,WAAW,UAAU,KAAK,GAAG,CAAC;AACnE,kBAAc;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,YAAoB,WAAmB,WAAW,IAAc;AACzF,QAAM,eAAe,iBAAiB,YAAY,SAAS;AAC3D,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,CAAC,wBAAwB;AAAA,EAClC;AAEA,QAAM,eAAe,aAAa,MAAM,GAAG,QAAQ,EAAE,IAAI,CAAC,UAAU,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AACnG,MAAI,aAAa,SAAS,UAAU;AAClC,iBAAa,KAAK,SAAS,aAAa,SAAS,QAAQ,uBAAuB;AAAA,EAClF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,WAA4E;AACtG,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,YAAY,WAAW;AAChC,WAAO,IAAI,SAAS,OAAO,OAAO,IAAI,SAAS,IAAI,KAAK,KAAK,CAAC;AAAA,EAChE;AAEA,SAAO,MAAM,KAAK,OAAO,QAAQ,CAAC,EAC/B,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,KAAK,KAAK,EAAE,EAC1C,KAAK,IAAI;AACd;AAEO,SAAS,iBAAiB,QAAoB,aAA8B;AACjF,QAAM,IAAI,iBAAiB,WAAW;AACtC,QAAM,EAAE,QAAQ,UAAU,UAAU,MAAM,IAAI,OAAO;AACrD,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,WAAW,OAAO,MAAM;AAAA,IACxB,YAAY,MAAM,IAAI,KAAK,mBAAmB,QAAQ,cAAc,QAAQ;AAAA,EAC9E;AAEA,QAAM,iBAAiB,OAAO,OAAO,IAAI,CAAC,UAAU,gBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;AACxF,QAAM,0BAA0BH,8BAA6B,OAAO,MAAM;AAC1E,QAAM,WACJ,0BAA0B,IACtB;AAAA,IAAO,EAAE,KAAK,MAAM,CAAC,IAAI,uBAAuB,uEAChD;AAEN,SAAO,GAAG,YAAY,KAAK,IAAI,CAAC;AAAA,EAAK,cAAc,GAAG,QAAQ;AAChE;AAEO,SAAS,oBAAoB,QAA2B,aAAsB,SAA0B;AAC7G,QAAM,IAAI,iBAAiB,WAAW;AACtC,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA,UAAU,OAAO,SAAS;AAAA,IAC1B,mBAAmB,OAAO,QAAQ,IAAI,OAAO,KAAK;AAAA,EACpD;AAEA,MAAI,OAAO,eAAe,OAAO,YAAY,SAAS,GAAG;AACvD,UAAM,KAAK,gBAAgB,OAAO,YAAY,IAAI,CAAC,eAAe,WAAW,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EACjG;AAEA,QAAM;AAAA,IACJ,cAAcC,eAAc,OAAO,QAAQ,SAAS,CAAC,aAAaA,eAAc,OAAO,QAAQ,MAAM,CAAC,SAASA,eAAc,OAAO,QAAQ,EAAE,CAAC;AAAA,EACjJ;AACA,QAAM;AAAA,IACJ,MAAM,OAAO,QAAQ,aAAa,QAAQ,OAAO,QAAQ,aAAa,QAAQ,OAAO,QAAQ,cAAc,QAAQ,OAAO,QAAQ,cAAc;AAAA,EAClJ;AAEA,aAAW,CAAC,OAAO,QAAQ,KAAK,OAAO,MAAM,QAAQ,GAAG;AACtD,UAAM,SAAS,SAAS,UAAU,EAAE,MAAM,MAAM,IAAI,EAAE,IAAI,MAAM;AAChE,UAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,MAAM,WAAW,SAAS,KAAK,EAAE;AAC7D,UAAM,KAAK,gBAAgB,SAAS,QAAQ,cAAc,SAAS,MAAM,EAAE;AAC3E,QAAI,WAAW,SAAS,oBAAoB;AAC1C,YAAM,KAAK,2BAA2B,SAAS,kBAAkB,EAAE;AAAA,IACrE;AACA,QAAI,WAAW,SAAS,kBAAkB;AACxC,YAAM,KAAK,aAAa,SAAS,iBAAiB,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAAE;AAAA,IACjF;AAAA,EACF;AAEA,QAAM,KAAK,cAAc;AACzB,aAAW,cAAc,OAAO,aAAa;AAC3C,UAAM,KAAK,KAAK,UAAU,EAAE;AAAA,EAC9B;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,iBAAiB,QAAoB,aAAsB,SAA0B;AACnG,QAAM,IAAI,iBAAiB,WAAW;AACtC,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA,UAAU,OAAO,SAAS;AAAA,IAC1B,mBAAmB,OAAO,QAAQ,IAAI,OAAO,KAAK;AAAA,IAClD,iBAAiB,OAAO,WAAW;AAAA,IACnC,sBAAsB,OAAO,QAAQ,gBAAgB,IAAI,OAAO,QAAQ,eAAe;AAAA,EACzF;AAEA,aAAW,CAAC,OAAO,YAAY,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC5D,UAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,aAAa,MAAM,EAAE;AACzD,UAAM,KAAK,wBAAwB,aAAa,gBAAgB,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAAE;AAC7F,QAAI,aAAa,WAAW;AAC1B,YAAM,KAAK,aAAa,aAAa,UAAU,MAAM,WAAW,mBAAmB,aAAa,SAAS,CAAC,GAAG;AAC7G,UAAI,aAAa,mBAAmB,QAAW;AAC7C,cAAM,KAAK,uBAAuB,aAAa,cAAc,EAAE;AAAA,MACjE;AAAA,IACF;AACA,eAAW,aAAa,aAAa,YAAY;AAC/C,YAAM,SAAS,UAAU,SAAS,EAAE,MAAM,MAAM,IAAI,EAAE,IAAI,MAAM;AAChE,YAAM,KAAK,MAAM,MAAM,IAAI,UAAU,SAAS,EAAE;AAChD,YAAM,KAAK,mBAAmB,UAAU,QAAQ,EAAE;AAAA,IACpD;AACA,QAAI,SAAS;AACX,UAAI,aAAa,WAAW;AAC1B,mBAAW,YAAY,aAAa,WAAW;AAC7C,gBAAM,KAAK,WAAW,SAAS,SAAS,KAAK,SAAS,IAAI,EAAE;AAC5D,gBAAM,KAAK,oBAAoB,KAAK,UAAU,SAAS,SAAS,CAAC,EAAE;AACnE,gBAAM,KAAK,mBAAmB,SAAS,QAAQ,EAAE;AAAA,QACnD;AAAA,MACF;AACA,YAAM,KAAK,qBAAqB,aAAa,QAAQ,EAAE;AAAA,IACzD;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,gBAAgB,OAAuB,GAA0B;AACxE,MAAI,UAAU,MAAM;AAClB,WAAO,EAAE,OAAO,MAAM;AAAA,EACxB;AACA,SAAO,QAAQ,EAAE,MAAM,MAAM,IAAI,EAAE,IAAI,MAAM;AAC/C;AAEO,SAAS,kBAAkB,QAAwB,aAAsB,SAA0B;AACxG,QAAM,IAAI,iBAAiB,WAAW;AACtC,QAAM,QAAkB,CAAC;AAEzB,QAAM,WAAW,gBAAgB,OAAO,MAAM,YAAY,CAAC;AAC3D,QAAM,cAAc,gBAAgB,OAAO,MAAM,eAAe,CAAC;AACjE,QAAM,WAAW,gBAAgB,OAAO,MAAM,YAAY,CAAC;AAC3D,QAAM,cAAc,OAAO,MAAM,gBAAgB,EAAE,MAAM,MAAM,IAAI,EAAE,IAAI,MAAM;AAE/E,QAAM,KAAK,iBAAiB;AAC5B,QAAM,KAAK,WAAW,OAAO,MAAM,EAAE;AACrC,QAAM,KAAK,mBAAmB,OAAO,QAAQ,IAAI,OAAO,KAAK,EAAE;AAC/D,QAAM,KAAK,iBAAiB,OAAO,WAAW,EAAE;AAChD,QAAM;AAAA,IACJ,sBAAsB,OAAO,WAAW,MAAM,QAAQ,CAAC,CAAC,yBAAyB,OAAO,WAAW,kBAAkB,QAAQ,CAAC,CAAC;AAAA,EACjI;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,MAAM;AACjB,QAAM;AAAA,IACJ,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,MAAM,IAAI,OAAO,KAAK,QAAQ,KAAK,mBAAmB,OAAO,KAAK,QAAQ,QAAQ,cAAc,OAAO,KAAK,QAAQ,QAAQ;AAAA,EACnK;AAEA,QAAM,aAAa,UAAU,OAAO,KAAK,SAAS,OAAO,KAAK,OAAO,OAAO,CAAC,UAAU,MAAM,WAAW,MAAM;AAC9G,aAAW,SAAS,YAAY;AAC9B,UAAM,KAAK,gBAAgB,OAAO,CAAC,CAAC;AAAA,EACtC;AAEA,QAAM,0BAA0BD,8BAA6B,OAAO,KAAK,MAAM;AAC/E,MAAI,0BAA0B,GAAG;AAC/B,UAAM,KAAK,KAAK,EAAE,KAAK,MAAM,CAAC,IAAI,uBAAuB,oEAAoE;AAAA,EAC/H;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,SAAS;AACpB,MAAI,OAAO,SAAS;AAClB,UAAM;AAAA,MACJ,KAAK,WAAW,OAAOC,eAAc,OAAO,QAAQ,QAAQ,EAAE,CAAC,eAAeA,eAAc,OAAO,QAAQ,QAAQ,SAAS,CAAC,WAAWA,eAAc,OAAO,QAAQ,QAAQ,MAAM,CAAC;AAAA,IACtL;AACA,UAAM;AAAA,MACJ,QAAQ,OAAO,QAAQ,QAAQ,aAAa,OAAO,OAAO,QAAQ,QAAQ,aAAa,OAAO,OAAO,QAAQ,QAAQ,cAAc,OAAO,OAAO,QAAQ,QAAQ,cAAc;AAAA,IACjL;AACA,QAAI,OAAO,QAAQ,eAAe,OAAO,QAAQ,YAAY,SAAS,GAAG;AACvE,YAAM,KAAK,kBAAkB,OAAO,QAAQ,YAAY,IAAI,CAAC,eAAe,WAAW,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAC3G;AAEA,UAAM,eAAe,UAAU,OAAO,QAAQ,QAAQ,OAAO,QAAQ,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,OAAO;AACjH,eAAW,YAAY,cAAc;AACnC,YAAM,SAAS,SAAS,UAAU,EAAE,MAAM,MAAM,IAAI,EAAE,IAAI,MAAM;AAChE,YAAM,KAAK,OAAO,MAAM,IAAI,SAAS,KAAK,EAAE;AAC5C,YAAM,KAAK,gBAAgB,SAAS,QAAQ,WAAW,SAAS,MAAM,EAAE;AACxE,UAAI,SAAS,oBAAoB;AAC/B,cAAM,KAAK,2BAA2B,SAAS,kBAAkB,EAAE;AAAA,MACrE;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,KAAK,KAAK,WAAW,IAAI,OAAO,wBAAwB,UAAU,EAAE;AAAA,EAC5E;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,MAAM;AACjB,MAAI,OAAO,MAAM;AACf,UAAM,WAAW,OAAO,MAAM,sBAAsB;AACpD,UAAM;AAAA,MACJ,KAAK,QAAQ,wBAAwBA,eAAc,QAAQ,CAAC,KAAK,OAAO,KAAK,QAAQ,gBAAgB,IAAI,OAAO,KAAK,QAAQ,eAAe;AAAA,IAC9I;AAEA,eAAW,gBAAgB,OAAO,KAAK,SAAS;AAC9C,YAAM,mBAAmB,aAAa,WAAW,OAAO,CAAC,cAAc,CAAC,UAAU,MAAM;AACxF,UAAI,CAAC,WAAW,iBAAiB,WAAW,GAAG;AAC7C;AAAA,MACF;AACA,YAAM,KAAK,eAAe,aAAa,MAAM,EAAE;AAC/C,YAAM,KAAK,yBAAyB,aAAa,gBAAgB,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAAE;AAC9F,UAAI,aAAa,WAAW;AAC1B,cAAM,KAAK,cAAc,aAAa,UAAU,MAAM,WAAW,mBAAmB,aAAa,SAAS,CAAC,GAAG;AAC9G,YAAI,aAAa,mBAAmB,QAAW;AAC7C,gBAAM,KAAK,wBAAwB,aAAa,cAAc,EAAE;AAAA,QAClE;AAAA,MACF;AACA,YAAM,qBAAqB,UAAU,aAAa,aAAa;AAC/D,iBAAW,aAAa,oBAAoB;AAC1C,cAAM,kBAAkB,UAAU,SAAS,EAAE,MAAM,MAAM,IAAI,EAAE,IAAI,MAAM;AACzE,cAAM,KAAK,OAAO,eAAe,IAAI,UAAU,SAAS,EAAE;AAC1D,cAAM,KAAK,mBAAmB,UAAU,QAAQ,EAAE;AAAA,MACpD;AACA,UAAI,SAAS;AACX,YAAI,aAAa,WAAW;AAC1B,qBAAW,YAAY,aAAa,WAAW;AAC7C,kBAAM,KAAK,YAAY,SAAS,SAAS,KAAK,SAAS,IAAI,EAAE;AAC7D,kBAAM,KAAK,oBAAoB,KAAK,UAAU,SAAS,SAAS,CAAC,EAAE;AACnE,kBAAM,KAAK,mBAAmB,SAAS,QAAQ,EAAE;AAAA,UACnD;AAAA,QACF;AACA,cAAM,KAAK,sBAAsB,aAAa,QAAQ,EAAE;AAAA,MAC1D;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,KAAK,KAAK,QAAQ,IAAI,OAAO,qBAAqB,UAAU,EAAE;AAAA,EACtE;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,cAAc;AACzB,QAAM,KAAK,gBAAgB,QAAQ,EAAE;AACrC,QAAM,KAAK,mBAAmB,WAAW,EAAE;AAC3C,QAAM,KAAK,gBAAgB,QAAQ,EAAE;AACrC,QAAM,KAAK,cAAc,WAAW,EAAE;AAEtC,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,oBAAoB,QAA0B,aAAsB,UAAU,OAAe;AAC3G,QAAM,IAAI,iBAAiB,WAAW;AACtC,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA,WAAW,OAAO,MAAM;AAAA,IACxB,mBAAmB,OAAO,QAAQ,IAAI,OAAO,KAAK;AAAA,IAClD,sBAAsB,OAAO,WAAW,MAAM,QAAQ,CAAC,CAAC,yBAAyB,OAAO,WAAW,kBAAkB,QAAQ,CAAC,CAAC;AAAA,EACjI;AAEA,QAAM,cAAc,OAAO,gBAAgB,EAAE,IAAI,SAAS,IAAI,OAAO,UAAU,EAAE,MAAM,SAAS,IAAI,EAAE,MAAM,UAAU;AACtH,QAAM,KAAK,WAAW,WAAW,EAAE;AAEnC,MAAI,OAAO,WAAW;AACpB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,gBAAgB;AAC3B,eAAW,QAAQ,OAAO,UAAU,eAAe;AACjD,YAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IACxB;AAEA,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,mBAAmB;AAC9B,eAAW,QAAQ,OAAO,UAAU,kBAAkB;AACpD,YAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,OAAO,cAAc;AACvC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,gBAAgB;AAC3B,UAAM;AAAA,MACJ,oBAAoB,OAAO,MAAM,aAAa,MAAM,OAAO,OAAO,MAAM,aAAa,KAAK,KAAK,mBAAmB,OAAO,MAAM,aAAa,OAAO,CAAC,CAAC;AAAA,IACvJ;AACA,UAAM;AAAA,MACJ,oBAAoB,OAAO,MAAM,aAAa,MAAM,OAAO,OAAO,MAAM,aAAa,KAAK,KAAK,mBAAmB,OAAO,MAAM,aAAa,OAAO,CAAC,CAAC;AAAA,IACvJ;AACA,UAAM;AAAA,MACJ,iBAAiBA,eAAc,OAAO,MAAM,UAAU,MAAM,CAAC,OAAOA,eAAc,OAAO,MAAM,UAAU,KAAK,CAAC,KAAK,mBAAmB,OAAO,MAAM,UAAU,KAAK,CAAC;AAAA,IACtK;AACA,UAAM;AAAA,MACJ,+BAA+BA,eAAc,OAAO,MAAM,mBAAmB,MAAM,CAAC,OAAOA,eAAc,OAAO,MAAM,mBAAmB,KAAK,CAAC,KAAK,mBAAmB,OAAO,MAAM,mBAAmB,KAAK,CAAC;AAAA,IAC/M;AACA,UAAM;AAAA,MACJ,mBAAmB,OAAO,MAAM,cAAc,SAAS,EAAE,MAAM,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,OAAO,OAAO,MAAM,cAAc,QAAQ,EAAE,MAAM,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;AAAA,IACjK;AAAA,EACF;AAEA,MAAI,OAAO,YAAY;AACrB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,WAAW,OAAO,UAAU,EAAE;AAAA,EAC3C;AAEA,MAAI,OAAO,eAAe;AACxB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,KAAK,OAAO,aAAa,EAAE;AAAA,EACxC;AAEA,MAAI,OAAO,WAAW;AACpB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,cAAc;AACzB,UAAM,KAAK,GAAG,kBAAkB,OAAO,aAAa,OAAO,UAAU,GAAG,CAAC;AAAA,EAC3E;AAEA,MAAI,SAAS;AACX,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,UAAU;AACrB,UAAM,KAAK,kBAAkB,OAAO,UAAU,aAAa,IAAI,CAAC;AAChE,QAAI,OAAO,cAAc;AACvB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,cAAc;AACzB,YAAM,KAAK,kBAAkB,OAAO,cAAc,aAAa,IAAI,CAAC;AAAA,IACtE;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AChZA,OAAOG,SAAQ;AAEf,SAAS,KAAAC,UAAS;;;ACFlB,SAAS,KAAAC,UAAS;;;ACAlB,SAAS,KAAAC,UAAS;AAUlB,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,WAAWA,GAAE,OAAO;AAAA,EACpB,QAAQA,GAAE,QAAQ;AAAA,EAClB,UAAUA,GAAE,OAAO;AACrB,CAAC;AAED,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EAClC,YAAYA,GAAE,MAAM,qBAAqB;AAC3C,CAAC;AAED,SAAS,kBAAkB,KAAsC;AAC/D,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AAEA,QAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,QAAM,MAAM,QAAQ,YAAY,GAAG;AACnC,MAAI,SAAS,KAAK,MAAM,OAAO;AAC7B,WAAO,KAAK,MAAM,QAAQ,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,EACjD;AAEA,QAAM,IAAI,MAAM,sCAAsC;AACxD;AAYA,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF;AAQO,SAAS,mBACd,SACe;AACf,QAAM,aACJ,QAAQ,cAAc,QAAQ,WAAW,SAAS,IAAI,QAAQ,aAAa;AAE7E,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AAEV,QAAM,aAAa;AAAA,IACjB,UAAU,QAAQ,SAAS;AAAA,IAC3B;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,gBAAgB,QAAQ,UAAU;AAAA,IAClC;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,WAAW,IAAI,CAAC,WAAW,UAAU,GAAG,QAAQ,CAAC,KAAK,SAAS,EAAE,EAAE,KAAK,IAAI;AAAA,EAC9E,EAAE,KAAK,IAAI;AAEX,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,KAAgC;AAChE,QAAM,SAAS,mBAAmB,UAAU,kBAAkB,GAAG,CAAC;AAElE,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,kCAAkC,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW,qBAAqB,EAAE;AAAA,EAC9G;AAEA,SAAO,OAAO,KAAK;AACrB;AAEA,eAAsB,cAAc,SAA2D;AAC7F,QAAM,UAAU,mBAAmB,OAAO;AAC1C,QAAM,MAAM,MAAM,QAAQ,SAAS,YAAY,QAAQ,cAAc,QAAQ,YAAY,EAAE,OAAO,QAAQ,MAAM,CAAC;AACjH,SAAO,kBAAkB,GAAG,EAAE,IAAI,CAAC,eAAe;AAAA,IAChD,GAAG;AAAA,IACH,QAAQ;AAAA,EACV,EAAE;AACJ;;;AC3GA,eAAsB,KACpB,OACA,IACA,aACc;AACd,MAAI,CAAC,OAAO,UAAU,WAAW,KAAK,cAAc,GAAG;AACrD,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,IAAI,MAAS,MAAM,MAAM;AAEzC,SAAO,IAAI,QAAa,CAAC,SAAS,WAAW;AAC3C,QAAI,YAAY;AAChB,QAAI,YAAY;AAChB,QAAI,WAAW;AAEf,UAAM,aAAa,MAAY;AAC7B,UAAI,UAAU;AACZ;AAAA,MACF;AAEA,UAAI,cAAc,MAAM,QAAQ;AAC9B,gBAAQ,OAAO;AACf;AAAA,MACF;AAEA,UAAI,aAAa,MAAM,QAAQ;AAC7B;AAAA,MACF;AAEA,YAAM,eAAe;AACrB,mBAAa;AAEb,cAAQ,QAAQ,EACb,KAAK,MAAM,GAAG,MAAM,YAAY,GAAG,YAAY,CAAC,EAChD,KAAK,CAAC,WAAW;AAChB,YAAI,UAAU;AACZ;AAAA,QACF;AAEA,gBAAQ,YAAY,IAAI;AACxB,qBAAa;AAEb,YAAI,cAAc,MAAM,QAAQ;AAC9B,kBAAQ,OAAO;AACf;AAAA,QACF;AAEA,mBAAW;AAAA,MACb,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,YAAI,UAAU;AACZ;AAAA,QACF;AAEA,mBAAW;AACX,eAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACL;AAEA,UAAM,iBAAiB,KAAK,IAAI,aAAa,MAAM,MAAM;AACzD,aAAS,cAAc,GAAG,cAAc,gBAAgB,eAAe,GAAG;AACxE,iBAAW;AAAA,IACb;AAAA,EACF,CAAC;AACH;;;AC1BA,SAAS,cAAc,OAAkD;AACvE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,UAAU,MAAe,OAAyB;AACzD,MAAI,MAAM,QAAQ,IAAI,KAAK,MAAM,QAAQ,KAAK,GAAG;AAC/C,QAAI,KAAK,WAAW,MAAM,QAAQ;AAChC,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,MAAM,CAAC,MAAM,UAAU,UAAU,MAAM,MAAM,KAAK,CAAC,CAAC;AAAA,EAClE;AAEA,MAAI,cAAc,IAAI,KAAK,cAAc,KAAK,GAAG;AAC/C,UAAM,WAAW,OAAO,KAAK,IAAI;AACjC,UAAM,YAAY,OAAO,KAAK,KAAK;AACnC,QAAI,SAAS,WAAW,UAAU,QAAQ;AACxC,aAAO;AAAA,IACT;AAEA,WAAO,SAAS,MAAM,CAAC,QAAQ,UAAU,KAAK,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;AAAA,EACjE;AAEA,SAAO,SAAS;AAClB;AAEO,SAAS,sBAAsB,QAAiB,UAA4B;AACjF,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,QAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,SAAS,QAAQ;AAC/D,aAAO;AAAA,IACT;AAEA,WAAO,SAAS,MAAM,CAAC,OAAO,UAAU,sBAAsB,OAAO,KAAK,GAAG,KAAK,CAAC;AAAA,EACrF;AAEA,MAAI,cAAc,QAAQ,GAAG;AAC3B,QAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,QAAQ,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM,sBAAsB,OAAO,GAAG,GAAG,KAAK,CAAC;AAAA,EACnG;AAEA,SAAO,UAAU,QAAQ,QAAQ;AACnC;AAEA,SAAS,qBAAqB,SAAiD;AAC7E,MAAI,YAAY,KAAK;AACnB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,WAAO,cAAc,MAAM,IAAI,SAAS;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,MAA0B,MAAuC;AAC/F,SAAO,gDAAgD,KAAK,IAAI,qBAAqB,KAAK,UAAU,IAAI,CAAC;AAC3G;AAEO,SAAS,oBAAoB,MAA0B,MAAuC;AACnG,QAAM,gBAAgB,KAAK,UAAU,IAAI;AACzC,QAAM,aAAa,KAAK,UAAU,aAAa;AAC/C,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,mBAAqE;AACzE,aAAW,CAAC,SAAS,QAAQ,KAAK,OAAO,QAAQ,KAAK,SAAS,GAAG;AAChE,QAAI,YAAY,KAAK;AACnB;AAAA,IACF;AAEA,UAAM,gBAAgB,qBAAqB,OAAO;AAClD,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AAEA,QAAI,CAAC,sBAAsB,MAAM,aAAa,GAAG;AAC/C;AAAA,IACF;AAEA,UAAM,cAAc,OAAO,KAAK,aAAa,EAAE;AAC/C,QAAI,CAAC,oBAAoB,cAAc,iBAAiB,aAAa;AACnE,yBAAmB,EAAE,aAAa,SAAS;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,kBAAkB;AACpB,WAAO,iBAAiB;AAAA,EAC1B;AAEA,QAAM,gBAAgB,KAAK,UAAU,GAAG;AACxC,MAAI,kBAAkB,QAAW;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO,uBAAuB,MAAM,IAAI;AAC1C;AAEO,SAAS,0BAA0B,WAAmD;AAC3F,SAAO,UAAU,IAAI,CAAC,SAAS;AAC7B,UAAM,aAAa,KAAK,cAAc,CAAC;AACvC,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY,OAAO;AAAA,UACjB,WAAW,IAAI,CAAC,cAAc;AAAA,YAC5B,UAAU;AAAA,YACV;AAAA,cACE,MAAM,UAAU;AAAA,cAChB,aAAa,UAAU;AAAA,YACzB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,UAAU,WAAW,OAAO,CAAC,cAAc,UAAU,QAAQ,EAAE,IAAI,CAAC,cAAc,UAAU,IAAI;AAAA,MAClG;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,8BAA8B,UAAuF;AAC5H,QAAM,gBAAgB,CAAC;AAEvB,MAAI,SAAS,YAAY,KAAK,EAAE,SAAS,GAAG;AAC1C,kBAAc,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,aAAW,SAAS,SAAS,eAAe;AAC1C,kBAAc,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO,cAAc,WAAW,IAC5B,CAAC,IACD;AAAA,IACE;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACN;AAEA,eAAsB,aAAa,SAA8D;AAC/F,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,cAAc,IAAI,IAAI,QAAQ,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;AAC1E,QAAM,gBAAgB,0BAA0B,QAAQ,KAAK;AAC7D,QAAM,WAAgC,CAAC,EAAE,MAAM,QAAQ,SAAS,QAAQ,YAAY,CAAC;AACrF,QAAM,YAAwB,CAAC;AAC/B,MAAI,gBAAgB;AACpB,MAAI,iBAAiB;AAErB,SAAO,iBAAiB,eAAe;AACrC,sBAAkB;AAElB,UAAM,WAAW,MAAM,QAAQ,SAAS,cAAc,QAAQ,cAAc,UAAU;AAAA,MACpF,OAAO,QAAQ;AAAA,MACf,OAAO;AAAA,IACT,CAAC;AAED,QAAI,SAAS,YAAY,KAAK,EAAE,SAAS,GAAG;AAC1C,sBAAgB,SAAS;AAAA,IAC3B;AAEA,QAAI,SAAS,cAAc,WAAW,GAAG;AACvC,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,aAAS,KAAK,GAAG,8BAA8B,QAAQ,CAAC;AAExD,UAAM,mBAAmB,CAAC;AAC1B,eAAW,WAAW,SAAS,eAAe;AAC5C,YAAM,OAAO,YAAY,IAAI,QAAQ,IAAI;AACzC,YAAM,mBAAmB,OACrB,oBAAoB,MAAM,QAAQ,SAAS,IAC3C,yBAAyB,QAAQ,IAAI;AAEzC,gBAAU,KAAK;AAAA,QACb,MAAM,QAAQ;AAAA,QACd,WAAW,QAAQ;AAAA,QACnB,UAAU;AAAA,QACV,WAAW;AAAA,MACb,CAAC;AAED,uBAAiB,KAAK;AAAA,QACpB,MAAM;AAAA,QACN,aAAa,QAAQ;AAAA,QACrB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,0CAA0C,aAAa;AAC/E,kBAAgB,gBAAgB,GAAG,aAAa;AAAA;AAAA,EAAO,eAAe,KAAK;AAE3E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AHjNA,IAAM,sBAAgDC,GAAE,OAAO;AAAA,EAC7D,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,GAAE,KAAK,CAAC,UAAU,UAAU,WAAW,UAAU,OAAO,CAAC;AAAA,EAC/D,aAAaA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,UAAUA,GAAE,QAAQ,EAAE,SAAS;AACjC,CAAC;AAED,IAAM,2BAA0DA,GAAE,OAAO;AAAA,EACvE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAaA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,YAAYA,GAAE,MAAM,mBAAmB,EAAE,SAAS;AAAA,EAClD,WAAWA,GAAE,OAAOA,GAAE,OAAO,CAAC;AAChC,CAAC;AAED,IAAM,sBAAgDA,GACnD,OAAO;AAAA,EACN,MAAMA,GAAE,KAAK,CAAC,eAAe,mBAAmB,mBAAmB,qBAAqB,CAAC;AAAA,EACzF,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACrC,WAAWA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC/C,cAAcA,GAAE,OAAOA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC7C,aAAaA,GAAE,OAAO,EAAE,IAAI,CAAC;AAC/B,CAAC,EACA,YAAY,CAAC,OAAO,YAAY;AAC/B,OAAK,MAAM,SAAS,iBAAiB,MAAM,SAAS,qBAAqB,MAAM,SAAS,0BAA0B,CAAC,MAAM,UAAU;AACjI,YAAQ,SAAS;AAAA,MACf,MAAMA,GAAE,aAAa;AAAA,MACrB,SAAS,GAAG,MAAM,IAAI;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,SAAS,sBAAsB,CAAC,MAAM,aAAa,MAAM,UAAU,WAAW,IAAI;AAC1F,YAAQ,SAAS;AAAA,MACf,MAAMA,GAAE,aAAa;AAAA,MACrB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,SAAS,yBAAyB,CAAC,MAAM,cAAc;AAC/D,YAAQ,SAAS;AAAA,MACf,MAAMA,GAAE,aAAa;AAAA,MACrB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF,CAAC;AAEI,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EACvC,QAAQA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,YAAYA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAChD,OAAOA,GAAE,MAAM,wBAAwB,EAAE,SAAS;AAAA,EAClD,gBAAgBA,GAAE,MAAM,mBAAmB,EAAE,SAAS;AACxD,CAAC;AAEM,IAAM,wBAAwBA,GAAE,MAAM,gBAAgB;AAa7D,SAAS,oBAAoB,WAA6B;AACxD,SAAO,IAAI,UAAU,KAAK,IAAI,CAAC;AACjC;AAEA,SAAS,kBAAkB,WAAuB,WAA6B;AAC7E,QAAM,gBAAgB,IAAI,IAAI,SAAS;AACvC,QAAM,cAAc,UAAU,OAAO,CAAC,aAAa,cAAc,IAAI,SAAS,IAAI,CAAC,EAAE,IAAI,CAAC,aAAa,SAAS,IAAI;AACpH,SAAO,IAAI,YAAY,KAAK,IAAI,CAAC;AACnC;AAEO,SAAS,uBAAuB,gBAAiC,WAA0C;AAChH,SAAO,eAAe,IAAI,CAAC,kBAAkB;AAC3C,QAAI,cAAc,SAAS,eAAe;AACxC,YAAM,gBAAgB,UAAU,OAAO,CAAC,aAAa,SAAS,SAAS,cAAc,QAAQ;AAC7F,aAAO;AAAA,QACL,WAAW,cAAc;AAAA,QACzB,QAAQ,cAAc,SAAS;AAAA,QAC/B,UACE,cAAc,SAAS,IACnB,SAAS,cAAc,QAAQ,gBAAgB,cAAc,MAAM,QAAQ,cAAc,WAAW,IAAI,KAAK,GAAG,MAChH,SAAS,cAAc,QAAQ;AAAA,QACrC,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,cAAc,SAAS,mBAAmB;AAC5C,YAAM,gBAAgB,UAAU,OAAO,CAAC,aAAa,SAAS,SAAS,cAAc,QAAQ;AAC7F,aAAO;AAAA,QACL,WAAW,cAAc;AAAA,QACzB,QAAQ,cAAc,WAAW;AAAA,QACjC,UACE,cAAc,WAAW,IACrB,SAAS,cAAc,QAAQ,sBAC/B,SAAS,cAAc,QAAQ,gBAAgB,cAAc,MAAM,QAAQ,cAAc,WAAW,IAAI,KAAK,GAAG;AAAA,QACtH,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,cAAc,SAAS,mBAAmB;AAC5C,YAAM,gBAAgB,cAAc,aAAa,CAAC;AAClD,UAAI,oBAAoB;AACxB,iBAAW,YAAY,WAAW;AAChC,YAAI,SAAS,SAAS,cAAc,iBAAiB,GAAG;AACtD,+BAAqB;AAAA,QACvB;AAAA,MACF;AAEA,aAAO;AAAA,QACL,WAAW,cAAc;AAAA,QACzB,QAAQ,sBAAsB,cAAc;AAAA,QAC5C,UACE,sBAAsB,cAAc,SAChC,4BAA4B,oBAAoB,aAAa,CAAC,MAC9D,uBAAuB,oBAAoB,aAAa,CAAC,YAAY,kBAAkB,WAAW,aAAa,CAAC;AAAA,QACtH,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,eAAe,UAAU;AAAA,MAC7B,CAAC,aACC,SAAS,SAAS,cAAc,YAChC,sBAAsB,SAAS,WAAW,cAAc,gBAAgB,CAAC,CAAC;AAAA,IAC9E;AAEA,WAAO;AAAA,MACL,WAAW,cAAc;AAAA,MACzB,QAAQ,QAAQ,YAAY;AAAA,MAC5B,UAAU,eACN,SAAS,cAAc,QAAQ,wCAAwC,KAAK,UAAU,cAAc,gBAAgB,CAAC,CAAC,CAAC,MACvH,OAAO,cAAc,QAAQ,kBAAkB,KAAK,UAAU,cAAc,gBAAgB,CAAC,CAAC,CAAC;AAAA,MACnG,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAEA,SAAS,iBAAiB,KAAwB;AAChD,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AAEA,QAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,QAAM,MAAM,QAAQ,YAAY,GAAG;AACnC,MAAI,SAAS,KAAK,MAAM,OAAO;AAC7B,WAAO,KAAK,MAAM,QAAQ,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,EACjD;AAEA,QAAM,IAAI,MAAM,oCAAoC;AACtD;AAEA,eAAe,gBACb,OACA,UACA,OACA,OACuB;AACvB,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AAEV,QAAM,aAAa;AAAA,IACjB,eAAe,MAAM,YAAY,IAAI;AAAA,IACrC,sBAAsB,MAAM,YAAY,WAAW;AAAA,IACnD;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,YAAY,KAAK;AAAA;AAAA,IAEjB;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,MAAM,MAAM,SAAS,YAAY,cAAc,YAAY,EAAE,MAAM,CAAC;AAC1E,QAAM,SAAS,sBAAsB,UAAU,iBAAiB,GAAG,CAAC;AACpE,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,2CAA2C,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW,qBAAqB,EAAE;AAAA,EACvH;AAEA,MAAI,OAAO,KAAK,WAAW,OAAO;AAChC,UAAM,IAAI,MAAM,YAAY,KAAK,iBAAiB,OAAO,KAAK,MAAM,GAAG;AAAA,EACzE;AAEA,SAAO,OAAO;AAChB;AAYA,eAAsB,QAAQ,OAAoB,SAA8C;AAC9F,QAAM,UACJ,QAAQ,WAAW,QAAQ,QAAQ,SAAS,IACxC,sBAAsB,MAAM,QAAQ,OAAO,IAC3C,MAAM,gBAAgB,OAAO,QAAQ,UAAU,QAAQ,OAAO,QAAQ,OAAO;AAEnF,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR,EAAE,KAAK,IAAI;AAEX,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA,OAAO,eAAe;AACpB,UAAI;AACJ,UAAI;AACJ,UAAI;AAEJ,UAAI,WAAW,SAAS,WAAW,MAAM,SAAS,GAAG;AACnD,cAAM,UAAU,MAAM,aAAa;AAAA,UACjC,UAAU,QAAQ;AAAA,UAClB,OAAO,QAAQ;AAAA,UACf;AAAA,UACA,aAAa,WAAW;AAAA,UACxB,OAAO,WAAW;AAAA,UAClB,eAAe,QAAQ;AAAA,QACzB,CAAC;AAED,mBAAW,QAAQ;AACnB,oBAAY,QAAQ;AACpB,yBAAiB,QAAQ;AAAA,MAC3B,OAAO;AACL,mBAAW,MAAM,QAAQ,SAAS,YAAY,cAAc,WAAW,QAAQ,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,MACzG;AAEA,YAAM,mBAAmB,MAAM,cAAc;AAAA,QAC3C,UAAU,QAAQ;AAAA,QAClB,OAAO,QAAQ;AAAA,QACf,WAAW,MAAM,YAAY;AAAA,QAC7B,WAAW,MAAM;AAAA,QACjB,YAAY,WAAW;AAAA,QACvB,eAAe;AAAA,QACf,YAAY,WAAW;AAAA,MACzB,CAAC;AACD,YAAM,uBACJ,WAAW,kBAAkB,WAAW,eAAe,SAAS,IAC5D,uBAAuB,WAAW,gBAAgB,aAAa,CAAC,CAAC,IACjE,CAAC;AACP,YAAM,aAAa,CAAC,GAAG,kBAAkB,GAAG,oBAAoB;AAEhE,YAAMC,oBAAmB,WAAW,OAAO,CAAC,cAAc,UAAU,MAAM,EAAE;AAC5E,aAAO;AAAA,QACL,QAAQ,WAAW;AAAA,QACnB;AAAA,QACA,iBAAiB,SAAS,MAAM,GAAG,GAAG;AAAA,QACtC;AAAA,QACA,kBAAAA;AAAA,QACA,iBAAiB,WAAW;AAAA,QAC5B,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,QACjC,GAAI,mBAAmB,SAAY,EAAE,eAAe,IAAI,CAAC;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,QAAQ,eAAe;AAAA,EACzB;AAEA,QAAM,kBAAkB,QAAQ,OAAO,CAAC,OAAO,WAAW,QAAQ,OAAO,iBAAiB,CAAC;AAC3F,QAAM,mBAAmB,QAAQ,OAAO,CAAC,OAAO,WAAW,QAAQ,OAAO,kBAAkB,CAAC;AAE7F,SAAO;AAAA,IACL,WAAW,MAAM,YAAY;AAAA,IAC7B,OAAO,QAAQ;AAAA,IACf,aAAa,QAAQ;AAAA,IACrB,UAAU,QAAQ,SAAS;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,cAAc,QAAQ;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AIpVA,SAAS,KAAAC,UAAS;AAgDlB,IAAM,qBAAqBC,GAAE,OAAO;AAAA,EAClC,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,gBAAgBA,GAAE,QAAQ;AAC5B,CAAC;AAEM,IAAM,0BAA0BA,GAAE,MAAM,kBAAkB;AAC1D,IAAM,0BAA0BA,GACpC,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,OAAO,CAAC,UAAU,QAAQ,MAAM,GAAG,oCAAoC;AAE1E,IAAM,cAA4D;AAAA,EAChE,EAAE,MAAM,eAAe,aAAa,0EAA0E;AAAA,EAC9G,EAAE,MAAM,cAAc,aAAa,gFAAgF;AAAA,EACnH,EAAE,MAAM,eAAe,aAAa,8EAA8E;AAAA,EAClH,EAAE,MAAM,aAAa,aAAa,yEAAyE;AAAA,EAC3G,EAAE,MAAM,iBAAiB,aAAa,sEAAsE;AAAA,EAC5G,EAAE,MAAM,gBAAgB,aAAa,2EAA2E;AAAA,EAChH,EAAE,MAAM,qBAAqB,aAAa,yEAAyE;AAAA,EACnH,EAAE,MAAM,kBAAkB,aAAa,iFAAiF;AAAA,EACxH,EAAE,MAAM,oBAAoB,aAAa,4EAA4E;AAAA,EACrH,EAAE,MAAM,mBAAmB,aAAa,sEAAsE;AAAA,EAC9G,EAAE,MAAM,eAAe,aAAa,qEAAqE;AAAA,EACzG,EAAE,MAAM,kBAAkB,aAAa,qEAAqE;AAAA,EAC5G,EAAE,MAAM,mBAAmB,aAAa,gFAAgF;AAAA,EACxH,EAAE,MAAM,kBAAkB,aAAa,uEAAuE;AAAA,EAC9G,EAAE,MAAM,gBAAgB,aAAa,sEAAsE;AAC7G;AASA,SAAS,WAAW,MAA4B;AAC9C,SAAO,MAAM;AACX,YAAQ;AACR,WAAQ,OAAO,aAAc;AAC7B,QAAI,IAAI,KAAK,KAAK,OAAQ,SAAS,IAAK,IAAI,IAAI;AAChD,QAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,KAAK,CAAC,IAAK;AAC7C,aAAS,IAAK,MAAM,QAAS,KAAK;AAAA,EACpC;AACF;AAEA,SAAS,UAAU,MAA6B;AAC9C,SAAO,SAAS,SAAY,WAAW,IAAI,IAAI,KAAK;AACtD;AAEA,SAAS,QAAW,QAAa,KAAwB;AACvD,QAAM,OAAO,CAAC,GAAG,MAAM;AACvB,WAAS,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG;AACvD,UAAM,YAAY,KAAK,MAAM,IAAI,KAAK,QAAQ,EAAE;AAChD,KAAC,KAAK,KAAK,GAAG,KAAK,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS,GAAG,KAAK,KAAK,CAAC;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,OAAU,QAAa,OAAe,KAAwB;AACrE,SAAO,QAAQ,QAAQ,GAAG,EAAE,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,OAAO,MAAM,CAAC,CAAC;AAClF;AAEO,SAAS,mBAAmB,YAA4B;AAC7D,SAAO,wBAAwB,MAAM,UAAU;AACjD;AAEA,SAAS,8BAA8B,KAAwB;AAC7D,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AAEA,QAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,QAAM,MAAM,QAAQ,YAAY,GAAG;AACnC,MAAI,SAAS,KAAK,MAAM,OAAO;AAC7B,UAAM,eAAe,QAAQ,MAAM,OAAO,MAAM,CAAC;AACjD,WAAO,KAAK,MAAM,YAAY;AAAA,EAChC;AAEA,QAAM,IAAI,MAAM,oCAAoC;AACtD;AAEA,eAAe,yBACb,OACA,UACA,OACA,YACA,aACyB;AACzB,qBAAmB,UAAU;AAC7B,QAAM,qBAAqB,KAAK,MAAM,aAAa,CAAC;AACpD,QAAM,wBAAwB,aAAa;AAE3C,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AAEV,QAAM,aAAa;AAAA,IACjB,eAAe,MAAM,YAAY,IAAI;AAAA,IACrC,sBAAsB,MAAM,YAAY,WAAW;AAAA,IACnD,GAAI,eAAe,YAAY,SAAS,IACpC;AAAA,MACE;AAAA,MACA;AAAA,MACA,GAAG,YAAY,IAAI,CAAC,eAAe,KAAK,WAAW,IAAI,KAAK,WAAW,WAAW,EAAE;AAAA,MACpF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IACA,CAAC;AAAA,IACL,YAAY,UAAU;AAAA,IACtB,WAAW,kBAAkB;AAAA,IAC7B,WAAW,qBAAqB;AAAA,IAChC;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,MAAM,MAAM,SAAS,YAAY,cAAc,YAAY,EAAE,MAAM,CAAC;AAC1E,QAAM,SAAS,wBAAwB,UAAU,8BAA8B,GAAG,CAAC;AACnF,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,sCAAsC,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW,gBAAgB,EAAE;AAAA,EAC7G;AAEA,QAAM,YAAY,OAAO,KAAK,OAAO,CAAC,SAAS,KAAK,cAAc,EAAE;AACpE,QAAM,aAAa,OAAO,KAAK,SAAS;AACxC,MAAI,OAAO,KAAK,WAAW,cAAc,cAAc,sBAAsB,eAAe,uBAAuB;AACjH,UAAM,IAAI;AAAA,MACR,4CAA4C,UAAU,KAAK,kBAAkB,IAAI,qBAAqB,UAAU,OAAO,KAAK,MAAM,KAAK,SAAS,IAAI,UAAU;AAAA,IAChK;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;AAEA,SAAS,cAAc,aAAqB,YAA8B;AACxE,QAAM,aAAa,YAAY,KAAK,EAAE,YAAY;AAClD,MAAI,eAAe,UAAU,WAAW,WAAW,MAAM,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,aAAW,aAAa,YAAY;AAClC,UAAM,UAAU,UAAU,QAAQ,uBAAuB,MAAM;AAC/D,UAAM,QAAQ,IAAI,OAAO,MAAM,OAAO,OAAO,GAAG;AAChD,QAAI,MAAM,KAAK,WAAW,GAAG;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,sBACd,OACA,SACA,MACA,aACwB;AACxB,QAAM,MAAM,UAAU,IAAI;AAC1B,QAAM,wBAAwB,eAAe,CAAC,GAAG,IAAI,CAAC,gBAAgB;AAAA,IACpE,MAAM,WAAW;AAAA,IACjB,aAAa,WAAW;AAAA,EAC1B,EAAE;AAEF,SAAO,QAAQ,IAAI,CAAC,cAAc;AAChC,UAAM,mBAAmB,qBAAqB,SAAS;AACvD,UAAM,YAAY,mBACd,UAAU,iBACR,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IACxB,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAC1B,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC;AAC5B,UAAM,aAAa,OAAO,aAAa,WAAW,GAAG;AACrD,UAAM,YAAY,mBACd;AAAA,MACE;AAAA,QACE,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAI,UAAU,iBACV;AAAA,UACE;AAAA,YACE,MAAM,MAAM,YAAY;AAAA,YACxB,aAAa,MAAM,YAAY;AAAA,UACjC;AAAA,QACF,IACA,CAAC;AAAA,MACP;AAAA,MACA;AAAA,IACF,IACA;AAAA,MACE;AAAA,QACE,GAAG;AAAA,QACH;AAAA,UACE,MAAM,MAAM,YAAY;AAAA,UACxB,aAAa,MAAM,YAAY;AAAA,QACjC;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAEJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,UAAU,IAAI,CAAC,UAAU,KAAK,MAAM,IAAI,KAAK,MAAM,WAAW,EAAE,EAAE,KAAK,IAAI;AAAA,IAC5F;AAAA,EACF,CAAC;AACH;AAEO,SAAS,iBAAiB,WAAmB,OAAgD;AAClG,MAAI,gBAAgB;AACpB,MAAI,gBAAgB;AACpB,MAAI,iBAAiB;AACrB,MAAI,iBAAiB;AAErB,aAAW,YAAY,OAAO;AAC5B,UAAM,mBAAmB,SAAS,WAAW;AAC7C,QAAI,SAAS,iBAAiB,kBAAkB;AAC9C,uBAAiB;AACjB;AAAA,IACF;AACA,QAAI,SAAS,iBAAiB,CAAC,kBAAkB;AAC/C,wBAAkB;AAClB;AAAA,IACF;AACA,QAAI,CAAC,SAAS,iBAAiB,kBAAkB;AAC/C,wBAAkB;AAClB;AAAA,IACF;AACA,qBAAiB;AAAA,EACnB;AAEA,QAAM,uBAAuB,gBAAgB;AAC7C,QAAM,oBAAoB,gBAAgB;AAC1C,QAAM,YAAY,yBAAyB,IAAI,IAAI,gBAAgB;AACnE,QAAM,SAAS,sBAAsB,IAAI,IAAI,gBAAgB;AAC7D,QAAM,KAAK,YAAY,WAAW,IAAI,IAAK,IAAI,YAAY,UAAW,YAAY;AAElF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,8BAA8B,WAAmB,aAAsC;AACrG,aAAW,cAAc,aAAa;AACpC,QAAI,WAAW,SAAS,WAAW;AACjC,YAAM,IAAI,MAAM,qBAAqB,WAAW,IAAI,8CAA8C;AAAA,IACpG;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,SAMb;AACxB,QAAM,WAAW,QAAQ,UAAU,iBAAiB,QAAQ,YAAY;AACxE,QAAM,UAAU,QAAQ,UAAU,iBAAiB,QAAQ,aAAa,QAAQ,YAAY,QAAQ,aAAa,QAAQ;AACzH,QAAM,qBAAqB,QAAQ,iBAAiB,SAAS,QAAQ,QAAQ,IAAI,QAAQ,WAAW;AAEpG,SAAO;AAAA,IACL,OAAO,QAAQ,UAAU;AAAA,IACzB,eAAe,QAAQ,UAAU;AAAA,IACjC;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA;AAAA,IACA,kBAAkB,QAAQ;AAAA,EAC5B;AACF;AAEA,SAAS,iBACP,WACA,SACA,OACA,aACU;AACV,QAAM,cAAwB,CAAC;AAC/B,MAAI,QAAQ,iBAAiB,GAAG;AAC9B,gBAAY;AAAA,MACV;AAAA,IACF;AACA,QAAI,eAAe,YAAY,SAAS,GAAG;AACzC,YAAM,mBAAmB,oBAAI,IAAoB;AACjD,iBAAW,YAAY,OAAO;AAC5B,YAAI,CAAC,SAAS,iBAAiB,SAAS,WAAW,aAAa,CAAC,SAAS,oBAAoB;AAC5F;AAAA,QACF;AACA,yBAAiB,IAAI,SAAS,qBAAqB,iBAAiB,IAAI,SAAS,kBAAkB,KAAK,KAAK,CAAC;AAAA,MAChH;AAEA,iBAAW,CAAC,gBAAgB,KAAK,KAAK,iBAAiB,QAAQ,GAAG;AAChE,oBAAY;AAAA,UACV,UAAU,cAAc,8BAA8B,SAAS,SAAS,KAAK,QAAQ,UAAU,IAAI,MAAM,KAAK,0CAA0C,cAAc;AAAA,QACxK;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,iBAAiB,GAAG;AAC9B,gBAAY,KAAK,2FAA2F;AAC5G,QAAI,eAAe,YAAY,SAAS,GAAG;AACzC,kBAAY;AAAA,QACV,mCAAmC,QAAQ,cAAc,iBAAiB,QAAQ,mBAAmB,IAAI,YAAY,WAAW,eAAe,SAAS;AAAA,MAC1J;AAAA,IACF;AAAA,EACF;AACA,MAAI,YAAY,WAAW,GAAG;AAC5B,gBAAY,KAAK,mGAAmG;AAAA,EACtH;AACA,SAAO;AACT;AAaA,eAAe,qBAAqB,cAAoD;AACtF,QAAM,cAAiC,CAAC;AAExC,aAAW,eAAe,cAAc;AACtC,UAAM,SAAS,MAAM,iBAAiB,WAAW;AACjD,gBAAY,KAAK;AAAA,MACf,MAAM,OAAO,YAAY;AAAA,MACzB,aAAa,OAAO,YAAY;AAAA,MAChC,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAsB,eAAe,OAAoB,SAA4D;AACnH,QAAM,cACJ,QAAQ,WAAW,QAAQ,QAAQ,SAAS,IAAI,MAAM,qBAAqB,QAAQ,OAAO,IAAI;AAChG,MAAI,eAAe,YAAY,SAAS,GAAG;AACzC,kCAA8B,MAAM,YAAY,MAAM,WAAW;AAAA,EACnE;AAEA,QAAM,UACJ,QAAQ,WAAW,QAAQ,QAAQ,SAAS,IACxC,wBAAwB,MAAM,QAAQ,OAAO,IAC7C,MAAM,yBAAyB,OAAO,QAAQ,UAAU,QAAQ,OAAO,QAAQ,YAAY,WAAW;AAE5G,QAAM,YAAY,MAAM,YAAY;AACpC,QAAM,kBAAkB,sBAAsB,OAAO,SAAS,QAAQ,MAAM,WAAW;AACvF,QAAM,kBAAkB,aAAa,IAAI,CAAC,eAAe,WAAW,IAAI,KAAK,CAAC;AAE9E,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AAEV,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA,OAAO,EAAE,WAAW,WAAW,cAAc,MAAM;AACjD,YAAM,aAAa,CAAC,qBAAqB,eAAe,IAAI,eAAe,UAAU,KAAK,EAAE,EAAE,KAAK,IAAI;AACvG,YAAM,cAAc,MAAM,QAAQ,SAAS,YAAY,cAAc,YAAY,EAAE,OAAO,QAAQ,MAAM,CAAC;AACzG,YAAM,WAAW;AAAA,QACf;AAAA,QACA,MAAM,KAAK,oBAAI,IAAI,CAAC,WAAW,GAAG,UAAU,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,CAAC,CAAC;AAAA,MAC1E;AAEA,aAAO,uBAAuB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,kBAAkB,QAAQ,UAAU,cAAc;AAAA,MACpD,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,eAAe;AAAA,EACzB;AAEA,QAAM,UAAU,iBAAiB,WAAW,OAAO;AAEnD,SAAO;AAAA,IACL;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,UAAU,QAAQ,SAAS;AAAA,IAC3B,MAAM,QAAQ;AAAA,IACd;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,aAAa,iBAAiB,WAAW,SAAS,SAAS,WAAW;AAAA,EACxE;AACF;;;ACrcO,SAAS,WAAW,OAAwB;AACjD,SAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AACtC;;;ANOA,IAAM,4BAA4B,oBAAI,QAAwC;AAE9E,IAAM,yBAAyB;AAE/B,IAAM,0BAA0BC,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACzD,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EACtC,YAAYA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC;AAOD,SAAS,oBAAoB,KAAsB;AACjD,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,OAAgB,aAAmC;AAC/E,QAAM,cAAc,sBAAsB,UAAU,KAAK;AACzD,MAAI,YAAY,SAAS;AACvB,WAAO,YAAY;AAAA,EACrB;AAEA,QAAM,eAAe,uBAAuB,UAAU,KAAK;AAC3D,MAAI,aAAa,SAAS;AACxB,WAAO,CAAC,aAAa,IAAI;AAAA,EAC3B;AAEA,QAAM,gBAAgB,wBAAwB,UAAU,KAAK;AAC7D,MAAI,cAAc,SAAS;AACzB,WAAO,cAAc,KAAK,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;AAAA,EACxD;AAEA,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,WAAO,CAAC,EAAE,QAAQ,MAAM,KAAK,EAAE,CAAC;AAAA,EAClC;AAEA,QAAM,IAAI;AAAA,IACR,iCAAiC,WAAW;AAAA,EAC9C;AACF;AAEA,SAAS,wBAAwB,KAAuB;AACtD,SAAO,IACJ,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,QAAQ,YAAY,EAAE,EAAE,QAAQ,aAAa,EAAE,CAAC,EAC1E,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACrC;AAEA,SAAS,gBAAgB,QAAgC;AACvD,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,YAAY,OAAO,aAAa,CAAC,GAAG,OAAO,UAAU,IAAI;AAAA,IACzD,OAAO,OAAO,QACV,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,MAC1B,GAAG;AAAA,MACH,YAAY,KAAK,aAAa,KAAK,WAAW,IAAI,CAAC,eAAe,EAAE,GAAG,UAAU,EAAE,IAAI;AAAA,MACvF,WAAW,EAAE,GAAG,KAAK,UAAU;AAAA,IACjC,EAAE,IACF;AAAA,IACJ,gBAAgB,OAAO,iBACnB,OAAO,eAAe,IAAI,CAAC,mBAAmB;AAAA,MAC5C,GAAG;AAAA,MACH,WAAW,cAAc,YAAY,CAAC,GAAG,cAAc,SAAS,IAAI;AAAA,MACpE,cAAc,cAAc,eAAe,EAAE,GAAG,cAAc,aAAa,IAAI;AAAA,IACjF,EAAE,IACF;AAAA,EACN;AACF;AAEA,SAAS,oBAAoB,OAAgB,aAA+B;AAC1E,QAAM,iBAAiBA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,UAAU,KAAK;AACjE,MAAI,eAAe,SAAS;AAC1B,WAAO,eAAe;AAAA,EACxB;AAEA,QAAM,kBAAkB,uBAAuB,UAAU,KAAK;AAC9D,MAAI,gBAAgB,SAAS;AAC3B,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,aAAa,wBAAwB,KAAK;AAChD,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,qCAAqC,WAAW;AAAA,EAClD;AACF;AAEO,SAAS,2BAA2B,SAAkB,SAAsC;AACjG,4BAA0B,IAAI,SAAS,OAAO;AAChD;AAEO,SAAS,2BAA2B,SAAyC;AAClF,QAAM,UAAU,0BAA0B,IAAI,OAAO;AACrD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,wCAAwC,QAAQ,KAAK,CAAC,IAAI;AAAA,EAC5E;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,SAAmD;AACnF,SAAO,2BAA2B,OAAO,EAAE;AAC7C;AAEO,SAAS,oBAAoB,SAAoC;AACtE,QAAM,UAAU,QAAQ,gBAAqD;AAC7E,QAAM,UAAU,0BAA0B,IAAI,OAAO;AAErD,SAAO;AAAA,IACL,MAAM,SAAS,OAAO,QAAQ,QAAQ,QAAQ,IAAI;AAAA,IAClD,OAAO,QAAQ,UAAU;AAAA,EAC3B;AACF;AAEA,eAAsB,uBAAuB,UAA2C;AACtF,QAAM,SAAS,MAAM,aAAsB,QAAQ;AACnD,QAAM,SAAS,wBAAwB,UAAU,MAAM;AACvD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,2BAA2B,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW,sBAAsB,EAAE;AAAA,EACxG;AACA,SAAO,OAAO;AAChB;AAEA,eAAsB,oBAAoB,UAAyC;AACjF,QAAM,SAAS,MAAM,aAAsB,QAAQ;AACnD,QAAM,SAAS,sBAAsB,UAAU,MAAM;AACrD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,2BAA2B,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW,sBAAsB,EAAE;AAAA,EACxG;AACA,SAAO,OAAO;AAChB;AAEA,eAAsB,0BAA0B,SAAqD;AACnG,QAAM,UAAU,2BAA2B,OAAO;AAClD,QAAM,aAAa,QAAQ,OAAO,KAAK;AACvC,QAAM,iBAAiB,QAAQ,OAAO,KAAK;AAE3C,MAAI,CAAC,cAAc,CAAC,gBAAgB;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,cAAc,gBAAgB;AACjC,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAEA,QAAM,YAAY,MAAMC,IAAG,SAAS,YAAsB,MAAM;AAChE,MAAI,UAAU,qBAAqB,oBAAoB,SAAS,GAAG,UAAoB;AAEvF,MAAI,gBAAgB;AAClB,UAAM,gBAAgB,MAAMA,IAAG,SAAS,gBAAgB,MAAM;AAC9D,UAAM,aAAa,oBAAoB,oBAAoB,aAAa,GAAG,cAAc;AACzF,cAAU,QAAQ,IAAI,CAAC,YAAY;AAAA,MACjC,GAAG,gBAAgB,MAAM;AAAA,MACzB,YAAY,CAAC,GAAG,UAAU;AAAA,IAC5B,EAAE;AAAA,EACJ;AAEA,QAAM,qBAAqB,QAAQ,YAAY,MAAM,YAAY;AACjE,MAAI,sBAAsB,QAAQ,WAAW,KAAK,QAAQ,OAAO,KAAK,UAAU,GAAG;AACjF,UAAM,iBAAiB,QAAQ,CAAC;AAChC,cAAU,MAAM,KAAK,EAAE,QAAQ,QAAQ,OAAO,KAAK,QAAQ,GAAG,MAAM,gBAAgB,cAAc,CAAC;AAAA,EACrG;AAEA,SAAO;AACT;AAEO,SAAS,YAAY,OAAgB,QAAuB;AACjE,MAAI,QAAQ;AACV,YAAQ,OAAO,MAAM,GAAG,WAAW,KAAK,CAAC;AAAA,CAAI;AAC7C;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,GAAG,OAAO,KAAK,CAAC;AAAA,CAAI;AAC3C;AAEO,SAAS,WAAW,OAAgB,QAAuB;AAChE,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,MAAI,QAAQ;AACV,YAAQ,OAAO,MAAM,GAAG,WAAW,EAAE,OAAO,QAAQ,CAAC,CAAC;AAAA,CAAI;AAC1D;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,UAAU,OAAO;AAAA,CAAI;AAC5C;;;AdhMA,IAAM,gBAAgBC,GAAE,OAAO;AAAA,EAC7B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,QAAQA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAC9C,CAAC;AAWD,SAAS,mBAAmB,OAAe,WAAqB,CAAC,GAAa;AAC5E,SAAO,CAAC,GAAG,UAAU,KAAK;AAC5B;AAEA,eAAe,kBAAkB,YAAoB,SAA4C;AAC/F,MAAI;AACF,UAAM,SAAS,MAAM,UAAU,YAAY,EAAE,UAAU,QAAQ,UAAU,SAAS,QAAQ,QAAQ,CAAC;AACnG,QAAI,QAAQ,MAAM;AAChB,kBAAY,QAAQ,IAAI;AAAA,IAC1B,OAAO;AACL,kBAAY,iBAAiB,QAAQ,QAAQ,KAAK,GAAG,KAAK;AAAA,IAC5D;AAEA,QAAI,QAAQ,MAAM;AAChB,YAAMC,IAAG,UAAU,QAAQ,MAAM,eAAe,MAAM,GAAG,MAAM;AAAA,IACjE;AAEA,QAAI,UAAU,QAAQ,QAAQ,MAAM,GAAG;AACrC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,SAAS,OAAO;AACd,eAAW,OAAO,QAAQ,IAAI;AAC9B,YAAQ,WAAW;AAAA,EACrB;AACF;AAEO,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,MAAM,EACd,YAAY,oEAAoE,EAChF,SAAS,mBAAmB,qCAAqC,EACjE,OAAO,iBAAiB,6CAA6C,EACrE,OAAO,mBAAmB,kCAAkC,oBAAoB,CAAC,CAAC,EAClF,OAAO,OAAO,YAAoB,iBAA0B,YAAqB;AAChF,UAAM,gBAAgB,oBAAoB,OAAO;AACjD,UAAM,SAAS,kBAAkB,OAAO;AACxC,UAAM,YAAY,cAAc,UAAU,QAAQ,KAAK,CAAC;AACxD,QAAI,CAAC,UAAU,SAAS;AACtB,iBAAW,IAAI,MAAM,UAAU,MAAM,OAAO,CAAC,GAAG,WAAW,uBAAuB,GAAG,cAAc,IAAI;AACvG,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,kBAAkB,YAAY;AAAA,MAClC,GAAG;AAAA,MACH,QAAQ,OAAO,KAAK;AAAA,MACpB,UAAU,OAAO,KAAK;AAAA,MACtB,SAAS,OAAO,KAAK;AAAA,MACrB,MAAM,UAAU,KAAK;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACL;;;AqBzEA,OAAOC,SAAQ;AACf,OAAO,SAAS;AAEhB,SAAS,KAAAC,UAAS;;;ACHlB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEjB,SAAS,KAAAC,UAAS;AAKlB,IAAM,qBAAqBC,GAAE,KAAK,CAAC,aAAa,QAAQ,CAAC;AACzD,IAAM,mBAAmBA,GAAE,KAAK,CAAC,SAAS,MAAM,CAAC;AAEjD,IAAM,mBAAmBA,GACtB,OAAO;AAAA,EACN,QAAQ,iBAAiB,SAAS;AAAA,EAClC,UAAUA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC9C,SAASA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAC/C,CAAC,EACA,OAAO;AAEV,IAAM,sBAAsBA,GACzB,OAAO;AAAA,EACN,YAAYA,GACT,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,OAAO,CAAC,UAAU,QAAQ,MAAM,GAAG,4CAA4C;AAAA,EAClF,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7C,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,SAASA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAC/C,CAAC,EACA,OAAO,EACP,QAAQ;AAEX,IAAM,mBAAmBA,GACtB,OAAO;AAAA,EACN,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC1C,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7C,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACvC,gBAAgBA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC3C,mBAAmBA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AAC9D,CAAC,EACA,OAAO,EACP,QAAQ;AAEJ,IAAM,wBAAwBA,GAClC,OAAO;AAAA,EACN,UAAU,mBAAmB,SAAS;AAAA,EACtC,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAClC,MAAMA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC3B,aAAaA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9C,MAAM,iBAAiB,SAAS;AAAA,EAChC,SAAS,oBAAoB,SAAS;AAAA,EACtC,MAAM,iBAAiB,SAAS;AAClC,CAAC,EACA,OAAO;AAEV,IAAM,gCAAgCA,GAAE,OAAO;AAAA,EAC7C,UAAU;AAAA,EACV,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,MAAMA,GAAE,QAAQ;AAAA,EAChB,aAAaA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EACnC,MAAMA,GAAE,OAAO;AAAA,IACb,QAAQ;AAAA,IACR,UAAUA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAAA,IACnC,SAASA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAAA,EACpC,CAAC;AAAA,EACD,SAASA,GAAE,OAAO;AAAA,IAChB,YAAYA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,GAAG,4CAA4C;AAAA,IACnH,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IAClC,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IAChC,SAASA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAAA,EACpC,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO;AAAA,IACb,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,IAC/B,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IAClC,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACvC,gBAAgBA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAC3C,mBAAmBA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EACnD,CAAC;AACH,CAAC;AAmBM,IAAM,2BAAoD;AAAA,EAC/D,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS,CAAC;AAAA,EACZ;AAAA,EACA,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,WAAW;AAAA,IACX,mBAAmB;AAAA,EACrB;AACF;AAEA,SAAS,gBAAgB,WAA2C;AAClE,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,SAAO,UAAU,IAAI,MAAM,EAAE,KAAK,GAAG;AACvC;AAEA,SAAS,2BAA2B,OAAmB,aAA4B;AACjF,QAAM,QAAQ,MAAM,OAAO,CAAC;AAC5B,QAAM,YAAY,gBAAgB,OAAO,QAAQ,CAAC,CAAC;AACnD,QAAM,eAAe,OAAO,WAAW;AACvC,SAAO,IAAI,MAAM,+BAA+B,WAAW,OAAO,SAAS,KAAK,YAAY,EAAE;AAChG;AAEA,eAAe,eAAe,UAAkB,OAAiC;AAC/E,MAAI;AACJ,MAAI;AACF,UAAM,MAAMC,IAAG,SAAS,UAAU,MAAM;AAAA,EAC1C,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI,MAAM,kBAAkB,KAAK,KAAK,OAAO,EAAE;AAAA,EACvD;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI,MAAM,mBAAmB,KAAK,KAAK,OAAO,EAAE;AAAA,EACxD;AACF;AAEA,eAAe,uBAAuB,UAAoD;AACxF,MAAI,CAAE,MAAM,WAAW,QAAQ,GAAI;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,MAAM,eAAe,UAAU,QAAQ;AACnD,QAAM,SAAS,sBAAsB,UAAU,GAAG;AAClD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,2BAA2B,OAAO,OAAO,QAAQ;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,YAAY,OAAO;AAAA,IACnB,YAAY;AAAA,IACZ,iBAAiBC,MAAK,QAAQ,QAAQ;AAAA,EACxC;AACF;AAEA,eAAe,iCAAiC,gBAA0D;AACxG,MAAI,mBAAmBA,MAAK,QAAQ,cAAc;AAElD,SAAO,MAAM;AACX,UAAM,kBAAkBA,MAAK,KAAK,kBAAkB,cAAc;AAClE,QAAI,MAAM,WAAW,eAAe,GAAG;AACrC,YAAM,MAAM,MAAM,eAAe,iBAAiB,eAAe;AACjE,YAAM,oBAAoBF,GACvB,OAAO;AAAA,QACN,aAAa,sBAAsB,SAAS;AAAA,MAC9C,CAAC,EACA,YAAY;AACf,YAAM,SAAS,kBAAkB,UAAU,GAAG;AAC9C,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,2BAA2B,OAAO,OAAO,GAAG,eAAe,cAAc;AAAA,MACjF;AAEA,UAAI,CAAC,OAAO,KAAK,aAAa;AAC5B,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACL,YAAY,OAAO,KAAK;AAAA,QACxB,YAAY;AAAA,QACZ,iBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,kBAAkBE,MAAK,QAAQ,gBAAgB;AACrD,QAAI,oBAAoB,kBAAkB;AACxC,aAAO;AAAA,IACT;AACA,uBAAmB;AAAA,EACrB;AACF;AAEA,eAAe,4BAA4B,YAAuD;AAChG,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,EAAE,UAAU,IAAI,MAAM,iBAAiB,UAAU;AACvD,WAAO,uBAAuBA,MAAK,KAAK,WAAW,cAAc,CAAC;AAAA,EACpE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,0BAA0B,eAAuB,OAA+C;AACvG,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAOA,MAAK,QAAQ,eAAe,KAAK;AAC1C;AAEA,SAAS,2BAA2B,eAAuB,QAAwC;AACjG,MAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AAClC,WAAO,CAAC;AAAA,EACV;AACA,SAAO,OAAO,IAAI,CAAC,UAAUA,MAAK,QAAQ,eAAe,KAAK,CAAC;AACjE;AAEO,SAAS,kBACd,aAAkC,CAAC,GACnC,WAAgC,CAAC,GACjC,gBAAgB,QAAQ,IAAI,GACH;AACzB,QAAM,SAAS;AAAA,IACb,UAAU,SAAS,YAAY,WAAW,YAAY,yBAAyB;AAAA,IAC/E,OAAO,SAAS,SAAS,WAAW,SAAS,yBAAyB;AAAA,IACtE,MAAM,SAAS,QAAQ,WAAW,QAAQ,yBAAyB;AAAA,IACnE,aAAa,SAAS,eAAe,WAAW,eAAe,yBAAyB;AAAA,IACxF,MAAM;AAAA,MACJ,QAAQ,SAAS,MAAM,UAAU,WAAW,MAAM,UAAU,yBAAyB,KAAK;AAAA,MAC1F,UAAU,SAAS,MAAM,YAAY,WAAW,MAAM,YAAY,yBAAyB,KAAK;AAAA,MAChG,SAAS;AAAA,QACP;AAAA,QACA,SAAS,MAAM,WAAW,WAAW,MAAM,WAAW,yBAAyB,KAAK;AAAA,MACtF;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,YACE,SAAS,SAAS,cAAc,WAAW,SAAS,cAAc,yBAAyB,QAAQ;AAAA,MACrG,WACE,SAAS,SAAS,aAAa,WAAW,SAAS,aAAa,yBAAyB,QAAQ;AAAA,MACnG,MAAM,SAAS,SAAS,QAAQ,WAAW,SAAS;AAAA,MACpD,SAAS;AAAA,QACP;AAAA,QACA,SAAS,SAAS,WAAW,WAAW,SAAS,WAAW,yBAAyB,QAAQ;AAAA,MAC/F;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,SAAS,SAAS,MAAM,WAAW,WAAW,MAAM,WAAW,yBAAyB,KAAK;AAAA,MAC7F,WAAW,SAAS,MAAM,aAAa,WAAW,MAAM,aAAa,yBAAyB,KAAK;AAAA,MACnG,YAAY;AAAA,QACV;AAAA,QACA,SAAS,MAAM,cAAc,WAAW,MAAM,cAAc,yBAAyB,KAAK;AAAA,MAC5F;AAAA,MACA,gBAAgB;AAAA,QACd;AAAA,QACA,SAAS,MAAM,kBAAkB,WAAW,MAAM,kBAAkB,yBAAyB,KAAK;AAAA,MACpG;AAAA,MACA,mBACE,SAAS,MAAM,qBACf,WAAW,MAAM,qBACjB,yBAAyB,KAAK;AAAA,IAClC;AAAA,EACF;AAEA,SAAO,8BAA8B,MAAM,MAAM;AACnD;AAEA,SAAS,oBAAoE,SAAkB,KAA4B;AACzH,QAAM,UAAU,QAAQ,gBAAyC;AACjE,QAAM,QAAQ,QAAQ,GAAG;AACzB,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,0BAA0B,SAAuC;AAC/E,QAAM,YAAiC,CAAC;AAExC,MAAI,QAAQ,gCAAgC,MAAM,MAAM,OAAO;AAC7D,cAAU,OAAO,QAAQ,oBAA6B,SAAS,MAAM,CAAC;AAAA,EACxE;AAEA,MAAI,QAAQ,qBAAqB,UAAU,MAAM,OAAO;AACtD,cAAU,WAAW,oBAAkC,SAAS,UAAU;AAAA,EAC5E;AAEA,MAAI,QAAQ,qBAAqB,OAAO,MAAM,OAAO;AACnD,cAAU,QAAQ,oBAA4B,SAAS,OAAO;AAAA,EAChE;AAEA,OACG,QAAQ,KAAK,MAAM,aAAa,QAAQ,KAAK,MAAM,UAAU,QAAQ,KAAK,MAAM,WAAW,QAAQ,KAAK,MAAM,cAC/G,QAAQ,qBAAqB,aAAa,MAAM,OAChD;AACA,cAAU,cAAc,oBAA4B,SAAS,aAAa;AAAA,EAC5E;AAEA,OACG,QAAQ,KAAK,MAAM,aAAa,QAAQ,KAAK,MAAM,WAAW,QAAQ,KAAK,MAAM,cAClF,QAAQ,qBAAqB,YAAY,MAAM,OAC/C;AACA,cAAU,UAAU;AAAA,MAClB,GAAG,UAAU;AAAA,MACb,YAAY,oBAA4B,SAAS,YAAY;AAAA,IAC/D;AAAA,EACF;AAEA,OACG,QAAQ,KAAK,MAAM,aAAa,QAAQ,KAAK,MAAM,WAAW,QAAQ,KAAK,MAAM,cAClF,QAAQ,qBAAqB,SAAS,MAAM,OAC5C;AACA,cAAU,UAAU;AAAA,MAClB,GAAG,UAAU;AAAA,MACb,SAAS,oBAA8B,SAAS,SAAS;AAAA,IAC3D;AAAA,EACF;AAEA,OACG,QAAQ,KAAK,MAAM,UAAU,QAAQ,KAAK,MAAM,WAAW,QAAQ,KAAK,MAAM,cAC/E,QAAQ,qBAAqB,QAAQ,MAAM,OAC3C;AACA,cAAU,OAAO;AAAA,MACf,GAAG,UAAU;AAAA,MACb,SAAS,oBAA8B,SAAS,QAAQ;AAAA,IAC1D;AAAA,EACF;AAEA,OAAK,QAAQ,KAAK,MAAM,WAAW,QAAQ,KAAK,MAAM,cAAc,QAAQ,qBAAqB,OAAO,MAAM,OAAO;AACnH,cAAU,UAAU;AAAA,MAClB,GAAG,UAAU;AAAA,MACb,WAAW,oBAA4B,SAAS,OAAO;AAAA,IACzD;AAAA,EACF;AAEA,OACG,QAAQ,KAAK,MAAM,WAAW,QAAQ,KAAK,MAAM,cAClD,QAAQ,qBAAqB,mBAAmB,MAAM,OACtD;AACA,cAAU,OAAO;AAAA,MACf,GAAG,UAAU;AAAA,MACb,WAAW,oBAA4B,SAAS,mBAAmB;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,SAAS,sBAAsB,UAAU,SAAS;AACxD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,2BAA2B,OAAO,OAAO,WAAW;AAAA,EAC5D;AACA,SAAO,OAAO;AAChB;AAEA,eAAsB,qBAAqB,YAAgC,UAA+D;AACxI,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,uBAAuB,MAAM,4BAA4B,UAAU;AACzE,MAAI,sBAAsB;AACxB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,kBAAkB,qBAAqB,YAAY,UAAU,qBAAqB,eAAe;AAAA,IAC3G;AAAA,EACF;AAEA,QAAM,gBAAgBA,MAAK,KAAK,KAAK,cAAc;AACnD,QAAM,YAAY,MAAM,uBAAuB,aAAa;AAC5D,MAAI,WAAW;AACb,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,kBAAkB,UAAU,YAAY,UAAU,UAAU,eAAe;AAAA,IACrF;AAAA,EACF;AAEA,QAAM,oBAAoB,MAAM,iCAAiC,GAAG;AACpE,MAAI,mBAAmB;AACrB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,kBAAkB,kBAAkB,YAAY,UAAU,kBAAkB,eAAe;AAAA,IACrG;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,QAAQ,kBAAkB,CAAC,GAAG,UAAU,GAAG;AAAA,IAC3C,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AACF;AAEO,SAAS,cAAc,UAAwB,UAA2B;AAC/E,MAAI,YAAY,SAAS,KAAK,MAAM,IAAI;AACtC,WAAO,SAAS,KAAK;AAAA,EACvB;AAEA,MAAI,aAAa,aAAa;AAC5B,UAAMC,YAAW,QAAQ,IAAI,mBAAmB,KAAK;AACrD,QAAIA,WAAU;AACZ,aAAOA;AAAA,IACT;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ,IAAI,gBAAgB,KAAK;AAClD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,0FAA0F;AAC5G;;;ACtaA,OAAO,eAAe;AA6BtB,SAAS,qBAAqB,OAA4D;AACxF,SAAO,MAAM,SAAS;AACxB;AAEA,SAAS,wBAAwB,OAA+D;AAC9F,SAAO,MAAM,SAAS;AACxB;AAEA,SAAS,KAAK,IAA2B;AACvC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,iBAAiB,OAAyB;AACjD,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,cAAe,MAA8B;AACnD,MAAI,gBAAgB,KAAK;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,eAAgB,MAA+B;AACrD,MAAI,OAAO,iBAAiB,YAAY,cAAc,KAAK,YAAY,GAAG;AACxE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,oBAAN,MAAyD;AAAA,EAC9C,OAAO;AAAA,EACN;AAAA,EAEV,YAAY,QAAgB;AACjC,SAAK,SAAS,IAAI,UAAU,EAAE,OAAO,CAAC;AAAA,EACxC;AAAA,EAEA,MAAc,cACZ,SACmC;AACnC,QAAI;AAEJ,aAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAI;AACF,eAAQ,MAAM,KAAK,OAAO,SAAS,OAAO,OAAgB;AAAA,MAC5D,SAAS,OAAO;AACd,oBAAY;AACZ,YAAI,CAAC,iBAAiB,KAAK,KAAK,YAAY,GAAG;AAC7C;AAAA,QACF;AAEA,cAAM,QAAQ,KAAK,IAAI,KAAM,MAAM,KAAK,OAAO,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG;AACjF,cAAM,KAAK,KAAK;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,qBAAqB,OAAO;AAC9B,YAAM,IAAI,MAAM,8BAA8B,UAAU,OAAO,EAAE;AAAA,IACnE;AACA,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAAA,EAEQ,oBAAoB,UAGzB;AACD,WAAO,SAAS,IAAI,CAAC,aAAa;AAAA,MAChC,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,IACnB,EAAE;AAAA,EACJ;AAAA,EAEA,MAAa,YAAY,cAAsB,aAAqB,SAA8C;AAChH,UAAM,WAAW,MAAM,KAAK,cAAc;AAAA,MACxC,OAAO,QAAQ;AAAA,MACf,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,aAAa,SAAS,QAAQ,OAAO,oBAAoB;AAC/D,UAAM,OAAO,WAAW,IAAI,CAAC,UAAU,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK;AACnE,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,cACX,cACA,UACA,SAC+B;AAC/B,UAAM,WAAW,MAAM,KAAK,cAAc;AAAA,MACxC,OAAO,QAAQ;AAAA,MACf,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,UAAU,KAAK,oBAAoB,QAAQ;AAAA,MAC3C,OAAO,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,QAClC,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,cAAe,KAAK,cAAc,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,MACrE,EAAE;AAAA,IACJ,CAAC;AAED,UAAM,cAAc,SAAS,QAC1B,OAAO,oBAAoB,EAC3B,IAAI,CAAC,UAAU,MAAM,IAAI,EACzB,KAAK,IAAI,EACT,KAAK;AAER,UAAM,gBAAgB,SAAS,QAC5B,OAAO,uBAAuB,EAC9B,IAAI,CAAC,WAAW;AAAA,MACf,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,WAAW,MAAM;AAAA,IACnB,EAAE;AAEJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY,SAAS,eAAe;AAAA,IACtC;AAAA,EACF;AACF;;;ACzGA,SAASC,MAAK,IAA2B;AACvC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,iBAAiB,OAAyB;AACjD,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,cAAe,MAA8B;AACnD,MAAI,gBAAgB,OAAQ,OAAO,gBAAgB,YAAY,eAAe,KAAM;AAClF,WAAO;AAAA,EACT;AAEA,QAAM,YAAa,MAA4B;AAC/C,MAAI,OAAO,cAAc,YAAY,0CAA0C,KAAK,SAAS,GAAG;AAC9F,WAAO;AAAA,EACT;AAEA,QAAM,eAAgB,MAA+B;AACrD,MAAI,OAAO,iBAAiB,YAAY,2DAA2D,KAAK,YAAY,GAAG;AACrH,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAA+E;AACzG,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,QAAQ,KAAK;AAAA,EACtB;AAEA,QAAM,OAAO,QACV,IAAI,CAAC,SAAU,KAAK,SAAS,UAAU,CAAC,KAAK,OAAO,KAAK,QAAQ,KAAK,EAAG,EACzE,KAAK,IAAI,EACT,KAAK;AACR,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAyB,UAA2C;AAC9F,MAAI,CAAC,OAAO,IAAI,KAAK,MAAM,IAAI;AAC7B,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI,MAAM,mCAAmC,QAAQ,0BAA0B,OAAO,EAAE;AAAA,EAChG;AACF;AAEA,SAAS,aAAa,QAA4C;AAChE,SAAO,OACJ,OAAO,CAAC,UAAU,MAAM,SAAS,MAAM,EACvC,IAAI,CAAC,UAAU,OAAO,MAAM,QAAQ,EAAE,CAAC,EACvC,KAAK,IAAI,EACT,KAAK;AACV;AAEA,SAAS,4BAA4B,QAAmD;AACtF,QAAM,cAAc,aAAa,MAAM;AACvC,QAAM,YAAY,OACf,OAAO,CAAC,UAAU,MAAM,SAAS,UAAU,EAC3C,IAAI,CAAC,WAAW;AAAA,IACf,IAAI,OAAO,MAAM,MAAM,EAAE;AAAA,IACzB,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,OAAO,MAAM,QAAQ,EAAE;AAAA,MAC7B,WAAW,KAAK,UAAU,MAAM,SAAS,CAAC,CAAC;AAAA,IAC7C;AAAA,EACF,EAAE;AAEJ,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,YAAY,SAAS,IAAI,cAAc;AAAA,IAChD,GAAI,UAAU,SAAS,IAAI,EAAE,YAAY,UAAU,IAAI,CAAC;AAAA,EAC1D;AACF;AAEA,SAAS,wBAAwB,QAAqD;AACpF,QAAM,cAAc,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,aAAa;AACzE,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO,YAAY,IAAI,CAAC,WAAW;AAAA,MACjC,MAAM;AAAA,MACN,cAAc,OAAO,MAAM,eAAe,EAAE;AAAA,MAC5C,SAAS,OAAO,MAAM,WAAW,EAAE;AAAA,IACrC,EAAE;AAAA,EACJ;AAEA,QAAM,cAAc,aAAa,MAAM;AACvC,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,+BAA+B,OAA2C;AACjF,MAAI,OAAO,MAAM,YAAY,UAAU;AACrC,WAAO;AAAA,MACL;AAAA,QACE,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,aAAa;AAC9B,WAAO,CAAC,4BAA4B,MAAM,OAAO,CAAC;AAAA,EACpD;AAEA,SAAO,wBAAwB,MAAM,OAAO;AAC9C;AAEO,IAAM,iBAAN,MAAsD;AAAA,EAC3C,OAAO;AAAA,EACN;AAAA,EACT;AAAA,EAED,YAAY,QAAgB;AACjC,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAc,eAAsC;AAClD,QAAI,KAAK,QAAQ;AACf,aAAO,KAAK;AAAA,IACd;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,aAAa;AACnB,qBAAe,MAAM,OAAO;AAAA,IAC9B,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,oBAAqB,aAAgF;AAC3G,QAAI,CAAC,mBAAmB;AACtB,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AAEA,SAAK,SAAS,IAAI,kBAAkB,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC3D,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,iBACZ,OAC6E;AAC7E,UAAM,SAAS,MAAM,KAAK,aAAa;AACvC,QAAI;AAEJ,aAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAI;AACF,eAAO,MAAM,OAAO,KAAK,YAAY,OAAO,KAAK;AAAA,MACnD,SAAS,OAAO;AACd,oBAAY;AACZ,YAAI,CAAC,iBAAiB,KAAK,KAAK,YAAY,GAAG;AAC7C;AAAA,QACF;AAEA,cAAM,QAAQ,KAAK,IAAI,KAAM,MAAM,KAAK,OAAO,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG;AACjF,cAAMA,MAAK,KAAK;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,qBAAqB,OAAO;AAC9B,YAAM,IAAI,MAAM,2BAA2B,UAAU,OAAO,EAAE;AAAA,IAChE;AACA,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAAA,EAEQ,iBAAiB,cAAsB,UAAgD;AAC7F,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,GAAG,SAAS,QAAQ,CAAC,YAAY,+BAA+B,OAAO,CAAC;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAa,YAAY,cAAsB,aAAqB,SAA8C;AAChH,UAAM,WAAW,MAAM,KAAK,iBAAiB;AAAA,MAC3C,OAAO,QAAQ;AAAA,MACf,YAAY;AAAA,MACZ,UAAU,KAAK,iBAAiB,cAAc,CAAC,EAAE,MAAM,QAAQ,SAAS,YAAY,CAAC,CAAC;AAAA,IACxF,CAAC;AAED,UAAM,QAAQ,SAAS,WAAW,CAAC,GAChC,IAAI,CAAC,WAAW,mBAAmB,OAAO,SAAS,OAAO,CAAC,EAC3D,KAAK,IAAI,EACT,KAAK;AAER,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,cACX,cACA,UACA,SAC+B;AAC/B,UAAM,WAAW,MAAM,KAAK,iBAAiB;AAAA,MAC3C,OAAO,QAAQ;AAAA,MACf,YAAY;AAAA,MACZ,UAAU,KAAK,iBAAiB,cAAc,QAAQ;AAAA,MACtD,OAAO,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,QAClC,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,YAAY,KAAK;AAAA,QACnB;AAAA,MACF,EAAE;AAAA,IACJ,CAAC;AAED,UAAM,SAAS,SAAS,UAAU,CAAC;AACnC,UAAM,UAAU,QAAQ;AACxB,UAAM,iBAAiB,SAAS,cAAc,CAAC,GAAG,IAAI,CAAC,UAAU,UAAU;AACzE,YAAM,WAAW,SAAS,UAAU,QAAQ,QAAQ,QAAQ,CAAC;AAC7D,aAAO;AAAA,QACL,IAAI,SAAS,MAAM,GAAG,QAAQ,IAAI,QAAQ,CAAC;AAAA,QAC3C,MAAM;AAAA,QACN,WAAW,mBAAmB,SAAS,UAAU,WAAW,QAAQ;AAAA,MACtE;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,aAAa,mBAAmB,SAAS,OAAO;AAAA,MAChD;AAAA,MACA,YACE,QAAQ,kBAAkB,SACtB,aACA,QAAQ,kBAAkB,eACxB,aACA,QAAQ,iBAAiB;AAAA,IACnC;AAAA,EACF;AACF;;;ACnTO,SAAS,eAAe,cAA4B,gBAAgD;AACzG,QAAM,SAAS,cAAc,cAAc,cAAc;AACzD,MAAI,iBAAiB,aAAa;AAChC,WAAO,IAAI,kBAAkB,MAAM;AAAA,EACrC;AACA,SAAO,IAAI,eAAe,MAAM;AAClC;;;AJCA,IAAM,mBAAmBC,GAAE,OAAO;AAAA,EAChC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAASA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC7C,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,aAAaA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9C,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAASA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,QAAQA,GAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAED,IAAM,0BAA0B;AAChC,IAAM,uBAAuB;AAkB7B,SAAS,aAAa,UAAkC,OAAuB;AAC7E,MAAI,aAAa,YAAY,UAAU,yBAAyB;AAC9D,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,4BAA4B,QAAgB,MAAuB;AAC1E,MAAI,SAAS,QAAW;AACtB,WAAO;AAAA,EACT;AACA,SAAO,GAAG,MAAM;AAAA,QAAW,IAAI;AACjC;AAEA,eAAe,qBAAqB,YAAoB,SAA+C;AACrG,QAAM,UAAU,QAAQ,QAAQ,CAAC,QAAQ,OAAO,QAAQ,OAAO,IAAI,iCAAiC,EAAE,MAAM;AAE5G,MAAI;AACF,QAAI,SAAS;AACX,cAAQ,OAAO;AAAA,IACjB;AACA,UAAM,QAAQ,MAAM,iBAAiB,UAAU;AAE/C,QAAI,SAAS;AACX,cAAQ,OAAO;AAAA,IACjB;AACA,UAAM,WAAW,eAAe,QAAQ,UAAU,QAAQ,MAAM;AAEhE,QAAI,UAAU;AACd,QAAI,QAAQ,SAAS;AACnB,UAAI,SAAS;AACX,gBAAQ,OAAO;AAAA,MACjB;AACA,gBAAU,MAAM,uBAAuB,QAAQ,OAAO;AAAA,IACxD;AAEA,QAAI,SAAS;AACX,cAAQ,OAAO;AAAA,IACjB;AACA,UAAM,QAAQ,aAAa,QAAQ,UAAU,QAAQ,KAAK;AAC1D,UAAM,SAAS,MAAM,eAAe,OAAO;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,QAAQ;AAAA,MACpB,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,MACrB,SAAS,QAAQ;AAAA,IACnB,CAAC;AAED,QAAI,QAAQ,aAAa;AACvB,YAAM,cAAc,QAAQ,aAAa,OAAO,OAAO;AAAA,IACzD;AAEA,aAAS,KAAK;AACd,QAAI,QAAQ,MAAM;AAChB,kBAAY,QAAQ,IAAI;AAAA,IAC1B,OAAO;AACL,kBAAY,4BAA4B,oBAAoB,QAAQ,QAAQ,OAAO,QAAQ,OAAO,GAAG,OAAO,IAAI,GAAG,KAAK;AAAA,IAC1H;AAEA,QAAI,QAAQ,MAAM;AAChB,YAAM,aAAiD;AAAA,QACrD,GAAG;AAAA,QACH,QAAQ;AAAA,MACV;AACA,YAAMC,IAAG,UAAU,QAAQ,MAAM,kBAAkB,UAAU,GAAG,MAAM;AAAA,IACxE;AAAA,EACF,SAAS,OAAO;AACd,aAAS,KAAK;AACd,eAAW,OAAO,QAAQ,IAAI;AAC9B,YAAQ,WAAW;AAAA,EACrB;AACF;AAEO,SAAS,uBAAuB,SAAwB;AAC7D,UACG,QAAQ,SAAS,EACjB,YAAY,0DAA0D,EACtE,SAAS,mBAAmB,qCAAqC,EACjE,OAAO,mBAAmB,cAAc,EACxC,OAAO,yBAAyB,gCAAgC,EAChE,OAAO,oBAAoB,kCAAkC,EAC7D,OAAO,uBAAuB,gEAAgE,EAC9F,OAAO,qBAAqB,oCAAoC,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC,EACrG,OAAO,mBAAmB,qCAAqC,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC,EACpG,OAAO,qBAAqB,sCAAsC,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC,EACvG,OAAO,iBAAiB,6CAA6C,EACrE,OAAO,yBAAyB,uCAAuC,EACvE,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,aAAa,2BAA2B,EAC/C,OAAO,OAAO,YAAoB,iBAA0B,YAAqB;AAChF,UAAM,gBAAgB,oBAAoB,OAAO;AACjD,UAAM,SAAS,kBAAkB,OAAO;AACxC,UAAM,YAAY,iBAAiB,UAAU,QAAQ,KAAK,CAAC;AAC3D,QAAI,CAAC,UAAU,SAAS;AACtB,iBAAW,IAAI,MAAM,UAAU,MAAM,OAAO,CAAC,GAAG,WAAW,0BAA0B,GAAG,cAAc,IAAI;AAC1G,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,qBAAqB,YAAY;AAAA,MACrC,GAAG;AAAA,MACH,OAAO,OAAO;AAAA,MACd,UAAU,OAAO;AAAA,MACjB,SAAS,UAAU,KAAK;AAAA,MACxB,YAAY,OAAO,QAAQ;AAAA,MAC3B,SAAS,OAAO,QAAQ;AAAA,MACxB,aAAa,UAAU,KAAK;AAAA,MAC5B,MAAM,UAAU,KAAK,QAAQ,OAAO,QAAQ;AAAA,MAC5C,aAAa,OAAO;AAAA,MACpB,MAAM,UAAU,KAAK;AAAA,MACrB,SAAS,QAAQ,UAAU,KAAK,OAAO;AAAA,MACvC,QAAQ,UAAU,KAAK;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AACL;;;AK/JA,OAAOC,UAAQ;AACf,OAAOC,UAAS;AAEhB,SAAS,KAAAC,UAAS;AAgBlB,IAAM,gBAAgBC,GAAE,OAAO;AAAA,EAC7B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,aAAaA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9C,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAASA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,QAAQA,GAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAED,IAAMC,2BAA0B;AAChC,IAAMC,wBAAuB;AAkB7B,SAASC,cAAa,UAAkC,OAAuB;AAC7E,MAAI,aAAa,YAAY,UAAUF,0BAAyB;AAC9D,WAAOC;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAe,kBAAkB,YAAoB,SAA6B,SAAiC;AACjH,QAAM,UAAU,QAAQ,QAAQ,CAAC,QAAQ,OAAO,QAAQ,OAAOE,KAAI,yBAAyB,EAAE,MAAM;AAEpG,MAAI;AACF,QAAI,SAAS;AACX,cAAQ,OAAO;AAAA,IACjB;AACA,UAAM,QAAQ,MAAM,iBAAiB,UAAU;AAE/C,QAAI,SAAS;AACX,cAAQ,OAAO;AAAA,IACjB;AACA,UAAM,WAAW,eAAe,QAAQ,UAAU,QAAQ,MAAM;AAEhE,QAAI,UAAU;AACd,QAAI,QAAQ,SAAS;AACnB,UAAI,SAAS;AACX,gBAAQ,OAAO;AAAA,MACjB;AACA,gBAAU,MAAM,oBAAoB,QAAQ,OAAO;AAAA,IACrD,OAAO;AACL,gBAAU,MAAM,0BAA0B,OAAO;AAAA,IACnD;AAEA,QAAI,SAAS;AACX,cAAQ,OAAO;AAAA,IACjB;AACA,UAAM,QAAQD,cAAa,QAAQ,UAAU,QAAQ,KAAK;AAC1D,UAAM,cAAc,QAAQ,eAAe;AAC3C,UAAM,SAAS,MAAM,QAAQ,OAAO;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA,mBAAmB,QAAQ;AAAA,IAC7B,CAAC;AAED,QAAI,QAAQ,aAAa;AACvB,YAAM,cAAc,QAAQ,aAAa,MAAM;AAAA,IACjD;AAEA,aAAS,KAAK;AACd,QAAI,QAAQ,MAAM;AAChB,kBAAY,QAAQ,IAAI;AAAA,IAC1B,OAAO;AACL,kBAAY,iBAAiB,QAAQ,QAAQ,OAAO,QAAQ,OAAO,GAAG,KAAK;AAAA,IAC7E;AAEA,QAAI,QAAQ,MAAM;AAChB,YAAM,aAAiD;AAAA,QACrD,GAAG;AAAA,QACH,QAAQ;AAAA,MACV;AACA,YAAME,KAAG,UAAU,QAAQ,MAAM,eAAe,UAAU,GAAG,MAAM;AAAA,IACrE;AAAA,EACF,SAAS,OAAO;AACd,aAAS,KAAK;AACd,eAAW,OAAO,QAAQ,IAAI;AAC9B,YAAQ,WAAW;AAAA,EACrB;AACF;AAEO,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,MAAM,EACd,YAAY,wDAAwD,EACpE,SAAS,mBAAmB,qCAAqC,EACjE,OAAO,oBAAoB,2BAA2B,EACtD,OAAO,mBAAmB,0BAA0B,EACpD,OAAO,0BAA0B,8CAA8C,EAC/E,OAAO,yBAAyB,gCAAgC,EAChE,OAAO,qBAAqB,sCAAsC,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC,EACvG,OAAO,iBAAiB,6CAA6C,EACrE,OAAO,yBAAyB,sCAAsC,EACtE,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,aAAa,2BAA2B,EAC/C,OAAO,OAAO,YAAoB,iBAA0B,YAAqB;AAChF,UAAM,gBAAgB,oBAAoB,OAAO;AACjD,UAAM,SAAS,kBAAkB,OAAO;AACxC,UAAM,YAAY,cAAc,UAAU,QAAQ,KAAK,CAAC;AACxD,QAAI,CAAC,UAAU,SAAS;AACtB,iBAAW,IAAI,MAAM,UAAU,MAAM,OAAO,CAAC,GAAG,WAAW,uBAAuB,GAAG,cAAc,IAAI;AACvG,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,SAAS,UAAU,KAAK;AAAA,QACxB,OAAO,OAAO;AAAA,QACd,aAAa,UAAU,KAAK;AAAA,QAC5B,UAAU,OAAO;AAAA,QACjB,aAAa,UAAU,KAAK;AAAA,QAC5B,MAAM,UAAU,KAAK;AAAA,QACrB,SAAS,QAAQ,UAAU,KAAK,OAAO;AAAA,QACvC,QAAQ,UAAU,KAAK;AAAA,QACvB,SAAS,OAAO,KAAK;AAAA,QACrB,aAAa,OAAO;AAAA,QACpB,mBAAmB,OAAO,KAAK;AAAA,MACjC;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACL;;;AClKA,OAAOC,UAAQ;AACf,OAAOC,UAAS;AAEhB,SAAS,KAAAC,WAAS;;;ACuDlB,SAAS,4BAA4B,QAA4B;AAC/D,MAAI,OAAO,QAAQ,oBAAoB,GAAG;AACxC,WAAO;AAAA,EACT;AACA,SAAO,OAAO,QAAQ,mBAAmB,OAAO,QAAQ;AAC1D;AAEA,eAAsB,SAAS,WAAmB,SAAmD;AACnG,UAAQ,UAAU,MAAM;AACxB,QAAM,OAAO,MAAM,UAAU,WAAW,EAAE,UAAU,QAAQ,cAAc,SAAS,QAAQ,YAAY,CAAC;AACxG,QAAM,aAAa,CAAC,UAAU,MAAM,QAAQ,UAAU;AAEtD,MAAI,UAAoC;AACxC,MAAI,aAAgC;AACpC,MAAI;AACJ,MAAI;AAEJ,MAAI,CAAC,cAAc,CAAC,QAAQ,oBAAoB;AAC9C,2BAAuB;AACvB,wBAAoB;AAAA,EACtB,OAAO;AACL,YAAQ,UAAU,OAAO;AACzB,QAAI,cAAc;AAClB,QAAI;AACF,oBAAc,MAAM,iBAAiB,SAAS;AAAA,IAChD,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,6BAAuB,gDAAgD,OAAO;AAC9E,0BAAoB,gDAAgD,OAAO;AAAA,IAC7E;AAEA,QAAI,aAAa;AACf,YAAM,iBAAiB;AAAA,QACrB,UAAU,QAAQ;AAAA,QAClB,OAAO,QAAQ;AAAA,QACf,SAAS,QAAQ;AAAA,QACjB,SAAS,QAAQ;AAAA,QACjB,YAAY,QAAQ;AAAA,QACpB,MAAM,QAAQ;AAAA,QACd,aAAa,QAAQ;AAAA,QACrB,SAAS,QAAQ;AAAA,MACnB;AACA,YAAM,cAAc;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,OAAO,QAAQ;AAAA,QACf,aAAa,QAAQ;AAAA,QACrB,SAAS,QAAQ;AAAA,QACjB,SAAS,QAAQ;AAAA,QACjB,aAAa,QAAQ;AAAA,QACrB,mBAAmB,QAAQ;AAAA,MAC7B;AAEA,WAAK,QAAQ,eAAe,OAAO,GAAG;AACpC,gBAAQ,UAAU,SAAS;AAC3B,kBAAU,MAAM,eAAe,aAAa,cAAc;AAE1D,gBAAQ,UAAU,MAAM;AACxB,qBAAa,MAAM,QAAQ,aAAa,WAAW;AAAA,MACrD,OAAO;AACL,gBAAQ,UAAU,SAAS;AAC3B,gBAAQ,UAAU,MAAM;AACxB,SAAC,SAAS,UAAU,IAAI,MAAM,QAAQ,IAAI,CAAC,eAAe,aAAa,cAAc,GAAG,QAAQ,aAAa,WAAW,CAAC,CAAC;AAAA,MAC5H;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,UAAU,QAAQ,QAAQ,KAAK;AACjD,QAAM,qBAAqB,aAAa,4BAA4B,UAAU,IAAI;AAClF,QAAM,gBAAgB,cAAc,OAAO,OAAO,aAAa,QAAQ;AACvE,QAAM,aAAa,uBAAuB,OAAO,OAAO,sBAAsB,QAAQ;AACtF,QAAM,gBAAgB,cAAc,kBAAkB,QAAQ,eAAe;AAE7E,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU,QAAQ,SAAS;AAAA,IAC3B,OAAO,QAAQ;AAAA,IACf,aAAa,QAAQ;AAAA,IACrB,YAAY;AAAA,MACV,OAAO,QAAQ;AAAA,MACf,mBAAmB,QAAQ;AAAA,IAC7B;AAAA,IACA,oBAAoB,QAAQ;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;ADvIA,IAAM,iBAAiBC,IAAE,OAAO;AAAA,EAC9B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,SAASA,IAAE,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC7C,MAAMA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQA,IAAE,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC5C,aAAaA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9C,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,oBAAoBA,IAAE,QAAQ,EAAE,SAAS;AAAA,EACzC,SAASA,IAAE,QAAQ,EAAE,SAAS;AAChC,CAAC;AAED,IAAMC,2BAA0B;AAChC,IAAMC,wBAAuB;AA4B7B,SAASC,oBAAmB,OAAe,WAAqB,CAAC,GAAa;AAC5E,SAAO,CAAC,GAAG,UAAU,KAAK;AAC5B;AAEA,SAASC,cAAa,UAAkC,OAAuB;AAC7E,MAAI,aAAa,YAAY,UAAUH,0BAAyB;AAC9D,WAAOC;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,0BAA0B,QAAgB,MAAuB;AACxE,MAAI,SAAS,QAAW;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,QAAM,eAAe,MAAM,QAAQ,SAAS;AAC5C,MAAI,iBAAiB,IAAI;AACvB,WAAO,GAAG,MAAM;AAAA,QAAW,IAAI;AAAA,EACjC;AAEA,QAAM,OAAO,eAAe,GAAG,GAAG,SAAS,IAAI,EAAE;AACjD,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAe,mBAAmB,YAAoB,SAA8B,SAAiC;AACnH,QAAM,UAAU,QAAQ,QAAQ,CAAC,QAAQ,OAAO,QAAQ,OAAOG,KAAI,wBAAwB,EAAE,MAAM;AAEnG,MAAI;AACF,QAAI,SAAS;AACX,cAAQ,OAAO;AAAA,IACjB;AACA,UAAM,WAAW,eAAe,QAAQ,UAAU,QAAQ,MAAM;AAEhE,QAAI,UAAU;AACd,QAAI,QAAQ,SAAS;AACnB,UAAI,SAAS;AACX,gBAAQ,OAAO;AAAA,MACjB;AACA,gBAAU,MAAM,uBAAuB,QAAQ,OAAO;AAAA,IACxD;AAEA,QAAI,UAAU;AACd,QAAI,QAAQ,SAAS;AACnB,UAAI,SAAS;AACX,gBAAQ,OAAO;AAAA,MACjB;AACA,gBAAU,MAAM,oBAAoB,QAAQ,OAAO;AAAA,IACrD,OAAO;AACL,gBAAU,MAAM,0BAA0B,OAAO;AAAA,IACnD;AAEA,UAAM,QAAQD,cAAa,QAAQ,UAAU,QAAQ,KAAK;AAC1D,UAAM,cAAc,QAAQ,eAAe;AAE3C,UAAM,SAAS,MAAM,SAAS,YAAY;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,QAAQ;AAAA,MACpB,cAAc,QAAQ;AAAA,MACtB,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,YAAY,QAAQ;AAAA,MACpB,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,uBAAuB,QAAQ;AAAA,MAC/B,aAAa,QAAQ;AAAA,MACrB,OAAO,QAAQ;AAAA,MACf,mBAAmB,QAAQ;AAAA,MAC3B,oBAAoB,QAAQ;AAAA,MAC5B,SAAS,QAAQ;AAAA,MACjB,SAAS,CAAC,UAAU;AAClB,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,YAAI,UAAU,QAAQ;AACpB,kBAAQ,OAAO;AAAA,QACjB,WAAW,UAAU,SAAS;AAC5B,kBAAQ,OAAO;AAAA,QACjB,WAAW,UAAU,aAAa,UAAU,QAAQ;AAClD,kBAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,QAAQ,aAAa;AACvB,YAAM,cAAc,QAAQ,aAAa,MAAM;AAAA,IACjD;AAEA,aAAS,KAAK;AACd,QAAI,QAAQ,MAAM;AAChB,kBAAY,QAAQ,IAAI;AAAA,IAC1B,OAAO;AACL;AAAA,QACE,0BAA0B,kBAAkB,QAAQ,QAAQ,OAAO,QAAQ,OAAO,GAAG,OAAO,SAAS,IAAI;AAAA,QACzG;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM;AAChB,YAAME,KAAG,UAAU,QAAQ,MAAM,gBAAgB,MAAM,GAAG,MAAM;AAAA,IAClE;AAEA,YAAQ,WAAW,OAAO,MAAM,gBAAgB,IAAI;AAAA,EACtD,SAAS,OAAO;AACd,aAAS,KAAK;AACd,eAAW,OAAO,QAAQ,IAAI;AAC9B,YAAQ,WAAW;AAAA,EACrB;AACF;AAEO,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,OAAO,EACf,YAAY,+DAA+D,EAC3E,SAAS,mBAAmB,qCAAqC,EACjE,OAAO,yBAAyB,gCAAgC,EAChE,OAAO,mBAAmB,6BAA6B,EACvD,OAAO,0BAA0B,8CAA8C,EAC/E,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,oBAAoB,qCAAqC,EAChE,OAAO,uBAAuB,gEAAgE,EAC9F,OAAO,qBAAqB,4CAA4C,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC,EAC7G,OAAO,mBAAmB,qCAAqC,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC,EACpG,OAAO,oBAAoB,2BAA2B,EACtD,OAAO,mBAAmB,kCAAkCH,qBAAoB,CAAC,CAAC,EAClF,OAAO,qBAAqB,wCAAwC,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC,EACzG,OAAO,iBAAiB,6CAA6C,EACrE,OAAO,gBAAgB,2CAA2C,CAAC,UAAU,OAAO,WAAW,KAAK,CAAC,EACrG,OAAO,8BAA8B,mDAAmD,CAAC,UAAU,OAAO,WAAW,KAAK,CAAC,EAC3H,OAAO,yBAAyB,qCAAqC,EACrE,OAAO,2BAA2B,0DAA0D,EAC5F,OAAO,aAAa,4CAA4C,EAChE,OAAO,OAAO,YAAoB,iBAA0B,YAAqB;AAChF,UAAM,gBAAgB,oBAAoB,OAAO;AACjD,UAAM,SAAS,kBAAkB,OAAO;AACxC,UAAM,YAAY,eAAe,UAAU,QAAQ,KAAK,CAAC;AACzD,QAAI,CAAC,UAAU,SAAS;AACtB,iBAAW,IAAI,MAAM,UAAU,MAAM,OAAO,CAAC,GAAG,WAAW,wBAAwB,GAAG,cAAc,IAAI;AACxG,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,OAAO;AAAA,QACjB,OAAO,OAAO;AAAA,QACd,aAAa,UAAU,KAAK;AAAA,QAC5B,QAAQ,UAAU,KAAK;AAAA,QACvB,SAAS,UAAU,KAAK;AAAA,QACxB,SAAS,OAAO,QAAQ;AAAA,QACxB,YAAY,OAAO,QAAQ;AAAA,QAC3B,SAAS,UAAU,KAAK;AAAA,QACxB,OAAO,OAAO,QAAQ;AAAA,QACtB,mBAAmB,OAAO,KAAK;AAAA,QAC/B,SAAS,OAAO,KAAK;AAAA,QACrB,mBAAmB,OAAO,KAAK;AAAA,QAC/B,aAAa,OAAO;AAAA,QACpB,MAAM,UAAU,KAAK;AAAA,QACrB,YAAY,OAAO,KAAK;AAAA,QACxB,cAAc,OAAO,KAAK;AAAA,QAC1B,aAAa,OAAO,KAAK;AAAA,QACzB,aAAa,UAAU,KAAK,QAAQ,OAAO,QAAQ;AAAA,QACnD,aAAa,UAAU,KAAK;AAAA,QAC5B,oBAAoB,QAAQ,UAAU,KAAK,kBAAkB;AAAA,QAC7D,SAAS,QAAQ,UAAU,KAAK,OAAO;AAAA,MACzC;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACL;;;AE9OA,OAAOI,UAAS;AAEhB,SAAS,KAAAC,WAAS;;;ACHlB,OAAOC,UAAQ;AACf,OAAO,QAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,WAAU;AACjB,SAAS,KAAAC,WAAS;AAclB,IAAM,uBAAuBC,IAAE,OAAO;AAAA,EACpC,aAAaA,IAAE,OAAOA,IAAE,QAAQ,CAAC;AAAA,EACjC,SAASA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,eAAeA,IAAE,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EAC/C,kBAAkBA,IAAE,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AACpD,CAAC;AAiGD,SAASC,6BAA4B,QAAwC;AAC3E,MAAI,CAAC,UAAU,OAAO,QAAQ,oBAAoB,GAAG;AACnD,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,QAAQ,mBAAmB,OAAO,QAAQ;AAC1D;AAEA,SAASC,mBAAkB,KAAsC;AAC/D,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AAEA,QAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,QAAM,MAAM,QAAQ,YAAY,GAAG;AACnC,MAAI,SAAS,KAAK,MAAM,OAAO;AAC7B,WAAO,KAAK,MAAM,QAAQ,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,EACjD;AAEA,QAAM,IAAI,MAAM,wCAAwC;AAC1D;AAEA,SAAS,iBAAiB,aAA+D;AACvF,QAAM,UAAmC,CAAC;AAE1C,aAAW,OAAO,CAAC,QAAQ,eAAe,SAAS,GAAG;AACpD,QAAI,OAAO,UAAU,eAAe,KAAK,aAAa,GAAG,GAAG;AAC1D,cAAQ,GAAG,IAAI,YAAY,GAAG;AAAA,IAChC;AAAA,EACF;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACtD,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,SAAS,GAAG,GAAG;AACvD,cAAQ,GAAG,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAqB;AAC7C,SAAO,IAAI,SAAS,MAAM,IAAI,SAAS;AACzC;AAEA,SAAS,mBAAmB,aAAsC,SAAiB,YAA4B;AAC7G,QAAM,iBAAiB,QAAQ,KAAK;AACpC,MAAI,eAAe,WAAW,GAAG;AAC/B,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,QAAM,mBAAmBC,MACtB,KAAK,iBAAiB,WAAW,GAAG;AAAA,IACrC,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,UAAU;AAAA,EACV,CAAC,EACA,QAAQ,OAAO,UAAU;AAE5B,SAAO,MAAM,UAAU,GAAG,gBAAgB,MAAM,UAAU,GAAG,UAAU,GAAG,eAAe,QAAQ,OAAO,UAAU,CAAC,GAAG,UAAU;AAClI;AAEA,eAAe,2BAA2B,KAAa,WAAkC;AACvF,aAAW,aAAa,8BAA8B,GAAG,GAAG;AAC1D,UAAM,WAAWC,MAAK,QAAQ,WAAW,SAAS;AAClD,UAAM,iBAAiBA,MAAK,SAAS,WAAW,QAAQ;AACxD,UAAM,cACJ,mBAAmB,KAAK,QAAQ,eAAe,WAAW,IAAI,KAAKA,MAAK,WAAW,cAAc;AAEnG,QAAI,aAAa;AACf,YAAM,IAAI,MAAM,0DAA0D,SAAS,EAAE;AAAA,IACvF;AAEA,QAAI,CAAE,MAAM,WAAW,QAAQ,GAAI;AACjC,YAAM,IAAI,MAAM,6DAA6D,SAAS,EAAE;AAAA,IAC1F;AAAA,EACF;AACF;AAEA,eAAe,eAAe,OAAoB,SAA0E;AAC1H,MAAI,OAAO,QAAQ,YAAY,SAAS,YAAY,QAAQ,YAAY,SAAS,MAAM,YAAY,MAAM;AACvG,UAAM,IAAI,MAAM,gDAAgD,MAAM,YAAY,IAAI,SAAS,QAAQ,YAAY,IAAI,IAAI;AAAA,EAC7H;AAEA,MACE,MAAM,YAAY,WAClB,OAAO,QAAQ,YAAY,YAAY,YACvC,QAAQ,YAAY,YAAY,MAAM,YAAY,SAClD;AACA,UAAM,IAAI;AAAA,MACR,kDAAkD,MAAM,YAAY,OAAO,SAAS,QAAQ,YAAY,OAAO;AAAA,IACjH;AAAA,EACF;AAEA,QAAM,oBAAoB;AAAA,IACxB,GAAG,MAAM;AAAA,IACT,GAAG,QAAQ;AAAA,IACX,MAAM,MAAM,YAAY;AAAA,IACxB,GAAI,MAAM,YAAY,UAAU,EAAE,SAAS,MAAM,YAAY,QAAQ,IAAI,CAAC;AAAA,EAC5E;AAEA,QAAM,MAAM,mBAAmB,mBAAmB,QAAQ,SAAS,iBAAiB,MAAM,GAAG,CAAC;AAC9F,2BAAyB,KAAK,MAAM,WAAW,MAAM,SAAS;AAC9D,QAAM,2BAA2B,KAAK,MAAM,SAAS;AAErD,SAAO;AAAA,IACL,aAAa;AAAA,IACb,SAAS,QAAQ,QAAQ,KAAK;AAAA,IAC9B;AAAA,IACA,eAAe,QAAQ;AAAA,IACvB,kBAAkB,QAAQ;AAAA,EAC5B;AACF;AAEA,SAAS,wBAAwB,QAA0C;AACzE,QAAM,aAAa,OAAO,KAAK,OAC5B,OAAO,CAAC,UAAU,MAAM,WAAW,MAAM,EACzC,IAAI,CAAC,WAAW;AAAA,IACf,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM,WAAW,SAAU,SAAoB;AAAA,IACvD,SAAS,MAAM;AAAA,IACf,YAAY,MAAM;AAAA,IAClB,WAAW,MAAM;AAAA,IACjB,SAAS,MAAM;AAAA,EACjB,EAAE;AAEJ,QAAM,kBACJ,OAAO,SAAS,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,OAAO,EAAE,IAAI,CAAC,cAAc;AAAA,IAC/E,OAAO,SAAS;AAAA,IAChB,UAAU,SAAS;AAAA,IACnB,QAAQ,SAAS;AAAA,IACjB,oBAAoB,SAAS;AAAA,IAC7B,kBAAkB,SAAS;AAAA,EAC7B,EAAE,KAAK,CAAC;AAEV,QAAM,eACJ,OAAO,MAAM,QAAQ;AAAA,IAAQ,CAAC,iBAC5B,aAAa,WACV,OAAO,CAAC,cAAc,CAAC,UAAU,MAAM,EACvC,IAAI,CAAC,eAAe;AAAA,MACnB,QAAQ,aAAa;AAAA,MACrB,WAAW,UAAU;AAAA,MACrB,UAAU,UAAU;AAAA,MACpB,QACE,UAAU,WAAW,YAAY,UAAU,WAAW,SAClD,UAAU,SACT;AAAA,IACT,EAAE;AAAA,EACN,KAAK,CAAC;AAER,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,OAAO,SAAS,eAAe,CAAC;AAAA,EACtD;AACF;AAEA,SAAS,sBAAsB,OAAkC;AAC/D,SACE,MAAM,WAAW,SAAS,KAC1B,MAAM,gBAAgB,SAAS,KAC/B,MAAM,aAAa,SAAS,KAC5B,MAAM,mBAAmB,SAAS;AAEtC;AAEA,eAAe,eAAe,WAAsC;AAClE,QAAM,UAAU,MAAMC,KAAG,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AACnE,QAAM,QAAkB,CAAC;AAEzB,aAAW,SAAS,SAAS;AAC3B,UAAM,eAAeD,MAAK,KAAK,WAAW,MAAM,IAAI;AACpD,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,KAAK,GAAI,MAAM,eAAe,YAAY,CAAE;AAClD;AAAA,IACF;AAEA,QAAI,MAAM,OAAO,GAAG;AAClB,YAAM,KAAKA,MAAK,SAAS,WAAW,YAAY,EAAE,MAAMA,MAAK,GAAG,EAAE,KAAK,GAAG,CAAC;AAAA,IAC7E;AAAA,EACF;AAEA,SAAO,MAAM,KAAK;AACpB;AAEA,eAAe,eACb,OACA,UACA,OACA,UACA,OAC+C;AAC/C,QAAM,iBAAiB,MAAM,eAAe,MAAM,SAAS;AAC3D,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gCAAgC,MAAM,YAAY,IAAI;AAAA,IACtD,MAAM,YAAY,UAAU,6BAA6B,MAAM,YAAY,OAAO,OAAO;AAAA,IACzF;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AAEV,QAAM,oBAAoB,SAAS,SAAS,QAAQ,MAAM;AAC1D,QAAM,uBAAuBH,6BAA4B,SAAS,IAAI;AACtE,QAAM,aAAa;AAAA,IACjB,eAAe,MAAM,SAAS;AAAA,IAC9B,uBAAuB,kBAAkB,QAAQ,CAAC,CAAC;AAAA,IACnD,qCAAqC,qBAAqB,QAAQ,CAAC,CAAC;AAAA,IACpE,kBAAkB,SAAS,KAAK,QAAQ,QAAQ;AAAA,IAChD,kBAAkB,SAAS,KAAK,QAAQ,QAAQ;AAAA,IAChD;AAAA,IACA;AAAA,IACA,GAAG,eAAe,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,IAC7B;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,MAAM,MAAM,SAAS,YAAY,cAAc,YAAY,EAAE,MAAM,CAAC;AAC1E,QAAM,SAAS,qBAAqB,UAAUC,mBAAkB,GAAG,CAAC;AACpE,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,mCAAmC,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW,sBAAsB,EAAE;AAAA,EAChH;AAEA,SAAO,OAAO;AAChB;AAEA,eAAe,4BAA4B,WAAmB,cAAwE;AACpI,QAAM,WAAW,MAAMG,KAAG,QAAQD,MAAK,KAAK,GAAG,OAAO,GAAG,oBAAoB,CAAC;AAC9E,QAAM,gBAAgBA,MAAK,KAAK,UAAUA,MAAK,SAAS,SAAS,CAAC;AAClE,QAAMC,KAAG,GAAG,WAAW,eAAe,EAAE,WAAW,KAAK,CAAC;AACzD,QAAMA,KAAG,UAAUD,MAAK,KAAK,eAAe,UAAU,GAAG,cAAc,MAAM;AAC7E,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEA,SAAS,WAAW,UAA0B,cAA4C;AACxF,QAAM,oBAAoB,SAAS,SAAS,QAAQ,MAAM;AAC1D,QAAM,wBAAwB,aAAa,SAAS,QAAQ,MAAM;AAClE,QAAM,uBAAuBH,6BAA4B,SAAS,IAAI;AACtE,QAAM,2BAA2BA,6BAA4B,aAAa,IAAI;AAE9E,QAAM,oBAAoB,SAAS,KAAK,QAAQ,WAAW,aAAa,KAAK,QAAQ;AACrF,QAAM,oBAAoB,SAAS,KAAK,QAAQ,WAAW,aAAa,KAAK,QAAQ;AACrF,QAAM,iBAAiB,wBAAwB;AAC/C,QAAM,oBAAoB,2BAA2B;AAErD,QAAM,gBACJ,aAAa,KAAK,QAAQ,WAAW,SAAS,KAAK,QAAQ,YAC3D,aAAa,KAAK,QAAQ,WAAW,SAAS,KAAK,QAAQ,YAC3D,wBAAwB,qBACxB,2BAA2B;AAE7B,QAAM,WACJ,aAAa,MAAM,kBAAkB,SAAS,MAAM,gBAChD,aAAa,MAAM,gBACnB,oBAAoB,KAAK,oBAAoB,KAAK,iBAAiB,KAAK,oBAAoB;AAElG,SAAO;AAAA,IACL,cAAc;AAAA,MACZ,QAAQ,SAAS,KAAK,QAAQ;AAAA,MAC9B,OAAO,aAAa,KAAK,QAAQ;AAAA,MACjC,OAAO;AAAA,IACT;AAAA,IACA,cAAc;AAAA,MACZ,QAAQ,SAAS,KAAK,QAAQ;AAAA,MAC9B,OAAO,aAAa,KAAK,QAAQ;AAAA,MACjC,OAAO;AAAA,IACT;AAAA,IACA,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,oBAAoB;AAAA,MAClB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,QAAQ,SAAS,MAAM;AAAA,MACvB,OAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,4BAA4B,QAAwB,QAAgC;AAC3F,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAAqB,cAAkD;AAClG,MAAI,MAAM,eAAe;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,UAAU;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,aAAa,MAAM,eAAe;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,iBAAiB,YAAoB,KAA8B;AAChF,QAAM,eAAeG,MAAK,QAAQ,UAAU;AAC5C,QAAMC,KAAG,MAAMD,MAAK,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9D,QAAMC,KAAG,UAAU,cAAc,KAAK,MAAM;AAC5C,SAAO;AACT;AAEA,eAAsB,WAAW,WAAmB,SAAuD;AACzG,UAAQ,UAAU,UAAU;AAC5B,QAAM,WAAW,MAAM,SAAS,WAAW;AAAA,IACzC,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,aAAa,QAAQ;AAAA,IACrB,YAAY,QAAQ;AAAA,IACpB,cAAc,QAAQ;AAAA,IACtB,aAAa,QAAQ;AAAA,IACrB,SAAS,QAAQ;AAAA,IACjB,YAAY,QAAQ;AAAA,IACpB,aAAa,QAAQ;AAAA,IACrB,SAAS,QAAQ;AAAA,IACjB,aAAa,QAAQ;AAAA,IACrB,SAAS,QAAQ;AAAA,IACjB,uBAAuB,QAAQ;AAAA,IAC/B,aAAa,QAAQ;AAAA,IACrB,OAAO,QAAQ;AAAA,IACf,mBAAmB,QAAQ;AAAA,IAC3B,oBAAoB;AAAA,IACpB,SAAS,QAAQ;AAAA,EACnB,CAAC;AAED,MAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU,QAAQ,SAAS;AAAA,MAC3B,OAAO,QAAQ;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,QACV,OAAO,QAAQ;AAAA,QACf,mBAAmB,QAAQ;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,SAAS;AAAA,MACT,eACE,SAAS,wBACT,SAAS,qBACT;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,iBAAiB,SAAS;AAC9C,QAAM,QAAQ,wBAAwB,QAAQ;AAC9C,MAAI,CAAC,sBAAsB,KAAK,GAAG;AACjC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU,QAAQ,SAAS;AAAA,MAC3B,OAAO,QAAQ;AAAA,MACf,aAAa,MAAM;AAAA,MACnB,YAAY;AAAA,QACV,OAAO,QAAQ;AAAA,QACf,mBAAmB,QAAQ;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,SAAS;AAAA,MACT,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,UAAQ,UAAU,UAAU;AAC5B,QAAM,UAAU,MAAM,eAAe,OAAO,UAAU,OAAO,QAAQ,UAAU,QAAQ,KAAK;AAE5F,UAAQ,UAAU,UAAU;AAC5B,QAAM,YAAY,MAAM,eAAe,OAAO,OAAO;AAErD,MAAI,UAAU,QAAQ,MAAM,KAAK;AAC/B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU,QAAQ,SAAS;AAAA,MAC3B,OAAO,QAAQ;AAAA,MACf,aAAa,MAAM;AAAA,MACnB,YAAY;AAAA,QACV,OAAO,QAAQ;AAAA,QACf,mBAAmB,QAAQ;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,OAAO;AAAA,MACP,SAAS;AAAA,MACT,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,UAAQ,UAAU,QAAQ;AAC1B,QAAM,wBAAwB,MAAM,4BAA4B,MAAM,WAAW,UAAU,GAAG;AAC9F,MAAI;AAEJ,MAAI;AACF,mBAAe;AAAA,MACb,MAAM,SAAS,sBAAsB,WAAW;AAAA,QAC9C,UAAU,QAAQ;AAAA,QAClB,OAAO,QAAQ;AAAA,QACf,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ;AAAA,QACpB,cAAc,QAAQ;AAAA,QACtB,aAAa,QAAQ;AAAA,QACrB,SAAS,QAAQ;AAAA,QACjB,YAAY,SAAS,QAAQ,QAAQ;AAAA,QACrC,aAAa,QAAQ;AAAA,QACrB,SAAS,SAAS,QAAQ;AAAA,QAC1B,aAAa,SAAS,KAAK,QAAQ;AAAA,QACnC,SAAS,SAAS,KAAK;AAAA,QACvB,uBAAuB,QAAQ;AAAA,QAC/B,aAAa,QAAQ;AAAA,QACrB,OAAO,QAAQ;AAAA,QACf,mBAAmB,QAAQ;AAAA,QAC3B,oBAAoB;AAAA,QACpB,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF,UAAE;AACA,UAAMA,KAAG,GAAG,sBAAsB,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAC9E;AAEA,QAAM,QAAQ,WAAW,UAAU,YAAY;AAC/C,QAAM,gBAAgB,oBAAoB,OAAO,YAAY;AAC7D,MAAI,UAAU;AACd,MAAI;AAEJ,MAAI,CAAC,eAAe;AAClB,QAAI,QAAQ,YAAY;AACtB,cAAQ,UAAU,OAAO;AACzB,mBAAa,MAAM,iBAAiB,QAAQ,YAAY,UAAU,GAAG;AAAA,IACvE;AAEA,QAAI,QAAQ,OAAO;AACjB,cAAQ,UAAU,OAAO;AACzB,YAAMA,KAAG,UAAU,MAAM,WAAW,UAAU,KAAK,MAAM;AACzD,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU,QAAQ,SAAS;AAAA,IAC3B,OAAO,QAAQ;AAAA,IACf,aAAa,MAAM;AAAA,IACnB,YAAY;AAAA,MACV,OAAO,QAAQ;AAAA,MACf,mBAAmB,QAAQ;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,IACnC,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,EAC3C;AACF;;;ADjlBA,IAAM,mBAAmBC,IAAE,OAAO;AAAA,EAChC,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,SAASA,IAAE,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC7C,MAAMA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQA,IAAE,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC5C,aAAaA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9C,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAOA,IAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,SAASA,IAAE,QAAQ,EAAE,SAAS;AAChC,CAAC;AAED,IAAMC,2BAA0B;AAChC,IAAMC,wBAAuB;AA2B7B,SAASC,oBAAmB,OAAe,WAAqB,CAAC,GAAa;AAC5E,SAAO,CAAC,GAAG,UAAU,KAAK;AAC5B;AAEA,SAASC,cAAa,UAAkC,OAAuB;AAC7E,MAAI,aAAa,YAAY,UAAUH,0BAAyB;AAC9D,WAAOC;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,qBAAqB,YAAoB,SAAgC,SAAiC;AACvH,QAAM,UAAU,QAAQ,QAAQ,CAAC,QAAQ,OAAO,QAAQ,OAAOG,KAAI,8BAA8B,EAAE,MAAM;AAEzG,MAAI;AACF,QAAI,SAAS;AACX,cAAQ,OAAO;AAAA,IACjB;AACA,UAAM,WAAW,eAAe,QAAQ,UAAU,QAAQ,MAAM;AAEhE,QAAI,UAAU;AACd,QAAI,QAAQ,SAAS;AACnB,UAAI,SAAS;AACX,gBAAQ,OAAO;AAAA,MACjB;AACA,gBAAU,MAAM,uBAAuB,QAAQ,OAAO;AAAA,IACxD;AAEA,QAAI,UAAU;AACd,QAAI,QAAQ,SAAS;AACnB,UAAI,SAAS;AACX,gBAAQ,OAAO;AAAA,MACjB;AACA,gBAAU,MAAM,oBAAoB,QAAQ,OAAO;AAAA,IACrD,OAAO;AACL,gBAAU,MAAM,0BAA0B,OAAO;AAAA,IACnD;AAEA,UAAM,QAAQD,cAAa,QAAQ,UAAU,QAAQ,KAAK;AAC1D,UAAM,SAAS,MAAM,WAAW,YAAY;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,YAAY,QAAQ;AAAA,MACpB,cAAc,QAAQ;AAAA,MACtB,aAAa,QAAQ;AAAA,MACrB,SAAS,QAAQ;AAAA,MACjB,YAAY,QAAQ;AAAA,MACpB,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,uBAAuB,QAAQ;AAAA,MAC/B,OAAO,QAAQ;AAAA,MACf,mBAAmB,QAAQ;AAAA,MAC3B,aAAa,QAAQ;AAAA,MACrB,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,SAAS,QAAQ;AAAA,MACjB,SAAS,CAAC,UAAU;AAClB,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AAEA,YAAI,UAAU,YAAY;AACxB,kBAAQ,OAAO;AAAA,QACjB,WAAW,UAAU,YAAY;AAC/B,kBAAQ,OAAO;AAAA,QACjB,WAAW,UAAU,YAAY;AAC/B,kBAAQ,OAAO;AAAA,QACjB,WAAW,UAAU,UAAU;AAC7B,kBAAQ,OAAO;AAAA,QACjB,WAAW,UAAU,SAAS;AAC5B,kBAAQ,OAAO,QAAQ,QAAQ,iCAAiC;AAAA,QAClE;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,QAAQ,aAAa;AACvB,YAAM,cAAc,QAAQ,aAAa,MAAM;AAAA,IACjD;AAEA,aAAS,KAAK;AACd,QAAI,QAAQ,MAAM;AAChB,kBAAY,QAAQ,IAAI;AAAA,IAC1B,OAAO;AACL,kBAAY,oBAAoB,QAAQ,QAAQ,OAAO,QAAQ,OAAO,GAAG,KAAK;AAAA,IAChF;AAEA,YAAQ,WAAW,OAAO,gBAAgB,IAAI;AAAA,EAChD,SAAS,OAAO;AACd,aAAS,KAAK;AACd,eAAW,OAAO,QAAQ,IAAI;AAC9B,YAAQ,WAAW;AAAA,EACrB;AACF;AAEO,SAAS,uBAAuB,SAAwB;AAC7D,UACG,QAAQ,SAAS,EACjB,YAAY,6EAA6E,EACzF,SAAS,mBAAmB,qCAAqC,EACjE,OAAO,yBAAyB,gCAAgC,EAChE,OAAO,mBAAmB,oDAAoD,EAC9E,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,oBAAoB,qCAAqC,EAChE,OAAO,uBAAuB,gEAAgE,EAC9F,OAAO,qBAAqB,4CAA4C,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC,EAC7G,OAAO,mBAAmB,6CAA6C,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC,EAC5G,OAAO,oBAAoB,2BAA2B,EACtD,OAAO,mBAAmB,kCAAkCD,qBAAoB,CAAC,CAAC,EAClF,OAAO,qBAAqB,wCAAwC,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC,EACzG,OAAO,mBAAmB,0DAA0D,EACpF,OAAO,yBAAyB,mCAAmC,EACnE,OAAO,gBAAgB,2CAA2C,CAAC,UAAU,OAAO,WAAW,KAAK,CAAC,EACrG;AAAA,IAAO;AAAA,IAA8B;AAAA,IAAmD,CAAC,UACxF,OAAO,WAAW,KAAK;AAAA,EACzB,EACC,OAAO,WAAW,mDAAmD,EACrE,OAAO,aAAa,oDAAoD,EACxE,OAAO,OAAO,YAAoB,iBAA0B,YAAqB;AAChF,UAAM,gBAAgB,oBAAoB,OAAO;AACjD,UAAM,SAAS,kBAAkB,OAAO;AACxC,UAAM,YAAY,iBAAiB,UAAU,QAAQ,KAAK,CAAC;AAC3D,QAAI,CAAC,UAAU,SAAS;AACtB,iBAAW,IAAI,MAAM,UAAU,MAAM,OAAO,CAAC,GAAG,WAAW,0BAA0B,GAAG,cAAc,IAAI;AAC1G,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,OAAO;AAAA,QACjB,OAAO,OAAO;AAAA,QACd,QAAQ,UAAU,KAAK;AAAA,QACvB,SAAS,UAAU,KAAK;AAAA,QACxB,SAAS,OAAO,QAAQ;AAAA,QACxB,YAAY,OAAO,QAAQ;AAAA,QAC3B,SAAS,UAAU,KAAK;AAAA,QACxB,OAAO,OAAO,QAAQ;AAAA,QACtB,mBAAmB,OAAO,KAAK;AAAA,QAC/B,SAAS,OAAO,KAAK;AAAA,QACrB,mBAAmB,OAAO,KAAK;AAAA,QAC/B,aAAa,OAAO;AAAA,QACpB,YAAY,OAAO,KAAK;AAAA,QACxB,cAAc,OAAO,KAAK;AAAA,QAC1B,aAAa,OAAO,KAAK;AAAA,QACzB,aAAa,UAAU,KAAK,QAAQ,OAAO,QAAQ;AAAA,QACnD,QAAQ,UAAU,KAAK;AAAA,QACvB,aAAa,UAAU,KAAK;AAAA,QAC5B,OAAO,QAAQ,UAAU,KAAK,KAAK;AAAA,QACnC,SAAS,QAAQ,UAAU,KAAK,OAAO;AAAA,MACzC;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACL;;;A9B9MA,SAAS,iBAAyB;AAChC,MAAI;AACF,UAAM,kBAAkB,cAAc,YAAY,GAAG;AACrD,UAAM,kBAAkBG,MAAK,QAAQA,MAAK,QAAQ,eAAe,GAAG,MAAM,cAAc;AACxF,UAAM,MAAMC,KAAG,aAAa,iBAAiB,MAAM;AACnD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,OAAO,WAAW;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,MAAyB;AACjD,SAAO,KAAK,SAAS,QAAQ;AAC/B;AAEA,SAAS,oBAAoB,OAAgB,QAAuB;AAClE,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,MAAI,QAAQ;AACV,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,OAAO,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AACvE;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,UAAU,OAAO;AAAA,CAAI;AAC5C;AAEA,eAAsB,IAAI,MAA+B;AACvD,QAAM,UAAU,IAAI,QAAQ;AAC5B,UACG,KAAK,WAAW,EAChB,YAAY,yCAAyC,EACrD,QAAQ,eAAe,CAAC,EACxB,OAAO,UAAU,wBAAwB,EACzC,OAAO,cAAc,wBAAwB,EAC7C,mBAAmB;AAEtB,UAAQ,KAAK,aAAa,OAAO,UAAU,kBAAkB;AAC3D,UAAM,aAAa,OAAO,cAAc,cAAc,CAAC,MAAM,WAAW,cAAc,cAAc,CAAC,IAAI;AACzG,UAAM,eAAe,0BAA0B,aAAa;AAC5D,UAAM,UAAU,MAAM,qBAAqB,YAAY,YAAY;AACnE,+BAA2B,eAAe,OAAO;AAAA,EACnD,CAAC;AAED,sBAAoB,OAAO;AAC3B,yBAAuB,OAAO;AAC9B,sBAAoB,OAAO;AAC3B,uBAAqB,OAAO;AAC5B,yBAAuB,OAAO;AAE9B,MAAI;AACF,UAAM,QAAQ,WAAW,IAAI;AAAA,EAC/B,SAAS,OAAO;AACd,wBAAoB,OAAO,iBAAiB,IAAI,CAAC;AACjD,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,IAAI,QAAQ,IAAI,EAAE,MAAM,CAAC,UAAmB;AAC1C,sBAAoB,OAAO,iBAAiB,QAAQ,IAAI,CAAC;AACzD,UAAQ,WAAW;AACrB,CAAC;","names":["fs","path","fs","z","fs","path","fs","path","path","fs","fs","path","uniqueLabels","summarizeLineRange","buildSkippedPatterns","fs","path","path","fs","countSkippedSecurityPatterns","formatPercent","beforeIndex","afterIndex","fs","z","z","z","z","passedAssertions","z","z","z","fs","z","fs","fs","z","fs","path","z","z","fs","path","envValue","wait","z","fs","fs","ora","z","z","DEFAULT_ANTHROPIC_MODEL","DEFAULT_OPENAI_MODEL","resolveModel","ora","fs","fs","ora","z","z","DEFAULT_ANTHROPIC_MODEL","DEFAULT_OPENAI_MODEL","collectPluginPaths","resolveModel","ora","fs","ora","z","fs","path","yaml","z","z","calculateEvalAssertPassRate","extractJsonObject","yaml","path","fs","z","DEFAULT_ANTHROPIC_MODEL","DEFAULT_OPENAI_MODEL","collectPluginPaths","resolveModel","ora","path","fs"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/lint.ts","../src/core/skill-parser.ts","../src/core/linter/compat.ts","../src/core/linter/markdown-zones.ts","../src/core/linter/content.ts","../src/core/linter/disclosure.ts","../src/utils/fs.ts","../src/core/linter/frontmatter.ts","../src/core/linter/plugin.ts","../src/core/linter/security.ts","../src/core/linter/structure.ts","../src/core/linter/index.ts","../src/reporters/html.ts","../src/reporters/terminal.ts","../src/commands/common.ts","../src/core/eval-runner.ts","../src/core/grader.ts","../src/utils/concurrency.ts","../src/core/tool-environment.ts","../src/core/trigger-tester.ts","../src/reporters/json.ts","../src/commands/trigger.ts","../src/utils/config.ts","../src/providers/anthropic.ts","../src/providers/openai.ts","../src/providers/index.ts","../src/commands/eval.ts","../src/commands/check.ts","../src/core/check-runner.ts","../src/commands/improve.ts","../src/core/improver.ts","../src/commands/route.ts","../src/core/route-tester.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport { registerLintCommand } from \"./commands/lint.js\";\nimport { registerTriggerCommand } from \"./commands/trigger.js\";\nimport { registerEvalCommand } from \"./commands/eval.js\";\nimport { registerCheckCommand } from \"./commands/check.js\";\nimport { registerImproveCommand } from \"./commands/improve.js\";\nimport { registerRouteCommand } from \"./commands/route.js\";\nimport { setCommandExecutionContext } from \"./commands/common.js\";\nimport { extractCliConfigOverrides, resolveConfigContext } from \"./utils/config.js\";\n\nfunction resolveVersion(): string {\n try {\n const currentFilePath = fileURLToPath(import.meta.url);\n const packageJsonPath = path.resolve(path.dirname(currentFilePath), \"..\", \"package.json\");\n const raw = fs.readFileSync(packageJsonPath, \"utf8\");\n const parsed = JSON.parse(raw) as { version?: string };\n return parsed.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nfunction shouldRenderJson(argv: string[]): boolean {\n return argv.includes(\"--json\");\n}\n\nfunction renderTopLevelError(error: unknown, asJson: boolean): void {\n const message = error instanceof Error ? error.message : String(error);\n if (asJson) {\n process.stdout.write(`${JSON.stringify({ error: message }, null, 2)}\\n`);\n return;\n }\n process.stderr.write(`Error: ${message}\\n`);\n}\n\nexport async function run(argv: string[]): Promise<void> {\n const program = new Command();\n program\n .name(\"skilltest\")\n .description(\"The testing framework for Agent Skills.\")\n .version(resolveVersion())\n .option(\"--json\", \"Output results as JSON\")\n .option(\"--no-color\", \"Disable colored output\")\n .showHelpAfterError();\n\n program.hook(\"preAction\", async (_program, actionCommand) => {\n const targetPath = typeof actionCommand.processedArgs[0] === \"string\" ? actionCommand.processedArgs[0] : undefined;\n const cliOverrides = extractCliConfigOverrides(actionCommand);\n const context = await resolveConfigContext(targetPath, cliOverrides);\n setCommandExecutionContext(actionCommand, context);\n });\n\n registerLintCommand(program);\n registerTriggerCommand(program);\n registerEvalCommand(program);\n registerCheckCommand(program);\n registerImproveCommand(program);\n registerRouteCommand(program);\n\n try {\n await program.parseAsync(argv);\n } catch (error) {\n renderTopLevelError(error, shouldRenderJson(argv));\n process.exitCode = 2;\n }\n}\n\nrun(process.argv).catch((error: unknown) => {\n renderTopLevelError(error, shouldRenderJson(process.argv));\n process.exitCode = 2;\n});\n","import fs from \"node:fs/promises\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { lintFails, runLinter } from \"../core/linter/index.js\";\nimport { renderLintHtml } from \"../reporters/html.js\";\nimport { renderLintReport } from \"../reporters/terminal.js\";\nimport { getGlobalCliOptions, getResolvedConfig, writeError, writeResult } from \"./common.js\";\n\nconst lintCliSchema = z.object({\n html: z.string().optional(),\n plugin: z.array(z.string().min(1)).optional()\n});\n\ninterface LintCommandOptions {\n json: boolean;\n color: boolean;\n failOn: \"error\" | \"warn\";\n suppress: string[];\n plugins: string[];\n html?: string;\n}\n\nfunction collectPluginPaths(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nasync function handleLintCommand(targetPath: string, options: LintCommandOptions): Promise<void> {\n try {\n const report = await runLinter(targetPath, { suppress: options.suppress, plugins: options.plugins });\n if (options.json) {\n writeResult(report, true);\n } else {\n writeResult(renderLintReport(report, options.color), false);\n }\n\n if (options.html) {\n await fs.writeFile(options.html, renderLintHtml(report), \"utf8\");\n }\n\n if (lintFails(report, options.failOn)) {\n process.exitCode = 1;\n }\n } catch (error) {\n writeError(error, options.json);\n process.exitCode = 2;\n }\n}\n\nexport function registerLintCommand(program: Command): void {\n program\n .command(\"lint\")\n .description(\"Run static lint checks against a SKILL.md file or skill directory.\")\n .argument(\"<path-to-skill>\", \"Path to SKILL.md or skill directory\")\n .option(\"--html <path>\", \"Write an HTML report to the given file path\")\n .option(\"--plugin <path>\", \"Load a custom lint plugin file\", collectPluginPaths, [])\n .action(async (targetPath: string, _commandOptions: unknown, command: Command) => {\n const globalOptions = getGlobalCliOptions(command);\n const config = getResolvedConfig(command);\n const parsedCli = lintCliSchema.safeParse(command.opts());\n if (!parsedCli.success) {\n writeError(new Error(parsedCli.error.issues[0]?.message ?? \"Invalid lint options.\"), globalOptions.json);\n process.exitCode = 2;\n return;\n }\n\n await handleLintCommand(targetPath, {\n ...globalOptions,\n failOn: config.lint.failOn,\n suppress: config.lint.suppress,\n plugins: config.lint.plugins,\n html: parsedCli.data.html\n });\n });\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport yaml from \"js-yaml\";\nimport { z } from \"zod\";\n\nexport interface SkillFileContext {\n skillRoot: string;\n skillFile: string;\n raw: string;\n lineCount: number;\n}\n\nexport interface FrontmatterParseResult {\n hasFrontmatter: boolean;\n rawFrontmatter: string | null;\n data: Record<string, unknown> | null;\n content: string;\n error: string | null;\n}\n\nconst frontmatterSchema = z\n .object({\n name: z.string(),\n description: z.string(),\n license: z.string().optional()\n })\n .passthrough();\n\nexport type SkillFrontmatter = z.infer<typeof frontmatterSchema>;\n\nexport interface ParsedSkill {\n skillRoot: string;\n skillFile: string;\n raw: string;\n content: string;\n frontmatterRaw: string | null;\n frontmatter: SkillFrontmatter;\n}\n\nconst FRONTMATTER_BLOCK_REGEX = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\nexport async function resolveSkillPath(inputPath: string): Promise<{ skillRoot: string; skillFile: string }> {\n const absoluteInput = path.resolve(inputPath);\n let stat;\n\n try {\n stat = await fs.stat(absoluteInput);\n } catch {\n throw new Error(`Path not found: ${inputPath}`);\n }\n\n if (stat.isDirectory()) {\n const skillFile = path.join(absoluteInput, \"SKILL.md\");\n try {\n const skillStat = await fs.stat(skillFile);\n if (!skillStat.isFile()) {\n throw new Error();\n }\n } catch {\n throw new Error(`No SKILL.md found in directory: ${inputPath}`);\n }\n\n return { skillRoot: absoluteInput, skillFile };\n }\n\n if (!stat.isFile()) {\n throw new Error(`Path is not a file or directory: ${inputPath}`);\n }\n\n if (path.basename(absoluteInput) !== \"SKILL.md\") {\n throw new Error(`Expected SKILL.md or a directory containing SKILL.md. Received: ${inputPath}`);\n }\n\n return { skillRoot: path.dirname(absoluteInput), skillFile: absoluteInput };\n}\n\nexport async function loadSkillFile(inputPath: string): Promise<SkillFileContext> {\n const { skillRoot, skillFile } = await resolveSkillPath(inputPath);\n const raw = await fs.readFile(skillFile, \"utf8\");\n const lineCount = raw === \"\" ? 0 : raw.split(/\\r?\\n/).length;\n\n return { skillRoot, skillFile, raw, lineCount };\n}\n\nexport function parseFrontmatter(rawSkill: string): FrontmatterParseResult {\n const blockMatch = rawSkill.match(FRONTMATTER_BLOCK_REGEX);\n const rawFrontmatter = blockMatch?.[1] ?? null;\n\n if (!rawFrontmatter) {\n return {\n hasFrontmatter: false,\n rawFrontmatter: null,\n data: null,\n content: rawSkill,\n error: null\n };\n }\n\n try {\n const parsedByYaml = yaml.load(rawFrontmatter);\n if (parsedByYaml === null || typeof parsedByYaml !== \"object\" || Array.isArray(parsedByYaml)) {\n return {\n hasFrontmatter: true,\n rawFrontmatter,\n data: null,\n content: rawSkill.replace(FRONTMATTER_BLOCK_REGEX, \"\"),\n error: \"Frontmatter must parse into a YAML object.\"\n };\n }\n\n const parsedByMatter = matter(rawSkill);\n return {\n hasFrontmatter: true,\n rawFrontmatter,\n data: parsedByMatter.data as Record<string, unknown>,\n content: parsedByMatter.content,\n error: null\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown frontmatter parse error\";\n return {\n hasFrontmatter: true,\n rawFrontmatter,\n data: null,\n content: rawSkill.replace(FRONTMATTER_BLOCK_REGEX, \"\"),\n error: message\n };\n }\n}\n\nexport async function parseSkillStrict(inputPath: string): Promise<ParsedSkill> {\n const skillContext = await loadSkillFile(inputPath);\n return parseSkillDocumentStrict(skillContext.raw, skillContext.skillRoot, skillContext.skillFile);\n}\n\nexport function parseSkillDocumentStrict(rawSkill: string, skillRoot: string, skillFile: string): ParsedSkill {\n const parsedFrontmatter = parseFrontmatter(rawSkill);\n\n if (!parsedFrontmatter.hasFrontmatter) {\n throw new Error(\"SKILL.md is missing YAML frontmatter.\");\n }\n\n if (parsedFrontmatter.error) {\n throw new Error(`Invalid frontmatter: ${parsedFrontmatter.error}`);\n }\n\n const validation = frontmatterSchema.safeParse(parsedFrontmatter.data ?? {});\n if (!validation.success) {\n const issue = validation.error.issues[0];\n throw new Error(`Invalid frontmatter field '${issue.path.join(\".\")}': ${issue.message}`);\n }\n\n return {\n skillRoot,\n skillFile,\n raw: rawSkill,\n content: parsedFrontmatter.content,\n frontmatterRaw: parsedFrontmatter.rawFrontmatter,\n frontmatter: validation.data\n };\n}\n\nconst RELATIVE_LINK_PREFIXES = [\"./\", \"../\", \"scripts/\", \"references/\", \"assets/\"];\n\nexport function extractRelativeFileReferences(markdown: string): string[] {\n const references = new Set<string>();\n\n const markdownLinkRegex = /\\[[^\\]]+\\]\\(([^)]+)\\)/g;\n for (const match of markdown.matchAll(markdownLinkRegex)) {\n const rawTarget = (match[1] ?? \"\").trim();\n const cleaned = cleanReferenceTarget(rawTarget);\n if (cleaned && isLikelyRelativePath(cleaned)) {\n references.add(cleaned);\n }\n }\n\n const inlineCodeRegex = /`([^`]+)`/g;\n for (const match of markdown.matchAll(inlineCodeRegex)) {\n const candidate = (match[1] ?? \"\").trim();\n if (isLikelyRelativePath(candidate)) {\n references.add(cleanReferenceTarget(candidate) as string);\n }\n }\n\n const barePathRegex = /\\b(?:scripts|references|assets)\\/[A-Za-z0-9._\\-/]+/g;\n for (const match of markdown.matchAll(barePathRegex)) {\n const candidate = match[0];\n if (candidate) {\n references.add(cleanReferenceTarget(candidate) as string);\n }\n }\n\n return Array.from(references);\n}\n\nexport function cleanReferenceTarget(target: string): string | null {\n if (!target) {\n return null;\n }\n\n let cleaned = target.trim();\n\n if (cleaned.startsWith(\"<\") && cleaned.endsWith(\">\")) {\n cleaned = cleaned.slice(1, -1).trim();\n }\n\n if (cleaned === \"\" || cleaned.startsWith(\"#\")) {\n return null;\n }\n\n if (/^(https?:|mailto:|tel:)/i.test(cleaned)) {\n return null;\n }\n\n const hashIndex = cleaned.indexOf(\"#\");\n if (hashIndex >= 0) {\n cleaned = cleaned.slice(0, hashIndex).trim();\n }\n\n return cleaned || null;\n}\n\nexport function isLikelyRelativePath(candidate: string): boolean {\n if (!candidate) {\n return false;\n }\n\n if (candidate.startsWith(\"/\")) {\n return false;\n }\n\n if (/^[A-Za-z]:\\\\/.test(candidate)) {\n return false;\n }\n\n if (/^(https?:|mailto:|tel:)/i.test(candidate)) {\n return false;\n }\n\n if (RELATIVE_LINK_PREFIXES.some((prefix) => candidate.startsWith(prefix))) {\n return true;\n }\n\n return /^[A-Za-z0-9._-]+(?:\\/[A-Za-z0-9._-]+)+$/.test(candidate);\n}\n","import { LintContext } from \"./context.js\";\nimport { LintIssue } from \"./types.js\";\n\nexport function runCompatibilityChecks(context: LintContext): LintIssue[] {\n const issues: LintIssue[] = [];\n const frontmatter = context.frontmatter.data ?? {};\n const body = context.frontmatter.content;\n\n const hasAllowedTools = Object.prototype.hasOwnProperty.call(frontmatter, \"allowed-tools\");\n const mentionsClaudeOnly = /\\bclaude code\\b/i.test(body);\n const mentionsCodexOnly = /\\bcodex\\b/i.test(body) && !/\\bopenai\\b/i.test(body);\n\n if (hasAllowedTools) {\n issues.push({\n id: \"compat.allowed-tools\",\n checkId: \"compat:frontmatter\",\n title: \"Platform-Specific Frontmatter\",\n status: \"warn\",\n message: \"Frontmatter includes allowed-tools, which is typically Claude-specific.\",\n suggestion: \"Document fallback behavior for platforms that ignore allowed-tools.\"\n });\n } else {\n issues.push({\n id: \"compat.allowed-tools\",\n checkId: \"compat:frontmatter\",\n title: \"Platform-Specific Frontmatter\",\n status: \"pass\",\n message: \"No known provider-specific frontmatter keys detected.\"\n });\n }\n\n if (mentionsClaudeOnly || mentionsCodexOnly) {\n const platform = mentionsClaudeOnly ? \"Claude\" : \"Codex\";\n issues.push({\n id: \"compat.provider-phrasing\",\n checkId: \"compat:provider-language\",\n title: \"Provider-Specific Language\",\n status: \"warn\",\n message: `Skill body appears tuned to ${platform}-specific behavior.`,\n suggestion: \"Add neutral instructions or an explicit compatibility note for other agents.\"\n });\n } else {\n issues.push({\n id: \"compat.provider-phrasing\",\n checkId: \"compat:provider-language\",\n title: \"Provider-Specific Language\",\n status: \"pass\",\n message: \"Skill body appears provider-neutral.\"\n });\n }\n\n const likelyCompatibility = hasAllowedTools || mentionsClaudeOnly || mentionsCodexOnly\n ? \"Likely compatible with some agents, but includes platform-specific assumptions.\"\n : \"Likely broadly compatible across Anthropic, OpenAI/Codex-style, and other markdown skill runners.\";\n\n issues.push({\n id: \"compat.summary\",\n checkId: \"compat:summary\",\n title: \"Compatibility Hint\",\n status: hasAllowedTools || mentionsClaudeOnly || mentionsCodexOnly ? \"warn\" : \"pass\",\n message: likelyCompatibility\n });\n\n return issues;\n}\n","export type ZoneType = \"frontmatter\" | \"prose\" | \"code-fence\" | \"inline-code\" | \"blockquote\" | \"html-comment\";\n\nexport interface Zone {\n type: ZoneType;\n content: string;\n startLine: number;\n endLine: number;\n}\n\ninterface BodySlice {\n bodyLines: string[];\n bodyStartLine: number;\n}\n\ninterface OpenCodeFence {\n delimiter: string;\n zone: Zone;\n}\n\nfunction splitLines(raw: string): string[] {\n return raw.split(/\\r?\\n/);\n}\n\nfunction stripTopFrontmatter(raw: string): BodySlice {\n const lines = splitLines(raw);\n if (lines[0] !== \"---\") {\n return {\n bodyLines: lines,\n bodyStartLine: 1\n };\n }\n\n for (let index = 1; index < lines.length; index += 1) {\n if (lines[index] === \"---\") {\n return {\n bodyLines: lines.slice(index + 1),\n bodyStartLine: index + 2\n };\n }\n }\n\n return {\n bodyLines: lines,\n bodyStartLine: 1\n };\n}\n\nfunction matchCodeFenceOpener(line: string): string | null {\n const match = line.match(/^\\s*(`{3,}|~{3,})(.*)$/);\n return match?.[1] ?? null;\n}\n\nfunction isExactCodeFenceCloser(line: string, delimiter: string): boolean {\n return line.trim() === delimiter;\n}\n\nfunction appendZone(zones: Zone[], type: ZoneType, content: string, startLine: number, endLine: number): void {\n if (content === \"\") {\n return;\n }\n\n const previous = zones[zones.length - 1];\n if (previous && previous.type === type && startLine <= previous.endLine + 1) {\n const separator = startLine > previous.endLine ? \"\\n\" : \"\";\n previous.content += `${separator}${content}`;\n previous.endLine = endLine;\n return;\n }\n\n zones.push({\n type,\n content,\n startLine,\n endLine\n });\n}\n\nfunction appendToOpenZone(zone: Zone, content: string, lineNumber: number): void {\n if (content === \"\") {\n if (lineNumber > zone.endLine) {\n zone.content += \"\\n\";\n zone.endLine = lineNumber;\n }\n return;\n }\n\n const separator = lineNumber > zone.endLine ? \"\\n\" : \"\";\n zone.content += `${separator}${content}`;\n zone.endLine = lineNumber;\n}\n\nfunction addInlineAwareText(zones: Zone[], text: string, lineNumber: number, baseType: \"prose\" | \"blockquote\"): void {\n if (text === \"\") {\n return;\n }\n\n let cursor = 0;\n while (cursor < text.length) {\n const inlineStart = text.indexOf(\"`\", cursor);\n if (inlineStart === -1) {\n appendZone(zones, baseType, text.slice(cursor), lineNumber, lineNumber);\n return;\n }\n\n if (inlineStart > cursor) {\n appendZone(zones, baseType, text.slice(cursor, inlineStart), lineNumber, lineNumber);\n }\n\n const inlineEnd = text.indexOf(\"`\", inlineStart + 1);\n if (inlineEnd === -1) {\n appendZone(zones, baseType, text.slice(inlineStart), lineNumber, lineNumber);\n return;\n }\n\n appendZone(zones, \"inline-code\", text.slice(inlineStart, inlineEnd + 1), lineNumber, lineNumber);\n cursor = inlineEnd + 1;\n }\n}\n\nexport function parseZones(raw: string): Zone[] {\n const { bodyLines, bodyStartLine } = stripTopFrontmatter(raw);\n const zones: Zone[] = [];\n let openCodeFence: OpenCodeFence | null = null;\n let openComment: Zone | null = null;\n\n for (const [index, line] of bodyLines.entries()) {\n const lineNumber = bodyStartLine + index;\n\n if (openCodeFence) {\n appendToOpenZone(openCodeFence.zone, line, lineNumber);\n if (isExactCodeFenceCloser(line, openCodeFence.delimiter)) {\n zones.push(openCodeFence.zone);\n openCodeFence = null;\n }\n continue;\n }\n\n if (!openComment) {\n const fenceDelimiter = matchCodeFenceOpener(line);\n if (fenceDelimiter) {\n openCodeFence = {\n delimiter: fenceDelimiter,\n zone: {\n type: \"code-fence\",\n content: line,\n startLine: lineNumber,\n endLine: lineNumber\n }\n };\n continue;\n }\n }\n\n const baseType: \"prose\" | \"blockquote\" = /^\\s*>/.test(line) ? \"blockquote\" : \"prose\";\n let cursor = 0;\n\n while (cursor < line.length || openComment) {\n if (openComment) {\n const closeIndex = line.indexOf(\"-->\", cursor);\n if (closeIndex === -1) {\n appendToOpenZone(openComment, line.slice(cursor), lineNumber);\n cursor = line.length;\n break;\n }\n\n appendToOpenZone(openComment, line.slice(cursor, closeIndex + 3), lineNumber);\n zones.push(openComment);\n openComment = null;\n cursor = closeIndex + 3;\n continue;\n }\n\n if (cursor >= line.length) {\n break;\n }\n\n const commentStart = line.indexOf(\"<!--\", cursor);\n const textEnd = commentStart === -1 ? line.length : commentStart;\n\n if (textEnd > cursor) {\n addInlineAwareText(zones, line.slice(cursor, textEnd), lineNumber, baseType);\n }\n\n if (commentStart === -1) {\n break;\n }\n\n const commentEnd = line.indexOf(\"-->\", commentStart + 4);\n if (commentEnd === -1) {\n openComment = {\n type: \"html-comment\",\n content: line.slice(commentStart),\n startLine: lineNumber,\n endLine: lineNumber\n };\n break;\n }\n\n appendZone(zones, \"html-comment\", line.slice(commentStart, commentEnd + 3), lineNumber, lineNumber);\n cursor = commentEnd + 3;\n }\n }\n\n if (openComment) {\n zones.push(openComment);\n }\n\n if (openCodeFence) {\n zones.push(openCodeFence.zone);\n }\n\n return zones;\n}\n","import { LintContext } from \"./context.js\";\nimport { parseZones, Zone } from \"./markdown-zones.js\";\nimport { LintIssue, LintSkippedPattern } from \"./types.js\";\n\nconst VAGUE_PATTERNS = [\n /\\bdo something appropriate\\b/i,\n /\\bhandle as needed\\b/i,\n /\\buse best judgment\\b/i,\n /\\bif possible\\b/i,\n /\\bwhen relevant\\b/i,\n /\\bdo what seems right\\b/i\n];\n\nconst SECRET_PATTERNS: Array<{ label: string; regex: RegExp }> = [\n { label: \"OpenAI key\", regex: /\\bsk-[A-Za-z0-9]{20,}\\b/ },\n { label: \"AWS access key\", regex: /\\bAKIA[0-9A-Z]{16}\\b/ },\n { label: \"GitHub token\", regex: /\\bghp_[A-Za-z0-9]{20,}\\b/ },\n { label: \"Slack token\", regex: /\\bxox[baprs]-[A-Za-z0-9-]{20,}\\b/ },\n { label: \"Generic private key header\", regex: /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/ }\n];\n\ninterface SecretOccurrence extends LintSkippedPattern {}\n\nfunction summarizeLineRange(matches: SecretOccurrence[]): Pick<LintIssue, \"startLine\" | \"endLine\"> {\n if (matches.length === 0) {\n return {};\n }\n\n return {\n startLine: Math.min(...matches.map((match) => match.startLine)),\n endLine: Math.max(...matches.map((match) => match.endLine))\n };\n}\n\nfunction uniqueLabels(matches: SecretOccurrence[]): string[] {\n const labels: string[] = [];\n const seen = new Set<string>();\n for (const match of matches) {\n if (seen.has(match.label)) {\n continue;\n }\n seen.add(match.label);\n labels.push(match.label);\n }\n return labels;\n}\n\nfunction collectSecretMatches(zones: Zone[]): { prose: SecretOccurrence[]; nonProse: SecretOccurrence[] } {\n const prose: SecretOccurrence[] = [];\n const nonProse: SecretOccurrence[] = [];\n\n for (const zone of zones) {\n for (const pattern of SECRET_PATTERNS) {\n if (!pattern.regex.test(zone.content)) {\n continue;\n }\n\n const occurrence: SecretOccurrence = {\n label: pattern.label,\n zoneType: zone.type,\n startLine: zone.startLine,\n endLine: zone.endLine\n };\n\n if (zone.type === \"prose\") {\n prose.push(occurrence);\n } else {\n nonProse.push(occurrence);\n }\n }\n }\n\n return { prose, nonProse };\n}\n\nfunction buildSkippedPatterns(matches: SecretOccurrence[]): LintSkippedPattern[] | undefined {\n if (matches.length === 0) {\n return undefined;\n }\n\n return matches.map((match) => ({\n label: match.label,\n zoneType: match.zoneType,\n startLine: match.startLine,\n endLine: match.endLine\n }));\n}\n\nfunction buildSecretsIssue(context: LintContext): LintIssue | null {\n if (context.suppressedCheckIds.has(\"content:secrets\")) {\n return null;\n }\n\n const { prose, nonProse } = collectSecretMatches(parseZones(context.skill.raw));\n const proseLabels = uniqueLabels(prose);\n const nonProseLabels = uniqueLabels(nonProse);\n const skippedPatterns = buildSkippedPatterns(nonProse);\n\n if (proseLabels.length > 0) {\n return {\n id: \"content.secrets\",\n checkId: \"content:secrets\",\n title: \"Hardcoded Secrets\",\n status: \"fail\",\n message: `Potential secrets detected (${proseLabels.join(\", \")}).`,\n suggestion: \"Remove secrets from skill files and use environment variables or secret managers.\",\n ...summarizeLineRange(prose),\n skippedPatterns\n };\n }\n\n if (nonProseLabels.length > 0) {\n const codeFenceOnly = nonProse.every((match) => match.zoneType === \"code-fence\");\n return {\n id: \"content.secrets\",\n checkId: \"content:secrets\",\n title: \"Hardcoded Secrets\",\n status: \"warn\",\n message: codeFenceOnly\n ? `Possible secret in code example — verify this is a placeholder, not a real key (${nonProseLabels.join(\", \")}).`\n : `Possible secrets found outside prose instructions (${nonProseLabels.join(\", \")}). Verify these are placeholders, not real credentials.`,\n suggestion: \"Replace real-looking credentials in examples with explicit placeholders such as YOUR_API_KEY.\",\n ...summarizeLineRange(nonProse),\n skippedPatterns\n };\n }\n\n return {\n id: \"content.secrets\",\n checkId: \"content:secrets\",\n title: \"Hardcoded Secrets\",\n status: \"pass\",\n message: \"No obvious API keys or secrets patterns were detected.\"\n };\n}\n\nexport function runContentChecks(context: LintContext): LintIssue[] {\n const issues: LintIssue[] = [];\n const body = context.frontmatter.content;\n const bodyLines = body\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n const description = typeof context.frontmatter.data?.description === \"string\" ? context.frontmatter.data.description : \"\";\n\n if (!/^#{1,6}\\s+\\S+/m.test(body)) {\n issues.push({\n id: \"content.headers\",\n checkId: \"content:headers\",\n title: \"Section Headers\",\n status: \"warn\",\n message: \"No markdown headers found in SKILL.md body.\",\n suggestion: \"Add section headers to improve scannability and maintenance.\"\n });\n } else {\n issues.push({\n id: \"content.headers\",\n checkId: \"content:headers\",\n title: \"Section Headers\",\n status: \"pass\",\n message: \"SKILL.md contains markdown section headers.\"\n });\n }\n\n const hasExamples = /example/i.test(body) || /```[\\s\\S]*?```/.test(body);\n if (!hasExamples) {\n issues.push({\n id: \"content.examples\",\n checkId: \"content:examples\",\n title: \"Examples\",\n status: \"warn\",\n message: \"No examples detected in SKILL.md body.\",\n suggestion: \"Add at least one concrete example to guide usage.\"\n });\n } else {\n issues.push({\n id: \"content.examples\",\n checkId: \"content:examples\",\n title: \"Examples\",\n status: \"pass\",\n message: \"Examples were detected in SKILL.md.\"\n });\n }\n\n const vagueMatches = VAGUE_PATTERNS.filter((pattern) => pattern.test(body));\n if (vagueMatches.length > 0) {\n issues.push({\n id: \"content.vagueness\",\n checkId: \"content:vagueness\",\n title: \"Instruction Specificity\",\n status: \"warn\",\n message: \"Potentially vague instruction phrases detected.\",\n suggestion: \"Replace vague guidance with explicit decision rules or step-by-step instructions.\"\n });\n } else {\n issues.push({\n id: \"content.vagueness\",\n checkId: \"content:vagueness\",\n title: \"Instruction Specificity\",\n status: \"pass\",\n message: \"No obvious vague placeholder phrasing found.\"\n });\n }\n\n const secretsIssue = buildSecretsIssue(context);\n if (secretsIssue) {\n issues.push(secretsIssue);\n }\n\n if (bodyLines.length < 10) {\n issues.push({\n id: \"content.body-length\",\n checkId: \"content:body-length\",\n title: \"Body Completeness\",\n status: \"warn\",\n message: `SKILL.md body has only ${bodyLines.length} non-empty lines.`,\n suggestion: \"Add more detailed instructions; short bodies are often incomplete.\"\n });\n } else {\n issues.push({\n id: \"content.body-length\",\n checkId: \"content:body-length\",\n title: \"Body Completeness\",\n status: \"pass\",\n message: `SKILL.md body has ${bodyLines.length} non-empty lines.`\n });\n }\n\n if (description && description.length < 50) {\n issues.push({\n id: \"content.description-length\",\n checkId: \"content:description-length\",\n title: \"Description Specificity\",\n status: \"warn\",\n message: `Description length is ${description.length} characters, which may be too vague for reliable triggering.`,\n suggestion: \"Expand description with concrete scope and activation conditions.\"\n });\n } else if (description) {\n issues.push({\n id: \"content.description-length\",\n checkId: \"content:description-length\",\n title: \"Description Specificity\",\n status: \"pass\",\n message: \"Description length is sufficient for triggerability heuristics.\"\n });\n }\n\n return issues;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n cleanReferenceTarget,\n extractRelativeFileReferences,\n isLikelyRelativePath\n} from \"../skill-parser.js\";\nimport { pathExists, toPosixPath } from \"../../utils/fs.js\";\nimport { LintContext } from \"./context.js\";\nimport { LintIssue } from \"./types.js\";\n\nfunction isPathInsideRoot(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return !relative.startsWith(\"..\") && !path.isAbsolute(relative);\n}\n\nasync function detectNestedReferenceChain(skillRoot: string, rootContent: string): Promise<number> {\n const initialReferences = extractRelativeFileReferences(rootContent);\n let maxDepth = 0;\n\n for (const reference of initialReferences) {\n const firstLevelPath = path.resolve(skillRoot, reference);\n if (!(await pathExists(firstLevelPath))) {\n continue;\n }\n const firstLevelRaw = await fs.readFile(firstLevelPath, \"utf8\");\n const secondLevelRefs = extractRelativeFileReferences(firstLevelRaw);\n if (secondLevelRefs.length > 0) {\n maxDepth = Math.max(maxDepth, 1);\n }\n\n for (const secondLevelReference of secondLevelRefs) {\n const secondLevelPath = path.resolve(path.dirname(firstLevelPath), secondLevelReference);\n if (!(await pathExists(secondLevelPath))) {\n continue;\n }\n const secondLevelRaw = await fs.readFile(secondLevelPath, \"utf8\");\n const thirdLevelRefs = extractRelativeFileReferences(secondLevelRaw);\n if (thirdLevelRefs.length > 0) {\n maxDepth = Math.max(maxDepth, 2);\n }\n }\n }\n\n return maxDepth;\n}\n\nexport async function runDisclosureChecks(context: LintContext): Promise<LintIssue[]> {\n const issues: LintIssue[] = [];\n const references = extractRelativeFileReferences(context.skill.raw);\n const referencesDir = path.join(context.skill.skillRoot, \"references\");\n\n if (context.skill.lineCount > 200 && !(await pathExists(referencesDir))) {\n issues.push({\n id: \"disclosure.skill-split\",\n checkId: \"disclosure:progressive-disclosure\",\n title: \"Progressive Disclosure\",\n status: \"warn\",\n message: \"SKILL.md exceeds 200 lines and no references/ directory is present.\",\n suggestion: \"Move detailed material into references/ files and keep SKILL.md focused.\"\n });\n } else {\n issues.push({\n id: \"disclosure.skill-split\",\n checkId: \"disclosure:progressive-disclosure\",\n title: \"Progressive Disclosure\",\n status: \"pass\",\n message: \"Top-level file length and references/ usage look reasonable.\"\n });\n }\n\n const nonRelativeOrEscaping: string[] = [];\n for (const rawReference of references) {\n const cleaned = cleanReferenceTarget(rawReference);\n if (!cleaned) {\n continue;\n }\n if (path.isAbsolute(cleaned) || /^[A-Za-z]:\\\\/.test(cleaned) || cleaned.startsWith(\"~\")) {\n nonRelativeOrEscaping.push(cleaned);\n continue;\n }\n if (!isLikelyRelativePath(cleaned)) {\n nonRelativeOrEscaping.push(cleaned);\n continue;\n }\n const resolved = path.resolve(context.skill.skillRoot, cleaned);\n if (!isPathInsideRoot(context.skill.skillRoot, resolved)) {\n nonRelativeOrEscaping.push(cleaned);\n }\n }\n\n if (nonRelativeOrEscaping.length > 0) {\n issues.push({\n id: \"disclosure.relative-path-root\",\n checkId: \"disclosure:path-scope\",\n title: \"Reference Path Scope\",\n status: \"fail\",\n message: `Found non-relative or out-of-root references: ${nonRelativeOrEscaping.join(\", \")}`,\n suggestion: \"Use relative paths that stay within the skill root directory.\"\n });\n } else {\n issues.push({\n id: \"disclosure.relative-path-root\",\n checkId: \"disclosure:path-scope\",\n title: \"Reference Path Scope\",\n status: \"pass\",\n message: \"All detected file references are relative and scoped to skill root.\"\n });\n }\n\n const chainDepth = await detectNestedReferenceChain(context.skill.skillRoot, context.skill.raw);\n if (chainDepth > 1) {\n issues.push({\n id: \"disclosure.reference-depth\",\n checkId: \"disclosure:reference-depth\",\n title: \"Reference Chain Depth\",\n status: \"warn\",\n message: \"Deep reference chains detected (>1 level).\",\n suggestion: \"Avoid linking from references to more nested references where possible.\"\n });\n } else {\n issues.push({\n id: \"disclosure.reference-depth\",\n checkId: \"disclosure:reference-depth\",\n title: \"Reference Chain Depth\",\n status: \"pass\",\n message: \"Reference depth is shallow and easy to navigate.\"\n });\n }\n\n const normalizedReferences = references.map((item) => toPosixPath(item));\n if (normalizedReferences.some((item) => item.includes(\"../\"))) {\n issues.push({\n id: \"disclosure.parent-traversal\",\n checkId: \"disclosure:parent-traversal\",\n title: \"Parent Traversal\",\n status: \"warn\",\n message: \"References include parent-directory traversal (../).\",\n suggestion: \"Prefer references rooted within the skill directory for portability.\"\n });\n } else {\n issues.push({\n id: \"disclosure.parent-traversal\",\n checkId: \"disclosure:parent-traversal\",\n title: \"Parent Traversal\",\n status: \"pass\",\n message: \"No parent-directory traversal references detected.\"\n });\n }\n\n return issues;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function pathExists(targetPath: string): Promise<boolean> {\n try {\n await fs.access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function listFilesRecursive(directory: string): Promise<string[]> {\n const entries = await fs.readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const absolutePath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listFilesRecursive(absolutePath)));\n continue;\n }\n if (entry.isFile()) {\n files.push(absolutePath);\n }\n }\n\n return files;\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nexport async function writeJsonFile(filePath: string, data: unknown): Promise<void> {\n const absolute = path.resolve(filePath);\n await fs.mkdir(path.dirname(absolute), { recursive: true });\n await fs.writeFile(absolute, `${JSON.stringify(data, null, 2)}\\n`, \"utf8\");\n}\n\nexport function toPosixPath(inputPath: string): string {\n return inputPath.split(path.sep).join(\"/\");\n}\n","import { LintContext } from \"./context.js\";\nimport { LintIssue } from \"./types.js\";\n\nconst SKILL_NAME_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nfunction getStringField(data: Record<string, unknown> | null, key: string): string | null {\n if (!data) {\n return null;\n }\n const value = data[key];\n if (typeof value !== \"string\") {\n return null;\n }\n return value;\n}\n\nfunction descriptionLooksActionable(description: string): boolean {\n const whatPattern =\n /\\b(create|build|generate|analyze|test|validate|review|refactor|debug|audit|compose|transform|summari[sz]e|plan)\\b/i;\n const whenPattern = /\\b(when|if|for|whenever|use this|ideal for|best for|should use)\\b/i;\n return whatPattern.test(description) && whenPattern.test(description);\n}\n\nexport function runFrontmatterChecks(context: LintContext): LintIssue[] {\n const issues: LintIssue[] = [];\n\n if (!context.frontmatter.hasFrontmatter) {\n issues.push({\n id: \"frontmatter.exists\",\n checkId: \"frontmatter:exists\",\n title: \"Frontmatter Presence\",\n status: \"fail\",\n message: \"SKILL.md is missing YAML frontmatter delimited by --- blocks.\",\n suggestion: \"Add YAML frontmatter at the top with at least name and description.\"\n });\n return issues;\n }\n\n if (context.frontmatter.error) {\n issues.push({\n id: \"frontmatter.valid-yaml\",\n checkId: \"frontmatter:yaml\",\n title: \"Frontmatter YAML\",\n status: \"fail\",\n message: `Frontmatter is not valid YAML: ${context.frontmatter.error}`,\n suggestion: \"Fix YAML syntax so the frontmatter parses as an object.\"\n });\n return issues;\n }\n\n issues.push({\n id: \"frontmatter.valid-yaml\",\n checkId: \"frontmatter:yaml\",\n title: \"Frontmatter YAML\",\n status: \"pass\",\n message: \"Frontmatter exists and parses correctly.\"\n });\n\n const data = context.frontmatter.data ?? {};\n const name = getStringField(data, \"name\");\n if (!name) {\n issues.push({\n id: \"frontmatter.name.required\",\n checkId: \"frontmatter:name\",\n title: \"Frontmatter Name\",\n status: \"fail\",\n message: \"Missing required frontmatter field: name.\",\n suggestion: \"Set name to lowercase words separated by single hyphens.\"\n });\n } else if (name.length > 64) {\n issues.push({\n id: \"frontmatter.name.length\",\n checkId: \"frontmatter:name\",\n title: \"Frontmatter Name Length\",\n status: \"fail\",\n message: `name is too long (${name.length} chars, max 64).`,\n suggestion: \"Shorten the skill name to 64 characters or fewer.\"\n });\n } else if (!SKILL_NAME_REGEX.test(name)) {\n issues.push({\n id: \"frontmatter.name.format\",\n checkId: \"frontmatter:name\",\n title: \"Frontmatter Name Format\",\n status: \"fail\",\n message: \"name must be lowercase alphanumeric with single hyphen separators only.\",\n suggestion: \"Use format like 'api-tester' or 'code-review'.\"\n });\n } else {\n issues.push({\n id: \"frontmatter.name.valid\",\n checkId: \"frontmatter:name\",\n title: \"Frontmatter Name\",\n status: \"pass\",\n message: \"name is present and follows naming conventions.\"\n });\n }\n\n const description = getStringField(data, \"description\");\n if (!description || description.trim() === \"\") {\n issues.push({\n id: \"frontmatter.description.required\",\n checkId: \"frontmatter:description\",\n title: \"Frontmatter Description\",\n status: \"fail\",\n message: \"Missing required frontmatter field: description.\",\n suggestion: \"Add a clear description of what the skill does and when to use it.\"\n });\n } else if (description.length > 1024) {\n issues.push({\n id: \"frontmatter.description.length\",\n checkId: \"frontmatter:description\",\n title: \"Frontmatter Description Length\",\n status: \"fail\",\n message: `description is too long (${description.length} chars, max 1024).`,\n suggestion: \"Keep description concise while still specific.\"\n });\n } else {\n issues.push({\n id: \"frontmatter.description.valid\",\n checkId: \"frontmatter:description\",\n title: \"Frontmatter Description\",\n status: \"pass\",\n message: \"description is present and within allowed length.\"\n });\n }\n\n const license = getStringField(data, \"license\");\n if (!license || license.trim() === \"\") {\n issues.push({\n id: \"frontmatter.license.recommended\",\n checkId: \"frontmatter:license\",\n title: \"Frontmatter License\",\n status: \"warn\",\n message: \"No license field found in frontmatter.\",\n suggestion: \"Add a license (for example: MIT) to clarify reuse terms.\"\n });\n } else {\n issues.push({\n id: \"frontmatter.license.present\",\n checkId: \"frontmatter:license\",\n title: \"Frontmatter License\",\n status: \"pass\",\n message: \"license field is present.\"\n });\n }\n\n if (context.frontmatter.rawFrontmatter && /[<>]/.test(context.frontmatter.rawFrontmatter)) {\n issues.push({\n id: \"frontmatter.angle-brackets\",\n checkId: \"frontmatter:angle-brackets\",\n title: \"Frontmatter Angle Brackets\",\n status: \"warn\",\n message: \"Frontmatter contains angle bracket characters (< or >), which can be misinterpreted in some agents.\",\n suggestion: \"Remove XML-like tags from frontmatter values when possible.\"\n });\n } else {\n issues.push({\n id: \"frontmatter.angle-brackets\",\n checkId: \"frontmatter:angle-brackets\",\n title: \"Frontmatter Angle Brackets\",\n status: \"pass\",\n message: \"No angle bracket tokens detected in frontmatter.\"\n });\n }\n\n if (description && description.trim() !== \"\" && !descriptionLooksActionable(description)) {\n issues.push({\n id: \"frontmatter.description.triggerability\",\n checkId: \"frontmatter:triggerability\",\n title: \"Description Trigger Clarity\",\n status: \"warn\",\n message: \"Description should explain both what the skill does and when it should be used.\",\n suggestion: \"Include explicit 'use when...' language plus concrete capability wording.\"\n });\n } else if (description) {\n issues.push({\n id: \"frontmatter.description.triggerability\",\n checkId: \"frontmatter:triggerability\",\n title: \"Description Trigger Clarity\",\n status: \"pass\",\n message: \"Description appears to cover both capability and usage context.\"\n });\n }\n\n return issues;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { LintContext } from \"./context.js\";\nimport { LintIssue } from \"./types.js\";\n\nexport interface LintRule {\n checkId: string;\n title: string;\n check: (context: LintContext) => LintIssue[] | Promise<LintIssue[]>;\n}\n\nexport interface LintPlugin {\n rules: LintRule[];\n}\n\nfunction normalizeRuleCheckId(checkId: string): string {\n return checkId.includes(\":\") ? checkId : `plugin:${checkId}`;\n}\n\nfunction buildPluginValidationError(filePath: string, message: string): Error {\n return new Error(`Invalid lint plugin at ${filePath}: ${message}`);\n}\n\nfunction validatePluginCandidate(candidate: unknown, filePath: string, exportName: string): LintPlugin {\n if (!candidate || typeof candidate !== \"object\" || !(\"rules\" in candidate)) {\n throw buildPluginValidationError(filePath, `${exportName} export must be an object with a rules array.`);\n }\n\n const rules = (candidate as { rules?: unknown }).rules;\n if (!Array.isArray(rules)) {\n throw buildPluginValidationError(filePath, `${exportName} export must include a rules array.`);\n }\n\n return {\n rules: rules.map((rule, index) => {\n if (!rule || typeof rule !== \"object\") {\n throw buildPluginValidationError(filePath, `rule at index ${index} must be an object.`);\n }\n\n const checkId = (rule as { checkId?: unknown }).checkId;\n if (typeof checkId !== \"string\" || checkId.trim() === \"\") {\n throw buildPluginValidationError(filePath, `rule at index ${index} must have a non-empty string checkId.`);\n }\n\n const title = (rule as { title?: unknown }).title;\n if (typeof title !== \"string\" || title.trim() === \"\") {\n throw buildPluginValidationError(filePath, `rule at index ${index} must have a non-empty string title.`);\n }\n\n const check = (rule as { check?: unknown }).check;\n if (typeof check !== \"function\") {\n throw buildPluginValidationError(filePath, `rule '${checkId}' must have a check function.`);\n }\n\n return {\n checkId: normalizeRuleCheckId(checkId),\n title,\n check: check as LintRule[\"check\"]\n };\n })\n };\n}\n\nexport async function loadPlugin(filePath: string): Promise<LintPlugin> {\n const absolutePath = path.resolve(filePath);\n\n try {\n await fs.access(absolutePath);\n } catch {\n throw new Error(`Failed to load lint plugin at ${absolutePath}: file does not exist.`);\n }\n\n let loadedModule: Record<string, unknown>;\n try {\n loadedModule = (await import(pathToFileURL(absolutePath).href)) as Record<string, unknown>;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load lint plugin at ${absolutePath}: ${message}`);\n }\n\n const validationErrors: string[] = [];\n for (const [exportName, candidate] of [\n [\"default\", loadedModule.default],\n [\"plugin\", loadedModule.plugin]\n ] as const) {\n if (candidate === undefined) {\n continue;\n }\n\n try {\n return validatePluginCandidate(candidate, absolutePath, exportName);\n } catch (error) {\n validationErrors.push(error instanceof Error ? error.message : String(error));\n }\n }\n\n if (validationErrors.length > 0) {\n throw new Error(validationErrors.join(\" \"));\n }\n\n throw buildPluginValidationError(\n absolutePath,\n \"expected a default export or named export 'plugin' containing a rules array.\"\n );\n}\n\nfunction buildRuleExecutionError(rule: LintRule, error: unknown): LintIssue {\n const message = error instanceof Error ? error.message : String(error);\n return {\n id: `plugin.load-error.${rule.checkId.replace(/[^A-Za-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\").toLowerCase()}`,\n checkId: \"plugin:load-error\",\n title: \"Plugin Rule Error\",\n status: \"fail\",\n message: `Plugin rule '${rule.checkId}' failed: ${message}`\n };\n}\n\nexport async function runPluginRules(plugin: LintPlugin, context: LintContext): Promise<LintIssue[]> {\n const issues: LintIssue[] = [];\n\n for (const rule of plugin.rules) {\n try {\n const result = await rule.check(context);\n if (!Array.isArray(result)) {\n throw new Error(\"check function must return an array of lint issues.\");\n }\n\n issues.push(\n ...result.map((issue) => ({\n ...issue,\n checkId: rule.checkId\n }))\n );\n } catch (error) {\n issues.push(buildRuleExecutionError(rule, error));\n }\n }\n\n return issues;\n}\n","import { LintContext } from \"./context.js\";\nimport { parseZones, Zone, ZoneType } from \"./markdown-zones.js\";\nimport { LintIssue, LintSkippedPattern } from \"./types.js\";\n\ninterface SecurityPattern {\n label: string;\n regex: RegExp;\n}\n\ninterface PatternOccurrence extends LintSkippedPattern {}\n\nconst DANGEROUS_COMMAND_PATTERNS: SecurityPattern[] = [\n {\n label: \"Destructive recursive delete\",\n regex: /\\b(?:sudo\\s+)?rm\\s+-rf\\s+(?:\\/|\\*|~\\/|\\.\\.\\/)/i\n },\n {\n label: \"Forceful recursive remove in PowerShell\",\n regex: /\\bRemove-Item\\b[^\\n]*\\b-Recurse\\b[^\\n]*\\b-Force\\b/i\n },\n {\n label: \"Remote script piped directly to shell\",\n regex: /\\b(?:curl|wget|Invoke-WebRequest)\\b[^\\n|]{0,220}\\|\\s*(?:bash|sh|zsh|pwsh|powershell|iex)\\b/i\n }\n];\n\nconst EXFILTRATION_PATTERNS: SecurityPattern[] = [\n {\n label: \"Reading SSH private keys\",\n regex: /\\b(?:cat|type|get-content)\\b[^\\n]*\\.ssh\\/id_(?:rsa|ed25519)\\b/i\n },\n {\n label: \"Reading cloud credential files\",\n regex: /\\b(?:cat|type|get-content)\\b[^\\n]*(?:\\.aws\\/credentials|\\.npmrc|\\.netrc)\\b/i\n },\n {\n label: \"Explicit credential exfiltration\",\n regex: /\\b(?:send|upload|post|exfiltrat(?:e|ion))\\b[^\\n]{0,200}\\b(?:api[_ -]?key|token|secret|credential|\\.env|id_rsa)\\b/i\n }\n];\n\nconst PRIVILEGE_ESCALATION_PATTERNS: SecurityPattern[] = [\n {\n label: \"Uses sudo/root escalation\",\n regex: /\\b(?:sudo|run as root|administrator privileges)\\b/i\n },\n {\n label: \"Asks to disable sandboxing or approvals\",\n regex: /\\b(?:disable sandbox|without approval|skip approval|require_escalated)\\b/i\n },\n {\n label: \"Inline expression execution\",\n regex: /\\b(?:Invoke-Expression|iex)\\b/i\n }\n];\n\nconst SHELL_ACTIVITY_PATTERNS: RegExp[] = [\n /```(?:bash|sh|zsh|pwsh|powershell|cmd)\\b[\\s\\S]*?```/i,\n /\\b(?:bash|sh|pwsh|powershell|cmd(?:\\.exe)?)\\b/i,\n /\\b(?:npm|pnpm|yarn|pip|git|docker|kubectl)\\s+[A-Za-z0-9-]/i\n];\n\nconst SAFETY_GUARDRAIL_PATTERN =\n /\\b(?:ask before|confirm|approval|dry[- ]run|sandbox|least privilege|redact|never expose|do not reveal)\\b/i;\n\nfunction buildOccurrence(zone: Zone, pattern: SecurityPattern): PatternOccurrence {\n return {\n label: pattern.label,\n zoneType: zone.type,\n startLine: zone.startLine,\n endLine: zone.endLine\n };\n}\n\nfunction collectZoneAwareMatches(zones: Zone[], patterns: SecurityPattern[]): { flagged: PatternOccurrence[]; skipped: PatternOccurrence[] } {\n const flagged: PatternOccurrence[] = [];\n const skipped: PatternOccurrence[] = [];\n\n for (const zone of zones) {\n for (const pattern of patterns) {\n if (!pattern.regex.test(zone.content)) {\n continue;\n }\n\n const occurrence = buildOccurrence(zone, pattern);\n if (zone.type === \"prose\") {\n flagged.push(occurrence);\n } else {\n skipped.push(occurrence);\n }\n }\n }\n\n return { flagged, skipped };\n}\n\nfunction uniqueLabels(matches: PatternOccurrence[]): string[] {\n const labels: string[] = [];\n const seen = new Set<string>();\n for (const match of matches) {\n if (seen.has(match.label)) {\n continue;\n }\n seen.add(match.label);\n labels.push(match.label);\n }\n return labels;\n}\n\nfunction summarizeLineRange(matches: PatternOccurrence[]): Pick<LintIssue, \"startLine\" | \"endLine\"> {\n if (matches.length === 0) {\n return {};\n }\n\n return {\n startLine: Math.min(...matches.map((match) => match.startLine)),\n endLine: Math.max(...matches.map((match) => match.endLine))\n };\n}\n\nfunction buildSkippedPatterns(matches: PatternOccurrence[]): LintSkippedPattern[] | undefined {\n if (matches.length === 0) {\n return undefined;\n }\n return matches.map((match) => ({\n label: match.label,\n zoneType: match.zoneType,\n startLine: match.startLine,\n endLine: match.endLine\n }));\n}\n\nfunction isSuppressed(context: LintContext, checkId: string): boolean {\n return context.suppressedCheckIds.has(checkId);\n}\n\nfunction runZoneAwareSecurityCheck(\n context: LintContext,\n zones: Zone[],\n options: {\n id: string;\n checkId: string;\n title: string;\n statusOnMatch: \"fail\" | \"warn\";\n patterns: SecurityPattern[];\n matchMessagePrefix: string;\n passMessage: string;\n suggestion: string;\n }\n): LintIssue | null {\n if (isSuppressed(context, options.checkId)) {\n return null;\n }\n\n const matches = collectZoneAwareMatches(zones, options.patterns);\n const labels = uniqueLabels(matches.flagged);\n const skippedPatterns = buildSkippedPatterns(matches.skipped);\n\n if (labels.length > 0) {\n return {\n id: options.id,\n checkId: options.checkId,\n title: options.title,\n status: options.statusOnMatch,\n message: `${options.matchMessagePrefix}: ${labels.join(\", \")}.`,\n suggestion: options.suggestion,\n ...summarizeLineRange(matches.flagged),\n skippedPatterns\n };\n }\n\n return {\n id: options.id,\n checkId: options.checkId,\n title: options.title,\n status: \"pass\",\n message: options.passMessage,\n skippedPatterns\n };\n}\n\nexport function runSecurityChecks(context: LintContext): LintIssue[] {\n const issues: LintIssue[] = [];\n const skillText = context.skill.raw;\n const needsZoneParsing =\n !isSuppressed(context, \"security:dangerous-commands\") ||\n !isSuppressed(context, \"security:exfiltration\") ||\n !isSuppressed(context, \"security:privilege-escalation\");\n const zones = needsZoneParsing ? parseZones(skillText) : [];\n\n const dangerousCommandsIssue = runZoneAwareSecurityCheck(context, zones, {\n id: \"security.dangerous-command-patterns\",\n checkId: \"security:dangerous-commands\",\n title: \"Dangerous Command Patterns\",\n statusOnMatch: \"fail\",\n patterns: DANGEROUS_COMMAND_PATTERNS,\n matchMessagePrefix: \"Potentially dangerous command instruction patterns found\",\n passMessage: \"No high-risk destructive or direct pipe-to-shell patterns detected.\",\n suggestion: \"Remove destructive/pipe-exec command examples or wrap them with explicit safety constraints.\"\n });\n if (dangerousCommandsIssue) {\n issues.push(dangerousCommandsIssue);\n }\n\n const exfiltrationIssue = runZoneAwareSecurityCheck(context, zones, {\n id: \"security.exfiltration-patterns\",\n checkId: \"security:exfiltration\",\n title: \"Sensitive Data Exfiltration\",\n statusOnMatch: \"fail\",\n patterns: EXFILTRATION_PATTERNS,\n matchMessagePrefix: \"Possible sensitive data exfiltration patterns found\",\n passMessage: \"No obvious credential access/exfiltration instructions detected.\",\n suggestion: \"Remove instructions that access or transmit secrets/credential files.\"\n });\n if (exfiltrationIssue) {\n issues.push(exfiltrationIssue);\n }\n\n const privilegeEscalationIssue = runZoneAwareSecurityCheck(context, zones, {\n id: \"security.privilege-escalation\",\n checkId: \"security:privilege-escalation\",\n title: \"Privilege Escalation Language\",\n statusOnMatch: \"warn\",\n patterns: PRIVILEGE_ESCALATION_PATTERNS,\n matchMessagePrefix: \"Potentially risky privilege/execution language detected\",\n passMessage: \"No obvious privilege-escalation language detected.\",\n suggestion: \"Prefer least-privilege execution and explicit approval steps for elevated commands.\"\n });\n if (privilegeEscalationIssue) {\n issues.push(privilegeEscalationIssue);\n }\n\n if (!isSuppressed(context, \"security:missing-guardrails\")) {\n const hasShellActivity = SHELL_ACTIVITY_PATTERNS.some((pattern) => pattern.test(skillText));\n if (hasShellActivity && !SAFETY_GUARDRAIL_PATTERN.test(skillText)) {\n issues.push({\n id: \"security.safety-guardrails\",\n checkId: \"security:missing-guardrails\",\n title: \"Execution Safety Guardrails\",\n status: \"warn\",\n message: \"Shell/tool execution is present, but no explicit safety guardrails were detected.\",\n suggestion: \"Add guidance such as approval requirements, dry-run mode, scope checks, and redaction rules.\"\n });\n } else {\n issues.push({\n id: \"security.safety-guardrails\",\n checkId: \"security:missing-guardrails\",\n title: \"Execution Safety Guardrails\",\n status: \"pass\",\n message: hasShellActivity\n ? \"Shell/tool execution instructions include at least one safety guardrail.\"\n : \"No shell/tool execution instructions detected.\"\n });\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { extractRelativeFileReferences } from \"../skill-parser.js\";\nimport { listFilesRecursive, pathExists, toPosixPath } from \"../../utils/fs.js\";\nimport { LintContext } from \"./context.js\";\nimport { LintIssue } from \"./types.js\";\n\nfunction hasTableOfContents(content: string): boolean {\n if (/^#{1,6}\\s+table of contents\\b/im.test(content)) {\n return true;\n }\n return /^\\s*[-*]\\s+\\[[^\\]]+\\]\\(#[^)]+\\)/im.test(content);\n}\n\nfunction classifyReferencePath(relativePath: string): \"scripts\" | \"references\" | \"assets\" | \"other\" {\n const normalized = toPosixPath(relativePath).replace(/^\\.\\//, \"\");\n if (normalized.startsWith(\"scripts/\")) {\n return \"scripts\";\n }\n if (normalized.startsWith(\"references/\")) {\n return \"references\";\n }\n if (normalized.startsWith(\"assets/\")) {\n return \"assets\";\n }\n return \"other\";\n}\n\nexport async function runStructureChecks(context: LintContext): Promise<LintIssue[]> {\n const issues: LintIssue[] = [];\n const references = extractRelativeFileReferences(context.skill.raw);\n\n if (context.skill.lineCount > 500) {\n issues.push({\n id: \"structure.skill-size\",\n checkId: \"structure:file-size\",\n title: \"SKILL.md Size\",\n status: \"warn\",\n message: `SKILL.md is ${context.skill.lineCount} lines (recommended max is 500).`,\n suggestion: \"Split detailed guidance into references/ files.\"\n });\n } else {\n issues.push({\n id: \"structure.skill-size\",\n checkId: \"structure:file-size\",\n title: \"SKILL.md Size\",\n status: \"pass\",\n message: `SKILL.md length is ${context.skill.lineCount} lines.`\n });\n }\n\n const referencesDir = path.join(context.skill.skillRoot, \"references\");\n if (await pathExists(referencesDir)) {\n const files = await listFilesRecursive(referencesDir);\n let oversizedWithoutToc = 0;\n for (const file of files) {\n const raw = await fs.readFile(file, \"utf8\");\n const lineCount = raw === \"\" ? 0 : raw.split(/\\r?\\n/).length;\n if (lineCount > 300 && !hasTableOfContents(raw)) {\n oversizedWithoutToc += 1;\n issues.push({\n id: `structure.references.toc.${toPosixPath(path.relative(context.skill.skillRoot, file))}`,\n checkId: \"structure:toc\",\n title: \"Reference File Navigation\",\n status: \"warn\",\n message: `${toPosixPath(path.relative(context.skill.skillRoot, file))} is ${lineCount} lines and has no table of contents.`,\n suggestion: \"Add a table of contents for long reference files.\"\n });\n }\n }\n\n if (oversizedWithoutToc === 0) {\n issues.push({\n id: \"structure.references.toc\",\n checkId: \"structure:toc\",\n title: \"Reference File Navigation\",\n status: \"pass\",\n message: \"No oversized reference files missing a table of contents.\"\n });\n }\n } else {\n issues.push({\n id: \"structure.references.toc\",\n checkId: \"structure:toc\",\n title: \"Reference File Navigation\",\n status: \"pass\",\n message: \"No references/ directory found, so no long reference files to validate.\"\n });\n }\n\n const missingByType: Record<string, string[]> = {\n scripts: [],\n references: [],\n assets: [],\n other: []\n };\n\n for (const reference of references) {\n const resolved = path.resolve(context.skill.skillRoot, reference);\n if (!(await pathExists(resolved))) {\n const kind = classifyReferencePath(reference);\n missingByType[kind].push(reference);\n }\n }\n\n const categories: Array<{ key: \"scripts\" | \"references\" | \"assets\"; title: string }> = [\n { key: \"scripts\", title: \"Script References\" },\n { key: \"references\", title: \"Reference File Links\" },\n { key: \"assets\", title: \"Asset References\" }\n ];\n\n for (const category of categories) {\n const missing = missingByType[category.key];\n if (missing.length > 0) {\n issues.push({\n id: `structure.${category.key}.exists`,\n checkId: \"structure:references\",\n title: category.title,\n status: \"fail\",\n message: `Missing referenced ${category.key} file(s): ${missing.join(\", \")}`,\n suggestion: \"Create the files or fix the paths in SKILL.md.\"\n });\n } else {\n issues.push({\n id: `structure.${category.key}.exists`,\n checkId: \"structure:references\",\n title: category.title,\n status: \"pass\",\n message: `All referenced ${category.key} files exist.`\n });\n }\n }\n\n const missingGeneric = missingByType.other;\n if (missingGeneric.length > 0) {\n issues.push({\n id: \"structure.relative-links.broken\",\n checkId: \"structure:references\",\n title: \"Relative Links\",\n status: \"fail\",\n message: `Broken relative path reference(s): ${missingGeneric.join(\", \")}`,\n suggestion: \"Fix or remove broken file links.\"\n });\n } else {\n issues.push({\n id: \"structure.relative-links.broken\",\n checkId: \"structure:references\",\n title: \"Relative Links\",\n status: \"pass\",\n message: \"No broken generic relative file references were found.\"\n });\n }\n\n return issues;\n}\n","import { loadSkillFile, parseFrontmatter } from \"../skill-parser.js\";\nimport { runCompatibilityChecks } from \"./compat.js\";\nimport { LintContext } from \"./context.js\";\nimport { runContentChecks } from \"./content.js\";\nimport { runDisclosureChecks } from \"./disclosure.js\";\nimport { runFrontmatterChecks } from \"./frontmatter.js\";\nimport { loadPlugin, runPluginRules } from \"./plugin.js\";\nimport { runSecurityChecks } from \"./security.js\";\nimport { runStructureChecks } from \"./structure.js\";\nimport { LintIssue, LintReport, LintSummary } from \"./types.js\";\nimport { LintFailOn } from \"../../utils/config.js\";\n\nfunction summarizeIssues(issues: LintIssue[]): LintSummary {\n const summary: LintSummary = {\n total: issues.length,\n passed: 0,\n warnings: 0,\n failures: 0\n };\n\n for (const issue of issues) {\n if (issue.status === \"pass\") {\n summary.passed += 1;\n continue;\n }\n if (issue.status === \"warn\") {\n summary.warnings += 1;\n continue;\n }\n summary.failures += 1;\n }\n\n return summary;\n}\n\nexport interface RunLinterOptions {\n suppress?: string[];\n plugins?: string[];\n}\n\nexport function lintFails(report: Pick<LintReport, \"summary\">, failOn: LintFailOn): boolean {\n if (report.summary.failures > 0) {\n return true;\n }\n return failOn === \"warn\" && report.summary.warnings > 0;\n}\n\nexport async function runLinter(inputPath: string, options: RunLinterOptions = {}): Promise<LintReport> {\n const skill = await loadSkillFile(inputPath);\n const frontmatter = parseFrontmatter(skill.raw);\n const suppressedCheckIds = new Set(options.suppress ?? []);\n const context: LintContext = {\n skill,\n frontmatter,\n suppressedCheckIds\n };\n\n const issues: LintIssue[] = [];\n issues.push(...runFrontmatterChecks(context));\n issues.push(...(await runStructureChecks(context)));\n issues.push(...runContentChecks(context));\n issues.push(...runSecurityChecks(context));\n issues.push(...(await runDisclosureChecks(context)));\n issues.push(...runCompatibilityChecks(context));\n\n for (const pluginPath of options.plugins ?? []) {\n const plugin = await loadPlugin(pluginPath);\n issues.push(...(await runPluginRules(plugin, context)));\n }\n\n const filteredIssues = issues.filter((issue) => !suppressedCheckIds.has(issue.checkId));\n\n return {\n target: inputPath,\n issues: filteredIssues,\n summary: summarizeIssues(filteredIssues)\n };\n}\n\nexport type { LintIssue, LintReport, LintSummary } from \"./types.js\";\n","import { CheckRunResult } from \"../core/check-runner.js\";\nimport { EvalPromptResult, EvalResult } from \"../core/eval-runner.js\";\nimport { LintIssue, LintReport } from \"../core/linter/index.js\";\nimport { TriggerTestCaseResult, TriggerTestResult } from \"../core/trigger-tester.js\";\nimport { RouteTestResult } from \"../core/route-tester.js\";\n\ntype HtmlStatus = \"pass\" | \"warn\" | \"fail\" | \"skip\";\n\ninterface StatCard {\n label: string;\n value: string;\n note?: string;\n status?: HtmlStatus;\n}\n\ninterface MetaItem {\n label: string;\n value: string;\n}\n\nfunction escapeHtml(value: string | number | undefined | null): string {\n return String(value ?? \"\")\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(1)}%`;\n}\n\nfunction formatLineRange(startLine?: number, endLine?: number): string | null {\n if (startLine === undefined) {\n return null;\n }\n\n if (endLine === undefined || endLine === startLine) {\n return `line ${startLine}`;\n }\n\n return `lines ${startLine}-${endLine}`;\n}\n\nfunction badgeLabel(status: HtmlStatus): string {\n if (status === \"pass\") {\n return \"PASS\";\n }\n if (status === \"warn\") {\n return \"WARN\";\n }\n if (status === \"fail\") {\n return \"FAIL\";\n }\n return \"SKIP\";\n}\n\nfunction renderBadge(status: HtmlStatus): string {\n return `<span class=\"badge ${status}\">${badgeLabel(status)}</span>`;\n}\n\nfunction renderMetaBadge(label: string): string {\n return `<span class=\"meta-badge\">${escapeHtml(label)}</span>`;\n}\n\nfunction renderStatCards(stats: StatCard[]): string {\n return `<div class=\"stats-grid\">${stats\n .map(\n (stat) => `\n <div class=\"stat-card${stat.status ? ` status-${stat.status}` : \"\"}\">\n <div class=\"stat-label\">${escapeHtml(stat.label)}</div>\n <div class=\"stat-value\">${escapeHtml(stat.value)}</div>\n ${stat.note ? `<div class=\"stat-note\">${escapeHtml(stat.note)}</div>` : \"\"}\n </div>\n `\n )\n .join(\"\")}</div>`;\n}\n\nfunction renderMetaItems(items: MetaItem[]): string {\n if (items.length === 0) {\n return \"\";\n }\n\n return `<div class=\"meta-grid\">${items\n .map(\n (item) => `\n <div class=\"meta-item\">\n <span class=\"meta-label\">${escapeHtml(item.label)}</span>\n <span class=\"meta-value\">${escapeHtml(item.value)}</span>\n </div>\n `\n )\n .join(\"\")}</div>`;\n}\n\nfunction renderHeaderCard(\n commandName: string,\n heading: string,\n target: string,\n stats: StatCard[],\n metaItems: MetaItem[]\n): string {\n return `\n <section class=\"card header-card\">\n <div class=\"eyebrow\">skilltest ${escapeHtml(commandName)}</div>\n <h1>${escapeHtml(heading)}</h1>\n <div class=\"target-line\">target: ${escapeHtml(target)}</div>\n ${renderMetaItems(metaItems)}\n ${renderStatCards(stats)}\n </section>\n `;\n}\n\nfunction renderSectionCard(title: string, body: string): string {\n return `\n <section class=\"card\">\n <h2>${escapeHtml(title)}</h2>\n ${body}\n </section>\n `;\n}\n\nfunction renderMessageRow(status: HtmlStatus, title: string, message: string, details?: string): string {\n return `\n <div class=\"row\">\n <div class=\"row-header\">\n <div class=\"row-title\">${escapeHtml(title)}</div>\n ${renderBadge(status)}\n </div>\n <div class=\"row-body\">${escapeHtml(message)}</div>\n ${details ?? \"\"}\n </div>\n `;\n}\n\nfunction renderDetails(summary: string, content: string): string {\n return `\n <details class=\"detail-block\">\n <summary>${escapeHtml(summary)}</summary>\n <div class=\"detail-content\">${content}</div>\n </details>\n `;\n}\n\nfunction renderPreBlock(content: string): string {\n return `<pre>${escapeHtml(content)}</pre>`;\n}\n\nfunction renderDefinitionList(items: MetaItem[]): string {\n return `<div class=\"definition-list\">${items\n .map(\n (item) => `\n <div class=\"definition-item\">\n <div class=\"definition-label\">${escapeHtml(item.label)}</div>\n <div class=\"definition-value\">${escapeHtml(item.value)}</div>\n </div>\n `\n )\n .join(\"\")}</div>`;\n}\n\nfunction countSkippedSecurityPatterns(issues: LintIssue[]): number {\n return issues.reduce((total, issue) => total + (issue.skippedPatterns?.length ?? 0), 0);\n}\n\nfunction renderLintIssueRow(issue: LintIssue): string {\n const lineRange = formatLineRange(issue.startLine, issue.endLine);\n const detailBlocks: string[] = [];\n\n if (issue.suggestion) {\n detailBlocks.push(renderDetails(\"Suggestion\", `<p>${escapeHtml(issue.suggestion)}</p>`));\n }\n\n if (issue.skippedPatterns && issue.skippedPatterns.length > 0) {\n const patternItems = issue.skippedPatterns\n .map(\n (pattern) => `\n <div class=\"definition-item\">\n <div class=\"definition-label\">${escapeHtml(pattern.label)}</div>\n <div class=\"definition-value\">${escapeHtml(\n `${pattern.zoneType} lines ${pattern.startLine}-${pattern.endLine}`\n )}</div>\n </div>\n `\n )\n .join(\"\");\n detailBlocks.push(renderDetails(\"Skipped security patterns\", `<div class=\"definition-list\">${patternItems}</div>`));\n }\n\n return `\n <div class=\"row\">\n <div class=\"row-header\">\n <div>\n <div class=\"row-title\">${escapeHtml(issue.title)}</div>\n <div class=\"row-subtitle\">${escapeHtml(issue.checkId)}</div>\n </div>\n ${renderBadge(issue.status)}\n </div>\n <div class=\"row-body\">${escapeHtml(issue.message)}</div>\n ${renderDefinitionList(\n [\n lineRange ? { label: \"Location\", value: lineRange } : null,\n { label: \"Check ID\", value: issue.checkId }\n ].filter((item): item is MetaItem => item !== null)\n )}\n ${detailBlocks.join(\"\")}\n </div>\n `;\n}\n\nfunction renderLintIssueList(report: LintReport): string {\n const skippedSecurityPatterns = countSkippedSecurityPatterns(report.issues);\n const rows = report.issues.map((issue) => renderLintIssueRow(issue)).join(\"\");\n const info =\n skippedSecurityPatterns > 0\n ? `<p class=\"info-line\">Skipped security patterns in examples/comments: ${escapeHtml(skippedSecurityPatterns)}</p>`\n : \"\";\n\n return `<div class=\"row-list\">${rows}</div>${info}`;\n}\n\nfunction renderTriggerCaseRow(testCase: TriggerTestCaseResult, showSelectedCompetitor: boolean): string {\n const details = testCase.rawModelResponse\n ? renderDetails(\"Model response\", renderPreBlock(testCase.rawModelResponse))\n : \"\";\n\n return `\n <div class=\"row${testCase.selectedCompetitor ? \" competitor-selected\" : \"\"}\">\n <div class=\"row-header\">\n <div>\n <div class=\"row-title\">${escapeHtml(testCase.query)}</div>\n <div class=\"row-subtitle\">${escapeHtml(\n `expected=${testCase.expected} actual=${testCase.actual} should_trigger=${String(testCase.shouldTrigger)}`\n )}</div>\n </div>\n ${renderBadge(testCase.matched ? \"pass\" : \"fail\")}\n </div>\n ${renderDefinitionList([\n { label: \"Expected\", value: testCase.expected },\n { label: \"Actual\", value: testCase.actual },\n ...(showSelectedCompetitor ? [{ label: \"Selected competitor\", value: testCase.selectedCompetitor ?? \"none\" }] : [])\n ])}\n ${details}\n </div>\n `;\n}\n\nfunction renderCompetitorSkillsSection(result: TriggerTestResult): string {\n if (!result.competitors || result.competitors.length === 0) {\n return \"\";\n }\n\n return renderSectionCard(\n \"Competitor Skills\",\n `<div class=\"row-list\">${result.competitors\n .map((competitor) =>\n renderMessageRow(\n \"warn\",\n competitor.name,\n competitor.description,\n renderDefinitionList([{ label: \"Source\", value: competitor.sourcePath }])\n )\n )\n .join(\"\")}</div>`\n );\n}\n\nfunction promptStatus(promptResult: EvalPromptResult): HtmlStatus {\n if (promptResult.totalAssertions === 0) {\n return \"skip\";\n }\n if (promptResult.passedAssertions === promptResult.totalAssertions) {\n return \"pass\";\n }\n if (promptResult.passedAssertions === 0) {\n return \"fail\";\n }\n return \"warn\";\n}\n\nfunction renderAssertionRow(assertion: EvalPromptResult[\"assertions\"][number]): string {\n return `\n <details class=\"detail-block\">\n <summary>\n ${renderBadge(assertion.passed ? \"pass\" : \"fail\")}\n ${assertion.source === \"tool\" ? renderMetaBadge(\"Tool\") : \"\"}\n <span>${escapeHtml(assertion.assertion)}</span>\n </summary>\n <div class=\"detail-content\">${renderPreBlock(assertion.evidence)}</div>\n </details>\n `;\n}\n\nfunction renderToolCallsSection(promptResult: EvalPromptResult): string {\n if (!promptResult.toolCalls || promptResult.toolCalls.length === 0) {\n return \"\";\n }\n\n const toolRows = promptResult.toolCalls\n .map(\n (toolCall) => `\n <div class=\"tool-call\">\n <div class=\"row-header\">\n <div>\n <div class=\"row-title\">${escapeHtml(toolCall.name)}</div>\n <div class=\"row-subtitle\">${escapeHtml(`turn ${toolCall.turnIndex}`)}</div>\n </div>\n ${renderMetaBadge(\"Tool Call\")}\n </div>\n ${renderDefinitionList([{ label: \"Arguments\", value: JSON.stringify(toolCall.arguments) }])}\n ${renderDetails(\"Mock response\", renderPreBlock(toolCall.response))}\n </div>\n `\n )\n .join(\"\");\n\n return renderDetails(\"Tool Calls\", `<div class=\"tool-call-list\">${toolRows}</div>`);\n}\n\nfunction renderEvalPromptRow(promptResult: EvalPromptResult): string {\n const assertionDetails = promptResult.assertions.map((assertion) => renderAssertionRow(assertion)).join(\"\");\n const responseDetails = renderDetails(\"Full model response\", renderPreBlock(promptResult.response));\n\n return `\n <div class=\"row\">\n <div class=\"row-header\">\n <div>\n <div class=\"row-title\">${escapeHtml(promptResult.prompt)}</div>\n <div class=\"row-subtitle\">${escapeHtml(\n `${promptResult.passedAssertions}/${promptResult.totalAssertions} assertions passed`\n )}</div>\n </div>\n ${renderBadge(promptStatus(promptResult))}\n </div>\n <div class=\"row-body\">${escapeHtml(promptResult.responseSummary)}</div>\n ${renderDefinitionList([\n { label: \"Passed assertions\", value: String(promptResult.passedAssertions) },\n { label: \"Total assertions\", value: String(promptResult.totalAssertions) },\n ...(promptResult.toolCalls ? [{ label: \"Tool calls\", value: String(promptResult.toolCalls.length) }] : []),\n ...(promptResult.loopIterations !== undefined ? [{ label: \"Loop iterations\", value: String(promptResult.loopIterations) }] : [])\n ])}\n ${renderDetails(\"Assertion evidence\", assertionDetails || `<p>No assertions.</p>`)}\n ${renderToolCallsSection(promptResult)}\n ${responseDetails}\n </div>\n `;\n}\n\nfunction gateStatus(value: boolean | null): HtmlStatus {\n if (value === null) {\n return \"skip\";\n }\n return value ? \"pass\" : \"fail\";\n}\n\nfunction renderGateCard(title: string, status: HtmlStatus, message: string): string {\n return `\n <div class=\"gate-card\">\n <div class=\"row-header\">\n <div class=\"row-title\">${escapeHtml(title)}</div>\n ${renderBadge(status)}\n </div>\n <div class=\"row-body\">${escapeHtml(message)}</div>\n </div>\n `;\n}\n\nfunction renderCollapsibleSection(title: string, summary: string, body: string, status: HtmlStatus): string {\n return `\n <details class=\"section-card\" open>\n <summary>\n <span class=\"section-title\">${escapeHtml(title)}</span>\n <span class=\"section-summary\">${renderBadge(status)} ${escapeHtml(summary)}</span>\n </summary>\n <div class=\"section-body\">${body}</div>\n </details>\n `;\n}\n\nfunction resolveOptionalTarget(result: { target?: string }, fallback: string): string {\n return result.target ?? fallback;\n}\n\nfunction renderHtmlDocument(title: string, body: string): string {\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\">\n <title>${escapeHtml(title)}</title>\n <style>\n :root {\n color-scheme: light;\n --bg: #f5f5f5;\n --surface: #ffffff;\n --surface-muted: #fafafa;\n --border: #d4d4d8;\n --text: #111827;\n --muted: #6b7280;\n --pass: #22c55e;\n --warn: #eab308;\n --fail: #ef4444;\n --competitor: #f97316;\n --skip: #6b7280;\n --shadow: 0 10px 30px rgba(15, 23, 42, 0.08);\n }\n\n * {\n box-sizing: border-box;\n }\n\n body {\n margin: 0;\n background: linear-gradient(180deg, #fafafa 0%, #f4f4f5 100%);\n color: var(--text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n line-height: 1.5;\n }\n\n .container {\n max-width: 1120px;\n margin: 0 auto;\n padding: 24px 16px 40px;\n }\n\n .card,\n .section-card {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 16px;\n box-shadow: var(--shadow);\n margin-bottom: 16px;\n }\n\n .card {\n padding: 20px;\n }\n\n .header-card h1,\n .card h2 {\n margin: 0 0 10px;\n font-size: 1.25rem;\n }\n\n .eyebrow {\n margin-bottom: 10px;\n color: var(--muted);\n font-size: 0.78rem;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n .target-line,\n .info-line {\n color: var(--muted);\n overflow-wrap: anywhere;\n }\n\n .meta-grid,\n .stats-grid,\n .gate-grid,\n .definition-list {\n display: grid;\n gap: 12px;\n }\n\n .meta-grid,\n .gate-grid,\n .definition-list {\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n }\n\n .stats-grid {\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n margin-top: 16px;\n }\n\n .meta-grid {\n margin-top: 14px;\n }\n\n .meta-item,\n .definition-item,\n .stat-card,\n .gate-card {\n background: var(--surface-muted);\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 12px;\n }\n\n .meta-item,\n .definition-item {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n }\n\n .meta-label,\n .definition-label,\n .stat-label {\n color: var(--muted);\n font-size: 0.82rem;\n }\n\n .meta-value,\n .definition-value {\n text-align: right;\n overflow-wrap: anywhere;\n }\n\n .stat-value {\n margin-top: 4px;\n font-size: 1.3rem;\n font-weight: 700;\n }\n\n .stat-note {\n margin-top: 6px;\n color: var(--muted);\n font-size: 0.82rem;\n }\n\n .status-pass {\n border-color: rgba(34, 197, 94, 0.35);\n }\n\n .status-warn {\n border-color: rgba(234, 179, 8, 0.35);\n }\n\n .status-fail {\n border-color: rgba(239, 68, 68, 0.35);\n }\n\n .status-skip {\n border-color: rgba(107, 114, 128, 0.35);\n }\n\n .row-list {\n display: grid;\n gap: 12px;\n }\n\n .row {\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 14px;\n background: var(--surface-muted);\n }\n\n .row.competitor-selected {\n border-color: rgba(249, 115, 22, 0.45);\n background: rgba(249, 115, 22, 0.08);\n }\n\n .row-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 12px;\n }\n\n .row-title {\n font-weight: 700;\n overflow-wrap: anywhere;\n }\n\n .row-subtitle {\n margin-top: 4px;\n color: var(--muted);\n font-size: 0.84rem;\n overflow-wrap: anywhere;\n }\n\n .row-body {\n margin-top: 10px;\n overflow-wrap: anywhere;\n }\n\n .badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 58px;\n padding: 3px 10px;\n border-radius: 999px;\n border: 1px solid currentColor;\n font-size: 0.76rem;\n font-weight: 700;\n letter-spacing: 0.04em;\n white-space: nowrap;\n }\n\n .badge.pass {\n color: #15803d;\n background: rgba(34, 197, 94, 0.14);\n }\n\n .badge.warn {\n color: #a16207;\n background: rgba(234, 179, 8, 0.18);\n }\n\n .badge.fail {\n color: #b91c1c;\n background: rgba(239, 68, 68, 0.14);\n }\n\n .badge.skip {\n color: #4b5563;\n background: rgba(107, 114, 128, 0.14);\n }\n\n .meta-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px 10px;\n border-radius: 999px;\n border: 1px solid rgba(17, 24, 39, 0.16);\n background: rgba(17, 24, 39, 0.06);\n color: var(--text);\n font-size: 0.76rem;\n font-weight: 700;\n white-space: nowrap;\n }\n\n details {\n margin-top: 10px;\n }\n\n details summary {\n cursor: pointer;\n color: var(--muted);\n }\n\n .detail-block {\n border-top: 1px dashed var(--border);\n padding-top: 10px;\n }\n\n .detail-block summary {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .detail-content p {\n margin: 0;\n }\n\n .section-card summary {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n padding: 18px 20px;\n list-style: none;\n }\n\n .section-card summary::-webkit-details-marker {\n display: none;\n }\n\n .section-title {\n font-size: 1rem;\n font-weight: 700;\n color: var(--text);\n }\n\n .section-summary {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: var(--muted);\n text-align: right;\n }\n\n .section-body {\n padding: 0 20px 20px;\n }\n\n .gate-grid {\n margin-top: 12px;\n }\n\n pre {\n margin: 0;\n padding: 12px;\n background: #f8fafc;\n border: 1px solid var(--border);\n border-radius: 10px;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: anywhere;\n }\n\n .tool-call-list {\n display: grid;\n gap: 12px;\n }\n\n .tool-call {\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 14px;\n background: #fffaf0;\n }\n\n ul {\n margin: 0;\n padding-left: 20px;\n }\n\n @media (max-width: 720px) {\n .container {\n padding: 16px 12px 28px;\n }\n\n .row-header,\n .section-card summary,\n .meta-item,\n .definition-item {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .meta-value,\n .definition-value,\n .section-summary {\n text-align: left;\n }\n }\n </style>\n </head>\n <body>\n <main class=\"container\">\n ${body}\n </main>\n </body>\n</html>`;\n}\n\nexport function renderLintHtml(report: LintReport): string {\n const passRate = report.summary.total === 0 ? 0 : report.summary.passed / report.summary.total;\n const body = [\n renderHeaderCard(\n \"lint\",\n \"Static Analysis Report\",\n report.target,\n [\n { label: \"Pass rate\", value: formatPercent(passRate), note: `${report.summary.passed}/${report.summary.total} passed` },\n { label: \"Warnings\", value: String(report.summary.warnings), status: report.summary.warnings > 0 ? \"warn\" : \"pass\" },\n { label: \"Failures\", value: String(report.summary.failures), status: report.summary.failures > 0 ? \"fail\" : \"pass\" },\n { label: \"Checks\", value: String(report.summary.total) }\n ],\n [{ label: \"Target\", value: report.target }]\n ),\n renderSectionCard(\"Lint Issues\", renderLintIssueList(report))\n ].join(\"\");\n\n return renderHtmlDocument(`skilltest lint - ${report.target}`, body);\n}\n\nexport function renderTriggerHtml(result: TriggerTestResult): string {\n const htmlResult = result as TriggerTestResult & { target?: string };\n const target = resolveOptionalTarget(htmlResult, result.skillName);\n const matchedCount = result.cases.filter((testCase) => testCase.matched).length;\n const matchRate = result.cases.length === 0 ? 0 : matchedCount / result.cases.length;\n const hasCompetitors = Boolean(result.competitors && result.competitors.length > 0);\n const body = [\n renderHeaderCard(\n \"trigger\",\n result.skillName,\n target,\n [\n { label: \"Match rate\", value: formatPercent(matchRate), note: `${matchedCount}/${result.cases.length} matched` },\n { label: \"Precision\", value: formatPercent(result.metrics.precision) },\n { label: \"Recall\", value: formatPercent(result.metrics.recall) },\n { label: \"F1\", value: formatPercent(result.metrics.f1), status: result.metrics.f1 >= 0.8 ? \"pass\" : \"warn\" }\n ],\n [\n { label: \"Provider\", value: result.provider },\n { label: \"Model\", value: result.model },\n { label: \"Seed\", value: result.seed !== undefined ? String(result.seed) : \"none\" },\n ...(hasCompetitors ? [{ label: \"Competitors\", value: String(result.competitors?.length ?? 0) }] : []),\n { label: \"Queries\", value: String(result.queries.length) }\n ]\n ),\n renderCompetitorSkillsSection(result),\n renderSectionCard(\n \"Trigger Cases\",\n `<div class=\"row-list\">${result.cases.map((testCase) => renderTriggerCaseRow(testCase, hasCompetitors)).join(\"\")}</div>`\n ),\n renderSectionCard(\n \"Suggestions\",\n `<ul>${result.suggestions.map((suggestion) => `<li>${escapeHtml(suggestion)}</li>`).join(\"\")}</ul>`\n )\n ].join(\"\");\n\n return renderHtmlDocument(`skilltest trigger - ${result.skillName}`, body);\n}\n\nexport function renderEvalHtml(result: EvalResult): string {\n const htmlResult = result as EvalResult & { target?: string };\n const target = resolveOptionalTarget(htmlResult, result.skillName);\n const passRate = result.summary.totalAssertions === 0 ? 0 : result.summary.passedAssertions / result.summary.totalAssertions;\n const body = [\n renderHeaderCard(\n \"eval\",\n result.skillName,\n target,\n [\n {\n label: \"Assertion pass rate\",\n value: formatPercent(passRate),\n note: `${result.summary.passedAssertions}/${result.summary.totalAssertions} passed`\n },\n { label: \"Prompts\", value: String(result.summary.totalPrompts) },\n { label: \"Model\", value: result.model },\n { label: \"Grader\", value: result.graderModel }\n ],\n [\n { label: \"Provider\", value: result.provider },\n { label: \"Execution model\", value: result.model },\n { label: \"Grader model\", value: result.graderModel },\n { label: \"Prompts\", value: String(result.prompts.length) }\n ]\n ),\n renderSectionCard(\"Eval Prompts\", `<div class=\"row-list\">${result.results.map((promptResult) => renderEvalPromptRow(promptResult)).join(\"\")}</div>`)\n ].join(\"\");\n\n return renderHtmlDocument(`skilltest eval - ${result.skillName}`, body);\n}\n\nexport function renderCheckHtml(result: CheckRunResult): string {\n const skillName = result.trigger?.skillName ?? result.eval?.skillName ?? result.target;\n const triggerBody = result.trigger\n ? `${renderCompetitorSkillsSection(result.trigger)}\n <div class=\"row-list\">${result.trigger.cases\n .map((testCase) => renderTriggerCaseRow(testCase, Boolean(result.trigger?.competitors?.length)))\n .join(\"\")}</div>\n <div class=\"card\" style=\"margin-top: 16px;\">\n <h2>Trigger Suggestions</h2>\n <ul>${result.trigger.suggestions.map((suggestion) => `<li>${escapeHtml(suggestion)}</li>`).join(\"\")}</ul>\n </div>`\n : renderMessageRow(\"skip\", \"Trigger skipped\", result.triggerSkippedReason ?? \"Skipped.\");\n\n const evalBody = result.eval\n ? `<div class=\"row-list\">${result.eval.results.map((promptResult) => renderEvalPromptRow(promptResult)).join(\"\")}</div>`\n : renderMessageRow(\"skip\", \"Eval skipped\", result.evalSkippedReason ?? \"Skipped.\");\n\n const lintStatus: HtmlStatus = result.gates.lintPassed ? \"pass\" : \"fail\";\n const triggerStatus = gateStatus(result.gates.triggerPassed);\n const evalStatus = gateStatus(result.gates.evalPassed);\n const overallStatus: HtmlStatus = result.gates.overallPassed ? \"pass\" : \"fail\";\n\n const header = renderHeaderCard(\n \"check\",\n skillName,\n result.target,\n [\n { label: \"Overall gate\", value: badgeLabel(overallStatus), status: overallStatus },\n {\n label: \"Trigger F1\",\n value: result.gates.triggerF1 !== null ? formatPercent(result.gates.triggerF1) : \"skipped\",\n status: triggerStatus\n },\n {\n label: \"Eval pass rate\",\n value: result.gates.evalAssertPassRate !== null ? formatPercent(result.gates.evalAssertPassRate) : \"skipped\",\n status: evalStatus\n },\n {\n label: \"Lint result\",\n value: `${result.lint.summary.failures} fail / ${result.lint.summary.warnings} warn`,\n status: lintStatus\n }\n ],\n [\n { label: \"Provider\", value: result.provider },\n { label: \"Model\", value: result.model },\n { label: \"Grader model\", value: result.graderModel },\n {\n label: \"Thresholds\",\n value: `min-f1=${result.thresholds.minF1.toFixed(2)} min-assert-pass-rate=${result.thresholds.minAssertPassRate.toFixed(2)}`\n }\n ]\n );\n\n const lintSection = renderCollapsibleSection(\n \"Lint\",\n `${result.lint.summary.passed}/${result.lint.summary.total} passed, ${result.lint.summary.warnings} warnings, ${result.lint.summary.failures} failures`,\n renderLintIssueList(result.lint),\n lintStatus\n );\n\n const triggerSection = renderCollapsibleSection(\n \"Trigger\",\n result.trigger\n ? `f1=${formatPercent(result.trigger.metrics.f1)} precision=${formatPercent(result.trigger.metrics.precision)} recall=${formatPercent(result.trigger.metrics.recall)}`\n : result.triggerSkippedReason ?? \"Skipped.\",\n triggerBody,\n triggerStatus\n );\n\n const evalSection = renderCollapsibleSection(\n \"Eval\",\n result.eval\n ? `assertion pass rate=${formatPercent(result.gates.evalAssertPassRate ?? 0)} (${result.eval.summary.passedAssertions}/${result.eval.summary.totalAssertions})`\n : result.evalSkippedReason ?? \"Skipped.\",\n evalBody,\n evalStatus\n );\n\n const qualityGate = renderSectionCard(\n \"Quality Gate\",\n `<div class=\"gate-grid\">\n ${renderGateCard(\"Lint gate\", lintStatus, result.gates.lintPassed ? \"Lint passed.\" : \"Lint failed.\")}\n ${renderGateCard(\n \"Trigger gate\",\n triggerStatus,\n result.gates.triggerPassed === null\n ? result.triggerSkippedReason ?? \"Skipped.\"\n : `required ${result.thresholds.minF1.toFixed(2)}, actual ${result.gates.triggerF1?.toFixed(2) ?? \"n/a\"}`\n )}\n ${renderGateCard(\n \"Eval gate\",\n evalStatus,\n result.gates.evalPassed === null\n ? result.evalSkippedReason ?? \"Skipped.\"\n : `required ${result.thresholds.minAssertPassRate.toFixed(2)}, actual ${result.gates.evalAssertPassRate?.toFixed(2) ?? \"n/a\"}`\n )}\n ${renderGateCard(\"Overall\", overallStatus, result.gates.overallPassed ? \"All quality gates passed.\" : \"One or more gates failed.\")}\n </div>`\n );\n\n return renderHtmlDocument(`skilltest check - ${skillName}`, [header, lintSection, triggerSection, evalSection, qualityGate].join(\"\"));\n}\n\nfunction renderRouteMatrix(result: RouteTestResult): string {\n const cols = [...result.skills, \"none\"];\n const headerCells = cols.map((col) => `<th>${escapeHtml(col)}</th>`).join(\"\");\n const rows = result.skills\n .map((target) => {\n const cells = cols\n .map((col) => {\n const pct = result.matrixPct[target]?.[col] ?? 0;\n const isDiag = col === target;\n const bg = isDiag\n ? \"background:rgba(34,197,94,0.18);\"\n : pct > 0.15\n ? \"background:rgba(239,68,68,0.18);\"\n : pct > 0.05\n ? \"background:rgba(234,179,8,0.12);\"\n : \"\";\n return `<td style=\"${bg}\">${escapeHtml(formatPercent(pct))}</td>`;\n })\n .join(\"\");\n return `<tr><th>${escapeHtml(target)}</th>${cells}</tr>`;\n })\n .join(\"\");\n return `<style>.rt{border-collapse:collapse;font-size:.85rem;width:100%}.rt th,.rt td{border:1px solid #d4d4d8;padding:8px 12px;text-align:center}.rt thead th{background:#fafafa;font-weight:700}</style><div style=\"overflow-x:auto\"><table class=\"rt\"><thead><tr><th></th>${headerCells}</tr></thead><tbody>${rows}</tbody></table></div>`;\n}\n\nexport function renderRouteHtml(result: RouteTestResult): string {\n const conflictCount = result.conflicts.length;\n const overallStatus: HtmlStatus = result.overallAccuracy >= 0.8 ? \"pass\" : \"warn\";\n const conflictStatus: HtmlStatus = conflictCount === 0 ? \"pass\" : \"warn\";\n\n const header = renderHeaderCard(\n \"route\",\n `Routing Report — ${result.skills.length} skills`,\n result.skillDir,\n [\n { label: \"Overall accuracy\", value: formatPercent(result.overallAccuracy), status: overallStatus },\n { label: \"Conflicts\", value: String(conflictCount), status: conflictStatus },\n { label: \"Skills\", value: String(result.skills.length) },\n { label: \"Queries/skill\", value: String(result.numQueriesPerSkill) }\n ],\n [\n { label: \"Provider\", value: result.provider },\n { label: \"Model\", value: result.model },\n { label: \"Seed\", value: result.seed !== undefined ? String(result.seed) : \"none\" }\n ]\n );\n\n const matrixSection = renderSectionCard(\"Routing Matrix\", renderRouteMatrix(result));\n\n const metricsRows = result.perSkillMetrics\n .map((m) => {\n const status: HtmlStatus = m.f1 >= 0.8 ? \"pass\" : \"warn\";\n return renderMessageRow(\n status,\n m.skill,\n `F1: ${formatPercent(m.f1)} precision: ${formatPercent(m.precision)} recall: ${formatPercent(m.recall)}`,\n renderDefinitionList([\n { label: \"Queries\", value: String(m.queriesTotal) },\n { label: \"Correct\", value: String(m.correct) },\n { label: \"Precision\", value: formatPercent(m.precision) },\n { label: \"Recall\", value: formatPercent(m.recall) }\n ])\n );\n })\n .join(\"\");\n const metricsSection = renderSectionCard(\"Per-Skill Metrics\", `<div class=\"row-list\">${metricsRows}</div>`);\n\n let conflictsSection = \"\";\n if (result.conflicts.length > 0) {\n const conflictRows = result.conflicts\n .map((conflict) =>\n renderMessageRow(\n \"warn\",\n `${escapeHtml(conflict.skillA)} \\u2194 ${escapeHtml(conflict.skillB)}`,\n `${formatPercent(conflict.bleedAtoB)} of ${escapeHtml(conflict.skillA)} queries routed to ${escapeHtml(conflict.skillB)}; ${formatPercent(conflict.bleedBtoA)} the other way`\n )\n )\n .join(\"\");\n conflictsSection = renderSectionCard(\"Conflicts\", `<div class=\"row-list\">${conflictRows}</div>`);\n }\n\n const suggestionsSection = renderSectionCard(\n \"Suggestions\",\n `<ul>${result.suggestions.map((s) => `<li>${escapeHtml(s)}</li>`).join(\"\")}</ul>`\n );\n\n return renderHtmlDocument(\n `skilltest route — ${result.skillDir}`,\n [header, matrixSection, metricsSection, conflictsSection, suggestionsSection].join(\"\")\n );\n}\n","import { Chalk, ChalkInstance } from \"chalk\";\nimport { LintIssue, LintReport } from \"../core/linter/index.js\";\nimport { TriggerTestResult } from \"../core/trigger-tester.js\";\nimport { EvalResult } from \"../core/eval-runner.js\";\nimport { CheckRunResult } from \"../core/check-runner.js\";\nimport { ImproveRunResult } from \"../core/improver.js\";\nimport { RouteTestResult } from \"../core/route-tester.js\";\n\nfunction getChalkInstance(enableColor: boolean): ChalkInstance {\n return new Chalk({ level: enableColor ? 1 : 0 });\n}\n\nfunction renderIssueLine(issue: LintIssue, c: ChalkInstance): string {\n const label =\n issue.status === \"pass\" ? c.green(\"PASS\") : issue.status === \"warn\" ? c.yellow(\"WARN\") : c.red(\"FAIL\");\n const detail = issue.suggestion ? `\\n suggestion: ${issue.suggestion}` : \"\";\n return ` ${label} ${issue.title}\\n ${issue.message}${detail}`;\n}\n\nfunction countSkippedSecurityPatterns(issues: LintIssue[]): number {\n return issues.reduce((total, issue) => {\n if (!issue.checkId.startsWith(\"security:\")) {\n return total;\n }\n return total + (issue.skippedPatterns?.length ?? 0);\n }, 0);\n}\n\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(1)}%`;\n}\n\nfunction formatSignedNumber(value: number, digits = 4): string {\n const prefix = value > 0 ? \"+\" : \"\";\n return `${prefix}${value.toFixed(digits)}`;\n}\n\nfunction diffChangedLines(beforeText: string, afterText: string): Array<{ type: \"+\" | \"-\"; line: string }> {\n const beforeLines = beforeText.split(/\\r?\\n/);\n const afterLines = afterText.split(/\\r?\\n/);\n const dp = Array.from({ length: beforeLines.length + 1 }, () => Array<number>(afterLines.length + 1).fill(0));\n\n for (let beforeIndex = beforeLines.length - 1; beforeIndex >= 0; beforeIndex -= 1) {\n for (let afterIndex = afterLines.length - 1; afterIndex >= 0; afterIndex -= 1) {\n if (beforeLines[beforeIndex] === afterLines[afterIndex]) {\n dp[beforeIndex]![afterIndex] = 1 + (dp[beforeIndex + 1]![afterIndex + 1] ?? 0);\n } else {\n dp[beforeIndex]![afterIndex] = Math.max(dp[beforeIndex + 1]![afterIndex] ?? 0, dp[beforeIndex]![afterIndex + 1] ?? 0);\n }\n }\n }\n\n const changedLines: Array<{ type: \"+\" | \"-\"; line: string }> = [];\n let beforeIndex = 0;\n let afterIndex = 0;\n\n while (beforeIndex < beforeLines.length && afterIndex < afterLines.length) {\n if (beforeLines[beforeIndex] === afterLines[afterIndex]) {\n beforeIndex += 1;\n afterIndex += 1;\n continue;\n }\n\n const skipBefore = dp[beforeIndex + 1]![afterIndex] ?? 0;\n const skipAfter = dp[beforeIndex]![afterIndex + 1] ?? 0;\n if (skipBefore >= skipAfter) {\n changedLines.push({ type: \"-\", line: beforeLines[beforeIndex] ?? \"\" });\n beforeIndex += 1;\n } else {\n changedLines.push({ type: \"+\", line: afterLines[afterIndex] ?? \"\" });\n afterIndex += 1;\n }\n }\n\n while (beforeIndex < beforeLines.length) {\n changedLines.push({ type: \"-\", line: beforeLines[beforeIndex] ?? \"\" });\n beforeIndex += 1;\n }\n\n while (afterIndex < afterLines.length) {\n changedLines.push({ type: \"+\", line: afterLines[afterIndex] ?? \"\" });\n afterIndex += 1;\n }\n\n return changedLines;\n}\n\nfunction renderDiffPreview(beforeText: string, afterText: string, maxLines = 40): string[] {\n const changedLines = diffChangedLines(beforeText, afterText);\n if (changedLines.length === 0) {\n return [\" (no content changes)\"];\n }\n\n const previewLines = changedLines.slice(0, maxLines).map((entry) => ` ${entry.type} ${entry.line}`);\n if (changedLines.length > maxLines) {\n previewLines.push(` ... ${changedLines.length - maxLines} more changed line(s)`);\n }\n return previewLines;\n}\n\nfunction summarizeToolCalls(toolCalls: NonNullable<EvalResult[\"results\"][number][\"toolCalls\"]>): string {\n const counts = new Map<string, number>();\n for (const toolCall of toolCalls) {\n counts.set(toolCall.name, (counts.get(toolCall.name) ?? 0) + 1);\n }\n\n return Array.from(counts.entries())\n .map(([name, count]) => `${name} x${count}`)\n .join(\", \");\n}\n\nexport function renderLintReport(report: LintReport, enableColor: boolean): string {\n const c = getChalkInstance(enableColor);\n const { passed, warnings, failures, total } = report.summary;\n const headerLines = [\n \"skilltest lint\",\n `target: ${report.target}`,\n `summary: ${passed}/${total} checks passed, ${warnings} warnings, ${failures} failures`\n ];\n\n const renderedIssues = report.issues.map((issue) => renderIssueLine(issue, c)).join(\"\\n\");\n const skippedSecurityPatterns = countSkippedSecurityPatterns(report.issues);\n const infoLine =\n skippedSecurityPatterns > 0\n ? `\\n ${c.cyan(\"INFO\")} ${skippedSecurityPatterns} security pattern(s) found in code examples/comments (not flagged)`\n : \"\";\n\n return `${headerLines.join(\"\\n\")}\\n${renderedIssues}${infoLine}`;\n}\n\nexport function renderTriggerReport(result: TriggerTestResult, enableColor: boolean, verbose: boolean): string {\n const c = getChalkInstance(enableColor);\n const lines: string[] = [\n \"skilltest trigger\",\n `skill: ${result.skillName}`,\n `provider/model: ${result.provider}/${result.model}`\n ];\n\n if (result.competitors && result.competitors.length > 0) {\n lines.push(`competitors: ${result.competitors.map((competitor) => competitor.name).join(\", \")}`);\n }\n\n lines.push(\n `precision: ${formatPercent(result.metrics.precision)} recall: ${formatPercent(result.metrics.recall)} f1: ${formatPercent(result.metrics.f1)}`\n );\n lines.push(\n `TP ${result.metrics.truePositives} TN ${result.metrics.trueNegatives} FP ${result.metrics.falsePositives} FN ${result.metrics.falseNegatives}`\n );\n\n for (const [index, testCase] of result.cases.entries()) {\n const status = testCase.matched ? c.green(\"PASS\") : c.red(\"FAIL\");\n lines.push(`${index + 1}. ${status} query: ${testCase.query}`);\n lines.push(` expected: ${testCase.expected} | actual: ${testCase.actual}`);\n if (verbose && testCase.selectedCompetitor) {\n lines.push(` competitor selected: ${testCase.selectedCompetitor}`);\n }\n if (verbose && testCase.rawModelResponse) {\n lines.push(` model: ${testCase.rawModelResponse.replace(/\\s+/g, \" \").trim()}`);\n }\n }\n\n lines.push(\"Suggestions:\");\n for (const suggestion of result.suggestions) {\n lines.push(`- ${suggestion}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function renderEvalReport(result: EvalResult, enableColor: boolean, verbose: boolean): string {\n const c = getChalkInstance(enableColor);\n const lines: string[] = [\n \"skilltest eval\",\n `skill: ${result.skillName}`,\n `provider/model: ${result.provider}/${result.model}`,\n `grader model: ${result.graderModel}`,\n `assertions passed: ${result.summary.passedAssertions}/${result.summary.totalAssertions}`\n ];\n\n for (const [index, promptResult] of result.results.entries()) {\n lines.push(`${index + 1}. prompt: ${promptResult.prompt}`);\n lines.push(` response summary: ${promptResult.responseSummary.replace(/\\s+/g, \" \").trim()}`);\n if (promptResult.toolCalls) {\n lines.push(` Tools: ${promptResult.toolCalls.length} calls (${summarizeToolCalls(promptResult.toolCalls)})`);\n if (promptResult.loopIterations !== undefined) {\n lines.push(` loop iterations: ${promptResult.loopIterations}`);\n }\n }\n for (const assertion of promptResult.assertions) {\n const status = assertion.passed ? c.green(\"PASS\") : c.red(\"FAIL\");\n lines.push(` ${status} ${assertion.assertion}`);\n lines.push(` evidence: ${assertion.evidence}`);\n }\n if (verbose) {\n if (promptResult.toolCalls) {\n for (const toolCall of promptResult.toolCalls) {\n lines.push(` tool ${toolCall.turnIndex}: ${toolCall.name}`);\n lines.push(` arguments: ${JSON.stringify(toolCall.arguments)}`);\n lines.push(` response: ${toolCall.response}`);\n }\n }\n lines.push(` full response: ${promptResult.response}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction gateStatusLabel(value: boolean | null, c: ChalkInstance): string {\n if (value === null) {\n return c.yellow(\"SKIP\");\n }\n return value ? c.green(\"PASS\") : c.red(\"FAIL\");\n}\n\nexport function renderCheckReport(result: CheckRunResult, enableColor: boolean, verbose: boolean): string {\n const c = getChalkInstance(enableColor);\n const lines: string[] = [];\n\n const lintGate = gateStatusLabel(result.gates.lintPassed, c);\n const triggerGate = gateStatusLabel(result.gates.triggerPassed, c);\n const evalGate = gateStatusLabel(result.gates.evalPassed, c);\n const overallGate = result.gates.overallPassed ? c.green(\"PASS\") : c.red(\"FAIL\");\n\n lines.push(\"skilltest check\");\n lines.push(`target: ${result.target}`);\n lines.push(`provider/model: ${result.provider}/${result.model}`);\n lines.push(`grader model: ${result.graderModel}`);\n lines.push(\n `thresholds: min-f1=${result.thresholds.minF1.toFixed(2)} min-assert-pass-rate=${result.thresholds.minAssertPassRate.toFixed(2)}`\n );\n\n lines.push(\"\");\n lines.push(\"Lint\");\n lines.push(\n `- ${lintGate} ${result.lint.summary.passed}/${result.lint.summary.total} checks passed (${result.lint.summary.warnings} warnings, ${result.lint.summary.failures} failures)`\n );\n\n const lintIssues = verbose ? result.lint.issues : result.lint.issues.filter((issue) => issue.status !== \"pass\");\n for (const issue of lintIssues) {\n lines.push(renderIssueLine(issue, c));\n }\n\n const skippedSecurityPatterns = countSkippedSecurityPatterns(result.lint.issues);\n if (skippedSecurityPatterns > 0) {\n lines.push(` ${c.cyan(\"INFO\")} ${skippedSecurityPatterns} security pattern(s) found in code examples/comments (not flagged)`);\n }\n\n lines.push(\"\");\n lines.push(\"Trigger\");\n if (result.trigger) {\n lines.push(\n `- ${triggerGate} f1=${formatPercent(result.trigger.metrics.f1)} (precision=${formatPercent(result.trigger.metrics.precision)} recall=${formatPercent(result.trigger.metrics.recall)})`\n );\n lines.push(\n ` TP ${result.trigger.metrics.truePositives} TN ${result.trigger.metrics.trueNegatives} FP ${result.trigger.metrics.falsePositives} FN ${result.trigger.metrics.falseNegatives}`\n );\n if (result.trigger.competitors && result.trigger.competitors.length > 0) {\n lines.push(` competitors: ${result.trigger.competitors.map((competitor) => competitor.name).join(\", \")}`);\n }\n\n const triggerCases = verbose ? result.trigger.cases : result.trigger.cases.filter((testCase) => !testCase.matched);\n for (const testCase of triggerCases) {\n const status = testCase.matched ? c.green(\"PASS\") : c.red(\"FAIL\");\n lines.push(` - ${status} ${testCase.query}`);\n lines.push(` expected=${testCase.expected} actual=${testCase.actual}`);\n if (testCase.selectedCompetitor) {\n lines.push(` competitor selected=${testCase.selectedCompetitor}`);\n }\n }\n } else {\n lines.push(`- ${triggerGate} ${result.triggerSkippedReason ?? \"Skipped.\"}`);\n }\n\n lines.push(\"\");\n lines.push(\"Eval\");\n if (result.eval) {\n const passRate = result.gates.evalAssertPassRate ?? 0;\n lines.push(\n `- ${evalGate} assertion pass rate=${formatPercent(passRate)} (${result.eval.summary.passedAssertions}/${result.eval.summary.totalAssertions})`\n );\n\n for (const promptResult of result.eval.results) {\n const failedAssertions = promptResult.assertions.filter((assertion) => !assertion.passed);\n if (!verbose && failedAssertions.length === 0) {\n continue;\n }\n lines.push(` - prompt: ${promptResult.prompt}`);\n lines.push(` response summary: ${promptResult.responseSummary.replace(/\\s+/g, \" \").trim()}`);\n if (promptResult.toolCalls) {\n lines.push(` Tools: ${promptResult.toolCalls.length} calls (${summarizeToolCalls(promptResult.toolCalls)})`);\n if (promptResult.loopIterations !== undefined) {\n lines.push(` loop iterations: ${promptResult.loopIterations}`);\n }\n }\n const assertionsToRender = verbose ? promptResult.assertions : failedAssertions;\n for (const assertion of assertionsToRender) {\n const assertionStatus = assertion.passed ? c.green(\"PASS\") : c.red(\"FAIL\");\n lines.push(` ${assertionStatus} ${assertion.assertion}`);\n lines.push(` evidence: ${assertion.evidence}`);\n }\n if (verbose) {\n if (promptResult.toolCalls) {\n for (const toolCall of promptResult.toolCalls) {\n lines.push(` tool ${toolCall.turnIndex}: ${toolCall.name}`);\n lines.push(` arguments: ${JSON.stringify(toolCall.arguments)}`);\n lines.push(` response: ${toolCall.response}`);\n }\n }\n lines.push(` full response: ${promptResult.response}`);\n }\n }\n } else {\n lines.push(`- ${evalGate} ${result.evalSkippedReason ?? \"Skipped.\"}`);\n }\n\n lines.push(\"\");\n lines.push(\"Quality Gate\");\n lines.push(`- lint gate: ${lintGate}`);\n lines.push(`- trigger gate: ${triggerGate}`);\n lines.push(`- eval gate: ${evalGate}`);\n lines.push(`- overall: ${overallGate}`);\n\n return lines.join(\"\\n\");\n}\n\nexport function renderImproveReport(result: ImproveRunResult, enableColor: boolean, verbose = false): string {\n const c = getChalkInstance(enableColor);\n const lines: string[] = [\n \"skilltest improve\",\n `target: ${result.target}`,\n `provider/model: ${result.provider}/${result.model}`,\n `thresholds: min-f1=${result.thresholds.minF1.toFixed(2)} min-assert-pass-rate=${result.thresholds.minAssertPassRate.toFixed(2)}`\n ];\n\n const statusLabel = result.blockedReason ? c.red(\"BLOCKED\") : result.applied ? c.green(\"APPLIED\") : c.green(\"VERIFIED\");\n lines.push(`status: ${statusLabel}`);\n\n if (result.candidate) {\n lines.push(\"\");\n lines.push(\"Change Summary\");\n for (const item of result.candidate.changeSummary) {\n lines.push(`- ${item}`);\n }\n\n lines.push(\"\");\n lines.push(\"Targeted Problems\");\n for (const item of result.candidate.targetedProblems) {\n lines.push(`- ${item}`);\n }\n }\n\n if (result.delta && result.verification) {\n lines.push(\"\");\n lines.push(\"Before / After\");\n lines.push(\n `- lint failures: ${result.delta.lintFailures.before} -> ${result.delta.lintFailures.after} (${formatSignedNumber(result.delta.lintFailures.delta, 0)})`\n );\n lines.push(\n `- lint warnings: ${result.delta.lintWarnings.before} -> ${result.delta.lintWarnings.after} (${formatSignedNumber(result.delta.lintWarnings.delta, 0)})`\n );\n lines.push(\n `- trigger f1: ${formatPercent(result.delta.triggerF1.before)} -> ${formatPercent(result.delta.triggerF1.after)} (${formatSignedNumber(result.delta.triggerF1.delta)})`\n );\n lines.push(\n `- eval assertion pass rate: ${formatPercent(result.delta.evalAssertPassRate.before)} -> ${formatPercent(result.delta.evalAssertPassRate.after)} (${formatSignedNumber(result.delta.evalAssertPassRate.delta)})`\n );\n lines.push(\n `- overall gate: ${result.delta.overallPassed.before ? c.green(\"PASS\") : c.red(\"FAIL\")} -> ${result.delta.overallPassed.after ? c.green(\"PASS\") : c.red(\"FAIL\")}`\n );\n }\n\n if (result.outputPath) {\n lines.push(\"\");\n lines.push(`output: ${result.outputPath}`);\n }\n\n if (result.blockedReason) {\n lines.push(\"\");\n lines.push(\"Blocked\");\n lines.push(`- ${result.blockedReason}`);\n }\n\n if (result.candidate) {\n lines.push(\"\");\n lines.push(\"Diff Preview\");\n lines.push(...renderDiffPreview(result.originalRaw, result.candidate.raw));\n }\n\n if (verbose) {\n lines.push(\"\");\n lines.push(\"Baseline\");\n lines.push(renderCheckReport(result.baseline, enableColor, true));\n if (result.verification) {\n lines.push(\"\");\n lines.push(\"Verification\");\n lines.push(renderCheckReport(result.verification, enableColor, true));\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function renderRouteReport(result: RouteTestResult, enableColor: boolean, verbose: boolean): string {\n const c = getChalkInstance(enableColor);\n const lines: string[] = [\n \"skilltest route\",\n `directory: ${result.skillDir}`,\n `provider/model: ${result.provider}/${result.model}`,\n `skills: ${result.skills.length} queries per skill: ${result.numQueriesPerSkill}`\n ];\n\n lines.push(\"\");\n lines.push(\"Per-skill metrics:\");\n for (const m of result.perSkillMetrics) {\n const badge = m.f1 >= 0.8 ? c.green(\"PASS\") : c.yellow(\"WARN\");\n lines.push(\n ` ${m.skill.padEnd(24)} F1: ${formatPercent(m.f1).padEnd(7)} precision: ${formatPercent(m.precision).padEnd(7)} recall: ${formatPercent(m.recall)} [${badge}]`\n );\n }\n\n lines.push(\"\");\n lines.push(\"Routing matrix (% of row queries routed to column):\");\n const colHeaders = [...result.skills, \"none\"];\n const colWidth = 10;\n const rowLabelWidth = 24;\n const headerRow = \"\".padEnd(rowLabelWidth) + colHeaders.map((h) => h.slice(0, colWidth - 1).padEnd(colWidth)).join(\"\");\n lines.push(\" \" + headerRow);\n for (const targetSkill of result.skills) {\n const rowLabel = (\" \" + targetSkill).padEnd(rowLabelWidth);\n const cells = colHeaders\n .map((col) => {\n const pct = result.matrixPct[targetSkill]?.[col] ?? 0;\n const formatted = formatPercent(pct).padEnd(colWidth);\n if (col === targetSkill) return c.green(formatted);\n if (pct > 0.1) return c.yellow(formatted);\n return formatted;\n })\n .join(\"\");\n lines.push(rowLabel + cells);\n }\n\n if (result.conflicts.length > 0) {\n lines.push(\"\");\n lines.push(\"Conflicts detected:\");\n for (const conflict of result.conflicts) {\n lines.push(\n ` ${conflict.skillA} <-> ${conflict.skillB} ${formatPercent(conflict.bleedAtoB)} / ${formatPercent(conflict.bleedBtoA)} bleed [${c.yellow(\"WARN\")}]`\n );\n }\n }\n\n lines.push(\"\");\n lines.push(`Overall accuracy: ${formatPercent(result.overallAccuracy)}`);\n\n lines.push(\"\");\n lines.push(\"Suggestions:\");\n for (const suggestion of result.suggestions) {\n lines.push(`- ${suggestion}`);\n }\n\n if (verbose) {\n lines.push(\"\");\n lines.push(\"Cases:\");\n for (const [index, testCase] of result.cases.entries()) {\n const status = testCase.correct ? c.green(\"PASS\") : c.red(\"FAIL\");\n lines.push(` ${index + 1}. ${status} [${testCase.targetSkill}] ${testCase.query}`);\n lines.push(` routed to: ${testCase.actualSkill}`);\n if (testCase.rawModelResponse) {\n lines.push(` model: ${testCase.rawModelResponse.replace(/\\s+/g, \" \").trim()}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n","import fs from \"node:fs/promises\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { EvalPrompt, evalPromptArraySchema, evalPromptSchema } from \"../core/eval-runner.js\";\nimport { TriggerQuery, triggerQueryArraySchema } from \"../core/trigger-tester.js\";\nimport { renderJson } from \"../reporters/json.js\";\nimport { ResolvedConfigContext } from \"../utils/config.js\";\nimport { readJsonFile } from \"../utils/fs.js\";\n\nconst executionContextByCommand = new WeakMap<Command, ResolvedConfigContext>();\n\nconst singleEvalPromptSchema = evalPromptSchema;\n\nconst promptStringArraySchema = z.array(z.string().min(1));\nconst assertionsObjectSchema = z.object({\n assertions: z.array(z.string().min(1))\n});\n\nexport interface GlobalCliOptions {\n json: boolean;\n color: boolean;\n}\n\nfunction parseJsonIfPossible(raw: string): unknown {\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return raw;\n }\n}\n\nfunction normalizeEvalPrompts(value: unknown, sourceLabel: string): EvalPrompt[] {\n const promptArray = evalPromptArraySchema.safeParse(value);\n if (promptArray.success) {\n return promptArray.data;\n }\n\n const singlePrompt = singleEvalPromptSchema.safeParse(value);\n if (singlePrompt.success) {\n return [singlePrompt.data];\n }\n\n const promptStrings = promptStringArraySchema.safeParse(value);\n if (promptStrings.success) {\n return promptStrings.data.map((prompt) => ({ prompt }));\n }\n\n if (typeof value === \"string\" && value.trim() !== \"\") {\n return [{ prompt: value.trim() }];\n }\n\n throw new Error(\n `Invalid eval prompt source at ${sourceLabel}. Expected plain text, a JSON prompt object, or a JSON array of prompts.`\n );\n}\n\nfunction parseAssertionsFromText(raw: string): string[] {\n return raw\n .split(/\\r?\\n/)\n .map((line) => line.trim().replace(/^[-*]\\s+/, \"\").replace(/^\\d+\\.\\s+/, \"\"))\n .filter((line) => line.length > 0);\n}\n\nfunction cloneEvalPrompt(prompt: EvalPrompt): EvalPrompt {\n return {\n prompt: prompt.prompt,\n assertions: prompt.assertions ? [...prompt.assertions] : undefined,\n tools: prompt.tools\n ? prompt.tools.map((tool) => ({\n ...tool,\n parameters: tool.parameters ? tool.parameters.map((parameter) => ({ ...parameter })) : undefined,\n responses: { ...tool.responses }\n }))\n : undefined,\n toolAssertions: prompt.toolAssertions\n ? prompt.toolAssertions.map((toolAssertion) => ({\n ...toolAssertion,\n toolNames: toolAssertion.toolNames ? [...toolAssertion.toolNames] : undefined,\n expectedArgs: toolAssertion.expectedArgs ? { ...toolAssertion.expectedArgs } : undefined\n }))\n : undefined\n };\n}\n\nfunction normalizeAssertions(value: unknown, sourceLabel: string): string[] {\n const assertionArray = z.array(z.string().min(1)).safeParse(value);\n if (assertionArray.success) {\n return assertionArray.data;\n }\n\n const assertionObject = assertionsObjectSchema.safeParse(value);\n if (assertionObject.success) {\n return assertionObject.data.assertions;\n }\n\n if (typeof value === \"string\") {\n const assertions = parseAssertionsFromText(value);\n if (assertions.length > 0) {\n return assertions;\n }\n }\n\n throw new Error(\n `Invalid eval assertions source at ${sourceLabel}. Expected JSON string[], { assertions: string[] }, or newline-delimited text.`\n );\n}\n\nexport function setCommandExecutionContext(command: Command, context: ResolvedConfigContext): void {\n executionContextByCommand.set(command, context);\n}\n\nexport function getCommandExecutionContext(command: Command): ResolvedConfigContext {\n const context = executionContextByCommand.get(command);\n if (!context) {\n throw new Error(`Missing resolved config for command '${command.name()}'.`);\n }\n return context;\n}\n\nexport function getResolvedConfig(command: Command): ResolvedConfigContext[\"config\"] {\n return getCommandExecutionContext(command).config;\n}\n\nexport function getGlobalCliOptions(command: Command): GlobalCliOptions {\n const options = command.optsWithGlobals<{ json?: boolean; color?: boolean }>();\n const context = executionContextByCommand.get(command);\n\n return {\n json: context?.config.json ?? Boolean(options.json),\n color: options.color !== false\n };\n}\n\nexport async function loadTriggerQueriesFile(filePath: string): Promise<TriggerQuery[]> {\n const loaded = await readJsonFile<unknown>(filePath);\n const parsed = triggerQueryArraySchema.safeParse(loaded);\n if (!parsed.success) {\n throw new Error(`Invalid --queries JSON: ${parsed.error.issues[0]?.message ?? \"unknown format issue\"}`);\n }\n return parsed.data;\n}\n\nexport async function loadEvalPromptsJson(filePath: string): Promise<EvalPrompt[]> {\n const loaded = await readJsonFile<unknown>(filePath);\n const parsed = evalPromptArraySchema.safeParse(loaded);\n if (!parsed.success) {\n throw new Error(`Invalid --prompts JSON: ${parsed.error.issues[0]?.message ?? \"unknown format issue\"}`);\n }\n return parsed.data;\n}\n\nexport async function loadConfiguredEvalPrompts(command: Command): Promise<EvalPrompt[] | undefined> {\n const context = getCommandExecutionContext(command);\n const promptFile = context.config.eval.promptFile;\n const assertionsFile = context.config.eval.assertionsFile;\n\n if (!promptFile && !assertionsFile) {\n return undefined;\n }\n\n if (!promptFile && assertionsFile) {\n throw new Error(\"Config field eval.assertionsFile requires eval.promptFile.\");\n }\n\n const promptRaw = await fs.readFile(promptFile as string, \"utf8\");\n let prompts = normalizeEvalPrompts(parseJsonIfPossible(promptRaw), promptFile as string);\n\n if (assertionsFile) {\n const assertionsRaw = await fs.readFile(assertionsFile, \"utf8\");\n const assertions = normalizeAssertions(parseJsonIfPossible(assertionsRaw), assertionsFile);\n prompts = prompts.map((prompt) => ({\n ...cloneEvalPrompt(prompt),\n assertions: [...assertions]\n }));\n }\n\n const numRunsWasExplicit = context.configFile?.eval?.numRuns !== undefined;\n if (numRunsWasExplicit && prompts.length === 1 && context.config.eval.numRuns > 1) {\n const promptTemplate = prompts[0];\n prompts = Array.from({ length: context.config.eval.numRuns }, () => cloneEvalPrompt(promptTemplate));\n }\n\n return prompts;\n}\n\nexport function writeResult(value: unknown, asJson: boolean): void {\n if (asJson) {\n process.stdout.write(`${renderJson(value)}\\n`);\n return;\n }\n process.stdout.write(`${String(value)}\\n`);\n}\n\nexport function writeError(error: unknown, asJson: boolean): void {\n const message = error instanceof Error ? error.message : String(error);\n if (asJson) {\n process.stdout.write(`${renderJson({ error: message })}\\n`);\n return;\n }\n process.stderr.write(`Error: ${message}\\n`);\n}\n","import { z } from \"zod\";\nimport { gradeResponse, GradedAssertion } from \"./grader.js\";\nimport { ParsedSkill } from \"./skill-parser.js\";\nimport { LanguageModelProvider } from \"../providers/types.js\";\nimport { pMap } from \"../utils/concurrency.js\";\nimport {\n matchesArgumentSubset,\n MockToolDefinition,\n runWithTools,\n ToolCall,\n ToolParameter\n} from \"./tool-environment.js\";\n\nexport interface EvalPrompt {\n prompt: string;\n assertions?: string[];\n tools?: MockToolDefinition[];\n toolAssertions?: ToolAssertion[];\n}\n\nexport interface ToolAssertion {\n type: \"tool_called\" | \"tool_not_called\" | \"tool_call_order\" | \"tool_argument_match\";\n toolName?: string;\n toolNames?: string[];\n expectedArgs?: Record<string, unknown>;\n description: string;\n}\n\nexport interface EvalPromptResult {\n prompt: string;\n assertions: GradedAssertion[];\n responseSummary: string;\n response: string;\n passedAssertions: number;\n totalAssertions: number;\n toolCalls?: ToolCall[];\n loopIterations?: number;\n}\n\nexport interface EvalResultSummary {\n totalPrompts: number;\n totalAssertions: number;\n passedAssertions: number;\n}\n\nexport interface EvalResult {\n skillName: string;\n model: string;\n graderModel: string;\n provider: string;\n prompts: EvalPrompt[];\n results: EvalPromptResult[];\n summary: EvalResultSummary;\n}\n\nconst toolParameterSchema: z.ZodType<ToolParameter> = z.object({\n name: z.string().min(1),\n type: z.enum([\"string\", \"number\", \"boolean\", \"object\", \"array\"]),\n description: z.string().min(1),\n required: z.boolean().optional()\n});\n\nconst mockToolDefinitionSchema: z.ZodType<MockToolDefinition> = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n parameters: z.array(toolParameterSchema).optional(),\n responses: z.record(z.string())\n});\n\nconst toolAssertionSchema: z.ZodType<ToolAssertion> = z\n .object({\n type: z.enum([\"tool_called\", \"tool_not_called\", \"tool_call_order\", \"tool_argument_match\"]),\n toolName: z.string().min(1).optional(),\n toolNames: z.array(z.string().min(1)).optional(),\n expectedArgs: z.record(z.unknown()).optional(),\n description: z.string().min(1)\n })\n .superRefine((value, context) => {\n if ((value.type === \"tool_called\" || value.type === \"tool_not_called\" || value.type === \"tool_argument_match\") && !value.toolName) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${value.type} requires toolName.`\n });\n }\n\n if (value.type === \"tool_call_order\" && (!value.toolNames || value.toolNames.length === 0)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"tool_call_order requires toolNames.\"\n });\n }\n\n if (value.type === \"tool_argument_match\" && !value.expectedArgs) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"tool_argument_match requires expectedArgs.\"\n });\n }\n });\n\nexport const evalPromptSchema = z.object({\n prompt: z.string().min(1),\n assertions: z.array(z.string().min(1)).optional(),\n tools: z.array(mockToolDefinitionSchema).optional(),\n toolAssertions: z.array(toolAssertionSchema).optional()\n});\n\nexport const evalPromptArraySchema = z.array(evalPromptSchema);\n\nfunction formatToolCallCounts(toolCalls: ToolCall[]): string {\n const counts = new Map<string, number>();\n for (const toolCall of toolCalls) {\n counts.set(toolCall.name, (counts.get(toolCall.name) ?? 0) + 1);\n }\n\n return Array.from(counts.entries())\n .map(([name, count]) => `${name} x${count}`)\n .join(\", \");\n}\n\nfunction formatExpectedOrder(toolNames: string[]): string {\n return `[${toolNames.join(\", \")}]`;\n}\n\nfunction formatActualOrder(toolCalls: ToolCall[], toolNames: string[]): string {\n const relevantNames = new Set(toolNames);\n const actualOrder = toolCalls.filter((toolCall) => relevantNames.has(toolCall.name)).map((toolCall) => toolCall.name);\n return `[${actualOrder.join(\", \")}]`;\n}\n\nexport function evaluateToolAssertions(toolAssertions: ToolAssertion[], toolCalls: ToolCall[]): GradedAssertion[] {\n return toolAssertions.map((toolAssertion) => {\n if (toolAssertion.type === \"tool_called\") {\n const matchingCalls = toolCalls.filter((toolCall) => toolCall.name === toolAssertion.toolName);\n return {\n assertion: toolAssertion.description,\n passed: matchingCalls.length > 0,\n evidence:\n matchingCalls.length > 0\n ? `Tool '${toolAssertion.toolName}' was called ${matchingCalls.length} time${matchingCalls.length === 1 ? \"\" : \"s\"}.`\n : `Tool '${toolAssertion.toolName}' was not called.`,\n source: \"tool\"\n };\n }\n\n if (toolAssertion.type === \"tool_not_called\") {\n const matchingCalls = toolCalls.filter((toolCall) => toolCall.name === toolAssertion.toolName);\n return {\n assertion: toolAssertion.description,\n passed: matchingCalls.length === 0,\n evidence:\n matchingCalls.length === 0\n ? `Tool '${toolAssertion.toolName}' was not called.`\n : `Tool '${toolAssertion.toolName}' was called ${matchingCalls.length} time${matchingCalls.length === 1 ? \"\" : \"s\"}.`,\n source: \"tool\"\n };\n }\n\n if (toolAssertion.type === \"tool_call_order\") {\n const expectedOrder = toolAssertion.toolNames ?? [];\n let nextExpectedIndex = 0;\n for (const toolCall of toolCalls) {\n if (toolCall.name === expectedOrder[nextExpectedIndex]) {\n nextExpectedIndex += 1;\n }\n }\n\n return {\n assertion: toolAssertion.description,\n passed: nextExpectedIndex === expectedOrder.length,\n evidence:\n nextExpectedIndex === expectedOrder.length\n ? `Observed tool call order ${formatExpectedOrder(expectedOrder)}.`\n : `Expected call order ${formatExpectedOrder(expectedOrder)} but got ${formatActualOrder(toolCalls, expectedOrder)}.`,\n source: \"tool\"\n };\n }\n\n const matchingCall = toolCalls.find(\n (toolCall) =>\n toolCall.name === toolAssertion.toolName &&\n matchesArgumentSubset(toolCall.arguments, toolAssertion.expectedArgs ?? {})\n );\n\n return {\n assertion: toolAssertion.description,\n passed: Boolean(matchingCall),\n evidence: matchingCall\n ? `Tool '${toolAssertion.toolName}' was called with arguments matching ${JSON.stringify(toolAssertion.expectedArgs ?? {})}.`\n : `No '${toolAssertion.toolName}' call matched ${JSON.stringify(toolAssertion.expectedArgs ?? {})}.`,\n source: \"tool\"\n };\n });\n}\n\nfunction extractJsonArray(raw: string): unknown[] {\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n return JSON.parse(trimmed) as unknown[];\n }\n\n const start = trimmed.indexOf(\"[\");\n const end = trimmed.lastIndexOf(\"]\");\n if (start >= 0 && end > start) {\n return JSON.parse(trimmed.slice(start, end + 1)) as unknown[];\n }\n\n throw new Error(\"Model did not return a JSON array.\");\n}\n\nasync function generatePrompts(\n skill: ParsedSkill,\n provider: LanguageModelProvider,\n model: string,\n count: number\n): Promise<EvalPrompt[]> {\n const systemPrompt = [\n \"You generate realistic evaluation prompts for an agent skill.\",\n \"Return JSON only.\",\n \"Format: [{\\\"prompt\\\":\\\"...\\\",\\\"assertions\\\":[\\\"...\\\", \\\"...\\\"]}]\",\n \"Assertions should be concrete and checkable.\"\n ].join(\" \");\n\n const userPrompt = [\n `Skill name: ${skill.frontmatter.name}`,\n `Skill description: ${skill.frontmatter.description}`,\n \"Skill instructions:\",\n skill.content,\n \"\",\n `Generate ${count} prompts that stress the main capabilities and likely edge cases.`,\n // Tool-aware prompts require user-defined mock responses and are not auto-generated.\n \"Each prompt should include 2-4 assertions.\"\n ].join(\"\\n\");\n\n const raw = await provider.sendMessage(systemPrompt, userPrompt, { model });\n const parsed = evalPromptArraySchema.safeParse(extractJsonArray(raw));\n if (!parsed.success) {\n throw new Error(`Failed to parse generated eval prompts: ${parsed.error.issues[0]?.message ?? \"invalid prompt JSON\"}`);\n }\n\n if (parsed.data.length !== count) {\n throw new Error(`Expected ${count} prompts, got ${parsed.data.length}.`);\n }\n\n return parsed.data;\n}\n\nexport interface RunEvalOptions {\n provider: LanguageModelProvider;\n model: string;\n graderModel: string;\n numRuns: number;\n prompts?: EvalPrompt[];\n concurrency?: number;\n maxToolIterations?: number;\n}\n\nexport async function runEval(skill: ParsedSkill, options: RunEvalOptions): Promise<EvalResult> {\n const prompts =\n options.prompts && options.prompts.length > 0\n ? evalPromptArraySchema.parse(options.prompts)\n : await generatePrompts(skill, options.provider, options.model, options.numRuns);\n\n const systemPrompt = [\n \"You are an AI assistant with an activated skill.\",\n \"Follow this SKILL.md content exactly where applicable.\",\n \"\",\n skill.raw\n ].join(\"\\n\");\n\n const results = await pMap(\n prompts,\n async (evalPrompt) => {\n let response: string;\n let toolCalls: ToolCall[] | undefined;\n let loopIterations: number | undefined;\n\n if (evalPrompt.tools && evalPrompt.tools.length > 0) {\n const toolRun = await runWithTools({\n provider: options.provider,\n model: options.model,\n systemPrompt,\n userMessage: evalPrompt.prompt,\n tools: evalPrompt.tools,\n maxIterations: options.maxToolIterations\n });\n\n response = toolRun.finalResponse;\n toolCalls = toolRun.toolCalls;\n loopIterations = toolRun.loopIterations;\n } else {\n response = await options.provider.sendMessage(systemPrompt, evalPrompt.prompt, { model: options.model });\n }\n\n const gradedAssertions = await gradeResponse({\n provider: options.provider,\n model: options.graderModel,\n skillName: skill.frontmatter.name,\n skillBody: skill.content,\n userPrompt: evalPrompt.prompt,\n modelResponse: response,\n assertions: evalPrompt.assertions\n });\n const structuralAssertions =\n evalPrompt.toolAssertions && evalPrompt.toolAssertions.length > 0\n ? evaluateToolAssertions(evalPrompt.toolAssertions, toolCalls ?? [])\n : [];\n const assertions = [...gradedAssertions, ...structuralAssertions];\n\n const passedAssertions = assertions.filter((assertion) => assertion.passed).length;\n return {\n prompt: evalPrompt.prompt,\n assertions,\n responseSummary: response.slice(0, 200),\n response,\n passedAssertions,\n totalAssertions: assertions.length,\n ...(toolCalls ? { toolCalls } : {}),\n ...(loopIterations !== undefined ? { loopIterations } : {})\n };\n },\n options.concurrency ?? 5\n );\n\n const totalAssertions = results.reduce((total, result) => total + result.totalAssertions, 0);\n const passedAssertions = results.reduce((total, result) => total + result.passedAssertions, 0);\n\n return {\n skillName: skill.frontmatter.name,\n model: options.model,\n graderModel: options.graderModel,\n provider: options.provider.name,\n prompts,\n results,\n summary: {\n totalPrompts: results.length,\n totalAssertions,\n passedAssertions\n }\n };\n}\n","import { z } from \"zod\";\nimport { LanguageModelProvider } from \"../providers/types.js\";\n\nexport interface GradedAssertion {\n assertion: string;\n passed: boolean;\n evidence: string;\n source?: \"grader\" | \"tool\";\n}\n\nconst gradedAssertionSchema = z.object({\n assertion: z.string(),\n passed: z.boolean(),\n evidence: z.string()\n});\n\nconst graderOutputSchema = z.object({\n assertions: z.array(gradedAssertionSchema)\n});\n\nfunction extractJsonObject(raw: string): Record<string, unknown> {\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n return JSON.parse(trimmed) as Record<string, unknown>;\n }\n\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n return JSON.parse(trimmed.slice(start, end + 1)) as Record<string, unknown>;\n }\n\n throw new Error(\"Grader did not return a JSON object.\");\n}\n\nexport interface GradeResponseOptions {\n provider: LanguageModelProvider;\n model: string;\n skillName: string;\n skillBody: string;\n userPrompt: string;\n modelResponse: string;\n assertions?: string[];\n}\n\nconst DEFAULT_ASSERTIONS = [\n \"The response follows the skill instructions faithfully.\",\n \"The response is well-structured and actionable.\",\n \"The response addresses the user prompt directly.\"\n];\n\nexport interface GraderPrompts {\n assertions: string[];\n systemPrompt: string;\n userPrompt: string;\n}\n\nexport function buildGraderPrompts(\n options: Omit<GradeResponseOptions, \"provider\" | \"model\">\n): GraderPrompts {\n const assertions =\n options.assertions && options.assertions.length > 0 ? options.assertions : DEFAULT_ASSERTIONS;\n\n const systemPrompt = [\n \"You are a strict evaluator for agent skill outputs.\",\n \"Assess each assertion and return JSON only.\",\n \"Required output format: {\\\"assertions\\\":[{\\\"assertion\\\":\\\"...\\\",\\\"passed\\\":true|false,\\\"evidence\\\":\\\"...\\\"}]}\"\n ].join(\" \");\n\n const userPrompt = [\n `Skill: ${options.skillName}`,\n \"Skill instructions:\",\n options.skillBody,\n \"\",\n `User prompt: ${options.userPrompt}`,\n \"\",\n \"Model response:\",\n options.modelResponse,\n \"\",\n \"Assertions to evaluate:\",\n assertions.map((assertion, index) => `${index + 1}. ${assertion}`).join(\"\\n\")\n ].join(\"\\n\");\n\n return {\n assertions,\n systemPrompt,\n userPrompt\n };\n}\n\nexport function parseGraderOutput(raw: string): GradedAssertion[] {\n const parsed = graderOutputSchema.safeParse(extractJsonObject(raw));\n\n if (!parsed.success) {\n throw new Error(`Failed to parse grader output: ${parsed.error.issues[0]?.message ?? \"invalid grader JSON\"}`);\n }\n\n return parsed.data.assertions;\n}\n\nexport async function gradeResponse(options: GradeResponseOptions): Promise<GradedAssertion[]> {\n const prompts = buildGraderPrompts(options);\n const raw = await options.provider.sendMessage(prompts.systemPrompt, prompts.userPrompt, { model: options.model });\n return parseGraderOutput(raw).map((assertion) => ({\n ...assertion,\n source: \"grader\"\n }));\n}\n","export async function pMap<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<R[]> {\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new Error(\"pMap concurrency must be an integer greater than or equal to 1.\");\n }\n\n if (items.length === 0) {\n return [];\n }\n\n const results = new Array<R>(items.length);\n\n return new Promise<R[]>((resolve, reject) => {\n let nextIndex = 0;\n let completed = 0;\n let rejected = false;\n\n const launchNext = (): void => {\n if (rejected) {\n return;\n }\n\n if (completed === items.length) {\n resolve(results);\n return;\n }\n\n if (nextIndex >= items.length) {\n return;\n }\n\n const currentIndex = nextIndex;\n nextIndex += 1;\n\n Promise.resolve()\n .then(() => fn(items[currentIndex], currentIndex))\n .then((result) => {\n if (rejected) {\n return;\n }\n\n results[currentIndex] = result;\n completed += 1;\n\n if (completed === items.length) {\n resolve(results);\n return;\n }\n\n launchNext();\n })\n .catch((error: unknown) => {\n if (rejected) {\n return;\n }\n\n rejected = true;\n reject(error);\n });\n };\n\n const initialWorkers = Math.min(concurrency, items.length);\n for (let workerIndex = 0; workerIndex < initialWorkers; workerIndex += 1) {\n launchNext();\n }\n });\n}\n","import {\n ConversationBlock,\n LanguageModelProvider,\n ToolDefinition,\n ToolUseBlock\n} from \"../providers/types.js\";\n\nexport interface ToolParameter {\n name: string;\n type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n description: string;\n required?: boolean;\n}\n\nexport interface MockToolDefinition {\n name: string;\n description: string;\n parameters?: ToolParameter[];\n responses: Record<string, string>;\n}\n\nexport interface ToolCall {\n name: string;\n arguments: Record<string, unknown>;\n response: string;\n turnIndex: number;\n}\n\nexport interface ToolEnvironmentResult {\n finalResponse: string;\n toolCalls: ToolCall[];\n loopIterations: number;\n}\n\nexport interface RunWithToolsOptions {\n provider: LanguageModelProvider;\n model: string;\n systemPrompt: string;\n userMessage: string;\n tools: MockToolDefinition[];\n maxIterations?: number;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction deepEqual(left: unknown, right: unknown): boolean {\n if (Array.isArray(left) && Array.isArray(right)) {\n if (left.length !== right.length) {\n return false;\n }\n\n return left.every((item, index) => deepEqual(item, right[index]));\n }\n\n if (isPlainObject(left) && isPlainObject(right)) {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n return leftKeys.every((key) => deepEqual(left[key], right[key]));\n }\n\n return left === right;\n}\n\nexport function matchesArgumentSubset(actual: unknown, expected: unknown): boolean {\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual) || actual.length !== expected.length) {\n return false;\n }\n\n return expected.every((value, index) => matchesArgumentSubset(actual[index], value));\n }\n\n if (isPlainObject(expected)) {\n if (!isPlainObject(actual)) {\n return false;\n }\n\n return Object.entries(expected).every(([key, value]) => matchesArgumentSubset(actual[key], value));\n }\n\n return deepEqual(actual, expected);\n}\n\nfunction parseResponsePattern(pattern: string): Record<string, unknown> | null {\n if (pattern === \"*\") {\n return null;\n }\n\n try {\n const parsed = JSON.parse(pattern) as unknown;\n return isPlainObject(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction renderFallbackResponse(tool: MockToolDefinition, args: Record<string, unknown>): string {\n return `[mock] No mock response configured for tool '${tool.name}' with arguments: ${JSON.stringify(args)}`;\n}\n\nexport function resolveToolResponse(tool: MockToolDefinition, args: Record<string, unknown>): string {\n const exactMatchKey = JSON.stringify(args);\n const exactMatch = tool.responses[exactMatchKey];\n if (exactMatch !== undefined) {\n return exactMatch;\n }\n\n let bestPartialMatch: { specificity: number; response: string } | null = null;\n for (const [pattern, response] of Object.entries(tool.responses)) {\n if (pattern === \"*\") {\n continue;\n }\n\n const parsedPattern = parseResponsePattern(pattern);\n if (!parsedPattern) {\n continue;\n }\n\n if (!matchesArgumentSubset(args, parsedPattern)) {\n continue;\n }\n\n const specificity = Object.keys(parsedPattern).length;\n if (!bestPartialMatch || specificity > bestPartialMatch.specificity) {\n bestPartialMatch = { specificity, response };\n }\n }\n\n if (bestPartialMatch) {\n return bestPartialMatch.response;\n }\n\n const wildcardMatch = tool.responses[\"*\"];\n if (wildcardMatch !== undefined) {\n return wildcardMatch;\n }\n\n return renderFallbackResponse(tool, args);\n}\n\nexport function toProviderToolDefinitions(mockTools: MockToolDefinition[]): ToolDefinition[] {\n return mockTools.map((tool) => {\n const parameters = tool.parameters ?? [];\n return {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties: Object.fromEntries(\n parameters.map((parameter) => [\n parameter.name,\n {\n type: parameter.type,\n description: parameter.description\n }\n ])\n ),\n required: parameters.filter((parameter) => parameter.required).map((parameter) => parameter.name)\n }\n };\n });\n}\n\nfunction toAssistantConversationBlocks(response: { textContent: string; toolUseBlocks: ToolUseBlock[] }): ConversationBlock[] {\n const contentBlocks = [];\n\n if (response.textContent.trim().length > 0) {\n contentBlocks.push({\n type: \"text\",\n text: response.textContent\n });\n }\n\n for (const block of response.toolUseBlocks) {\n contentBlocks.push({\n type: \"tool_use\",\n id: block.id,\n name: block.name,\n input: block.arguments\n });\n }\n\n return contentBlocks.length === 0\n ? []\n : [\n {\n role: \"assistant\" as const,\n content: contentBlocks\n }\n ];\n}\n\nexport async function runWithTools(options: RunWithToolsOptions): Promise<ToolEnvironmentResult> {\n const maxIterations = options.maxIterations ?? 10;\n const toolsByName = new Map(options.tools.map((tool) => [tool.name, tool]));\n const providerTools = toProviderToolDefinitions(options.tools);\n const messages: ConversationBlock[] = [{ role: \"user\", content: options.userMessage }];\n const toolCalls: ToolCall[] = [];\n let finalResponse = \"\";\n let loopIterations = 0;\n\n while (loopIterations < maxIterations) {\n loopIterations += 1;\n\n const response = await options.provider.sendWithTools(options.systemPrompt, messages, {\n model: options.model,\n tools: providerTools\n });\n\n if (response.textContent.trim().length > 0) {\n finalResponse = response.textContent;\n }\n\n if (response.toolUseBlocks.length === 0) {\n return {\n finalResponse,\n toolCalls,\n loopIterations\n };\n }\n\n messages.push(...toAssistantConversationBlocks(response));\n\n const toolResultBlocks = [];\n for (const toolUse of response.toolUseBlocks) {\n const tool = toolsByName.get(toolUse.name);\n const resolvedResponse = tool\n ? resolveToolResponse(tool, toolUse.arguments)\n : `[mock] No tool named '${toolUse.name}' is registered.`;\n\n toolCalls.push({\n name: toolUse.name,\n arguments: toolUse.arguments,\n response: resolvedResponse,\n turnIndex: loopIterations\n });\n\n toolResultBlocks.push({\n type: \"tool_result\",\n tool_use_id: toolUse.id,\n content: resolvedResponse\n });\n }\n\n messages.push({\n role: \"user\",\n content: toolResultBlocks\n });\n }\n\n const terminationNote = `[skilltest: tool loop terminated after ${maxIterations} iterations]`;\n finalResponse = finalResponse ? `${finalResponse}\\n\\n${terminationNote}` : terminationNote;\n\n return {\n finalResponse,\n toolCalls,\n loopIterations\n };\n}\n","import { z } from \"zod\";\nimport { ParsedSkill, parseSkillStrict } from \"./skill-parser.js\";\nimport { LanguageModelProvider } from \"../providers/types.js\";\nimport { pMap } from \"../utils/concurrency.js\";\n\nexport interface TriggerQuery {\n query: string;\n should_trigger: boolean;\n}\n\nexport interface TriggerTestCaseResult {\n query: string;\n shouldTrigger: boolean;\n expected: string;\n actual: string;\n matched: boolean;\n selectedCompetitor?: string;\n rawModelResponse?: string;\n}\n\nexport interface TriggerMetrics {\n truePositives: number;\n trueNegatives: number;\n falsePositives: number;\n falseNegatives: number;\n precision: number;\n recall: number;\n f1: number;\n}\n\nexport interface TriggerTestResult {\n skillName: string;\n model: string;\n provider: string;\n seed?: number;\n competitors?: CompetitorSkill[];\n queries: TriggerQuery[];\n cases: TriggerTestCaseResult[];\n metrics: TriggerMetrics;\n suggestions: string[];\n}\n\nexport interface CompetitorSkill {\n name: string;\n description: string;\n sourcePath: string;\n}\n\nconst triggerQuerySchema = z.object({\n query: z.string().min(1),\n should_trigger: z.boolean()\n});\n\nexport const triggerQueryArraySchema = z.array(triggerQuerySchema);\nexport const triggerNumQueriesSchema = z\n .number()\n .int()\n .min(2)\n .refine((value) => value % 2 === 0, \"numQueries must be an even number.\");\n\nconst FAKE_SKILLS: Array<{ name: string; description: string }> = [\n { name: \"code-review\", description: \"Reviews code changes for bugs, regressions, and maintainability issues.\" },\n { name: \"api-tester\", description: \"Designs and runs REST API tests, validating status codes and response shapes.\" },\n { name: \"db-migrator\", description: \"Plans and generates safe database migration scripts with rollback guidance.\" },\n { name: \"bug-repro\", description: \"Reproduces reported bugs by building deterministic minimal test cases.\" },\n { name: \"release-notes\", description: \"Drafts release notes from commits and PR metadata for stakeholders.\" },\n { name: \"log-analyzer\", description: \"Analyzes service logs to identify error clusters and likely root causes.\" },\n { name: \"performance-audit\", description: \"Finds hotspots in runtime and suggests profiling-driven optimizations.\" },\n { name: \"security-audit\", description: \"Checks code and config for common security vulnerabilities and risky defaults.\" },\n { name: \"refactor-planner\", description: \"Breaks large refactors into safe incremental steps with validation plans.\" },\n { name: \"schema-designer\", description: \"Designs JSON schemas and validates data contracts for integrations.\" },\n { name: \"docs-writer\", description: \"Writes developer documentation, tutorials, and API usage examples.\" },\n { name: \"cli-scaffolder\", description: \"Creates CLI project skeletons with argument parsing and help text.\" },\n { name: \"incident-triage\", description: \"Triage production incidents with severity tagging and next-action checklists.\" },\n { name: \"test-generator\", description: \"Generates unit and integration test cases from feature requirements.\" },\n { name: \"prompt-tuner\", description: \"Improves prompts for reliability, formatting, and failure handling.\" }\n];\n\nexport interface PreparedTriggerQuery {\n testQuery: TriggerQuery;\n fakeSkills: Array<{ name: string; description: string }>;\n allSkills: Array<{ name: string; description: string }>;\n skillListText: string;\n}\n\nfunction mulberry32(seed: number): () => number {\n return () => {\n seed |= 0;\n seed = (seed + 0x6d2b79f5) | 0;\n let t = Math.imul(seed ^ (seed >>> 15), 1 | seed);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nfunction createRng(seed?: number): () => number {\n return seed !== undefined ? mulberry32(seed) : Math.random;\n}\n\nfunction shuffle<T>(values: T[], rng: () => number): T[] {\n const copy = [...values];\n for (let index = copy.length - 1; index > 0; index -= 1) {\n const swapIndex = Math.floor(rng() * (index + 1));\n [copy[index], copy[swapIndex]] = [copy[swapIndex], copy[index]];\n }\n return copy;\n}\n\nfunction sample<T>(values: T[], count: number, rng: () => number): T[] {\n return shuffle(values, rng).slice(0, Math.max(0, Math.min(count, values.length)));\n}\n\nexport function validateNumQueries(numQueries: number): number {\n return triggerNumQueriesSchema.parse(numQueries);\n}\n\nfunction parseJsonArrayFromModelOutput(raw: string): unknown[] {\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n return JSON.parse(trimmed) as unknown[];\n }\n\n const start = trimmed.indexOf(\"[\");\n const end = trimmed.lastIndexOf(\"]\");\n if (start >= 0 && end > start) {\n const possibleJson = trimmed.slice(start, end + 1);\n return JSON.parse(possibleJson) as unknown[];\n }\n\n throw new Error(\"Model did not return a JSON array.\");\n}\n\nasync function generateQueriesWithModel(\n skill: ParsedSkill,\n provider: LanguageModelProvider,\n model: string,\n numQueries: number,\n competitors?: CompetitorSkill[]\n): Promise<TriggerQuery[]> {\n validateNumQueries(numQueries);\n const shouldTriggerCount = Math.floor(numQueries / 2);\n const shouldNotTriggerCount = numQueries - shouldTriggerCount;\n\n const systemPrompt = [\n \"You generate realistic user prompts to test whether a specific agent skill triggers.\",\n \"Return JSON only. No markdown, no comments.\",\n \"Each entry must be an object: {\\\"query\\\": string, \\\"should_trigger\\\": boolean}.\",\n \"Create substantive prompts, not toy one-liners.\"\n ].join(\" \");\n\n const userPrompt = [\n `Skill name: ${skill.frontmatter.name}`,\n `Skill description: ${skill.frontmatter.description}`,\n ...(competitors && competitors.length > 0\n ? [\n \"\",\n \"Competitor skills in the same domain:\",\n ...competitors.map((competitor) => `- ${competitor.name}: ${competitor.description}`),\n \"\",\n \"Generate queries that test whether the target skill triggers correctly even when these similar skills exist.\",\n \"Positive queries should clearly belong to the target skill, not the competitors.\",\n \"Negative queries should belong to a competitor or to no skill at all.\"\n ]\n : []),\n `Generate ${numQueries} prompts total.`,\n `Exactly ${shouldTriggerCount} should have should_trigger=true.`,\n `Exactly ${shouldNotTriggerCount} should have should_trigger=false.`,\n \"Prompts should look like real user requests with enough context to drive a trigger decision.\"\n ].join(\"\\n\");\n\n const raw = await provider.sendMessage(systemPrompt, userPrompt, { model });\n const parsed = triggerQueryArraySchema.safeParse(parseJsonArrayFromModelOutput(raw));\n if (!parsed.success) {\n throw new Error(`Failed to parse generated queries: ${parsed.error.issues[0]?.message ?? \"invalid format\"}`);\n }\n\n const trueCount = parsed.data.filter((item) => item.should_trigger).length;\n const falseCount = parsed.data.length - trueCount;\n if (parsed.data.length !== numQueries || trueCount !== shouldTriggerCount || falseCount !== shouldNotTriggerCount) {\n throw new Error(\n `Generated query split mismatch. Expected ${numQueries} (${shouldTriggerCount}/${shouldNotTriggerCount}), got ${parsed.data.length} (${trueCount}/${falseCount}).`\n );\n }\n\n return parsed.data;\n}\n\nfunction parseDecision(rawResponse: string, skillNames: string[]): string {\n const normalized = rawResponse.trim().toLowerCase();\n if (normalized === \"none\" || normalized.startsWith(\"none\")) {\n return \"none\";\n }\n\n for (const skillName of skillNames) {\n const escaped = skillName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regex = new RegExp(`\\\\b${escaped}\\\\b`, \"i\");\n if (regex.test(rawResponse)) {\n return skillName;\n }\n }\n\n return \"unrecognized\";\n}\n\nexport function prepareTriggerQueries(\n skill: Pick<ParsedSkill, \"frontmatter\">,\n queries: TriggerQuery[],\n seed?: number,\n competitors?: CompetitorSkill[]\n): PreparedTriggerQuery[] {\n const rng = createRng(seed);\n const competitorCandidates = (competitors ?? []).map((competitor) => ({\n name: competitor.name,\n description: competitor.description\n }));\n\n return queries.map((testQuery) => {\n const usingCompetitors = competitorCandidates.length > 0;\n const fakeCount = usingCompetitors\n ? testQuery.should_trigger\n ? 2 + Math.floor(rng() * 3)\n : 3 + Math.floor(rng() * 3)\n : 5 + Math.floor(rng() * 5);\n const fakeSkills = sample(FAKE_SKILLS, fakeCount, rng);\n const allSkills = usingCompetitors\n ? shuffle(\n [\n ...competitorCandidates,\n ...fakeSkills,\n ...(testQuery.should_trigger\n ? [\n {\n name: skill.frontmatter.name,\n description: skill.frontmatter.description\n }\n ]\n : [])\n ],\n rng\n )\n : shuffle(\n [\n ...fakeSkills,\n {\n name: skill.frontmatter.name,\n description: skill.frontmatter.description\n }\n ],\n rng\n );\n\n return {\n testQuery,\n fakeSkills,\n allSkills,\n skillListText: allSkills.map((entry) => `- ${entry.name}: ${entry.description}`).join(\"\\n\")\n };\n });\n}\n\nexport function calculateMetrics(skillName: string, cases: TriggerTestCaseResult[]): TriggerMetrics {\n let truePositives = 0;\n let trueNegatives = 0;\n let falsePositives = 0;\n let falseNegatives = 0;\n\n for (const testCase of cases) {\n const choseTargetSkill = testCase.actual === skillName;\n if (testCase.shouldTrigger && choseTargetSkill) {\n truePositives += 1;\n continue;\n }\n if (testCase.shouldTrigger && !choseTargetSkill) {\n falseNegatives += 1;\n continue;\n }\n if (!testCase.shouldTrigger && choseTargetSkill) {\n falsePositives += 1;\n continue;\n }\n trueNegatives += 1;\n }\n\n const precisionDenominator = truePositives + falsePositives;\n const recallDenominator = truePositives + falseNegatives;\n const precision = precisionDenominator === 0 ? 0 : truePositives / precisionDenominator;\n const recall = recallDenominator === 0 ? 0 : truePositives / recallDenominator;\n const f1 = precision + recall === 0 ? 0 : (2 * precision * recall) / (precision + recall);\n\n return {\n truePositives,\n trueNegatives,\n falsePositives,\n falseNegatives,\n precision,\n recall,\n f1\n };\n}\n\nexport function assertCompetitorNamesDistinct(skillName: string, competitors: CompetitorSkill[]): void {\n for (const competitor of competitors) {\n if (competitor.name === skillName) {\n throw new Error(`Competitor skill '${competitor.name}' has the same name as the skill under test.`);\n }\n }\n}\n\nexport function buildTriggerCaseResult(options: {\n testQuery: TriggerQuery;\n skillName: string;\n decision: string;\n competitorNames?: string[];\n rawModelResponse?: string;\n}): TriggerTestCaseResult {\n const expected = options.testQuery.should_trigger ? options.skillName : \"none\";\n const matched = options.testQuery.should_trigger ? options.decision === options.skillName : options.decision !== options.skillName;\n const selectedCompetitor = options.competitorNames?.includes(options.decision) ? options.decision : undefined;\n\n return {\n query: options.testQuery.query,\n shouldTrigger: options.testQuery.should_trigger,\n expected,\n actual: options.decision,\n matched,\n selectedCompetitor,\n rawModelResponse: options.rawModelResponse\n };\n}\n\nfunction buildSuggestions(\n skillName: string,\n metrics: TriggerMetrics,\n cases: TriggerTestCaseResult[],\n competitors?: CompetitorSkill[]\n): string[] {\n const suggestions: string[] = [];\n if (metrics.falseNegatives > 0) {\n suggestions.push(\n \"False negatives found: clarify capability keywords and add explicit 'use when ...' phrasing in description.\"\n );\n if (competitors && competitors.length > 0) {\n const competitorCounts = new Map<string, number>();\n for (const testCase of cases) {\n if (!testCase.shouldTrigger || testCase.actual === skillName || !testCase.selectedCompetitor) {\n continue;\n }\n competitorCounts.set(testCase.selectedCompetitor, (competitorCounts.get(testCase.selectedCompetitor) ?? 0) + 1);\n }\n\n for (const [competitorName, count] of competitorCounts.entries()) {\n suggestions.push(\n `Skill '${competitorName}' was selected instead of '${skillName}' for ${count} quer${count === 1 ? \"y\" : \"ies\"}. Differentiate your description from '${competitorName}'.`\n );\n }\n }\n }\n if (metrics.falsePositives > 0) {\n suggestions.push(\"False positives found: narrow scope boundaries and add explicit non-goals in description.\");\n if (competitors && competitors.length > 0) {\n suggestions.push(\n `With competitor skills present, ${metrics.falsePositives} negative quer${metrics.falsePositives === 1 ? \"y still\" : \"ies still\"} triggered '${skillName}'. Narrow your description's scope boundaries.`\n );\n }\n }\n if (suggestions.length === 0) {\n suggestions.push(\"Trigger behavior looks clean on this sample. Keep monitoring with domain-specific custom queries.\");\n }\n return suggestions;\n}\n\nexport interface RunTriggerTestOptions {\n model: string;\n provider: LanguageModelProvider;\n queries?: TriggerQuery[];\n numQueries: number;\n compare?: string[];\n seed?: number;\n concurrency?: number;\n verbose?: boolean;\n}\n\nasync function loadCompetitorSkills(comparePaths: string[]): Promise<CompetitorSkill[]> {\n const competitors: CompetitorSkill[] = [];\n\n for (const comparePath of comparePaths) {\n const parsed = await parseSkillStrict(comparePath);\n competitors.push({\n name: parsed.frontmatter.name,\n description: parsed.frontmatter.description,\n sourcePath: comparePath\n });\n }\n\n return competitors;\n}\n\nexport async function runTriggerTest(skill: ParsedSkill, options: RunTriggerTestOptions): Promise<TriggerTestResult> {\n const competitors =\n options.compare && options.compare.length > 0 ? await loadCompetitorSkills(options.compare) : undefined;\n if (competitors && competitors.length > 0) {\n assertCompetitorNamesDistinct(skill.frontmatter.name, competitors);\n }\n\n const queries =\n options.queries && options.queries.length > 0\n ? triggerQueryArraySchema.parse(options.queries)\n : await generateQueriesWithModel(skill, options.provider, options.model, options.numQueries, competitors);\n\n const skillName = skill.frontmatter.name;\n const preparedQueries = prepareTriggerQueries(skill, queries, options.seed, competitors);\n const competitorNames = competitors?.map((competitor) => competitor.name) ?? [];\n\n const systemPrompt = [\n \"You are selecting one skill to activate for a user query.\",\n \"Choose the single best matching skill name from the provided list, or 'none' if no skill is a good fit.\",\n \"Respond with only the skill name or 'none'.\"\n ].join(\" \");\n\n const results = await pMap(\n preparedQueries,\n async ({ testQuery, allSkills, skillListText }) => {\n const userPrompt = [`Available skills:`, skillListText, \"\", `User query: ${testQuery.query}`].join(\"\\n\");\n const rawResponse = await options.provider.sendMessage(systemPrompt, userPrompt, { model: options.model });\n const decision = parseDecision(\n rawResponse,\n Array.from(new Set([skillName, ...allSkills.map((entry) => entry.name)]))\n );\n\n return buildTriggerCaseResult({\n testQuery,\n skillName,\n decision,\n competitorNames,\n rawModelResponse: options.verbose ? rawResponse : undefined\n });\n },\n options.concurrency ?? 5\n );\n\n const metrics = calculateMetrics(skillName, results);\n\n return {\n skillName,\n model: options.model,\n provider: options.provider.name,\n seed: options.seed,\n competitors,\n queries,\n cases: results,\n metrics,\n suggestions: buildSuggestions(skillName, metrics, results, competitors)\n };\n}\n","export function renderJson(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n","import fs from \"node:fs/promises\";\nimport ora from \"ora\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { runTriggerTest } from \"../core/trigger-tester.js\";\nimport { parseSkillStrict } from \"../core/skill-parser.js\";\nimport { createProvider } from \"../providers/index.js\";\nimport { renderTriggerHtml } from \"../reporters/html.js\";\nimport { renderTriggerReport } from \"../reporters/terminal.js\";\nimport { getGlobalCliOptions, getResolvedConfig, loadTriggerQueriesFile, writeError, writeResult } from \"./common.js\";\nimport { writeJsonFile } from \"../utils/fs.js\";\n\nconst triggerCliSchema = z.object({\n queries: z.string().optional(),\n saveQueries: z.string().optional(),\n compare: z.array(z.string().min(1)).optional(),\n seed: z.number().int().optional(),\n concurrency: z.number().int().min(1).optional(),\n html: z.string().optional(),\n verbose: z.boolean().optional(),\n apiKey: z.string().optional()\n});\n\nconst DEFAULT_ANTHROPIC_MODEL = \"claude-sonnet-4-5-20250929\";\nconst DEFAULT_OPENAI_MODEL = \"gpt-4.1-mini\";\n\ninterface TriggerCommandOptions {\n json: boolean;\n color: boolean;\n model: string;\n provider: \"anthropic\" | \"openai\";\n queries?: string;\n numQueries: number;\n compare: string[];\n saveQueries?: string;\n seed?: number;\n concurrency: number;\n html?: string;\n verbose: boolean;\n apiKey?: string;\n}\n\nfunction resolveModel(provider: \"anthropic\" | \"openai\", model: string): string {\n if (provider === \"openai\" && model === DEFAULT_ANTHROPIC_MODEL) {\n return DEFAULT_OPENAI_MODEL;\n }\n return model;\n}\n\nfunction renderTriggerOutputWithSeed(output: string, seed?: number): string {\n if (seed === undefined) {\n return output;\n }\n return `${output}\\nSeed: ${seed}`;\n}\n\nasync function handleTriggerCommand(targetPath: string, options: TriggerCommandOptions): Promise<void> {\n const spinner = options.json || !process.stdout.isTTY ? null : ora(\"Preparing trigger evaluation...\").start();\n\n try {\n if (spinner) {\n spinner.text = \"Parsing skill...\";\n }\n const skill = await parseSkillStrict(targetPath);\n\n if (spinner) {\n spinner.text = \"Initializing model provider...\";\n }\n const provider = createProvider(options.provider, options.apiKey);\n\n let queries = undefined;\n if (options.queries) {\n if (spinner) {\n spinner.text = \"Loading custom trigger queries...\";\n }\n queries = await loadTriggerQueriesFile(options.queries);\n }\n\n if (spinner) {\n spinner.text = \"Running trigger simulations...\";\n }\n const model = resolveModel(options.provider, options.model);\n const result = await runTriggerTest(skill, {\n model,\n provider,\n queries,\n numQueries: options.numQueries,\n compare: options.compare,\n seed: options.seed,\n concurrency: options.concurrency,\n verbose: options.verbose\n });\n\n if (options.saveQueries) {\n await writeJsonFile(options.saveQueries, result.queries);\n }\n\n spinner?.stop();\n if (options.json) {\n writeResult(result, true);\n } else {\n writeResult(renderTriggerOutputWithSeed(renderTriggerReport(result, options.color, options.verbose), result.seed), false);\n }\n\n if (options.html) {\n const htmlResult: typeof result & { target: string } = {\n ...result,\n target: targetPath\n };\n await fs.writeFile(options.html, renderTriggerHtml(htmlResult), \"utf8\");\n }\n } catch (error) {\n spinner?.stop();\n writeError(error, options.json);\n process.exitCode = 2;\n }\n}\n\nexport function registerTriggerCommand(program: Command): void {\n program\n .command(\"trigger\")\n .description(\"Evaluate whether a skill description triggers correctly.\")\n .argument(\"<path-to-skill>\", \"Path to SKILL.md or skill directory\")\n .option(\"--model <model>\", \"Model to use\")\n .option(\"--provider <provider>\", \"LLM provider: anthropic|openai\")\n .option(\"--queries <path>\", \"Path to custom test queries JSON\")\n .option(\"--compare <path...>\", \"Path(s) to sibling skill directories to include as competitors\")\n .option(\"--num-queries <n>\", \"Number of auto-generated queries\", (value) => Number.parseInt(value, 10))\n .option(\"--seed <number>\", \"RNG seed for reproducible results\", (value) => Number.parseInt(value, 10))\n .option(\"--concurrency <n>\", \"Maximum in-flight trigger requests\", (value) => Number.parseInt(value, 10))\n .option(\"--html <path>\", \"Write an HTML report to the given file path\")\n .option(\"--save-queries <path>\", \"Save generated queries to a JSON file\")\n .option(\"--api-key <key>\", \"API key override\")\n .option(\"--verbose\", \"Show full model decisions\")\n .action(async (targetPath: string, _commandOptions: unknown, command: Command) => {\n const globalOptions = getGlobalCliOptions(command);\n const config = getResolvedConfig(command);\n const parsedCli = triggerCliSchema.safeParse(command.opts());\n if (!parsedCli.success) {\n writeError(new Error(parsedCli.error.issues[0]?.message ?? \"Invalid trigger options.\"), globalOptions.json);\n process.exitCode = 2;\n return;\n }\n\n await handleTriggerCommand(targetPath, {\n ...globalOptions,\n model: config.model,\n provider: config.provider,\n queries: parsedCli.data.queries,\n numQueries: config.trigger.numQueries,\n compare: config.trigger.compare,\n saveQueries: parsedCli.data.saveQueries,\n seed: parsedCli.data.seed ?? config.trigger.seed,\n concurrency: config.concurrency,\n html: parsedCli.data.html,\n verbose: Boolean(parsedCli.data.verbose),\n apiKey: parsedCli.data.apiKey\n });\n });\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { resolveSkillPath } from \"../core/skill-parser.js\";\nimport { ProviderName } from \"../providers/types.js\";\nimport { pathExists } from \"./fs.js\";\n\nconst providerNameSchema = z.enum([\"anthropic\", \"openai\"]);\nconst lintFailOnSchema = z.enum([\"error\", \"warn\"]);\n\nconst lintConfigSchema = z\n .object({\n failOn: lintFailOnSchema.optional(),\n suppress: z.array(z.string().min(1)).optional(),\n plugins: z.array(z.string().min(1)).optional()\n })\n .strict();\n\nconst triggerConfigSchema = z\n .object({\n numQueries: z\n .number()\n .int()\n .min(2)\n .refine((value) => value % 2 === 0, \"trigger.numQueries must be an even number.\"),\n threshold: z.number().min(0).max(1).optional(),\n seed: z.number().int().optional(),\n compare: z.array(z.string().min(1)).optional()\n })\n .strict()\n .partial();\n\nconst evalConfigSchema = z\n .object({\n numRuns: z.number().int().min(1).optional(),\n threshold: z.number().min(0).max(1).optional(),\n promptFile: z.string().min(1).optional(),\n assertionsFile: z.string().min(1).optional(),\n maxToolIterations: z.number().int().min(1).max(50).optional()\n })\n .strict()\n .partial();\n\nexport const skilltestConfigSchema = z\n .object({\n provider: providerNameSchema.optional(),\n model: z.string().min(1).optional(),\n json: z.boolean().optional(),\n concurrency: z.number().int().min(1).optional(),\n lint: lintConfigSchema.optional(),\n trigger: triggerConfigSchema.optional(),\n eval: evalConfigSchema.optional()\n })\n .strict();\n\nconst resolvedSkilltestConfigSchema = z.object({\n provider: providerNameSchema,\n model: z.string().min(1),\n json: z.boolean(),\n concurrency: z.number().int().min(1),\n lint: z.object({\n failOn: lintFailOnSchema,\n suppress: z.array(z.string().min(1)),\n plugins: z.array(z.string().min(1))\n }),\n trigger: z.object({\n numQueries: z.number().int().min(2).refine((value) => value % 2 === 0, \"trigger.numQueries must be an even number.\"),\n threshold: z.number().min(0).max(1),\n seed: z.number().int().optional(),\n compare: z.array(z.string().min(1))\n }),\n eval: z.object({\n numRuns: z.number().int().min(1),\n threshold: z.number().min(0).max(1),\n promptFile: z.string().min(1).optional(),\n assertionsFile: z.string().min(1).optional(),\n maxToolIterations: z.number().int().min(1).max(50)\n })\n});\n\nexport type SkilltestConfigFile = z.infer<typeof skilltestConfigSchema>;\nexport type LintFailOn = z.infer<typeof lintFailOnSchema>;\nexport type ResolvedSkilltestConfig = z.infer<typeof resolvedSkilltestConfigSchema>;\n\nexport interface ResolvedConfigContext {\n configFile: SkilltestConfigFile | null;\n config: ResolvedSkilltestConfig;\n sourcePath: string | null;\n sourceDirectory: string;\n}\n\ninterface LoadedConfigFile {\n configFile: SkilltestConfigFile;\n sourcePath: string;\n sourceDirectory: string;\n}\n\nexport const DEFAULT_SKILLTEST_CONFIG: ResolvedSkilltestConfig = {\n provider: \"anthropic\",\n model: \"claude-sonnet-4-5-20250929\",\n json: false,\n concurrency: 5,\n lint: {\n failOn: \"error\",\n suppress: [],\n plugins: []\n },\n trigger: {\n numQueries: 20,\n threshold: 0.8,\n compare: []\n },\n eval: {\n numRuns: 5,\n threshold: 0.9,\n maxToolIterations: 10\n }\n};\n\nfunction formatIssuePath(issuePath: Array<string | number>): string {\n if (issuePath.length === 0) {\n return \"root\";\n }\n return issuePath.map(String).join(\".\");\n}\n\nfunction buildConfigValidationError(error: z.ZodError, sourceLabel: string): Error {\n const issue = error.issues[0];\n const issuePath = formatIssuePath(issue?.path ?? []);\n const issueMessage = issue?.message ?? \"Invalid config value.\";\n return new Error(`Invalid skilltest config in ${sourceLabel} at ${issuePath}: ${issueMessage}`);\n}\n\nasync function readJsonObject(filePath: string, label: string): Promise<unknown> {\n let raw: string;\n try {\n raw = await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to read ${label}: ${message}`);\n }\n\n try {\n return JSON.parse(raw) as unknown;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid JSON in ${label}: ${message}`);\n }\n}\n\nasync function loadConfigFromJsonFile(filePath: string): Promise<LoadedConfigFile | null> {\n if (!(await pathExists(filePath))) {\n return null;\n }\n\n const raw = await readJsonObject(filePath, filePath);\n const parsed = skilltestConfigSchema.safeParse(raw);\n if (!parsed.success) {\n throw buildConfigValidationError(parsed.error, filePath);\n }\n\n return {\n configFile: parsed.data,\n sourcePath: filePath,\n sourceDirectory: path.dirname(filePath)\n };\n}\n\nasync function loadConfigFromNearestPackageJson(startDirectory: string): Promise<LoadedConfigFile | null> {\n let currentDirectory = path.resolve(startDirectory);\n\n while (true) {\n const packageJsonPath = path.join(currentDirectory, \"package.json\");\n if (await pathExists(packageJsonPath)) {\n const raw = await readJsonObject(packageJsonPath, packageJsonPath);\n const packageJsonSchema = z\n .object({\n skilltestrc: skilltestConfigSchema.optional()\n })\n .passthrough();\n const parsed = packageJsonSchema.safeParse(raw);\n if (!parsed.success) {\n throw buildConfigValidationError(parsed.error, `${packageJsonPath}#skilltestrc`);\n }\n\n if (!parsed.data.skilltestrc) {\n return null;\n }\n\n return {\n configFile: parsed.data.skilltestrc,\n sourcePath: packageJsonPath,\n sourceDirectory: currentDirectory\n };\n }\n\n const parentDirectory = path.dirname(currentDirectory);\n if (parentDirectory === currentDirectory) {\n return null;\n }\n currentDirectory = parentDirectory;\n }\n}\n\nasync function resolveSkillDirectoryConfig(targetPath?: string): Promise<LoadedConfigFile | null> {\n if (!targetPath) {\n return null;\n }\n\n try {\n const { skillRoot } = await resolveSkillPath(targetPath);\n return loadConfigFromJsonFile(path.join(skillRoot, \".skilltestrc\"));\n } catch {\n return null;\n }\n}\n\nfunction resolveConfigRelativePath(baseDirectory: string, value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n return path.resolve(baseDirectory, value);\n}\n\nfunction resolveConfigRelativePaths(baseDirectory: string, values: string[] | undefined): string[] {\n if (!values || values.length === 0) {\n return [];\n }\n return values.map((value) => path.resolve(baseDirectory, value));\n}\n\nexport function mergeConfigLayers(\n configFile: SkilltestConfigFile = {},\n cliFlags: SkilltestConfigFile = {},\n baseDirectory = process.cwd()\n): ResolvedSkilltestConfig {\n const merged = {\n provider: cliFlags.provider ?? configFile.provider ?? DEFAULT_SKILLTEST_CONFIG.provider,\n model: cliFlags.model ?? configFile.model ?? DEFAULT_SKILLTEST_CONFIG.model,\n json: cliFlags.json ?? configFile.json ?? DEFAULT_SKILLTEST_CONFIG.json,\n concurrency: cliFlags.concurrency ?? configFile.concurrency ?? DEFAULT_SKILLTEST_CONFIG.concurrency,\n lint: {\n failOn: cliFlags.lint?.failOn ?? configFile.lint?.failOn ?? DEFAULT_SKILLTEST_CONFIG.lint.failOn,\n suppress: cliFlags.lint?.suppress ?? configFile.lint?.suppress ?? DEFAULT_SKILLTEST_CONFIG.lint.suppress,\n plugins: resolveConfigRelativePaths(\n baseDirectory,\n cliFlags.lint?.plugins ?? configFile.lint?.plugins ?? DEFAULT_SKILLTEST_CONFIG.lint.plugins\n )\n },\n trigger: {\n numQueries:\n cliFlags.trigger?.numQueries ?? configFile.trigger?.numQueries ?? DEFAULT_SKILLTEST_CONFIG.trigger.numQueries,\n threshold:\n cliFlags.trigger?.threshold ?? configFile.trigger?.threshold ?? DEFAULT_SKILLTEST_CONFIG.trigger.threshold,\n seed: cliFlags.trigger?.seed ?? configFile.trigger?.seed,\n compare: resolveConfigRelativePaths(\n baseDirectory,\n cliFlags.trigger?.compare ?? configFile.trigger?.compare ?? DEFAULT_SKILLTEST_CONFIG.trigger.compare\n )\n },\n eval: {\n numRuns: cliFlags.eval?.numRuns ?? configFile.eval?.numRuns ?? DEFAULT_SKILLTEST_CONFIG.eval.numRuns,\n threshold: cliFlags.eval?.threshold ?? configFile.eval?.threshold ?? DEFAULT_SKILLTEST_CONFIG.eval.threshold,\n promptFile: resolveConfigRelativePath(\n baseDirectory,\n cliFlags.eval?.promptFile ?? configFile.eval?.promptFile ?? DEFAULT_SKILLTEST_CONFIG.eval.promptFile\n ),\n assertionsFile: resolveConfigRelativePath(\n baseDirectory,\n cliFlags.eval?.assertionsFile ?? configFile.eval?.assertionsFile ?? DEFAULT_SKILLTEST_CONFIG.eval.assertionsFile\n ),\n maxToolIterations:\n cliFlags.eval?.maxToolIterations ??\n configFile.eval?.maxToolIterations ??\n DEFAULT_SKILLTEST_CONFIG.eval.maxToolIterations\n }\n };\n\n return resolvedSkilltestConfigSchema.parse(merged);\n}\n\nfunction getTypedOptionValue<T extends string | number | boolean | string[]>(command: Command, key: string): T | undefined {\n const options = command.optsWithGlobals<Record<string, unknown>>();\n const value = options[key];\n if (value === undefined) {\n return undefined;\n }\n return value as T;\n}\n\nexport function extractCliConfigOverrides(command: Command): SkilltestConfigFile {\n const overrides: SkilltestConfigFile = {};\n\n if (command.getOptionValueSourceWithGlobals(\"json\") === \"cli\") {\n overrides.json = Boolean(getTypedOptionValue<boolean>(command, \"json\"));\n }\n\n if (command.getOptionValueSource(\"provider\") === \"cli\") {\n overrides.provider = getTypedOptionValue<ProviderName>(command, \"provider\");\n }\n\n if (command.getOptionValueSource(\"model\") === \"cli\") {\n overrides.model = getTypedOptionValue<string>(command, \"model\");\n }\n\n if (\n (command.name() === \"trigger\" || command.name() === \"eval\" || command.name() === \"check\" || command.name() === \"improve\" || command.name() === \"route\") &&\n command.getOptionValueSource(\"concurrency\") === \"cli\"\n ) {\n overrides.concurrency = getTypedOptionValue<number>(command, \"concurrency\");\n }\n\n if (\n (command.name() === \"trigger\" || command.name() === \"check\" || command.name() === \"improve\") &&\n command.getOptionValueSource(\"numQueries\") === \"cli\"\n ) {\n overrides.trigger = {\n ...overrides.trigger,\n numQueries: getTypedOptionValue<number>(command, \"numQueries\")\n };\n }\n\n if (\n (command.name() === \"trigger\" || command.name() === \"check\" || command.name() === \"improve\") &&\n command.getOptionValueSource(\"compare\") === \"cli\"\n ) {\n overrides.trigger = {\n ...overrides.trigger,\n compare: getTypedOptionValue<string[]>(command, \"compare\")\n };\n }\n\n if (\n (command.name() === \"lint\" || command.name() === \"check\" || command.name() === \"improve\") &&\n command.getOptionValueSource(\"plugin\") === \"cli\"\n ) {\n overrides.lint = {\n ...overrides.lint,\n plugins: getTypedOptionValue<string[]>(command, \"plugin\")\n };\n }\n\n if ((command.name() === \"check\" || command.name() === \"improve\") && command.getOptionValueSource(\"minF1\") === \"cli\") {\n overrides.trigger = {\n ...overrides.trigger,\n threshold: getTypedOptionValue<number>(command, \"minF1\")\n };\n }\n\n if (\n (command.name() === \"check\" || command.name() === \"improve\") &&\n command.getOptionValueSource(\"minAssertPassRate\") === \"cli\"\n ) {\n overrides.eval = {\n ...overrides.eval,\n threshold: getTypedOptionValue<number>(command, \"minAssertPassRate\")\n };\n }\n\n const parsed = skilltestConfigSchema.safeParse(overrides);\n if (!parsed.success) {\n throw buildConfigValidationError(parsed.error, \"CLI flags\");\n }\n return parsed.data;\n}\n\nexport async function resolveConfigContext(targetPath: string | undefined, cliFlags: SkilltestConfigFile): Promise<ResolvedConfigContext> {\n const cwd = process.cwd();\n const skillDirectoryConfig = await resolveSkillDirectoryConfig(targetPath);\n if (skillDirectoryConfig) {\n return {\n ...skillDirectoryConfig,\n config: mergeConfigLayers(skillDirectoryConfig.configFile, cliFlags, skillDirectoryConfig.sourceDirectory)\n };\n }\n\n const cwdConfigPath = path.join(cwd, \".skilltestrc\");\n const cwdConfig = await loadConfigFromJsonFile(cwdConfigPath);\n if (cwdConfig) {\n return {\n ...cwdConfig,\n config: mergeConfigLayers(cwdConfig.configFile, cliFlags, cwdConfig.sourceDirectory)\n };\n }\n\n const packageJsonConfig = await loadConfigFromNearestPackageJson(cwd);\n if (packageJsonConfig) {\n return {\n ...packageJsonConfig,\n config: mergeConfigLayers(packageJsonConfig.configFile, cliFlags, packageJsonConfig.sourceDirectory)\n };\n }\n\n return {\n configFile: null,\n config: mergeConfigLayers({}, cliFlags, cwd),\n sourcePath: null,\n sourceDirectory: cwd\n };\n}\n\nexport function resolveApiKey(provider: ProviderName, override?: string): string {\n if (override && override.trim() !== \"\") {\n return override.trim();\n }\n\n if (provider === \"anthropic\") {\n const envValue = process.env.ANTHROPIC_API_KEY?.trim();\n if (envValue) {\n return envValue;\n }\n throw new Error(\n \"No Anthropic API key found. Set ANTHROPIC_API_KEY environment variable or pass --api-key flag.\"\n );\n }\n\n const envValue = process.env.OPENAI_API_KEY?.trim();\n if (envValue) {\n return envValue;\n }\n throw new Error(\"No OpenAI API key found. Set OPENAI_API_KEY environment variable or pass --api-key flag.\");\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport {\n ConversationBlock,\n ConversationContentBlock,\n LanguageModelProvider,\n ProviderToolResponse,\n SendMessageOptions,\n SendWithToolsOptions\n} from \"./types.js\";\n\ninterface AnthropicTextBlock {\n type: \"text\";\n text: string;\n}\n\ninterface AnthropicToolUseBlock {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\ntype AnthropicResponseBlock = AnthropicTextBlock | AnthropicToolUseBlock | { type: string; [key: string]: unknown };\n\ninterface AnthropicMessageResponse {\n content: AnthropicResponseBlock[];\n stop_reason: string | null;\n}\n\nfunction isAnthropicTextBlock(block: AnthropicResponseBlock): block is AnthropicTextBlock {\n return block.type === \"text\";\n}\n\nfunction isAnthropicToolUseBlock(block: AnthropicResponseBlock): block is AnthropicToolUseBlock {\n return block.type === \"tool_use\";\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isRateLimitError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n\n const maybeStatus = (error as { status?: number }).status;\n if (maybeStatus === 429) {\n return true;\n }\n\n const maybeMessage = (error as { message?: string }).message;\n if (typeof maybeMessage === \"string\" && /rate limit/i.test(maybeMessage)) {\n return true;\n }\n\n return false;\n}\n\nexport class AnthropicProvider implements LanguageModelProvider {\n public readonly name = \"anthropic\" as const;\n private readonly client: Anthropic;\n\n public constructor(apiKey: string) {\n this.client = new Anthropic({ apiKey });\n }\n\n private async createMessage(\n request: Record<string, unknown>\n ): Promise<AnthropicMessageResponse> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n try {\n return (await this.client.messages.create(request as never)) as unknown as AnthropicMessageResponse;\n } catch (error) {\n lastError = error;\n if (!isRateLimitError(error) || attempt === 2) {\n break;\n }\n\n const delay = Math.min(4000, 500 * 2 ** attempt) + Math.floor(Math.random() * 250);\n await wait(delay);\n }\n }\n\n if (lastError instanceof Error) {\n throw new Error(`Anthropic API call failed: ${lastError.message}`);\n }\n throw new Error(\"Anthropic API call failed with an unknown error.\");\n }\n\n private toAnthropicMessages(messages: ConversationBlock[]): Array<{\n role: \"user\" | \"assistant\";\n content: string | ConversationContentBlock[];\n }> {\n return messages.map((message) => ({\n role: message.role,\n content: message.content\n }));\n }\n\n public async sendMessage(systemPrompt: string, userMessage: string, options: SendMessageOptions): Promise<string> {\n const response = await this.createMessage({\n model: options.model,\n max_tokens: 2048,\n system: systemPrompt,\n messages: [\n {\n role: \"user\",\n content: userMessage\n }\n ]\n });\n\n const textBlocks = response.content.filter(isAnthropicTextBlock);\n const text = textBlocks.map((block) => block.text).join(\"\\n\").trim();\n if (text.length === 0) {\n throw new Error(\"Model returned an empty response.\");\n }\n return text;\n }\n\n public async sendWithTools(\n systemPrompt: string,\n messages: ConversationBlock[],\n options: SendWithToolsOptions\n ): Promise<ProviderToolResponse> {\n const response = await this.createMessage({\n model: options.model,\n max_tokens: 2048,\n system: systemPrompt,\n messages: this.toAnthropicMessages(messages),\n tools: options.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.parameters ?? { type: \"object\", properties: {} }) as Record<string, unknown> & { type: string }\n }))\n });\n\n const textContent = response.content\n .filter(isAnthropicTextBlock)\n .map((block) => block.text)\n .join(\"\\n\")\n .trim();\n\n const toolUseBlocks = response.content\n .filter(isAnthropicToolUseBlock)\n .map((block) => ({\n id: block.id,\n name: block.name,\n arguments: block.input\n }));\n\n return {\n textContent,\n toolUseBlocks,\n stopReason: response.stop_reason ?? \"end_turn\"\n };\n }\n}\n","import {\n ConversationBlock,\n ConversationContentBlock,\n LanguageModelProvider,\n ProviderToolResponse,\n SendMessageOptions,\n SendWithToolsOptions\n} from \"./types.js\";\n\ntype OpenAIClient = {\n chat: {\n completions: {\n create(input: {\n model: string;\n messages: OpenAIMessage[];\n max_tokens?: number;\n tools?: Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters?: Record<string, unknown>;\n };\n }>;\n }): Promise<{\n choices?: Array<{\n message?: {\n content?: string | Array<{ type?: string; text?: string }>;\n tool_calls?: Array<{\n id?: string;\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n };\n finish_reason?: string | null;\n }>;\n }>;\n };\n };\n};\n\ntype OpenAIMessage =\n | { role: \"system\" | \"user\"; content: string }\n | { role: \"assistant\"; content?: string | null; tool_calls?: OpenAIAssistantToolCall[] }\n | { role: \"tool\"; tool_call_id: string; content: string };\n\ninterface OpenAIAssistantToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isRetriableError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n\n const maybeStatus = (error as { status?: number }).status;\n if (maybeStatus === 429 || (typeof maybeStatus === \"number\" && maybeStatus >= 500)) {\n return true;\n }\n\n const maybeCode = (error as { code?: string }).code;\n if (typeof maybeCode === \"string\" && /timeout|econnreset|enotfound|eai_again/i.test(maybeCode)) {\n return true;\n }\n\n const maybeMessage = (error as { message?: string }).message;\n if (typeof maybeMessage === \"string\" && /(rate limit|timeout|temporarily unavailable|connection)/i.test(maybeMessage)) {\n return true;\n }\n\n return false;\n}\n\nfunction extractTextContent(content: string | Array<{ type?: string; text?: string }> | undefined): string {\n if (!content) {\n return \"\";\n }\n if (typeof content === \"string\") {\n return content.trim();\n }\n\n const text = content\n .map((item) => (item.type === \"text\" || !item.type ? item.text ?? \"\" : \"\"))\n .join(\"\\n\")\n .trim();\n return text;\n}\n\nfunction parseToolArguments(raw: string | undefined, toolName: string): Record<string, unknown> {\n if (!raw || raw.trim() === \"\") {\n return {};\n }\n\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Tool arguments must be a JSON object.\");\n }\n return parsed as Record<string, unknown>;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`OpenAI tool call arguments for '${toolName}' were not valid JSON: ${message}`);\n }\n}\n\nfunction getBlockText(blocks: ConversationContentBlock[]): string {\n return blocks\n .filter((block) => block.type === \"text\")\n .map((block) => String(block.text ?? \"\"))\n .join(\"\\n\")\n .trim();\n}\n\nfunction mapAssistantBlocksToMessage(blocks: ConversationContentBlock[]): OpenAIMessage {\n const textContent = getBlockText(blocks);\n const toolCalls = blocks\n .filter((block) => block.type === \"tool_use\")\n .map((block) => ({\n id: String(block.id ?? \"\"),\n type: \"function\" as const,\n function: {\n name: String(block.name ?? \"\"),\n arguments: JSON.stringify(block.input ?? {})\n }\n }));\n\n return {\n role: \"assistant\",\n content: textContent.length > 0 ? textContent : null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {})\n };\n}\n\nfunction mapUserBlocksToMessages(blocks: ConversationContentBlock[]): OpenAIMessage[] {\n const toolResults = blocks.filter((block) => block.type === \"tool_result\");\n if (toolResults.length > 0) {\n return toolResults.map((block) => ({\n role: \"tool\",\n tool_call_id: String(block.tool_use_id ?? \"\"),\n content: String(block.content ?? \"\")\n }));\n }\n\n const textContent = getBlockText(blocks);\n return [\n {\n role: \"user\",\n content: textContent\n }\n ];\n}\n\nfunction mapConversationBlockToMessages(block: ConversationBlock): OpenAIMessage[] {\n if (typeof block.content === \"string\") {\n return [\n {\n role: block.role,\n content: block.content\n }\n ];\n }\n\n if (block.role === \"assistant\") {\n return [mapAssistantBlocksToMessage(block.content)];\n }\n\n return mapUserBlocksToMessages(block.content);\n}\n\nexport class OpenAIProvider implements LanguageModelProvider {\n public readonly name = \"openai\" as const;\n private readonly apiKey: string;\n private client: OpenAIClient | null;\n\n public constructor(apiKey: string) {\n this.apiKey = apiKey;\n this.client = null;\n }\n\n private async ensureClient(): Promise<OpenAIClient> {\n if (this.client) {\n return this.client;\n }\n\n let openAiModule: unknown;\n try {\n const moduleName = \"openai\";\n openAiModule = await import(moduleName);\n } catch {\n throw new Error(\n \"OpenAI SDK is not installed. Install optional dependency 'openai' or run 'npm install' with optional dependencies enabled.\"\n );\n }\n\n const OpenAIConstructor = (openAiModule as { default?: new (config: { apiKey: string }) => OpenAIClient }).default;\n if (!OpenAIConstructor) {\n throw new Error(\"OpenAI SDK loaded but no default client export was found.\");\n }\n\n this.client = new OpenAIConstructor({ apiKey: this.apiKey });\n return this.client;\n }\n\n private async createCompletion(\n input: Parameters<OpenAIClient[\"chat\"][\"completions\"][\"create\"]>[0]\n ): Promise<Awaited<ReturnType<OpenAIClient[\"chat\"][\"completions\"][\"create\"]>>> {\n const client = await this.ensureClient();\n let lastError: unknown;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n try {\n return await client.chat.completions.create(input);\n } catch (error) {\n lastError = error;\n if (!isRetriableError(error) || attempt === 2) {\n break;\n }\n\n const delay = Math.min(4000, 500 * 2 ** attempt) + Math.floor(Math.random() * 250);\n await wait(delay);\n }\n }\n\n if (lastError instanceof Error) {\n throw new Error(`OpenAI API call failed: ${lastError.message}`);\n }\n throw new Error(\"OpenAI API call failed with an unknown error.\");\n }\n\n private toOpenAiMessages(systemPrompt: string, messages: ConversationBlock[]): OpenAIMessage[] {\n return [\n {\n role: \"system\",\n content: systemPrompt\n },\n ...messages.flatMap((message) => mapConversationBlockToMessages(message))\n ];\n }\n\n public async sendMessage(systemPrompt: string, userMessage: string, options: SendMessageOptions): Promise<string> {\n const response = await this.createCompletion({\n model: options.model,\n max_tokens: 2048,\n messages: this.toOpenAiMessages(systemPrompt, [{ role: \"user\", content: userMessage }])\n });\n\n const text = (response.choices ?? [])\n .map((choice) => extractTextContent(choice.message?.content))\n .join(\"\\n\")\n .trim();\n\n if (text.length === 0) {\n throw new Error(\"Model returned an empty response.\");\n }\n\n return text;\n }\n\n public async sendWithTools(\n systemPrompt: string,\n messages: ConversationBlock[],\n options: SendWithToolsOptions\n ): Promise<ProviderToolResponse> {\n const response = await this.createCompletion({\n model: options.model,\n max_tokens: 2048,\n messages: this.toOpenAiMessages(systemPrompt, messages),\n tools: options.tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters\n }\n }))\n });\n\n const choice = response.choices?.[0];\n const message = choice?.message;\n const toolUseBlocks = (message?.tool_calls ?? []).map((toolCall, index) => {\n const toolName = toolCall.function?.name ?? `tool-${index + 1}`;\n return {\n id: toolCall.id ?? `${toolName}-${index + 1}`,\n name: toolName,\n arguments: parseToolArguments(toolCall.function?.arguments, toolName)\n };\n });\n\n return {\n textContent: extractTextContent(message?.content),\n toolUseBlocks,\n stopReason:\n choice?.finish_reason === \"stop\"\n ? \"end_turn\"\n : choice?.finish_reason === \"tool_calls\"\n ? \"tool_use\"\n : choice?.finish_reason ?? \"end_turn\"\n };\n }\n}\n","import { resolveApiKey } from \"../utils/config.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { OpenAIProvider } from \"./openai.js\";\nimport { LanguageModelProvider, ProviderName } from \"./types.js\";\n\nexport function createProvider(providerName: ProviderName, apiKeyOverride?: string): LanguageModelProvider {\n const apiKey = resolveApiKey(providerName, apiKeyOverride);\n if (providerName === \"anthropic\") {\n return new AnthropicProvider(apiKey);\n }\n return new OpenAIProvider(apiKey);\n}\n\nexport type { LanguageModelProvider, ProviderName };\n","import fs from \"node:fs/promises\";\nimport ora from \"ora\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { runEval } from \"../core/eval-runner.js\";\nimport { parseSkillStrict } from \"../core/skill-parser.js\";\nimport { createProvider } from \"../providers/index.js\";\nimport { renderEvalHtml } from \"../reporters/html.js\";\nimport { renderEvalReport } from \"../reporters/terminal.js\";\nimport {\n getGlobalCliOptions,\n getResolvedConfig,\n loadConfiguredEvalPrompts,\n loadEvalPromptsJson,\n writeError,\n writeResult\n} from \"./common.js\";\nimport { writeJsonFile } from \"../utils/fs.js\";\n\nconst evalCliSchema = z.object({\n prompts: z.string().optional(),\n graderModel: z.string().optional(),\n saveResults: z.string().optional(),\n concurrency: z.number().int().min(1).optional(),\n html: z.string().optional(),\n verbose: z.boolean().optional(),\n apiKey: z.string().optional()\n});\n\nconst DEFAULT_ANTHROPIC_MODEL = \"claude-sonnet-4-5-20250929\";\nconst DEFAULT_OPENAI_MODEL = \"gpt-4.1-mini\";\n\ninterface EvalCommandOptions {\n json: boolean;\n color: boolean;\n prompts?: string;\n model: string;\n graderModel?: string;\n provider: \"anthropic\" | \"openai\";\n saveResults?: string;\n verbose: boolean;\n apiKey?: string;\n numRuns: number;\n concurrency: number;\n maxToolIterations: number;\n html?: string;\n}\n\nfunction resolveModel(provider: \"anthropic\" | \"openai\", model: string): string {\n if (provider === \"openai\" && model === DEFAULT_ANTHROPIC_MODEL) {\n return DEFAULT_OPENAI_MODEL;\n }\n return model;\n}\n\nasync function handleEvalCommand(targetPath: string, options: EvalCommandOptions, command: Command): Promise<void> {\n const spinner = options.json || !process.stdout.isTTY ? null : ora(\"Preparing evaluation...\").start();\n\n try {\n if (spinner) {\n spinner.text = \"Parsing skill...\";\n }\n const skill = await parseSkillStrict(targetPath);\n\n if (spinner) {\n spinner.text = \"Initializing model provider...\";\n }\n const provider = createProvider(options.provider, options.apiKey);\n\n let prompts = undefined;\n if (options.prompts) {\n if (spinner) {\n spinner.text = \"Loading test prompts...\";\n }\n prompts = await loadEvalPromptsJson(options.prompts);\n } else {\n prompts = await loadConfiguredEvalPrompts(command);\n }\n\n if (spinner) {\n spinner.text = \"Running eval prompts and grading responses...\";\n }\n const model = resolveModel(options.provider, options.model);\n const graderModel = options.graderModel ?? model;\n const result = await runEval(skill, {\n provider,\n model,\n graderModel,\n numRuns: options.numRuns,\n concurrency: options.concurrency,\n prompts,\n maxToolIterations: options.maxToolIterations\n });\n\n if (options.saveResults) {\n await writeJsonFile(options.saveResults, result);\n }\n\n spinner?.stop();\n if (options.json) {\n writeResult(result, true);\n } else {\n writeResult(renderEvalReport(result, options.color, options.verbose), false);\n }\n\n if (options.html) {\n const htmlResult: typeof result & { target: string } = {\n ...result,\n target: targetPath\n };\n await fs.writeFile(options.html, renderEvalHtml(htmlResult), \"utf8\");\n }\n } catch (error) {\n spinner?.stop();\n writeError(error, options.json);\n process.exitCode = 2;\n }\n}\n\nexport function registerEvalCommand(program: Command): void {\n program\n .command(\"eval\")\n .description(\"Run end-to-end skill execution and quality evaluation.\")\n .argument(\"<path-to-skill>\", \"Path to SKILL.md or skill directory\")\n .option(\"--prompts <path>\", \"Path to eval prompts JSON\")\n .option(\"--model <model>\", \"Model to execute prompts\")\n .option(\"--grader-model <model>\", \"Model used for grading (defaults to --model)\")\n .option(\"--provider <provider>\", \"LLM provider: anthropic|openai\")\n .option(\"--concurrency <n>\", \"Maximum in-flight eval prompt runs\", (value) => Number.parseInt(value, 10))\n .option(\"--html <path>\", \"Write an HTML report to the given file path\")\n .option(\"--save-results <path>\", \"Save full evaluation results to JSON\")\n .option(\"--api-key <key>\", \"API key override\")\n .option(\"--verbose\", \"Show full model responses\")\n .action(async (targetPath: string, _commandOptions: unknown, command: Command) => {\n const globalOptions = getGlobalCliOptions(command);\n const config = getResolvedConfig(command);\n const parsedCli = evalCliSchema.safeParse(command.opts());\n if (!parsedCli.success) {\n writeError(new Error(parsedCli.error.issues[0]?.message ?? \"Invalid eval options.\"), globalOptions.json);\n process.exitCode = 2;\n return;\n }\n\n await handleEvalCommand(\n targetPath,\n {\n ...globalOptions,\n prompts: parsedCli.data.prompts,\n model: config.model,\n graderModel: parsedCli.data.graderModel,\n provider: config.provider,\n saveResults: parsedCli.data.saveResults,\n html: parsedCli.data.html,\n verbose: Boolean(parsedCli.data.verbose),\n apiKey: parsedCli.data.apiKey,\n numRuns: config.eval.numRuns,\n concurrency: config.concurrency,\n maxToolIterations: config.eval.maxToolIterations\n },\n command\n );\n });\n}\n","import fs from \"node:fs/promises\";\nimport ora from \"ora\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { runCheck } from \"../core/check-runner.js\";\nimport { createProvider } from \"../providers/index.js\";\nimport { renderCheckHtml } from \"../reporters/html.js\";\nimport { renderCheckReport } from \"../reporters/terminal.js\";\nimport {\n getGlobalCliOptions,\n getResolvedConfig,\n loadConfiguredEvalPrompts,\n loadEvalPromptsJson,\n loadTriggerQueriesFile,\n writeError,\n writeResult\n} from \"./common.js\";\nimport { writeJsonFile } from \"../utils/fs.js\";\n\nconst checkCliSchema = z.object({\n graderModel: z.string().optional(),\n apiKey: z.string().optional(),\n queries: z.string().optional(),\n compare: z.array(z.string().min(1)).optional(),\n seed: z.number().int().optional(),\n prompts: z.string().optional(),\n plugin: z.array(z.string().min(1)).optional(),\n concurrency: z.number().int().min(1).optional(),\n html: z.string().optional(),\n saveResults: z.string().optional(),\n continueOnLintFail: z.boolean().optional(),\n verbose: z.boolean().optional()\n});\n\nconst DEFAULT_ANTHROPIC_MODEL = \"claude-sonnet-4-5-20250929\";\nconst DEFAULT_OPENAI_MODEL = \"gpt-4.1-mini\";\n\ninterface CheckCommandOptions {\n json: boolean;\n color: boolean;\n provider: \"anthropic\" | \"openai\";\n model: string;\n graderModel?: string;\n apiKey?: string;\n queries?: string;\n compare: string[];\n numQueries: number;\n prompts?: string;\n minF1: number;\n minAssertPassRate: number;\n numRuns: number;\n maxToolIterations: number;\n concurrency: number;\n html?: string;\n lintFailOn: \"error\" | \"warn\";\n lintSuppress: string[];\n lintPlugins: string[];\n triggerSeed?: number;\n saveResults?: string;\n continueOnLintFail: boolean;\n verbose: boolean;\n}\n\nfunction collectPluginPaths(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nfunction resolveModel(provider: \"anthropic\" | \"openai\", model: string): string {\n if (provider === \"openai\" && model === DEFAULT_ANTHROPIC_MODEL) {\n return DEFAULT_OPENAI_MODEL;\n }\n return model;\n}\n\nfunction renderCheckOutputWithSeed(output: string, seed?: number): string {\n if (seed === undefined) {\n return output;\n }\n\n const lines = output.split(\"\\n\");\n const triggerIndex = lines.indexOf(\"Trigger\");\n if (triggerIndex === -1) {\n return `${output}\\nSeed: ${seed}`;\n }\n\n lines.splice(triggerIndex + 1, 0, `Seed: ${seed}`);\n return lines.join(\"\\n\");\n}\n\nasync function handleCheckCommand(targetPath: string, options: CheckCommandOptions, command: Command): Promise<void> {\n const spinner = options.json || !process.stdout.isTTY ? null : ora(\"Preparing check run...\").start();\n\n try {\n if (spinner) {\n spinner.text = \"Initializing model provider...\";\n }\n const provider = createProvider(options.provider, options.apiKey);\n\n let queries = undefined;\n if (options.queries) {\n if (spinner) {\n spinner.text = \"Loading custom trigger queries...\";\n }\n queries = await loadTriggerQueriesFile(options.queries);\n }\n\n let prompts = undefined;\n if (options.prompts) {\n if (spinner) {\n spinner.text = \"Loading eval prompts...\";\n }\n prompts = await loadEvalPromptsJson(options.prompts);\n } else {\n prompts = await loadConfiguredEvalPrompts(command);\n }\n\n const model = resolveModel(options.provider, options.model);\n const graderModel = options.graderModel ?? model;\n\n const result = await runCheck(targetPath, {\n provider,\n model,\n graderModel,\n lintFailOn: options.lintFailOn,\n lintSuppress: options.lintSuppress,\n lintPlugins: options.lintPlugins,\n queries,\n compare: options.compare,\n numQueries: options.numQueries,\n triggerSeed: options.triggerSeed,\n prompts,\n evalNumRuns: options.numRuns,\n evalMaxToolIterations: options.maxToolIterations,\n concurrency: options.concurrency,\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate,\n continueOnLintFail: options.continueOnLintFail,\n verbose: options.verbose,\n onStage: (stage) => {\n if (!spinner) {\n return;\n }\n if (stage === \"lint\") {\n spinner.text = \"Running lint checks...\";\n } else if (stage === \"parse\") {\n spinner.text = \"Parsing skill for model evaluations...\";\n } else if (stage === \"trigger\" || stage === \"eval\") {\n spinner.text = \"Running trigger and eval suites...\";\n }\n }\n });\n\n if (options.saveResults) {\n await writeJsonFile(options.saveResults, result);\n }\n\n spinner?.stop();\n if (options.json) {\n writeResult(result, true);\n } else {\n writeResult(\n renderCheckOutputWithSeed(renderCheckReport(result, options.color, options.verbose), result.trigger?.seed),\n false\n );\n }\n\n if (options.html) {\n await fs.writeFile(options.html, renderCheckHtml(result), \"utf8\");\n }\n\n process.exitCode = result.gates.overallPassed ? 0 : 1;\n } catch (error) {\n spinner?.stop();\n writeError(error, options.json);\n process.exitCode = 2;\n }\n}\n\nexport function registerCheckCommand(program: Command): void {\n program\n .command(\"check\")\n .description(\"Run lint + trigger + eval with threshold-based quality gates.\")\n .argument(\"<path-to-skill>\", \"Path to SKILL.md or skill directory\")\n .option(\"--provider <provider>\", \"LLM provider: anthropic|openai\")\n .option(\"--model <model>\", \"Model for trigger/eval runs\")\n .option(\"--grader-model <model>\", \"Model used for grading (defaults to --model)\")\n .option(\"--api-key <key>\", \"API key override\")\n .option(\"--queries <path>\", \"Path to custom trigger queries JSON\")\n .option(\"--compare <path...>\", \"Path(s) to sibling skill directories to include as competitors\")\n .option(\"--num-queries <n>\", \"Number of auto-generated trigger queries\", (value) => Number.parseInt(value, 10))\n .option(\"--seed <number>\", \"RNG seed for reproducible results\", (value) => Number.parseInt(value, 10))\n .option(\"--prompts <path>\", \"Path to eval prompts JSON\")\n .option(\"--plugin <path>\", \"Load a custom lint plugin file\", collectPluginPaths, [])\n .option(\"--concurrency <n>\", \"Maximum in-flight trigger/eval tasks\", (value) => Number.parseInt(value, 10))\n .option(\"--html <path>\", \"Write an HTML report to the given file path\")\n .option(\"--min-f1 <n>\", \"Minimum required trigger F1 score (0-1)\", (value) => Number.parseFloat(value))\n .option(\"--min-assert-pass-rate <n>\", \"Minimum required eval assertion pass rate (0-1)\", (value) => Number.parseFloat(value))\n .option(\"--save-results <path>\", \"Save combined check results to JSON\")\n .option(\"--continue-on-lint-fail\", \"Continue trigger/eval stages even when lint has failures\")\n .option(\"--verbose\", \"Show detailed trigger/eval output sections\")\n .action(async (targetPath: string, _commandOptions: unknown, command: Command) => {\n const globalOptions = getGlobalCliOptions(command);\n const config = getResolvedConfig(command);\n const parsedCli = checkCliSchema.safeParse(command.opts());\n if (!parsedCli.success) {\n writeError(new Error(parsedCli.error.issues[0]?.message ?? \"Invalid check options.\"), globalOptions.json);\n process.exitCode = 2;\n return;\n }\n\n await handleCheckCommand(\n targetPath,\n {\n ...globalOptions,\n provider: config.provider,\n model: config.model,\n graderModel: parsedCli.data.graderModel,\n apiKey: parsedCli.data.apiKey,\n queries: parsedCli.data.queries,\n compare: config.trigger.compare,\n numQueries: config.trigger.numQueries,\n prompts: parsedCli.data.prompts,\n minF1: config.trigger.threshold,\n minAssertPassRate: config.eval.threshold,\n numRuns: config.eval.numRuns,\n maxToolIterations: config.eval.maxToolIterations,\n concurrency: config.concurrency,\n html: parsedCli.data.html,\n lintFailOn: config.lint.failOn,\n lintSuppress: config.lint.suppress,\n lintPlugins: config.lint.plugins,\n triggerSeed: parsedCli.data.seed ?? config.trigger.seed,\n saveResults: parsedCli.data.saveResults,\n continueOnLintFail: Boolean(parsedCli.data.continueOnLintFail),\n verbose: Boolean(parsedCli.data.verbose)\n },\n command\n );\n });\n}\n","import { runEval, EvalPrompt, EvalResult } from \"./eval-runner.js\";\nimport { lintFails, runLinter, LintReport } from \"./linter/index.js\";\nimport { parseSkillStrict } from \"./skill-parser.js\";\nimport { runTriggerTest, TriggerQuery, TriggerTestResult } from \"./trigger-tester.js\";\nimport { LanguageModelProvider } from \"../providers/types.js\";\nimport { LintFailOn } from \"../utils/config.js\";\n\nexport interface CheckThresholds {\n minF1: number;\n minAssertPassRate: number;\n}\n\nexport interface CheckGates {\n lintPassed: boolean;\n triggerPassed: boolean | null;\n evalPassed: boolean | null;\n triggerF1: number | null;\n evalAssertPassRate: number | null;\n overallPassed: boolean;\n}\n\nexport interface CheckRunResult {\n target: string;\n provider: string;\n model: string;\n graderModel: string;\n thresholds: CheckThresholds;\n continueOnLintFail: boolean;\n lint: LintReport;\n trigger: TriggerTestResult | null;\n eval: EvalResult | null;\n triggerSkippedReason?: string;\n evalSkippedReason?: string;\n gates: CheckGates;\n}\n\nexport interface RunCheckOptions {\n provider: LanguageModelProvider;\n model: string;\n graderModel: string;\n lintFailOn: LintFailOn;\n lintSuppress: string[];\n lintPlugins: string[];\n compare?: string[];\n numQueries: number;\n concurrency?: number;\n triggerSeed?: number;\n queries?: TriggerQuery[];\n evalNumRuns: number;\n prompts?: EvalPrompt[];\n evalMaxToolIterations: number;\n minF1: number;\n minAssertPassRate: number;\n continueOnLintFail: boolean;\n verbose?: boolean;\n onStage?: (stage: string) => void;\n}\n\nfunction calculateEvalAssertPassRate(result: EvalResult): number {\n if (result.summary.totalAssertions === 0) {\n return 0;\n }\n return result.summary.passedAssertions / result.summary.totalAssertions;\n}\n\nexport async function runCheck(inputPath: string, options: RunCheckOptions): Promise<CheckRunResult> {\n options.onStage?.(\"lint\");\n const lint = await runLinter(inputPath, { suppress: options.lintSuppress, plugins: options.lintPlugins });\n const lintPassed = !lintFails(lint, options.lintFailOn);\n\n let trigger: TriggerTestResult | null = null;\n let evalResult: EvalResult | null = null;\n let triggerSkippedReason: string | undefined;\n let evalSkippedReason: string | undefined;\n\n if (!lintPassed && !options.continueOnLintFail) {\n triggerSkippedReason = \"Skipped because lint has failures (use --continue-on-lint-fail to override).\";\n evalSkippedReason = \"Skipped because lint has failures (use --continue-on-lint-fail to override).\";\n } else {\n options.onStage?.(\"parse\");\n let parsedSkill = null;\n try {\n parsedSkill = await parseSkillStrict(inputPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n triggerSkippedReason = `Skipped: skill could not be parsed strictly (${message}).`;\n evalSkippedReason = `Skipped: skill could not be parsed strictly (${message}).`;\n }\n\n if (parsedSkill) {\n const triggerOptions = {\n provider: options.provider,\n model: options.model,\n queries: options.queries,\n compare: options.compare,\n numQueries: options.numQueries,\n seed: options.triggerSeed,\n concurrency: options.concurrency,\n verbose: options.verbose\n };\n const evalOptions = {\n provider: options.provider,\n model: options.model,\n graderModel: options.graderModel,\n numRuns: options.evalNumRuns,\n prompts: options.prompts,\n concurrency: options.concurrency,\n maxToolIterations: options.evalMaxToolIterations\n };\n\n if ((options.concurrency ?? 5) === 1) {\n options.onStage?.(\"trigger\");\n trigger = await runTriggerTest(parsedSkill, triggerOptions);\n\n options.onStage?.(\"eval\");\n evalResult = await runEval(parsedSkill, evalOptions);\n } else {\n options.onStage?.(\"trigger\");\n options.onStage?.(\"eval\");\n [trigger, evalResult] = await Promise.all([runTriggerTest(parsedSkill, triggerOptions), runEval(parsedSkill, evalOptions)]);\n }\n }\n }\n\n const triggerF1 = trigger ? trigger.metrics.f1 : null;\n const evalAssertPassRate = evalResult ? calculateEvalAssertPassRate(evalResult) : null;\n const triggerPassed = triggerF1 === null ? null : triggerF1 >= options.minF1;\n const evalPassed = evalAssertPassRate === null ? null : evalAssertPassRate >= options.minAssertPassRate;\n const overallPassed = lintPassed && triggerPassed === true && evalPassed === true;\n\n return {\n target: inputPath,\n provider: options.provider.name,\n model: options.model,\n graderModel: options.graderModel,\n thresholds: {\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate\n },\n continueOnLintFail: options.continueOnLintFail,\n lint,\n trigger,\n eval: evalResult,\n triggerSkippedReason,\n evalSkippedReason,\n gates: {\n lintPassed,\n triggerPassed,\n evalPassed,\n triggerF1,\n evalAssertPassRate,\n overallPassed\n }\n };\n}\n","import fs from \"node:fs/promises\";\nimport ora from \"ora\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { runImprove } from \"../core/improver.js\";\nimport { createProvider } from \"../providers/index.js\";\nimport {\n getGlobalCliOptions,\n getResolvedConfig,\n loadConfiguredEvalPrompts,\n loadEvalPromptsJson,\n loadTriggerQueriesFile,\n writeError,\n writeResult\n} from \"./common.js\";\nimport { renderImproveReport } from \"../reporters/terminal.js\";\nimport { writeJsonFile } from \"../utils/fs.js\";\n\nconst improveCliSchema = z.object({\n apiKey: z.string().optional(),\n queries: z.string().optional(),\n compare: z.array(z.string().min(1)).optional(),\n seed: z.number().int().optional(),\n prompts: z.string().optional(),\n plugin: z.array(z.string().min(1)).optional(),\n concurrency: z.number().int().min(1).optional(),\n output: z.string().optional(),\n saveResults: z.string().optional(),\n apply: z.boolean().optional(),\n verbose: z.boolean().optional()\n});\n\nconst DEFAULT_ANTHROPIC_MODEL = \"claude-sonnet-4-5-20250929\";\nconst DEFAULT_OPENAI_MODEL = \"gpt-4.1-mini\";\n\ninterface ImproveCommandOptions {\n json: boolean;\n color: boolean;\n provider: \"anthropic\" | \"openai\";\n model: string;\n apiKey?: string;\n queries?: string;\n compare: string[];\n numQueries: number;\n prompts?: string;\n minF1: number;\n minAssertPassRate: number;\n numRuns: number;\n maxToolIterations: number;\n concurrency: number;\n lintFailOn: \"error\" | \"warn\";\n lintSuppress: string[];\n lintPlugins: string[];\n triggerSeed?: number;\n output?: string;\n saveResults?: string;\n apply: boolean;\n verbose: boolean;\n}\n\nfunction collectPluginPaths(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nfunction resolveModel(provider: \"anthropic\" | \"openai\", model: string): string {\n if (provider === \"openai\" && model === DEFAULT_ANTHROPIC_MODEL) {\n return DEFAULT_OPENAI_MODEL;\n }\n\n return model;\n}\n\nasync function handleImproveCommand(targetPath: string, options: ImproveCommandOptions, command: Command): Promise<void> {\n const spinner = options.json || !process.stdout.isTTY ? null : ora(\"Preparing improvement run...\").start();\n\n try {\n if (spinner) {\n spinner.text = \"Initializing model provider...\";\n }\n const provider = createProvider(options.provider, options.apiKey);\n\n let queries = undefined;\n if (options.queries) {\n if (spinner) {\n spinner.text = \"Loading frozen trigger queries...\";\n }\n queries = await loadTriggerQueriesFile(options.queries);\n }\n\n let prompts = undefined;\n if (options.prompts) {\n if (spinner) {\n spinner.text = \"Loading eval prompts...\";\n }\n prompts = await loadEvalPromptsJson(options.prompts);\n } else {\n prompts = await loadConfiguredEvalPrompts(command);\n }\n\n const model = resolveModel(options.provider, options.model);\n const result = await runImprove(targetPath, {\n provider,\n model,\n lintFailOn: options.lintFailOn,\n lintSuppress: options.lintSuppress,\n lintPlugins: options.lintPlugins,\n compare: options.compare,\n numQueries: options.numQueries,\n triggerSeed: options.triggerSeed,\n queries,\n prompts,\n evalNumRuns: options.numRuns,\n evalMaxToolIterations: options.maxToolIterations,\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate,\n concurrency: options.concurrency,\n apply: options.apply,\n outputPath: options.output,\n verbose: options.verbose,\n onStage: (stage) => {\n if (!spinner) {\n return;\n }\n\n if (stage === \"baseline\") {\n spinner.text = \"Running baseline check...\";\n } else if (stage === \"generate\") {\n spinner.text = \"Generating candidate rewrite...\";\n } else if (stage === \"validate\") {\n spinner.text = \"Validating candidate rewrite...\";\n } else if (stage === \"verify\") {\n spinner.text = \"Verifying candidate against frozen test inputs...\";\n } else if (stage === \"write\") {\n spinner.text = options.apply ? \"Writing improved SKILL.md...\" : \"Writing candidate output...\";\n }\n }\n });\n\n if (options.saveResults) {\n await writeJsonFile(options.saveResults, result);\n }\n\n spinner?.stop();\n if (options.json) {\n writeResult(result, true);\n } else {\n writeResult(renderImproveReport(result, options.color, options.verbose), false);\n }\n\n process.exitCode = result.blockedReason ? 1 : 0;\n } catch (error) {\n spinner?.stop();\n writeError(error, options.json);\n process.exitCode = 2;\n }\n}\n\nexport function registerImproveCommand(program: Command): void {\n program\n .command(\"improve\")\n .description(\"Rewrite SKILL.md, verify it on frozen test inputs, and optionally apply it.\")\n .argument(\"<path-to-skill>\", \"Path to SKILL.md or skill directory\")\n .option(\"--provider <provider>\", \"LLM provider: anthropic|openai\")\n .option(\"--model <model>\", \"Model for baseline, rewrite, and verification runs\")\n .option(\"--api-key <key>\", \"API key override\")\n .option(\"--queries <path>\", \"Path to custom trigger queries JSON\")\n .option(\"--compare <path...>\", \"Path(s) to sibling skill directories to include as competitors\")\n .option(\"--num-queries <n>\", \"Number of auto-generated trigger queries\", (value) => Number.parseInt(value, 10))\n .option(\"--seed <number>\", \"RNG seed for reproducible trigger results\", (value) => Number.parseInt(value, 10))\n .option(\"--prompts <path>\", \"Path to eval prompts JSON\")\n .option(\"--plugin <path>\", \"Load a custom lint plugin file\", collectPluginPaths, [])\n .option(\"--concurrency <n>\", \"Maximum in-flight trigger/eval tasks\", (value) => Number.parseInt(value, 10))\n .option(\"--output <path>\", \"Write the verified candidate SKILL.md to a separate file\")\n .option(\"--save-results <path>\", \"Save the full improve result JSON\")\n .option(\"--min-f1 <n>\", \"Minimum required trigger F1 score (0-1)\", (value) => Number.parseFloat(value))\n .option(\"--min-assert-pass-rate <n>\", \"Minimum required eval assertion pass rate (0-1)\", (value) =>\n Number.parseFloat(value)\n )\n .option(\"--apply\", \"Apply the verified rewrite to the source SKILL.md\")\n .option(\"--verbose\", \"Include detailed baseline and verification reports\")\n .action(async (targetPath: string, _commandOptions: unknown, command: Command) => {\n const globalOptions = getGlobalCliOptions(command);\n const config = getResolvedConfig(command);\n const parsedCli = improveCliSchema.safeParse(command.opts());\n if (!parsedCli.success) {\n writeError(new Error(parsedCli.error.issues[0]?.message ?? \"Invalid improve options.\"), globalOptions.json);\n process.exitCode = 2;\n return;\n }\n\n await handleImproveCommand(\n targetPath,\n {\n ...globalOptions,\n provider: config.provider,\n model: config.model,\n apiKey: parsedCli.data.apiKey,\n queries: parsedCli.data.queries,\n compare: config.trigger.compare,\n numQueries: config.trigger.numQueries,\n prompts: parsedCli.data.prompts,\n minF1: config.trigger.threshold,\n minAssertPassRate: config.eval.threshold,\n numRuns: config.eval.numRuns,\n maxToolIterations: config.eval.maxToolIterations,\n concurrency: config.concurrency,\n lintFailOn: config.lint.failOn,\n lintSuppress: config.lint.suppress,\n lintPlugins: config.lint.plugins,\n triggerSeed: parsedCli.data.seed ?? config.trigger.seed,\n output: parsedCli.data.output,\n saveResults: parsedCli.data.saveResults,\n apply: Boolean(parsedCli.data.apply),\n verbose: Boolean(parsedCli.data.verbose)\n },\n command\n );\n });\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport yaml from \"js-yaml\";\nimport { z } from \"zod\";\nimport { EvalPrompt } from \"./eval-runner.js\";\nimport { CheckRunResult, runCheck } from \"./check-runner.js\";\nimport {\n extractRelativeFileReferences,\n ParsedSkill,\n parseSkillDocumentStrict,\n parseSkillStrict\n} from \"./skill-parser.js\";\nimport { TriggerQuery } from \"./trigger-tester.js\";\nimport { pathExists } from \"../utils/fs.js\";\nimport { LintFailOn } from \"../utils/config.js\";\nimport { LanguageModelProvider } from \"../providers/types.js\";\n\nconst improveRewriteSchema = z.object({\n frontmatter: z.record(z.unknown()),\n content: z.string().min(1),\n changeSummary: z.array(z.string().min(1)).min(1),\n targetedProblems: z.array(z.string().min(1)).min(1)\n});\n\nexport interface ImprovementBrief {\n lintIssues: Array<{\n checkId: string;\n title: string;\n status: \"warn\" | \"fail\";\n message: string;\n suggestion?: string;\n startLine?: number;\n endLine?: number;\n }>;\n triggerFailures: Array<{\n query: string;\n expected: string;\n actual: string;\n selectedCompetitor?: string;\n rawModelResponse?: string;\n }>;\n evalFailures: Array<{\n prompt: string;\n assertion: string;\n evidence: string;\n source: \"grader\" | \"tool\" | \"unknown\";\n }>;\n triggerSuggestions: string[];\n}\n\nexport interface ImproveCandidate {\n frontmatter: Record<string, unknown>;\n content: string;\n raw: string;\n changeSummary: string[];\n targetedProblems: string[];\n}\n\nexport interface ImproveMetricDelta {\n before: number;\n after: number;\n delta: number;\n}\n\nexport interface ImproveBooleanDelta {\n before: boolean;\n after: boolean;\n}\n\nexport interface ImproveDelta {\n lintFailures: ImproveMetricDelta;\n lintWarnings: ImproveMetricDelta;\n triggerF1: ImproveMetricDelta;\n evalAssertPassRate: ImproveMetricDelta;\n overallPassed: ImproveBooleanDelta;\n improved: boolean;\n hasRegression: boolean;\n}\n\nexport interface ImproveRunResult {\n target: string;\n provider: string;\n model: string;\n originalRaw: string;\n thresholds: {\n minF1: number;\n minAssertPassRate: number;\n };\n baseline: CheckRunResult;\n candidate: ImproveCandidate | null;\n verification: CheckRunResult | null;\n delta: ImproveDelta | null;\n applied: boolean;\n outputPath?: string;\n blockedReason?: string;\n}\n\nexport interface RunImproveOptions {\n provider: LanguageModelProvider;\n model: string;\n lintFailOn: LintFailOn;\n lintSuppress: string[];\n lintPlugins: string[];\n compare?: string[];\n numQueries: number;\n triggerSeed?: number;\n queries?: TriggerQuery[];\n prompts?: EvalPrompt[];\n evalNumRuns: number;\n evalMaxToolIterations: number;\n minF1: number;\n minAssertPassRate: number;\n concurrency?: number;\n verbose?: boolean;\n apply?: boolean;\n outputPath?: string;\n onStage?: (stage: \"baseline\" | \"generate\" | \"validate\" | \"verify\" | \"write\") => void;\n}\n\nfunction calculateEvalAssertPassRate(result: CheckRunResult[\"eval\"]): number {\n if (!result || result.summary.totalAssertions === 0) {\n return 0;\n }\n\n return result.summary.passedAssertions / result.summary.totalAssertions;\n}\n\nfunction extractJsonObject(raw: string): Record<string, unknown> {\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n return JSON.parse(trimmed) as Record<string, unknown>;\n }\n\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n return JSON.parse(trimmed.slice(start, end + 1)) as Record<string, unknown>;\n }\n\n throw new Error(\"Improver did not return a JSON object.\");\n}\n\nfunction orderFrontmatter(frontmatter: Record<string, unknown>): Record<string, unknown> {\n const ordered: Record<string, unknown> = {};\n\n for (const key of [\"name\", \"description\", \"license\"]) {\n if (Object.prototype.hasOwnProperty.call(frontmatter, key)) {\n ordered[key] = frontmatter[key];\n }\n }\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (!Object.prototype.hasOwnProperty.call(ordered, key)) {\n ordered[key] = value;\n }\n }\n\n return ordered;\n}\n\nfunction detectLineEnding(raw: string): string {\n return raw.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n}\n\nfunction buildSkillMarkdown(frontmatter: Record<string, unknown>, content: string, lineEnding: string): string {\n const normalizedBody = content.trim();\n if (normalizedBody.length === 0) {\n throw new Error(\"Candidate rewrite produced an empty SKILL.md body.\");\n }\n\n const frontmatterBlock = yaml\n .dump(orderFrontmatter(frontmatter), {\n lineWidth: 0,\n noRefs: true,\n sortKeys: false\n })\n .replace(/\\n/g, lineEnding);\n\n return `---${lineEnding}${frontmatterBlock}---${lineEnding}${lineEnding}${normalizedBody.replace(/\\n/g, lineEnding)}${lineEnding}`;\n}\n\nasync function validateRelativeReferences(raw: string, skillRoot: string): Promise<void> {\n for (const reference of extractRelativeFileReferences(raw)) {\n const resolved = path.resolve(skillRoot, reference);\n const relativeToRoot = path.relative(skillRoot, resolved);\n const escapesRoot =\n relativeToRoot === \"\" ? false : relativeToRoot.startsWith(\"..\") || path.isAbsolute(relativeToRoot);\n\n if (escapesRoot) {\n throw new Error(`Candidate rewrite introduced an out-of-root reference: ${reference}`);\n }\n\n if (!(await pathExists(resolved))) {\n throw new Error(`Candidate rewrite introduced a broken relative reference: ${reference}`);\n }\n }\n}\n\nasync function buildCandidate(skill: ParsedSkill, rewrite: z.infer<typeof improveRewriteSchema>): Promise<ImproveCandidate> {\n if (typeof rewrite.frontmatter.name === \"string\" && rewrite.frontmatter.name !== skill.frontmatter.name) {\n throw new Error(`Candidate rewrite attempted to rename skill '${skill.frontmatter.name}' to '${rewrite.frontmatter.name}'.`);\n }\n\n if (\n skill.frontmatter.license &&\n typeof rewrite.frontmatter.license === \"string\" &&\n rewrite.frontmatter.license !== skill.frontmatter.license\n ) {\n throw new Error(\n `Candidate rewrite attempted to change license '${skill.frontmatter.license}' to '${rewrite.frontmatter.license}'.`\n );\n }\n\n const mergedFrontmatter = {\n ...skill.frontmatter,\n ...rewrite.frontmatter,\n name: skill.frontmatter.name,\n ...(skill.frontmatter.license ? { license: skill.frontmatter.license } : {})\n };\n\n const raw = buildSkillMarkdown(mergedFrontmatter, rewrite.content, detectLineEnding(skill.raw));\n parseSkillDocumentStrict(raw, skill.skillRoot, skill.skillFile);\n await validateRelativeReferences(raw, skill.skillRoot);\n\n return {\n frontmatter: mergedFrontmatter,\n content: rewrite.content.trim(),\n raw,\n changeSummary: rewrite.changeSummary,\n targetedProblems: rewrite.targetedProblems\n };\n}\n\nfunction extractActionableIssues(result: CheckRunResult): ImprovementBrief {\n const lintIssues = result.lint.issues\n .filter((issue) => issue.status !== \"pass\")\n .map((issue) => ({\n checkId: issue.checkId,\n title: issue.title,\n status: issue.status === \"warn\" ? (\"warn\" as const) : (\"fail\" as const),\n message: issue.message,\n suggestion: issue.suggestion,\n startLine: issue.startLine,\n endLine: issue.endLine\n }));\n\n const triggerFailures =\n result.trigger?.cases.filter((testCase) => !testCase.matched).map((testCase) => ({\n query: testCase.query,\n expected: testCase.expected,\n actual: testCase.actual,\n selectedCompetitor: testCase.selectedCompetitor,\n rawModelResponse: testCase.rawModelResponse\n })) ?? [];\n\n const evalFailures =\n result.eval?.results.flatMap((promptResult) =>\n promptResult.assertions\n .filter((assertion) => !assertion.passed)\n .map((assertion) => ({\n prompt: promptResult.prompt,\n assertion: assertion.assertion,\n evidence: assertion.evidence,\n source:\n assertion.source === \"grader\" || assertion.source === \"tool\"\n ? assertion.source\n : (\"unknown\" as const)\n }))\n ) ?? [];\n\n return {\n lintIssues,\n triggerFailures,\n evalFailures,\n triggerSuggestions: result.trigger?.suggestions ?? []\n };\n}\n\nfunction hasActionableProblems(brief: ImprovementBrief): boolean {\n return (\n brief.lintIssues.length > 0 ||\n brief.triggerFailures.length > 0 ||\n brief.evalFailures.length > 0 ||\n brief.triggerSuggestions.length > 0\n );\n}\n\nasync function listSkillFiles(skillRoot: string): Promise<string[]> {\n const entries = await fs.readdir(skillRoot, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const absolutePath = path.join(skillRoot, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listSkillFiles(absolutePath)));\n continue;\n }\n\n if (entry.isFile()) {\n files.push(path.relative(skillRoot, absolutePath).split(path.sep).join(\"/\"));\n }\n }\n\n return files.sort();\n}\n\nasync function requestRewrite(\n skill: ParsedSkill,\n baseline: CheckRunResult,\n brief: ImprovementBrief,\n provider: LanguageModelProvider,\n model: string\n): Promise<z.infer<typeof improveRewriteSchema>> {\n const availableFiles = await listSkillFiles(skill.skillRoot);\n const systemPrompt = [\n \"You rewrite Agent Skill files to improve measured quality.\",\n \"Return JSON only.\",\n \"Required format:\",\n '{\"frontmatter\": {...}, \"content\": \"...\", \"changeSummary\": [\"...\"], \"targetedProblems\": [\"...\"]}',\n \"The content field must contain only the markdown body of SKILL.md, without YAML frontmatter fences.\",\n `Keep the skill name exactly '${skill.frontmatter.name}'.`,\n skill.frontmatter.license ? `Keep the license exactly '${skill.frontmatter.license}'.` : \"Do not remove any valid existing frontmatter fields.\",\n \"Do not invent new scripts, assets, references, APIs, or tools.\",\n \"Only reference files that already exist under the skill root.\",\n \"Optimize for trigger clarity, explicit scope boundaries, concrete examples, safety guidance, and tool usage instructions.\"\n ].join(\" \");\n\n const baselineTriggerF1 = baseline.trigger?.metrics.f1 ?? 0;\n const baselineEvalPassRate = calculateEvalAssertPassRate(baseline.eval);\n const userPrompt = [\n `Skill file: ${skill.skillFile}`,\n `Current trigger F1: ${baselineTriggerF1.toFixed(4)}`,\n `Current eval assertion pass rate: ${baselineEvalPassRate.toFixed(4)}`,\n `Lint failures: ${baseline.lint.summary.failures}`,\n `Lint warnings: ${baseline.lint.summary.warnings}`,\n \"\",\n \"Available files under the skill root:\",\n ...availableFiles.map((file) => `- ${file}`),\n \"\",\n \"Current SKILL.md:\",\n \"```markdown\",\n skill.raw,\n \"```\",\n \"\",\n \"Actionable problems to fix:\",\n JSON.stringify(brief, null, 2),\n \"\",\n \"Rewrite the skill to address only these evidenced problems. Keep the instructions tight and practical.\"\n ].join(\"\\n\");\n\n const raw = await provider.sendMessage(systemPrompt, userPrompt, { model });\n const parsed = improveRewriteSchema.safeParse(extractJsonObject(raw));\n if (!parsed.success) {\n throw new Error(`Failed to parse improve output: ${parsed.error.issues[0]?.message ?? \"invalid improve JSON\"}`);\n }\n\n return parsed.data;\n}\n\nasync function createVerificationDirectory(skillRoot: string, candidateRaw: string): Promise<{ tempRoot: string; skillPath: string }> {\n const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), \"skilltest-improve-\"));\n const tempSkillRoot = path.join(tempRoot, path.basename(skillRoot));\n await fs.cp(skillRoot, tempSkillRoot, { recursive: true });\n await fs.writeFile(path.join(tempSkillRoot, \"SKILL.md\"), candidateRaw, \"utf8\");\n return {\n tempRoot,\n skillPath: tempSkillRoot\n };\n}\n\nfunction buildDelta(baseline: CheckRunResult, verification: CheckRunResult): ImproveDelta {\n const baselineTriggerF1 = baseline.trigger?.metrics.f1 ?? 0;\n const verificationTriggerF1 = verification.trigger?.metrics.f1 ?? 0;\n const baselineEvalPassRate = calculateEvalAssertPassRate(baseline.eval);\n const verificationEvalPassRate = calculateEvalAssertPassRate(verification.eval);\n\n const lintFailuresDelta = baseline.lint.summary.failures - verification.lint.summary.failures;\n const lintWarningsDelta = baseline.lint.summary.warnings - verification.lint.summary.warnings;\n const triggerF1Delta = verificationTriggerF1 - baselineTriggerF1;\n const evalPassRateDelta = verificationEvalPassRate - baselineEvalPassRate;\n\n const hasRegression =\n verification.lint.summary.failures > baseline.lint.summary.failures ||\n verification.lint.summary.warnings > baseline.lint.summary.warnings ||\n verificationTriggerF1 < baselineTriggerF1 ||\n verificationEvalPassRate < baselineEvalPassRate;\n\n const improved =\n verification.gates.overallPassed !== baseline.gates.overallPassed\n ? verification.gates.overallPassed\n : lintFailuresDelta > 0 || lintWarningsDelta > 0 || triggerF1Delta > 0 || evalPassRateDelta > 0;\n\n return {\n lintFailures: {\n before: baseline.lint.summary.failures,\n after: verification.lint.summary.failures,\n delta: lintFailuresDelta\n },\n lintWarnings: {\n before: baseline.lint.summary.warnings,\n after: verification.lint.summary.warnings,\n delta: lintWarningsDelta\n },\n triggerF1: {\n before: baselineTriggerF1,\n after: verificationTriggerF1,\n delta: triggerF1Delta\n },\n evalAssertPassRate: {\n before: baselineEvalPassRate,\n after: verificationEvalPassRate,\n delta: evalPassRateDelta\n },\n overallPassed: {\n before: baseline.gates.overallPassed,\n after: verification.gates.overallPassed\n },\n improved,\n hasRegression\n };\n}\n\nfunction normalizeVerificationTarget(result: CheckRunResult, target: string): CheckRunResult {\n return {\n ...result,\n target\n };\n}\n\nfunction buildBlockingReason(delta: ImproveDelta, verification: CheckRunResult): string | undefined {\n if (delta.hasRegression) {\n return \"Candidate rewrite regressed one or more quality metrics on the frozen test set.\";\n }\n\n if (!delta.improved) {\n return \"Candidate rewrite did not produce a measurable improvement on the frozen test set.\";\n }\n\n if (!verification.gates.overallPassed) {\n return \"Candidate rewrite improved the skill but still failed the configured quality gates.\";\n }\n\n return undefined;\n}\n\nasync function maybeWriteOutput(outputPath: string, raw: string): Promise<string> {\n const absolutePath = path.resolve(outputPath);\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(absolutePath, raw, \"utf8\");\n return absolutePath;\n}\n\nexport async function runImprove(inputPath: string, options: RunImproveOptions): Promise<ImproveRunResult> {\n options.onStage?.(\"baseline\");\n const baseline = await runCheck(inputPath, {\n provider: options.provider,\n model: options.model,\n graderModel: options.model,\n lintFailOn: options.lintFailOn,\n lintSuppress: options.lintSuppress,\n lintPlugins: options.lintPlugins,\n compare: options.compare,\n numQueries: options.numQueries,\n triggerSeed: options.triggerSeed,\n queries: options.queries,\n evalNumRuns: options.evalNumRuns,\n prompts: options.prompts,\n evalMaxToolIterations: options.evalMaxToolIterations,\n concurrency: options.concurrency,\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate,\n continueOnLintFail: true,\n verbose: options.verbose\n });\n\n if (!baseline.trigger || !baseline.eval) {\n return {\n target: inputPath,\n provider: options.provider.name,\n model: options.model,\n originalRaw: \"\",\n thresholds: {\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate\n },\n baseline,\n candidate: null,\n verification: null,\n delta: null,\n applied: false,\n blockedReason:\n baseline.triggerSkippedReason ??\n baseline.evalSkippedReason ??\n \"Improve requires a strictly parseable skill so trigger and eval can be frozen.\"\n };\n }\n\n const skill = await parseSkillStrict(inputPath);\n const brief = extractActionableIssues(baseline);\n if (!hasActionableProblems(brief)) {\n return {\n target: inputPath,\n provider: options.provider.name,\n model: options.model,\n originalRaw: skill.raw,\n thresholds: {\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate\n },\n baseline,\n candidate: null,\n verification: null,\n delta: null,\n applied: false,\n blockedReason: \"No actionable failures, warnings, or mismatches were found to improve.\"\n };\n }\n\n options.onStage?.(\"generate\");\n const rewrite = await requestRewrite(skill, baseline, brief, options.provider, options.model);\n\n options.onStage?.(\"validate\");\n const candidate = await buildCandidate(skill, rewrite);\n\n if (candidate.raw === skill.raw) {\n return {\n target: inputPath,\n provider: options.provider.name,\n model: options.model,\n originalRaw: skill.raw,\n thresholds: {\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate\n },\n baseline,\n candidate,\n verification: null,\n delta: null,\n applied: false,\n blockedReason: \"Candidate rewrite produced no changes.\"\n };\n }\n\n options.onStage?.(\"verify\");\n const verificationDirectory = await createVerificationDirectory(skill.skillRoot, candidate.raw);\n let verification: CheckRunResult;\n\n try {\n verification = normalizeVerificationTarget(\n await runCheck(verificationDirectory.skillPath, {\n provider: options.provider,\n model: options.model,\n graderModel: options.model,\n lintFailOn: options.lintFailOn,\n lintSuppress: options.lintSuppress,\n lintPlugins: options.lintPlugins,\n compare: options.compare,\n numQueries: baseline.trigger.queries.length,\n triggerSeed: options.triggerSeed,\n queries: baseline.trigger.queries,\n evalNumRuns: baseline.eval.prompts.length,\n prompts: baseline.eval.prompts,\n evalMaxToolIterations: options.evalMaxToolIterations,\n concurrency: options.concurrency,\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate,\n continueOnLintFail: true,\n verbose: options.verbose\n }),\n inputPath\n );\n } finally {\n await fs.rm(verificationDirectory.tempRoot, { recursive: true, force: true });\n }\n\n const delta = buildDelta(baseline, verification);\n const blockedReason = buildBlockingReason(delta, verification);\n let applied = false;\n let outputPath: string | undefined;\n\n if (!blockedReason) {\n if (options.outputPath) {\n options.onStage?.(\"write\");\n outputPath = await maybeWriteOutput(options.outputPath, candidate.raw);\n }\n\n if (options.apply) {\n options.onStage?.(\"write\");\n await fs.writeFile(skill.skillFile, candidate.raw, \"utf8\");\n applied = true;\n }\n }\n\n return {\n target: inputPath,\n provider: options.provider.name,\n model: options.model,\n originalRaw: skill.raw,\n thresholds: {\n minF1: options.minF1,\n minAssertPassRate: options.minAssertPassRate\n },\n baseline,\n candidate,\n verification,\n delta,\n applied,\n ...(outputPath ? { outputPath } : {}),\n ...(blockedReason ? { blockedReason } : {})\n };\n}\n\nexport { improveRewriteSchema, extractActionableIssues as buildImprovementBrief };\n","import fs from \"node:fs/promises\";\nimport ora from \"ora\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { runRouteTest } from \"../core/route-tester.js\";\nimport { createProvider } from \"../providers/index.js\";\nimport { renderRouteHtml } from \"../reporters/html.js\";\nimport { renderRouteReport } from \"../reporters/terminal.js\";\nimport { getGlobalCliOptions, getResolvedConfig, writeError, writeResult } from \"./common.js\";\nimport { writeJsonFile } from \"../utils/fs.js\";\n\nconst routeCliSchema = z.object({\n numQueries: z.number().int().min(1).optional(),\n conflictThreshold: z.number().min(0).max(1).optional(),\n saveQueries: z.string().optional(),\n seed: z.number().int().optional(),\n concurrency: z.number().int().min(1).optional(),\n html: z.string().optional(),\n verbose: z.boolean().optional(),\n apiKey: z.string().optional()\n});\n\nconst DEFAULT_ANTHROPIC_MODEL = \"claude-sonnet-4-5-20250929\";\nconst DEFAULT_OPENAI_MODEL = \"gpt-4.1-mini\";\n\ninterface RouteCommandOptions {\n json: boolean;\n color: boolean;\n model: string;\n provider: \"anthropic\" | \"openai\";\n numQueriesPerSkill: number;\n conflictThreshold: number;\n saveQueries?: string;\n seed?: number;\n concurrency: number;\n html?: string;\n verbose: boolean;\n apiKey?: string;\n}\n\nfunction resolveModel(provider: \"anthropic\" | \"openai\", model: string): string {\n if (provider === \"openai\" && model === DEFAULT_ANTHROPIC_MODEL) {\n return DEFAULT_OPENAI_MODEL;\n }\n return model;\n}\n\nasync function handleRouteCommand(skillDir: string, options: RouteCommandOptions): Promise<void> {\n const spinner = options.json || !process.stdout.isTTY ? null : ora(\"Preparing route evaluation...\").start();\n\n try {\n if (spinner) spinner.text = \"Initializing model provider...\";\n const provider = createProvider(options.provider, options.apiKey);\n\n if (spinner) spinner.text = \"Running route simulations...\";\n const model = resolveModel(options.provider, options.model);\n const result = await runRouteTest(skillDir, {\n model,\n provider,\n numQueriesPerSkill: options.numQueriesPerSkill,\n conflictThreshold: options.conflictThreshold,\n seed: options.seed,\n concurrency: options.concurrency,\n verbose: options.verbose\n });\n\n if (options.saveQueries) {\n await writeJsonFile(\n options.saveQueries,\n result.cases.map((c) => ({ query: c.query, targetSkill: c.targetSkill }))\n );\n }\n\n spinner?.stop();\n if (options.json) {\n writeResult(result, true);\n } else {\n writeResult(renderRouteReport(result, options.color, options.verbose), false);\n }\n\n if (options.html) {\n await fs.writeFile(options.html, renderRouteHtml(result), \"utf8\");\n }\n } catch (error) {\n spinner?.stop();\n writeError(error, options.json);\n process.exitCode = 2;\n }\n}\n\nexport function registerRouteCommand(program: Command): void {\n program\n .command(\"route\")\n .description(\"Validate multi-skill routing across all skills in a directory.\")\n .argument(\"<skillDir>\", \"Directory containing skill subdirectories with SKILL.md files\")\n .option(\"--model <model>\", \"Model to use\")\n .option(\"--provider <provider>\", \"LLM provider: anthropic|openai\")\n .option(\"--num-queries <n>\", \"Queries per skill (default: 10)\", (value) => Number.parseInt(value, 10))\n .option(\"--conflict-threshold <n>\", \"Bleed fraction to flag as conflict (default: 0.1)\", (value) => Number.parseFloat(value))\n .option(\"--seed <number>\", \"RNG seed for reproducibility metadata\", (value) => Number.parseInt(value, 10))\n .option(\"--concurrency <n>\", \"Maximum in-flight requests\", (value) => Number.parseInt(value, 10))\n .option(\"--html <path>\", \"Write an HTML report to the given file path\")\n .option(\"--save-queries <path>\", \"Save generated queries as JSON\")\n .option(\"--api-key <key>\", \"API key override\")\n .option(\"--verbose\", \"Show raw model responses\")\n .action(async (skillDir: string, _commandOptions: unknown, command: Command) => {\n const globalOptions = getGlobalCliOptions(command);\n const config = getResolvedConfig(command);\n const parsedCli = routeCliSchema.safeParse(command.opts());\n if (!parsedCli.success) {\n writeError(new Error(parsedCli.error.issues[0]?.message ?? \"Invalid route options.\"), globalOptions.json);\n process.exitCode = 2;\n return;\n }\n\n await handleRouteCommand(skillDir, {\n ...globalOptions,\n model: config.model,\n provider: config.provider,\n numQueriesPerSkill: parsedCli.data.numQueries ?? 10,\n conflictThreshold: parsedCli.data.conflictThreshold ?? 0.1,\n saveQueries: parsedCli.data.saveQueries,\n seed: parsedCli.data.seed,\n concurrency: parsedCli.data.concurrency ?? config.concurrency,\n html: parsedCli.data.html,\n verbose: Boolean(parsedCli.data.verbose),\n apiKey: parsedCli.data.apiKey\n });\n });\n}\n","import path from \"node:path\";\nimport { z } from \"zod\";\nimport { ParsedSkill, parseSkillStrict } from \"./skill-parser.js\";\nimport { LanguageModelProvider } from \"../providers/types.js\";\nimport { pMap } from \"../utils/concurrency.js\";\nimport { listFilesRecursive } from \"../utils/fs.js\";\n\nexport interface RouteTestCase {\n query: string;\n targetSkill: string;\n actualSkill: string;\n correct: boolean;\n rawModelResponse?: string;\n}\n\nexport interface SkillRouteMetrics {\n skill: string;\n queriesTotal: number;\n correct: number;\n precision: number;\n recall: number;\n f1: number;\n}\n\nexport interface RoutingConflict {\n skillA: string;\n skillB: string;\n bleedAtoB: number;\n bleedBtoA: number;\n}\n\nexport interface RouteTestResult {\n skillDir: string;\n skills: string[];\n model: string;\n provider: string;\n seed?: number;\n numQueriesPerSkill: number;\n cases: RouteTestCase[];\n matrix: Record<string, Record<string, number>>;\n matrixPct: Record<string, Record<string, number>>;\n perSkillMetrics: SkillRouteMetrics[];\n conflicts: RoutingConflict[];\n suggestions: string[];\n overallAccuracy: number;\n}\n\nexport interface RunRouteTestOptions {\n model: string;\n provider: LanguageModelProvider;\n numQueriesPerSkill?: number;\n conflictThreshold?: number;\n seed?: number;\n concurrency?: number;\n verbose?: boolean;\n}\n\nconst stringArraySchema = z.array(z.string().min(1));\n\nfunction parseJsonArrayFromModelOutput(raw: string): unknown[] {\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n return JSON.parse(trimmed) as unknown[];\n }\n const start = trimmed.indexOf(\"[\");\n const end = trimmed.lastIndexOf(\"]\");\n if (start >= 0 && end > start) {\n return JSON.parse(trimmed.slice(start, end + 1)) as unknown[];\n }\n throw new Error(\"Model did not return a JSON array.\");\n}\n\nfunction parseRouteDecision(rawResponse: string, skillNames: string[]): string {\n const normalized = rawResponse.trim().toLowerCase();\n if (normalized === \"none\" || normalized.startsWith(\"none\")) {\n return \"none\";\n }\n for (const skillName of skillNames) {\n const escaped = skillName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regex = new RegExp(`\\\\b${escaped}\\\\b`, \"i\");\n if (regex.test(rawResponse)) {\n return skillName;\n }\n }\n return \"unrecognized\";\n}\n\nasync function discoverSkillPaths(skillDir: string): Promise<string[]> {\n const allFiles = await listFilesRecursive(skillDir);\n return allFiles.filter((f) => path.basename(f) === \"SKILL.md\");\n}\n\nasync function generatePositiveQueriesForSkill(\n skill: ParsedSkill,\n provider: LanguageModelProvider,\n model: string,\n count: number\n): Promise<string[]> {\n const systemPrompt = [\n \"You generate realistic user queries that should trigger a specific agent skill.\",\n \"Return a JSON array of strings only. No markdown, no comments.\",\n \"Each string is one realistic user query that clearly belongs to this skill.\",\n \"Queries should look like real user requests with enough context to drive a routing decision.\"\n ].join(\" \");\n\n const userPrompt = [\n `Skill name: ${skill.frontmatter.name}`,\n `Skill description: ${skill.frontmatter.description}`,\n `Generate exactly ${count} distinct queries that should trigger this skill.`\n ].join(\"\\n\");\n\n const raw = await provider.sendMessage(systemPrompt, userPrompt, { model });\n const parsed = stringArraySchema.safeParse(parseJsonArrayFromModelOutput(raw));\n if (!parsed.success) {\n throw new Error(\n `Failed to parse generated queries for skill '${skill.frontmatter.name}': ${parsed.error.issues[0]?.message ?? \"invalid format\"}`\n );\n }\n if (parsed.data.length < count) {\n throw new Error(\n `Expected ${count} queries for skill '${skill.frontmatter.name}', got ${parsed.data.length}.`\n );\n }\n return parsed.data.slice(0, count);\n}\n\nfunction buildSkillListText(skills: ParsedSkill[]): string {\n return skills.map((s) => `- ${s.frontmatter.name}: ${s.frontmatter.description}`).join(\"\\n\");\n}\n\nexport function buildConfusionMatrix(\n cases: RouteTestCase[],\n skillNames: string[],\n numQueriesPerSkill: number\n): { matrix: Record<string, Record<string, number>>; matrixPct: Record<string, Record<string, number>> } {\n const allActualValues = [...skillNames, \"none\", \"unrecognized\"];\n const matrix: Record<string, Record<string, number>> = {};\n for (const target of skillNames) {\n matrix[target] = {};\n for (const actual of allActualValues) {\n matrix[target]![actual] = 0;\n }\n }\n for (const c of cases) {\n const row = matrix[c.targetSkill];\n if (row) {\n row[c.actualSkill] = (row[c.actualSkill] ?? 0) + 1;\n }\n }\n const matrixPct: Record<string, Record<string, number>> = {};\n const divisor = numQueriesPerSkill > 0 ? numQueriesPerSkill : 1;\n for (const target of skillNames) {\n matrixPct[target] = {};\n for (const actual of allActualValues) {\n matrixPct[target]![actual] = (matrix[target]![actual] ?? 0) / divisor;\n }\n }\n return { matrix, matrixPct };\n}\n\nexport function computePerSkillMetrics(\n skillNames: string[],\n matrix: Record<string, Record<string, number>>,\n numQueriesPerSkill: number\n): SkillRouteMetrics[] {\n return skillNames.map((skill) => {\n const tp = matrix[skill]?.[skill] ?? 0;\n const fp = skillNames\n .filter((s) => s !== skill)\n .reduce((sum, other) => sum + (matrix[other]?.[skill] ?? 0), 0);\n const recall = numQueriesPerSkill === 0 ? 0 : tp / numQueriesPerSkill;\n const precDenom = tp + fp;\n const precision = precDenom === 0 ? 0 : tp / precDenom;\n const f1 = precision + recall === 0 ? 0 : (2 * precision * recall) / (precision + recall);\n return { skill, queriesTotal: numQueriesPerSkill, correct: tp, precision, recall, f1 };\n });\n}\n\nexport function detectConflicts(\n skillNames: string[],\n matrixPct: Record<string, Record<string, number>>,\n conflictThreshold: number\n): RoutingConflict[] {\n const conflicts: RoutingConflict[] = [];\n for (let i = 0; i < skillNames.length; i++) {\n for (let j = i + 1; j < skillNames.length; j++) {\n const skillA = skillNames[i]!;\n const skillB = skillNames[j]!;\n const bleedAtoB = matrixPct[skillA]?.[skillB] ?? 0;\n const bleedBtoA = matrixPct[skillB]?.[skillA] ?? 0;\n if (Math.max(bleedAtoB, bleedBtoA) > conflictThreshold) {\n conflicts.push({ skillA, skillB, bleedAtoB, bleedBtoA });\n }\n }\n }\n return conflicts;\n}\n\nfunction buildRouteSuggestions(perSkillMetrics: SkillRouteMetrics[], conflicts: RoutingConflict[]): string[] {\n const suggestions: string[] = [];\n for (const metrics of perSkillMetrics) {\n if (metrics.f1 < 0.7) {\n suggestions.push(\n `'${metrics.skill}' has low F1 (${(metrics.f1 * 100).toFixed(1)}%) — consider clarifying its description and scope boundaries.`\n );\n }\n }\n for (const conflict of conflicts) {\n suggestions.push(\n `'${conflict.skillA}' and '${conflict.skillB}' overlap: ${(conflict.bleedAtoB * 100).toFixed(1)}% of ${conflict.skillA} queries routed to ${conflict.skillB}, ${(conflict.bleedBtoA * 100).toFixed(1)}% the other way — consider narrowing scope boundaries.`\n );\n }\n if (suggestions.length === 0) {\n suggestions.push(\"Routing looks clean. All skills are well-differentiated on this sample.\");\n }\n return suggestions;\n}\n\nexport async function runRouteTest(skillDir: string, options: RunRouteTestOptions): Promise<RouteTestResult> {\n const numQueriesPerSkill = options.numQueriesPerSkill ?? 10;\n const conflictThreshold = options.conflictThreshold ?? 0.1;\n const concurrency = options.concurrency ?? 5;\n const absoluteSkillDir = path.resolve(skillDir);\n\n const skillPaths = await discoverSkillPaths(absoluteSkillDir);\n if (skillPaths.length < 2) {\n throw new Error(\n `Route test requires at least 2 skills. Found ${skillPaths.length} in: ${skillDir}`\n );\n }\n if (skillPaths.length > 20) {\n process.stderr.write(\n `Warning: ${skillPaths.length} skills found. This will make ${skillPaths.length * numQueriesPerSkill} routing model calls.\\n`\n );\n }\n\n const skills = await Promise.all(skillPaths.map((p) => parseSkillStrict(p)));\n const skillNames = skills.map((s) => s.frontmatter.name);\n\n const queriesPerSkill = await pMap(\n skills,\n (skill) => generatePositiveQueriesForSkill(skill, options.provider, options.model, numQueriesPerSkill),\n concurrency\n );\n\n interface WorkItem { query: string; targetSkill: string }\n const workItems: WorkItem[] = [];\n for (let i = 0; i < skills.length; i++) {\n const skill = skills[i]!;\n const queries = queriesPerSkill[i]!;\n for (const query of queries) {\n workItems.push({ query, targetSkill: skill.frontmatter.name });\n }\n }\n\n const skillListText = buildSkillListText(skills);\n const systemPrompt =\n \"Select the single best skill for the user's request from the provided list. Respond with only the skill name, or 'none' if nothing fits.\";\n\n const cases = await pMap(\n workItems,\n async ({ query, targetSkill }) => {\n const userPrompt = `Available skills:\\n${skillListText}\\n\\nUser query: ${query}`;\n const rawResponse = await options.provider.sendMessage(systemPrompt, userPrompt, { model: options.model });\n const actualSkill = parseRouteDecision(rawResponse, skillNames);\n return {\n query,\n targetSkill,\n actualSkill,\n correct: actualSkill === targetSkill,\n rawModelResponse: options.verbose ? rawResponse : undefined\n } satisfies RouteTestCase;\n },\n concurrency\n );\n\n const { matrix, matrixPct } = buildConfusionMatrix(cases, skillNames, numQueriesPerSkill);\n const perSkillMetrics = computePerSkillMetrics(skillNames, matrix, numQueriesPerSkill);\n const conflicts = detectConflicts(skillNames, matrixPct, conflictThreshold);\n const correctCount = cases.filter((c) => c.correct).length;\n const overallAccuracy = cases.length === 0 ? 0 : correctCount / cases.length;\n const suggestions = buildRouteSuggestions(perSkillMetrics, conflicts);\n\n return {\n skillDir: absoluteSkillDir,\n skills: skillNames,\n model: options.model,\n provider: options.provider.name,\n seed: options.seed,\n numQueriesPerSkill,\n cases,\n matrix,\n matrixPct,\n perSkillMetrics,\n conflicts,\n suggestions,\n overallAccuracy\n };\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QA8VtB,IAAI;AAAA;AAAA;AAAA;AAIZ;AAEO,SAAS,eAAe,QAA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","names":["fs","path","fs","z","fs","path","fs","path","path","fs","fs","path","uniqueLabels","summarizeLineRange","buildSkippedPatterns","fs","path","path","fs","countSkippedSecurityPatterns","formatPercent","beforeIndex","afterIndex","fs","z","z","z","z","passedAssertions","z","z","z","fs","z","fs","fs","z","fs","path","z","z","fs","path","envValue","wait","z","fs","fs","ora","z","z","DEFAULT_ANTHROPIC_MODEL","DEFAULT_OPENAI_MODEL","resolveModel","ora","fs","fs","ora","z","z","DEFAULT_ANTHROPIC_MODEL","DEFAULT_OPENAI_MODEL","collectPluginPaths","resolveModel","ora","fs","ora","z","fs","path","yaml","z","z","calculateEvalAssertPassRate","extractJsonObject","yaml","path","fs","z","DEFAULT_ANTHROPIC_MODEL","DEFAULT_OPENAI_MODEL","collectPluginPaths","resolveModel","ora","fs","ora","z","path","z","z","parseJsonArrayFromModelOutput","path","z","DEFAULT_ANTHROPIC_MODEL","DEFAULT_OPENAI_MODEL","resolveModel","ora","fs","path","fs"]}