From e4dce16dc6a0d9f50f173d8191833b4852387b6a Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 1 Oct 2025 09:32:25 +0200 Subject: [PATCH 1/8] refactor: remove unnecessary methods from Gemini CLI runner Removes a couple of methods that were duplicated from the base class. --- .../codegen/gemini-cli/gemini-cli-runner.ts | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/runner/codegen/gemini-cli/gemini-cli-runner.ts b/runner/codegen/gemini-cli/gemini-cli-runner.ts index 7cb0fd6..baaa937 100644 --- a/runner/codegen/gemini-cli/gemini-cli-runner.ts +++ b/runner/codegen/gemini-cli/gemini-cli-runner.ts @@ -1,9 +1,4 @@ -import { - LlmConstrainedOutputGenerateResponse, - LlmGenerateFilesRequestOptions, - LlmGenerateTextResponse, - LlmRunner, -} from '../llm-runner.js'; +import {LlmGenerateFilesRequestOptions, LlmRunner} from '../llm-runner.js'; import {join} from 'path'; import {mkdirSync} from 'fs'; import {writeFile} from 'fs/promises'; @@ -12,7 +7,6 @@ import { getGeminiInstructionsFile, getGeminiSettingsFile, } from './gemini-files.js'; -import {UserFacingError} from '../../utils/errors.js'; import {BaseCliAgentRunner} from '../base-cli-agent-runner.js'; const SUPPORTED_MODELS = ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.5-flash-lite']; @@ -25,17 +19,6 @@ export class GeminiCliRunner extends BaseCliAgentRunner implements LlmRunner { protected ignoredFilePatterns = ['**/GEMINI.md', '**/.geminiignore']; protected binaryName = 'gemini'; - generateText(): Promise { - // Technically we can make this work, but we don't need it at the time of writing. - throw new UserFacingError('Generating text with Gemini CLI is not supported.'); - } - - generateConstrained(): Promise> { - // We can't support this, because there's no straightforward - // way to tell the Gemini CLI to follow a schema. - throw new UserFacingError('Constrained output with Gemini CLI is not supported.'); - } - getSupportedModels(): string[] { return SUPPORTED_MODELS; } From 0472210b11b6b47c4d8940c15ee1cfa78e3b3071 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 1 Oct 2025 09:48:40 +0200 Subject: [PATCH 2/8] refactor: move more common code into base agent class Moves the instructions and ignored files into the agent base class. --- runner/codegen/base-cli-agent-runner.ts | 48 +++++++++++ runner/codegen/gemini-cli-runner.ts | 84 +++++++++++++++++++ .../codegen/gemini-cli/gemini-cli-runner.ts | 64 -------------- runner/codegen/gemini-cli/gemini-files.ts | 73 ---------------- runner/codegen/runner-creation.ts | 4 +- runner/index.ts | 2 +- 6 files changed, 135 insertions(+), 140 deletions(-) create mode 100644 runner/codegen/gemini-cli-runner.ts delete mode 100644 runner/codegen/gemini-cli/gemini-cli-runner.ts delete mode 100644 runner/codegen/gemini-cli/gemini-files.ts diff --git a/runner/codegen/base-cli-agent-runner.ts b/runner/codegen/base-cli-agent-runner.ts index 83dd84a..38fade2 100644 --- a/runner/codegen/base-cli-agent-runner.ts +++ b/runner/codegen/base-cli-agent-runner.ts @@ -86,6 +86,54 @@ export abstract class BaseCliAgentRunner { this.pendingProcesses.clear(); } + /** Gets patterns of files that likely all agents need to ignore. */ + protected getCommonIgnorePatterns() { + return { + directories: [ + '/dist', + '/tmp', + '/out-tsc', + '/bazel-out', + '/node_modules', + '/.angular/cache', + '.sass-cache/', + '.DS_Store', + ], + files: [ + 'npm-debug.log', + 'yarn-error.log', + '.editorconfig', + '.postcssrc.json', + '.gitignore', + 'yarn.lock', + 'pnpm-lock.yaml', + 'package-lock.json', + 'pnpm-workspace.yaml', + 'Thumbs.db', + ], + }; + } + + /** Gets the common system instructions for all agents. */ + protected getCommonInstructions(options: LlmGenerateFilesRequestOptions) { + return [ + `# Important Rules`, + `The following instructions dictate how you should behave. It is CRITICAL that you follow them AS CLOSELY AS POSSIBLE:`, + `- Do NOT attempt to improve the existing code, only implement the user request.`, + `- STOP once you've implemented the user request, do NOT try to clean up the project.`, + `- You ARE NOT ALLOWED to install dependencies. Assume that all necessary dependencies are already installed.`, + `- Do NOT clean up unused files.`, + `- Do NOT run the dev server, use \`${options.context.buildCommand}\` to verify the build correctness instead.`, + `- Do NOT use \`git\` or any other versioning software.`, + `- Do NOT attempt to lint the project.`, + '', + `Following the rules is VERY important and should be done with the utmost care!`, + '', + '', + options.context.systemInstructions, + ].join('\n'); + } + private resolveBinaryPath(binaryName: string): string { let dir = import.meta.dirname; let closestRoot: string | null = null; diff --git a/runner/codegen/gemini-cli-runner.ts b/runner/codegen/gemini-cli-runner.ts new file mode 100644 index 0000000..93582eb --- /dev/null +++ b/runner/codegen/gemini-cli-runner.ts @@ -0,0 +1,84 @@ +import {LlmGenerateFilesRequestOptions, LlmRunner} from './llm-runner.js'; +import {join} from 'path'; +import {mkdirSync} from 'fs'; +import {writeFile} from 'fs/promises'; +import {BaseCliAgentRunner} from './base-cli-agent-runner.js'; + +const SUPPORTED_MODELS = ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.5-flash-lite']; + +/** Runner that generates code using the Gemini CLI. */ +export class GeminiCliRunner extends BaseCliAgentRunner implements LlmRunner { + readonly id = 'gemini-cli'; + readonly displayName = 'Gemini CLI'; + readonly hasBuiltInRepairLoop = true; + protected ignoredFilePatterns = ['**/GEMINI.md', '**/.geminiignore']; + protected binaryName = 'gemini'; + + getSupportedModels(): string[] { + return SUPPORTED_MODELS; + } + + protected getCommandLineFlags(options: LlmGenerateFilesRequestOptions): string[] { + return [ + '--prompt', + options.context.executablePrompt, + '--model', + options.model, + // Skip all confirmations. + '--approval-mode', + 'yolo', + ]; + } + + protected async writeAgentFiles(options: LlmGenerateFilesRequestOptions): Promise { + const {context} = options; + const ignoreFilePath = join(context.directory, '.geminiignore'); + const instructionFilePath = join(context.directory, 'GEMINI.md'); + const settingsDir = join(context.directory, '.gemini'); + + mkdirSync(settingsDir); + + const commonIgnorePatterns = super.getCommonIgnorePatterns(); + const ignoreFileContent = [ + ...commonIgnorePatterns.directories, + ...commonIgnorePatterns.files, + ].join('\n'); + + const promises: Promise[] = [ + writeFile(ignoreFilePath, ignoreFileContent), + writeFile(instructionFilePath, super.getCommonInstructions(options)), + ]; + + if (context.packageManager) { + writeFile( + join(settingsDir, 'settings.json'), + this.getGeminiSettingsFile(context.packageManager, context.possiblePackageManagers), + ); + } + + await Promise.all(promises); + } + + private getGeminiSettingsFile(packageManager: string, possiblePackageManagers: string[]): string { + const config = { + excludeTools: [ + // Prevent Gemini from using version control and package + // managers since doing so via prompting doesn't always work. + 'run_shell_command(git)', + ...possiblePackageManagers + .filter(m => m !== packageManager) + .map(m => `run_shell_command(${m})`), + + // Note that we don't block all commands, + // because the build commands also go through it. + `run_shell_command(${packageManager} install)`, + `run_shell_command(${packageManager} add)`, + `run_shell_command(${packageManager} remove)`, + `run_shell_command(${packageManager} update)`, + `run_shell_command(${packageManager} list)`, + ], + }; + + return JSON.stringify(config, null, 2); + } +} diff --git a/runner/codegen/gemini-cli/gemini-cli-runner.ts b/runner/codegen/gemini-cli/gemini-cli-runner.ts deleted file mode 100644 index baaa937..0000000 --- a/runner/codegen/gemini-cli/gemini-cli-runner.ts +++ /dev/null @@ -1,64 +0,0 @@ -import {LlmGenerateFilesRequestOptions, LlmRunner} from '../llm-runner.js'; -import {join} from 'path'; -import {mkdirSync} from 'fs'; -import {writeFile} from 'fs/promises'; -import { - getGeminiIgnoreFile, - getGeminiInstructionsFile, - getGeminiSettingsFile, -} from './gemini-files.js'; -import {BaseCliAgentRunner} from '../base-cli-agent-runner.js'; - -const SUPPORTED_MODELS = ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.5-flash-lite']; - -/** Runner that generates code using the Gemini CLI. */ -export class GeminiCliRunner extends BaseCliAgentRunner implements LlmRunner { - readonly id = 'gemini-cli'; - readonly displayName = 'Gemini CLI'; - readonly hasBuiltInRepairLoop = true; - protected ignoredFilePatterns = ['**/GEMINI.md', '**/.geminiignore']; - protected binaryName = 'gemini'; - - getSupportedModels(): string[] { - return SUPPORTED_MODELS; - } - - protected getCommandLineFlags(options: LlmGenerateFilesRequestOptions): string[] { - return [ - '--prompt', - options.context.executablePrompt, - '--model', - options.model, - // Skip all confirmations. - '--approval-mode', - 'yolo', - ]; - } - - protected async writeAgentFiles(options: LlmGenerateFilesRequestOptions): Promise { - const {context} = options; - const ignoreFilePath = join(context.directory, '.geminiignore'); - const instructionFilePath = join(context.directory, 'GEMINI.md'); - const settingsDir = join(context.directory, '.gemini'); - - mkdirSync(settingsDir); - - const promises: Promise[] = [writeFile(ignoreFilePath, getGeminiIgnoreFile())]; - - if (context.buildCommand) { - promises.push( - writeFile( - instructionFilePath, - getGeminiInstructionsFile(context.systemInstructions, context.buildCommand), - ), - ); - } - - if (context.packageManager) { - writeFile( - join(settingsDir, 'settings.json'), - getGeminiSettingsFile(context.packageManager, context.possiblePackageManagers), - ); - } - } -} diff --git a/runner/codegen/gemini-cli/gemini-files.ts b/runner/codegen/gemini-cli/gemini-files.ts deleted file mode 100644 index 9412cd7..0000000 --- a/runner/codegen/gemini-cli/gemini-files.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** Generates the `GEMINI.md` file for an eval run. */ -export function getGeminiInstructionsFile( - systemInstructions: string, - buildCommand: string, -): string { - return [ - `# Important Rules`, - `The following instructions dictate how you should behave. It is CRITICAL that you follow them AS CLOSELY AS POSSIBLE:`, - `- Do NOT attempt to improve the existing code, only implement the user request.`, - `- STOP once you've implemented the user request, do NOT try to clean up the project.`, - `- You ARE NOT ALLOWED to install dependencies. Assume that all necessary dependencies are already installed.`, - `- Do NOT clean up unused files.`, - `- Do NOT run the dev server, use \`${buildCommand}\` to verify the build correctness instead.`, - `- Do NOT use \`git\` or any other versioning software.`, - `- Do NOT attempt to lint the project.`, - '', - `Following the rules is VERY important and should be done with the utmost care!`, - '', - '', - systemInstructions, - ].join('\n'); -} - -/** Generates the `.geminiignore` file for an eval run. */ -export function getGeminiIgnoreFile(): string { - return [ - '/dist', - '/tmp', - '/out-tsc', - '/bazel-out', - '/node_modules', - 'npm-debug.log', - 'yarn-error.log', - '.editorconfig', - '.postcssrc.json', - '.gitignore', - 'yarn.lock', - 'pnpm-lock.yaml', - 'package-lock.json', - 'pnpm-workspace.yaml', - '/.angular/cache', - '.sass-cache/', - '.DS_Store', - 'Thumbs.db', - ].join('\n'); -} - -/** Gets the content of the `.gemini/settings.json` file. */ -export function getGeminiSettingsFile( - packageManager: string, - possiblePackageManagers: string[], -): string { - const config = { - excludeTools: [ - // Prevent Gemini from using version control and package - // managers since doing so via prompting doesn't always work. - 'run_shell_command(git)', - ...possiblePackageManagers - .filter(m => m !== packageManager) - .map(m => `run_shell_command(${m})`), - - // Note that we don't block all commands, - // because the build commands also go through it. - `run_shell_command(${packageManager} install)`, - `run_shell_command(${packageManager} add)`, - `run_shell_command(${packageManager} remove)`, - `run_shell_command(${packageManager} update)`, - `run_shell_command(${packageManager} list)`, - ], - }; - - return JSON.stringify(config, null, 2); -} diff --git a/runner/codegen/runner-creation.ts b/runner/codegen/runner-creation.ts index 046b5fe..249fd8a 100644 --- a/runner/codegen/runner-creation.ts +++ b/runner/codegen/runner-creation.ts @@ -1,5 +1,5 @@ import {UserFacingError} from '../utils/errors.js'; -import type {GeminiCliRunner} from './gemini-cli/gemini-cli-runner.js'; +import type {GeminiCliRunner} from './gemini-cli-runner.js'; import type {GenkitRunner} from './genkit/genkit-runner.js'; interface AvailableRunners { @@ -22,7 +22,7 @@ export async function getRunnerByName(name: T): Promise new m.GenkitRunner() as AvailableRunners[T], ); case 'gemini-cli': - return import('./gemini-cli/gemini-cli-runner.js').then( + return import('./gemini-cli-runner.js').then( m => new m.GeminiCliRunner() as AvailableRunners[T], ); default: diff --git a/runner/index.ts b/runner/index.ts index 66a12f4..3080dce 100644 --- a/runner/index.ts +++ b/runner/index.ts @@ -24,7 +24,7 @@ export {generateCodeAndAssess} from './orchestration/generate.js'; export {groupSimilarReports} from './orchestration/grouping.js'; export {type LlmRunner} from './codegen/llm-runner.js'; export {GenkitRunner} from './codegen/genkit/genkit-runner.js'; -export {GeminiCliRunner} from './codegen/gemini-cli/gemini-cli-runner.js'; +export {GeminiCliRunner} from './codegen/gemini-cli-runner.js'; export {getRunnerByName, type RunnerName} from './codegen/runner-creation.js'; export {getEnvironmentByPath} from './configuration/environment-resolution.js'; export {type Environment} from './configuration/environment.js'; From 053e509b907b031b435719c9a87465845d03b6a5 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 1 Oct 2025 12:24:04 +0200 Subject: [PATCH 3/8] fix: occasional runtime errors when killing processes Fixes an error I saw while debugging where if the `exit` event emits quickly, we would get a `Cannot access before initialization` error. --- runner/utils/kill-gracefully.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/runner/utils/kill-gracefully.ts b/runner/utils/kill-gracefully.ts index 5249685..f74fe92 100644 --- a/runner/utils/kill-gracefully.ts +++ b/runner/utils/kill-gracefully.ts @@ -28,7 +28,12 @@ export function killChildProcessGracefully( throw new Error(`No process ID for processed that should be killed.`); } - // Watch for exiting, so that we can cancel the timeout(s) then. + // Declare the variables here, because in some cases it was throwing a + // `Cannot access '' before initialization` error, despite hoisting. + let sigkillTimeoutId: ReturnType | undefined; + let rejectTimeoutId: ReturnType | undefined; + + // Watch for exiting, so that we can cancel the timeouts. child.on('exit', () => { clearTimeout(sigkillTimeoutId); clearTimeout(rejectTimeoutId); @@ -43,9 +48,10 @@ export function killChildProcessGracefully( } // Start a timeout for the SIGKILL fallback - const sigkillTimeoutId = setTimeout(() => treeKill(pid, 'SIGKILL'), timeoutInMs); + sigkillTimeoutId = setTimeout(() => treeKill(pid, 'SIGKILL'), timeoutInMs); + // Start another timeout to reject the promise if the child process never fires `exit` for some reasons. - const rejectTimeoutId = setTimeout( + rejectTimeoutId = setTimeout( () => reject(new Error('Child process did not exit gracefully within the timeout.')), timeoutInMs * 2, ); From 6cd3be5c0ff18206ec653ee99ad9a2043f0bf53f Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 1 Oct 2025 12:26:48 +0200 Subject: [PATCH 4/8] refactor: allow agents to configure the timeouts Allows for agents inheriting from the `BaseCliAgentRunner` to override the timeout values. --- runner/codegen/base-cli-agent-runner.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/runner/codegen/base-cli-agent-runner.ts b/runner/codegen/base-cli-agent-runner.ts index 38fade2..34cb987 100644 --- a/runner/codegen/base-cli-agent-runner.ts +++ b/runner/codegen/base-cli-agent-runner.ts @@ -19,6 +19,8 @@ export abstract class BaseCliAgentRunner { protected abstract readonly ignoredFilePatterns: string[]; protected abstract getCommandLineFlags(options: LlmGenerateFilesRequestOptions): string[]; protected abstract writeAgentFiles(options: LlmGenerateFilesRequestOptions): Promise; + protected inactivityTimeoutMins = 2; + protected totalRequestTimeoutMins = 10; private pendingTimeouts = new Set>(); private pendingProcesses = new Set(); @@ -46,7 +48,7 @@ export abstract class BaseCliAgentRunner { await this.writeAgentFiles(options); - const reasoning = await this.runAgentProcess(options, 2, 10); + const reasoning = await this.runAgentProcess(options); const finalSnapshot = await DirectorySnapshot.forDirectory(context.directory, ignoredPatterns); const diff = finalSnapshot.getChangedOrAddedFiles(initialSnapshot); @@ -168,15 +170,13 @@ export abstract class BaseCliAgentRunner { return binaryPath; } - private runAgentProcess( - options: LlmGenerateFilesRequestOptions, - inactivityTimeoutMins: number, - totalRequestTimeoutMins: number, - ): Promise { + private runAgentProcess(options: LlmGenerateFilesRequestOptions): Promise { return new Promise(resolve => { let stdoutBuffer = ''; let stdErrBuffer = ''; let isDone = false; + const inactivityTimeoutMins = this.inactivityTimeoutMins; + const totalRequestTimeoutMins = this.totalRequestTimeoutMins; const msPerMin = 1000 * 60; const finalize = (finalMessage: string) => { if (isDone) { From 6c19e8d70549309c8a69efa3ae67f3cc249eb651 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 1 Oct 2025 12:29:38 +0200 Subject: [PATCH 5/8] fix: prevent some agents from hanging indefinitely Some agent processes don't seem to execute until stdin has ended. These changes add it to the `BaseCliAgentRunner`. --- runner/codegen/base-cli-agent-runner.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/runner/codegen/base-cli-agent-runner.ts b/runner/codegen/base-cli-agent-runner.ts index 34cb987..97644b4 100644 --- a/runner/codegen/base-cli-agent-runner.ts +++ b/runner/codegen/base-cli-agent-runner.ts @@ -232,6 +232,9 @@ export abstract class BaseCliAgentRunner { env: {...process.env}, }); + // Important! some agents won't start executing until stdin has ended. + childProcess.stdin.end(); + childProcess.on('close', code => finalize( `${this.displayName} process has exited` + (code == null ? '.' : ` with ${code} code.`), From 12578018e7ff6afaccff8dce6cb64a05547a4130 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 1 Oct 2025 12:33:57 +0200 Subject: [PATCH 6/8] feat: add Claude Code runner Adds a runner that generates code using Claude Code. --- README.md | 2 +- package.json | 1 + pnpm-lock.yaml | 127 +++++++++++++++++++++++++++ runner/codegen/claude-code-runner.ts | 88 +++++++++++++++++++ runner/codegen/runner-creation.ts | 6 ++ runner/eval-cli.ts | 2 +- 6 files changed, 224 insertions(+), 2 deletions(-) create mode 100644 runner/codegen/claude-code-runner.ts diff --git a/README.md b/README.md index 1d9f41c..31d9bd0 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ You can customize the `web-codegen-scorer eval` script with the following flags: - Example: `web-codegen-scorer eval --model=gemini-2.5-flash --autorater-model=gemini-2.5-flash --env=` - `--runner=`: Specifies the runner to use to execute the eval. Supported runners are - `genkit` (default) or `gemini-cli`. + `genkit` (default), `gemini-cli` or `claude-code`. - `--local`: Runs the script in local mode for the initial code generation request. Instead of calling the LLM, it will attempt to read the initial code from a corresponding file in the diff --git a/package.json b/package.json index 85c185a..de5f4b5 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "wcs": "./runner/bin/cli.js" }, "dependencies": { + "@anthropic-ai/claude-code": "^1.0.128", "@anthropic-ai/sdk": "^0.63.0", "@axe-core/puppeteer": "^4.10.2", "@genkit-ai/compat-oai": "^1.19.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab2e5b7..6c4464e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@anthropic-ai/claude-code': + specifier: ^1.0.128 + version: 1.0.128 '@anthropic-ai/sdk': specifier: ^0.63.0 version: 0.63.0(zod@3.25.76) @@ -456,6 +459,11 @@ packages: '@angular/platform-server': optional: true + '@anthropic-ai/claude-code@1.0.128': + resolution: {integrity: sha512-uUg5cFMJfeQetQzFw76Vpbro6DAXst2Lpu8aoZWRFSoQVYu5ZSAnbBoxaWmW/IgnHSqIIvtMwzCoqmcA9j9rNQ==} + engines: {node: '>=18.0.0'} + hasBin: true + '@anthropic-ai/sdk@0.39.0': resolution: {integrity: sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg==} @@ -1000,6 +1008,73 @@ packages: '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/checkbox@4.2.2': resolution: {integrity: sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==} engines: {node: '>=18'} @@ -6817,6 +6892,15 @@ snapshots: optionalDependencies: '@angular/platform-server': 20.2.4(@angular/common@20.2.4(@angular/core@20.2.4(@angular/compiler@20.2.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.2.4)(@angular/core@20.2.4(@angular/compiler@20.2.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.2.4(@angular/common@20.2.4(@angular/core@20.2.4(@angular/compiler@20.2.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.2.4(@angular/compiler@20.2.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@anthropic-ai/claude-code@1.0.128': + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + '@anthropic-ai/sdk@0.39.0(encoding@0.1.13)': dependencies: '@types/node': 18.19.124 @@ -7606,6 +7690,49 @@ snapshots: '@iarna/toml@2.2.5': {} + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + '@inquirer/checkbox@4.2.2(@types/node@24.3.1)': dependencies: '@inquirer/core': 10.2.0(@types/node@24.3.1) diff --git a/runner/codegen/claude-code-runner.ts b/runner/codegen/claude-code-runner.ts new file mode 100644 index 0000000..b97a7b3 --- /dev/null +++ b/runner/codegen/claude-code-runner.ts @@ -0,0 +1,88 @@ +import {LlmGenerateFilesContext, LlmGenerateFilesRequestOptions, LlmRunner} from './llm-runner.js'; +import {join} from 'path'; +import {mkdirSync} from 'fs'; +import {writeFile} from 'fs/promises'; +import {BaseCliAgentRunner} from './base-cli-agent-runner.js'; + +const MODEL_MAPPING: Record = { + 'claude-4.0-sonnet': 'claude-sonnet-4-20250514', + 'claude-3.5-haiku': 'claude-3-5-haiku-latest', +}; + +/** Runner that generates code using the Claude Code. */ +export class ClaudeCodeRunner extends BaseCliAgentRunner implements LlmRunner { + readonly id = 'claude-code'; + readonly displayName = 'Claude Code'; + readonly hasBuiltInRepairLoop = true; + protected ignoredFilePatterns = ['**/CLAUDE.md', '**/.claude/**']; + protected binaryName = 'claude'; + protected override inactivityTimeoutMins = 10; + protected override totalRequestTimeoutMins = 10; + + getSupportedModels(): string[] { + return Object.keys(MODEL_MAPPING); + } + + protected getCommandLineFlags(options: LlmGenerateFilesRequestOptions): string[] { + return [ + '--print', + '--model', + MODEL_MAPPING[options.model], + // Skip all confirmations. + '--dangerously-skip-permissions', + '--permission-mode', + 'bypassPermissions', + '--verbose', + options.context.executablePrompt, + ]; + } + + protected async writeAgentFiles(options: LlmGenerateFilesRequestOptions): Promise { + const {context} = options; + const instructionFilePath = join(context.directory, 'CLAUDE.md'); + const settingsDir = join(context.directory, '.claude'); + + mkdirSync(settingsDir); + + await Promise.all([ + writeFile(join(settingsDir, 'settings.json'), this.getSettingsJsonFile(options.context)), + writeFile(instructionFilePath, super.getCommonInstructions(options)), + ]); + } + + private getSettingsJsonFile(context: LlmGenerateFilesContext): string { + const ignoredPatterns = super.getCommonIgnorePatterns(); + const deniedPermissions: string[] = [ + // Block some commands like `git` and `npm install` since they aren't relevant for the evals. + 'Bash(git:*)', + ...ignoredPatterns.directories.map(dir => `"Read(${join(dir, '**')})"`), + ...ignoredPatterns.files.map(file => `"Read(${file})"`), + ...context.possiblePackageManagers + .filter(manager => manager !== context.packageManager) + .map(manager => `Bash(${manager}:*)`), + + // Note that we don't block all commands, + // because the build commands also go through it. + `Bash(${context.packageManager} install:*)`, + `Bash(${context.packageManager} add:*)`, + `Bash(${context.packageManager} remove:*)`, + `Bash(${context.packageManager} update:*)`, + `Bash(${context.packageManager} list:*)`, + ]; + + return JSON.stringify( + { + permissions: { + deny: deniedPermissions, + }, + env: { + DISABLE_AUTOUPDATER: 1, + DISABLE_TELEMETRY: 1, + DISABLE_ERROR_REPORTING: 1, + }, + }, + undefined, + 2, + ); + } +} diff --git a/runner/codegen/runner-creation.ts b/runner/codegen/runner-creation.ts index 249fd8a..4ea677c 100644 --- a/runner/codegen/runner-creation.ts +++ b/runner/codegen/runner-creation.ts @@ -1,10 +1,12 @@ import {UserFacingError} from '../utils/errors.js'; import type {GeminiCliRunner} from './gemini-cli-runner.js'; +import type {ClaudeCodeRunner} from './claude-code-runner.js'; import type {GenkitRunner} from './genkit/genkit-runner.js'; interface AvailableRunners { genkit: GenkitRunner; 'gemini-cli': GeminiCliRunner; + 'claude-code': ClaudeCodeRunner; } /** Names of supported runners. */ @@ -25,6 +27,10 @@ export async function getRunnerByName(name: T): Promise new m.GeminiCliRunner() as AvailableRunners[T], ); + case 'claude-code': + return import('./claude-code-runner.js').then( + m => new m.ClaudeCodeRunner() as AvailableRunners[T], + ); default: throw new UserFacingError(`Unsupported runner ${name}`); } diff --git a/runner/eval-cli.ts b/runner/eval-cli.ts index 21259a2..6173b3a 100644 --- a/runner/eval-cli.ts +++ b/runner/eval-cli.ts @@ -57,7 +57,7 @@ function builder(argv: Argv): Argv { .option('runner', { type: 'string', default: 'genkit' as const, - choices: ['genkit', 'gemini-cli'] as RunnerName[], + choices: ['genkit', 'gemini-cli', 'claude-code'] as RunnerName[], description: 'Runner to use to execute the eval', }) .option('local', { From d57309b43ac17e4e5ee13e62926672a5c539172c Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 1 Oct 2025 12:49:12 +0200 Subject: [PATCH 7/8] fix: give more space for provider labels to fit on one line Reduces the font size of the provider labels so they don't wrap to the next line as often. --- report-app/src/app/pages/report-list/report-list.html | 9 ++++++--- .../src/app/pages/report-viewer/report-viewer.html | 2 +- report-app/src/app/shared/provider-label.ts | 8 ++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/report-app/src/app/pages/report-list/report-list.html b/report-app/src/app/pages/report-list/report-list.html index 8ff2bf6..fffac16 100644 --- a/report-app/src/app/pages/report-list/report-list.html +++ b/report-app/src/app/pages/report-list/report-list.html @@ -67,14 +67,17 @@
+ [label]="group.model" + size="small"/> + [label]="group.framework.fullStackFramework.displayName" + size="small"/> @if (group.runner) { + [label]="group.runner.displayName" + size="small"/> }
{{ result.score.totalPoints }} / {{ result.score.maxOverallPoints }} points ({{ totalPercent - }}) + }}%) diff --git a/report-app/src/app/shared/provider-label.ts b/report-app/src/app/shared/provider-label.ts index b2e9859..14872ee 100644 --- a/report-app/src/app/shared/provider-label.ts +++ b/report-app/src/app/shared/provider-label.ts @@ -17,6 +17,11 @@ const exactMatches: Record = { display: inline-flex; align-items: center; gap: 0.5rem; + font-size: 1rem; + } + + :host(.small) { + font-size: 0.75rem; } .logo { @@ -39,11 +44,14 @@ const exactMatches: Record = { `, host: { '[class]': 'id()', + '[class.small]': 'size() === "small"', }, }) export class ProviderLabel { readonly id = input(); readonly label = input.required(); + readonly size = input<'small' | 'medium'>('medium'); + protected logo = computed(() => { const id = this.id(); From 611a7b1cd22e9e4703b7426a36ac426d46777ce9 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 1 Oct 2025 16:20:10 +0200 Subject: [PATCH 8/8] build: switch Gemini CLI and Claude Code to optional dependencies --- package.json | 8 +- pnpm-lock.yaml | 364 +++++++++++++++++++++++++++++++++++++------------ 2 files changed, 280 insertions(+), 92 deletions(-) diff --git a/package.json b/package.json index de5f4b5..c9b2c66 100644 --- a/package.json +++ b/package.json @@ -51,13 +51,11 @@ "wcs": "./runner/bin/cli.js" }, "dependencies": { - "@anthropic-ai/claude-code": "^1.0.128", "@anthropic-ai/sdk": "^0.63.0", "@axe-core/puppeteer": "^4.10.2", "@genkit-ai/compat-oai": "^1.19.1", "@genkit-ai/googleai": "1.19.3", "@genkit-ai/mcp": "1.19.3", - "@google/gemini-cli": "^0.5.0", "@google/genai": "1.20.0", "@inquirer/prompts": "^7.8.4", "@safety-web/runner": "0.4.0-alpha.14", @@ -91,7 +89,13 @@ "zod": "^3.23.8", "zod-validation-error": "^4.0.1" }, + "optionalDependencies": { + "@anthropic-ai/claude-code": "^1.0.128", + "@google/gemini-cli": "^0.5.0" + }, "devDependencies": { + "@anthropic-ai/claude-code": "^1.0.128", + "@google/gemini-cli": "^0.5.0", "prettier": "^3.5.3", "tsx": "^4.20.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c4464e..c337438 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: dependencies: - '@anthropic-ai/claude-code': - specifier: ^1.0.128 - version: 1.0.128 '@anthropic-ai/sdk': specifier: ^0.63.0 version: 0.63.0(zod@3.25.76) @@ -26,9 +23,6 @@ importers: '@genkit-ai/mcp': specifier: 1.19.3 version: 1.19.3(@modelcontextprotocol/sdk@1.17.5)(genkit@1.19.1(@google-cloud/firestore@7.11.3(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))) - '@google/gemini-cli': - specifier: ^0.5.0 - version: 0.5.5(encoding@0.1.13) '@google/genai': specifier: 1.20.0 version: 1.20.0(@modelcontextprotocol/sdk@1.17.5)(encoding@0.1.13) @@ -129,6 +123,13 @@ importers: prettier: specifier: ^3.5.3 version: 3.6.2 + optionalDependencies: + '@anthropic-ai/claude-code': + specifier: ^1.0.128 + version: 1.0.128 + '@google/gemini-cli': + specifier: ^0.5.0 + version: 0.5.5(encoding@0.1.13) report-app: dependencies: @@ -6613,6 +6614,7 @@ snapshots: dependencies: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 + optional: true '@algolia/abtesting@1.1.0': dependencies: @@ -6900,6 +6902,7 @@ snapshots: '@img/sharp-linux-arm64': 0.33.5 '@img/sharp-linux-x64': 0.33.5 '@img/sharp-win32-x64': 0.33.5 + optional: true '@anthropic-ai/sdk@0.39.0(encoding@0.1.13)': dependencies: @@ -7600,6 +7603,7 @@ snapshots: - encoding - supports-color - utf-8-validate + optional: true '@google/gemini-cli@0.5.5(encoding@0.1.13)': dependencies: @@ -7638,6 +7642,7 @@ snapshots: - react-devtools-core - supports-color - utf-8-validate + optional: true '@google/genai@1.16.0(@modelcontextprotocol/sdk@1.17.5)(encoding@0.1.13)': dependencies: @@ -7650,6 +7655,7 @@ snapshots: - encoding - supports-color - utf-8-validate + optional: true '@google/genai@1.20.0(@modelcontextprotocol/sdk@1.17.5)(encoding@0.1.13)': dependencies: @@ -7688,7 +7694,8 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iarna/toml@2.2.5': {} + '@iarna/toml@2.2.5': + optional: true '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -7910,6 +7917,7 @@ snapshots: xdg-basedir: 5.1.0 transitivePeerDependencies: - supports-color + optional: true '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -7939,8 +7947,10 @@ snapshots: debug: 4.4.1 transitivePeerDependencies: - supports-color + optional: true - '@kwsites/promise-deferred@1.1.1': {} + '@kwsites/promise-deferred@1.1.1': + optional: true '@listr2/prompt-adapter-inquirer@3.0.1(@inquirer/prompts@7.8.2(@types/node@24.3.1))(@types/node@24.3.1)(listr2@9.0.1)': dependencies: @@ -7971,7 +7981,8 @@ snapshots: '@lmdb/lmdb-win32-x64@3.4.2': optional: true - '@lvce-editor/verror@1.7.0': {} + '@lvce-editor/verror@1.7.0': + optional: true '@lydell/node-pty-darwin-arm64@1.1.0': optional: true @@ -8206,6 +8217,7 @@ snapshots: '@opentelemetry/api-logs@0.203.0': dependencies: '@opentelemetry/api': 1.9.0 + optional: true '@opentelemetry/api-logs@0.52.1': dependencies: @@ -8275,6 +8287,7 @@ snapshots: '@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 + optional: true '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)': dependencies: @@ -8290,6 +8303,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.37.0 + optional: true '@opentelemetry/exporter-jaeger@1.30.1(@opentelemetry/api@1.9.0)': dependencies: @@ -8308,6 +8322,7 @@ snapshots: '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/exporter-logs-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -8317,6 +8332,7 @@ snapshots: '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/exporter-logs-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -8328,6 +8344,7 @@ snapshots: '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/exporter-metrics-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -8340,6 +8357,7 @@ snapshots: '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/exporter-metrics-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -8349,6 +8367,7 @@ snapshots: '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/exporter-metrics-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -8359,6 +8378,7 @@ snapshots: '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/exporter-prometheus@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -8366,6 +8386,7 @@ snapshots: '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/exporter-trace-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -8377,6 +8398,7 @@ snapshots: '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0)': dependencies: @@ -8396,6 +8418,7 @@ snapshots: '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/exporter-trace-otlp-http@0.52.1(@opentelemetry/api@1.9.0)': dependencies: @@ -8414,6 +8437,7 @@ snapshots: '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/exporter-trace-otlp-proto@0.52.1(@opentelemetry/api@1.9.0)': dependencies: @@ -8439,6 +8463,7 @@ snapshots: '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 + optional: true '@opentelemetry/instrumentation-amqplib@0.41.0(@opentelemetry/api@1.9.0)': dependencies: @@ -8602,6 +8627,7 @@ snapshots: forwarded-parse: 2.1.2 transitivePeerDependencies: - supports-color + optional: true '@opentelemetry/instrumentation-http@0.52.1(@opentelemetry/api@1.9.0)': dependencies: @@ -8834,6 +8860,7 @@ snapshots: require-in-the-middle: 7.5.2 transitivePeerDependencies: - supports-color + optional: true '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)': dependencies: @@ -8852,6 +8879,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/otlp-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': dependencies: @@ -8866,6 +8894,7 @@ snapshots: '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/otlp-grpc-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': dependencies: @@ -8885,6 +8914,7 @@ snapshots: '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) protobufjs: 7.5.4 + optional: true '@opentelemetry/otlp-transformer@0.52.1(@opentelemetry/api@1.9.0)': dependencies: @@ -8916,6 +8946,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/propagator-jaeger@1.25.1(@opentelemetry/api@1.9.0)': dependencies: @@ -8926,6 +8957,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/redis-common@0.36.2': optional: true @@ -8991,6 +9023,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 + optional: true '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -8998,6 +9031,7 @@ snapshots: '@opentelemetry/api-logs': 0.203.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.9.0)': dependencies: @@ -9018,6 +9052,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/sdk-node@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -9046,6 +9081,7 @@ snapshots: '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color + optional: true '@opentelemetry/sdk-node@0.52.1(@opentelemetry/api@1.9.0)': dependencies: @@ -9086,6 +9122,7 @@ snapshots: '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 + optional: true '@opentelemetry/sdk-trace-node@1.25.1(@opentelemetry/api@1.9.0)': dependencies: @@ -9103,12 +9140,14 @@ snapshots: '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/semantic-conventions@1.25.1': {} '@opentelemetry/semantic-conventions@1.28.0': {} - '@opentelemetry/semantic-conventions@1.37.0': {} + '@opentelemetry/semantic-conventions@1.37.0': + optional: true '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': dependencies: @@ -9184,17 +9223,20 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pnpm/config.env-replace@1.1.0': {} + '@pnpm/config.env-replace@1.1.0': + optional: true '@pnpm/network.ca-file@1.0.2': dependencies: graceful-fs: 4.2.10 + optional: true '@pnpm/npm-conf@2.3.1': dependencies: '@pnpm/config.env-replace': 1.1.0 '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + optional: true '@protobuf-ts/plugin@2.11.1': dependencies: @@ -9417,12 +9459,14 @@ snapshots: transitivePeerDependencies: - chokidar - '@sec-ant/readable-stream@0.4.1': {} + '@sec-ant/readable-stream@0.4.1': + optional: true '@selderee/plugin-htmlparser2@0.11.0': dependencies: domhandler: 5.0.3 selderee: 0.11.0 + optional: true '@shikijs/core@3.12.2': dependencies: @@ -9502,15 +9546,18 @@ snapshots: '@sigstore/core': 2.0.0 '@sigstore/protobuf-specs': 0.4.3 - '@sindresorhus/is@7.1.0': {} + '@sindresorhus/is@7.1.0': + optional: true - '@sindresorhus/merge-streams@4.0.0': {} + '@sindresorhus/merge-streams@4.0.0': + optional: true '@socket.io/component-emitter@3.1.2': {} '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 + optional: true '@tokenizer/inflate@0.2.7': dependencies: @@ -9563,7 +9610,8 @@ snapshots: dependencies: '@types/node': 24.3.1 - '@types/configstore@6.0.2': {} + '@types/configstore@6.0.2': + optional: true '@types/connect@3.4.36': dependencies: @@ -9598,12 +9646,14 @@ snapshots: dependencies: '@types/minimatch': 5.1.2 '@types/node': 24.3.1 + optional: true '@types/google.visualization@0.0.74': {} '@types/gradient-string@1.1.6': dependencies: '@types/tinycolor2': 1.4.6 + optional: true '@types/handlebars@4.1.0': dependencies: @@ -9613,9 +9663,11 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/html-to-text@9.0.4': {} + '@types/html-to-text@9.0.4': + optional: true - '@types/http-cache-semantics@4.0.4': {} + '@types/http-cache-semantics@4.0.4': + optional: true '@types/http-errors@2.0.5': {} @@ -9643,7 +9695,8 @@ snapshots: '@types/mime@1.3.5': {} - '@types/minimatch@5.1.2': {} + '@types/minimatch@5.1.2': + optional: true '@types/ms@2.1.0': optional: true @@ -9675,7 +9728,8 @@ snapshots: dependencies: undici-types: 7.10.0 - '@types/normalize-package-data@2.4.4': {} + '@types/normalize-package-data@2.4.4': + optional: true '@types/pg-pool@2.0.4': dependencies: @@ -9719,7 +9773,8 @@ snapshots: '@types/node': 24.3.1 optional: true - '@types/tinycolor2@1.4.6': {} + '@types/tinycolor2@1.4.6': + optional: true '@types/tough-cookie@4.0.5': optional: true @@ -9732,6 +9787,7 @@ snapshots: dependencies: '@types/configstore': 6.0.2 boxen: 7.1.1 + optional: true '@types/yargs-parser@21.0.3': {} @@ -9850,7 +9906,8 @@ snapshots: dependencies: vite: 7.1.2(@types/node@24.3.1)(sass@1.90.0)(tsx@4.20.5)(yaml@2.8.1) - '@xterm/headless@5.5.0': {} + '@xterm/headless@5.5.0': + optional: true '@yarnpkg/lockfile@1.1.0': {} @@ -9991,8 +10048,10 @@ snapshots: dependencies: stubborn-fs: 1.2.5 when-exit: 2.1.4 + optional: true - auto-bind@5.0.1: {} + auto-bind@5.0.1: + optional: true axe-core@4.10.3: {} @@ -10091,6 +10150,7 @@ snapshots: type-fest: 2.19.0 widest-line: 4.0.1 wrap-ansi: 8.1.0 + optional: true boxen@8.0.1: dependencies: @@ -10139,6 +10199,7 @@ snapshots: bundle-name@4.1.0: dependencies: run-applescript: 7.0.0 + optional: true bytes@3.1.2: {} @@ -10157,7 +10218,8 @@ snapshots: tar: 7.4.3 unique-filename: 4.0.0 - cacheable-lookup@7.0.0: {} + cacheable-lookup@7.0.0: + optional: true cacheable-request@12.0.1: dependencies: @@ -10168,6 +10230,7 @@ snapshots: mimic-response: 4.0.0 normalize-url: 8.1.0 responselike: 3.0.0 + optional: true cacheable@1.10.4: dependencies: @@ -10186,7 +10249,8 @@ snapshots: callsites@3.1.0: {} - camelcase@7.0.1: {} + camelcase@7.0.1: + optional: true camelcase@8.0.0: {} @@ -10263,6 +10327,7 @@ snapshots: cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 + optional: true cli-cursor@5.0.0: dependencies: @@ -10302,6 +10367,7 @@ snapshots: code-excerpt@4.0.0: dependencies: convert-to-spaces: 2.0.1 + optional: true color-convert@1.9.3: dependencies: @@ -10340,7 +10406,8 @@ snapshots: comma-separated-tokens@2.0.3: {} - command-exists@1.2.9: {} + command-exists@1.2.9: + optional: true concat-map@0.0.1: {} @@ -10348,6 +10415,7 @@ snapshots: dependencies: ini: 1.3.8 proto-list: 1.2.4 + optional: true configstore@7.0.0: dependencies: @@ -10355,6 +10423,7 @@ snapshots: dot-prop: 9.0.0 graceful-fs: 4.2.11 xdg-basedir: 5.1.0 + optional: true connect@3.7.0: dependencies: @@ -10379,7 +10448,8 @@ snapshots: convert-source-map@2.0.0: {} - convert-to-spaces@2.0.1: {} + convert-to-spaces@2.0.1: + optional: true cookie-signature@1.0.6: {} @@ -10463,23 +10533,30 @@ snapshots: decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 + optional: true - deep-extend@0.6.0: {} + deep-extend@0.6.0: + optional: true deep-is@0.1.4: {} - deepmerge@4.3.1: {} + deepmerge@4.3.1: + optional: true - default-browser-id@5.0.0: {} + default-browser-id@5.0.0: + optional: true default-browser@5.2.1: dependencies: bundle-name: 4.1.0 default-browser-id: 5.0.0 + optional: true - defer-to-connect@2.0.1: {} + defer-to-connect@2.0.1: + optional: true - define-lazy-prop@3.0.0: {} + define-lazy-prop@3.0.0: + optional: true degenerator@5.0.1: dependencies: @@ -10509,7 +10586,8 @@ snapshots: di@0.0.1: {} - diff@7.0.0: {} + diff@7.0.0: + optional: true dir-glob@3.0.1: dependencies: @@ -10548,8 +10626,10 @@ snapshots: dot-prop@9.0.0: dependencies: type-fest: 4.41.0 + optional: true - dotenv@17.2.2: {} + dotenv@17.2.2: + optional: true dotprompt@1.1.1: dependencies: @@ -10666,7 +10746,8 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-toolkit@1.39.10: {} + es-toolkit@1.39.10: + optional: true esbuild@0.25.9: optionalDependencies: @@ -10699,11 +10780,13 @@ snapshots: escalade@3.2.0: {} - escape-goat@4.0.0: {} + escape-goat@4.0.0: + optional: true escape-html@1.0.3: {} - escape-string-regexp@2.0.0: {} + escape-string-regexp@2.0.0: + optional: true escape-string-regexp@4.0.0: {} @@ -10817,6 +10900,7 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 4.0.0 yoctocolors: 2.1.2 + optional: true exponential-backoff@3.1.2: {} @@ -10961,6 +11045,7 @@ snapshots: figures@6.1.0: dependencies: is-unicode-supported: 2.1.0 + optional: true file-entry-cache@10.1.4: dependencies: @@ -11018,7 +11103,8 @@ snapshots: transitivePeerDependencies: - supports-color - find-up-simple@1.0.1: {} + find-up-simple@1.0.1: + optional: true find-up@5.0.0: dependencies: @@ -11070,7 +11156,8 @@ snapshots: form-data-encoder@1.7.2: {} - form-data-encoder@4.1.0: {} + form-data-encoder@4.1.0: + optional: true form-data@2.5.5: dependencies: @@ -11099,7 +11186,8 @@ snapshots: dependencies: fetch-blob: 3.2.0 - forwarded-parse@2.1.2: {} + forwarded-parse@2.1.2: + optional: true forwarded@0.2.0: {} @@ -11112,6 +11200,7 @@ snapshots: graceful-fs: 4.2.11 jsonfile: 6.2.0 universalify: 2.0.1 + optional: true fs-extra@8.1.0: dependencies: @@ -11137,7 +11226,8 @@ snapshots: functional-red-black-tree@1.0.1: optional: true - fzf@0.5.2: {} + fzf@0.5.2: + optional: true gaxios@6.7.1(encoding@0.1.13): dependencies: @@ -11212,6 +11302,7 @@ snapshots: dependencies: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 + optional: true get-tsconfig@4.10.1: dependencies: @@ -11265,6 +11356,7 @@ snapshots: global-directory@4.0.1: dependencies: ini: 4.1.1 + optional: true global-modules@2.0.0: dependencies: @@ -11359,8 +11451,10 @@ snapshots: p-cancelable: 4.0.1 responselike: 3.0.0 type-fest: 4.41.0 + optional: true - graceful-fs@4.2.10: {} + graceful-fs@4.2.10: + optional: true graceful-fs@4.2.11: {} @@ -11368,6 +11462,7 @@ snapshots: dependencies: chalk: 4.1.2 tinygradient: 1.1.5 + optional: true graphemer@1.4.0: {} @@ -11425,13 +11520,15 @@ snapshots: process: 0.10.1 xtend: 4.0.2 - highlight.js@11.11.1: {} + highlight.js@11.11.1: + optional: true hookified@1.12.0: {} hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 + optional: true hosted-git-info@8.1.0: dependencies: @@ -11455,6 +11552,7 @@ snapshots: dom-serializer: 2.0.0 htmlparser2: 8.0.2 selderee: 0.11.0 + optional: true html-void-elements@3.0.0: {} @@ -11471,6 +11569,7 @@ snapshots: domhandler: 5.0.3 domutils: 3.2.2 entities: 4.5.0 + optional: true http-cache-semantics@4.2.0: {} @@ -11513,6 +11612,7 @@ snapshots: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + optional: true https-proxy-agent@5.0.1: dependencies: @@ -11529,7 +11629,8 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@8.0.1: {} + human-signals@8.0.1: + optional: true humanize-ms@1.2.1: dependencies: @@ -11575,9 +11676,11 @@ snapshots: imurmurhash@0.1.4: {} - indent-string@5.0.0: {} + indent-string@5.0.0: + optional: true - index-to-position@1.1.0: {} + index-to-position@1.1.0: + optional: true inflight@1.0.6: dependencies: @@ -11588,7 +11691,8 @@ snapshots: ini@1.3.8: {} - ini@4.1.1: {} + ini@4.1.1: + optional: true ini@5.0.0: {} @@ -11599,12 +11703,14 @@ snapshots: ink: 6.3.0(react@19.1.1) prop-types: 15.8.1 strip-ansi: 7.1.2 + optional: true ink-spinner@5.0.0(ink@6.3.0(react@19.1.1))(react@19.1.1): dependencies: cli-spinners: 2.9.2 ink: 6.3.0(react@19.1.1) react: 19.1.1 + optional: true ink@6.3.0(react@19.1.1): dependencies: @@ -11635,6 +11741,7 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + optional: true ip-address@10.0.1: {} @@ -11652,7 +11759,8 @@ snapshots: dependencies: hasown: 2.0.2 - is-docker@3.0.0: {} + is-docker@3.0.0: + optional: true is-extglob@2.1.1: {} @@ -11668,31 +11776,38 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-in-ci@1.0.0: {} + is-in-ci@1.0.0: + optional: true - is-in-ci@2.0.0: {} + is-in-ci@2.0.0: + optional: true is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 + optional: true is-installed-globally@1.0.0: dependencies: global-directory: 4.0.1 is-path-inside: 4.0.0 + optional: true is-interactive@2.0.0: {} - is-npm@6.0.0: {} + is-npm@6.0.0: + optional: true is-number@7.0.0: {} is-obj@2.0.0: optional: true - is-path-inside@4.0.0: {} + is-path-inside@4.0.0: + optional: true - is-plain-obj@4.1.0: {} + is-plain-obj@4.1.0: + optional: true is-plain-object@5.0.0: {} @@ -11707,7 +11822,8 @@ snapshots: is-stream@2.0.1: {} - is-stream@4.0.1: {} + is-stream@4.0.1: + optional: true is-unicode-supported@1.3.0: {} @@ -11716,6 +11832,7 @@ snapshots: is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 + optional: true isarray@1.0.0: {} @@ -11835,6 +11952,7 @@ snapshots: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 + optional: true jsonparse@1.3.1: {} @@ -11969,13 +12087,16 @@ snapshots: kuler@2.0.0: {} - ky@1.10.0: {} + ky@1.10.0: + optional: true latest-version@9.0.0: dependencies: package-json: 10.0.1 + optional: true - leac@0.6.0: {} + leac@0.6.0: + optional: true levn@0.4.1: dependencies: @@ -12097,14 +12218,17 @@ snapshots: loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 + optional: true - lowercase-keys@3.0.0: {} + lowercase-keys@3.0.0: + optional: true lowlight@3.3.0: dependencies: '@types/hast': 3.0.4 devlop: 1.1.0 highlight.js: 11.11.1 + optional: true lru-cache@10.4.3: {} @@ -12151,7 +12275,8 @@ snapshots: transitivePeerDependencies: - supports-color - marked@15.0.12: {} + marked@15.0.12: + optional: true marked@16.2.1: {} @@ -12230,15 +12355,19 @@ snapshots: mime@3.0.0: optional: true - mime@4.0.7: {} + mime@4.0.7: + optional: true - mimic-fn@2.1.0: {} + mimic-fn@2.1.0: + optional: true mimic-function@5.0.1: {} - mimic-response@3.1.0: {} + mimic-response@3.1.0: + optional: true - mimic-response@4.0.0: {} + mimic-response@4.0.0: + optional: true minimatch@10.0.3: dependencies: @@ -12308,6 +12437,7 @@ snapshots: mnemonist@0.40.3: dependencies: obliterator: 2.0.5 + optional: true module-details-from-path@1.0.4: {} @@ -12416,10 +12546,12 @@ snapshots: hosted-git-info: 7.0.2 semver: 7.7.2 validate-npm-package-license: 3.0.4 + optional: true normalize-path@3.0.0: {} - normalize-url@8.1.0: {} + normalize-url@8.1.0: + optional: true npm-bundled@4.0.0: dependencies: @@ -12473,6 +12605,7 @@ snapshots: dependencies: path-key: 4.0.0 unicorn-magic: 0.3.0 + optional: true nth-check@2.1.1: dependencies: @@ -12485,7 +12618,8 @@ snapshots: object-inspect@1.13.4: {} - obliterator@2.0.5: {} + obliterator@2.0.5: + optional: true on-finished@2.3.0: dependencies: @@ -12506,6 +12640,7 @@ snapshots: onetime@5.1.2: dependencies: mimic-fn: 2.1.0 + optional: true onetime@7.0.0: dependencies: @@ -12525,6 +12660,7 @@ snapshots: define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 wsl-utils: 0.1.0 + optional: true openai@4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.76): dependencies: @@ -12567,7 +12703,8 @@ snapshots: ordered-binary@1.6.0: optional: true - p-cancelable@4.0.1: {} + p-cancelable@4.0.1: + optional: true p-limit@3.1.0: dependencies: @@ -12612,6 +12749,7 @@ snapshots: registry-auth-token: 5.1.0 registry-url: 6.0.1 semver: 7.7.2 + optional: true pacote@21.0.0: dependencies: @@ -12653,8 +12791,10 @@ snapshots: '@babel/code-frame': 7.27.1 index-to-position: 1.1.0 type-fest: 4.41.0 + optional: true - parse-ms@4.0.0: {} + parse-ms@4.0.0: + optional: true parse5-html-rewriting-stream@8.0.0: dependencies: @@ -12687,22 +12827,26 @@ snapshots: dependencies: leac: 0.6.0 peberminta: 0.9.0 + optional: true parseurl@1.3.3: {} partial-json@0.1.7: {} - patch-console@2.0.0: {} + patch-console@2.0.0: + optional: true path-exists@4.0.0: {} - path-exists@5.0.0: {} + path-exists@5.0.0: + optional: true path-is-absolute@1.0.1: {} path-key@3.1.1: {} - path-key@4.0.0: {} + path-key@4.0.0: + optional: true path-parse@1.0.7: {} @@ -12722,7 +12866,8 @@ snapshots: path-type@4.0.0: {} - peberminta@0.9.0: {} + peberminta@0.9.0: + optional: true pend@1.2.0: {} @@ -12799,6 +12944,7 @@ snapshots: pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 + optional: true proc-log@5.0.0: {} @@ -12818,10 +12964,12 @@ snapshots: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 + optional: true property-information@7.1.0: {} - proto-list@1.2.4: {} + proto-list@1.2.4: + optional: true proto3-json-serializer@2.0.2: dependencies: @@ -12882,6 +13030,7 @@ snapshots: pupa@3.1.0: dependencies: escape-goat: 4.0.0 + optional: true puppeteer-core@24.19.0: dependencies: @@ -12926,7 +13075,8 @@ snapshots: queue-microtask@1.2.3: {} - quick-lru@5.1.1: {} + quick-lru@5.1.1: + optional: true range-parser@1.2.1: {} @@ -12950,21 +13100,26 @@ snapshots: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 + optional: true - react-is@16.13.1: {} + react-is@16.13.1: + optional: true react-reconciler@0.32.0(react@19.1.1): dependencies: react: 19.1.1 scheduler: 0.26.0 + optional: true - react@19.1.1: {} + react@19.1.1: + optional: true read-package-up@11.0.0: dependencies: find-up-simple: 1.0.1 read-pkg: 9.0.1 type-fest: 4.41.0 + optional: true read-pkg@9.0.1: dependencies: @@ -12973,6 +13128,7 @@ snapshots: parse-json: 8.3.0 type-fest: 4.41.0 unicorn-magic: 0.1.0 + optional: true readable-stream@2.3.8: dependencies: @@ -13011,10 +13167,12 @@ snapshots: registry-auth-token@5.1.0: dependencies: '@pnpm/npm-conf': 2.3.1 + optional: true registry-url@6.0.1: dependencies: rc: 1.2.8 + optional: true require-directory@2.1.1: {} @@ -13030,7 +13188,8 @@ snapshots: requires-port@1.0.0: {} - resolve-alpn@1.2.1: {} + resolve-alpn@1.2.1: + optional: true resolve-from@4.0.0: {} @@ -13047,11 +13206,13 @@ snapshots: responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 + optional: true restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 + optional: true restore-cursor@5.1.0: dependencies: @@ -13140,7 +13301,8 @@ snapshots: transitivePeerDependencies: - supports-color - run-applescript@7.0.0: {} + run-applescript@7.0.0: + optional: true run-parallel@1.2.0: dependencies: @@ -13180,11 +13342,13 @@ snapshots: optionalDependencies: '@parcel/watcher': 2.5.1 - scheduler@0.26.0: {} + scheduler@0.26.0: + optional: true selderee@0.11.0: dependencies: parseley: 0.12.1 + optional: true semver@6.3.1: {} @@ -13252,7 +13416,8 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.3: {} + shell-quote@1.8.3: + optional: true shiki@3.12.2: dependencies: @@ -13295,7 +13460,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - signal-exit@3.0.7: {} + signal-exit@3.0.7: + optional: true signal-exit@4.1.0: {} @@ -13317,6 +13483,7 @@ snapshots: debug: 4.4.1 transitivePeerDependencies: - supports-color + optional: true simple-swizzle@0.2.2: dependencies: @@ -13421,6 +13588,7 @@ snapshots: stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 + optional: true statuses@1.5.0: {} @@ -13499,9 +13667,11 @@ snapshots: dependencies: ansi-regex: 6.2.2 - strip-final-newline@4.0.0: {} + strip-final-newline@4.0.0: + optional: true - strip-json-comments@2.0.1: {} + strip-json-comments@2.0.1: + optional: true strip-json-comments@3.1.1: {} @@ -13512,7 +13682,8 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 - stubborn-fs@1.2.5: {} + stubborn-fs@1.2.5: + optional: true stubs@3.0.0: optional: true @@ -13668,7 +13839,8 @@ snapshots: tiktoken@1.0.22: {} - tinycolor2@1.6.0: {} + tinycolor2@1.6.0: + optional: true tinyglobby@0.2.14: dependencies: @@ -13684,6 +13856,7 @@ snapshots: dependencies: '@types/tinycolor2': 1.4.6 tinycolor2: 1.6.0 + optional: true tmp@0.2.5: {} @@ -13743,7 +13916,8 @@ snapshots: type-fest@0.21.3: {} - type-fest@2.19.0: {} + type-fest@2.19.0: + optional: true type-fest@4.41.0: {} @@ -13794,9 +13968,11 @@ snapshots: undici@7.15.0: {} - unicorn-magic@0.1.0: {} + unicorn-magic@0.1.0: + optional: true - unicorn-magic@0.3.0: {} + unicorn-magic@0.3.0: + optional: true unique-filename@4.0.0: dependencies: @@ -13831,7 +14007,8 @@ snapshots: universalify@0.1.2: {} - universalify@2.0.1: {} + universalify@2.0.1: + optional: true unpipe@1.0.0: {} @@ -13853,6 +14030,7 @@ snapshots: pupa: 3.1.0 semver: 7.7.2 xdg-basedir: 5.1.0 + optional: true uri-js@4.4.1: dependencies: @@ -13947,7 +14125,8 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - when-exit@2.1.4: {} + when-exit@2.1.4: + optional: true which@1.3.1: dependencies: @@ -13964,6 +14143,7 @@ snapshots: widest-line@4.0.1: dependencies: string-width: 5.1.2 + optional: true widest-line@5.0.0: dependencies: @@ -14031,8 +14211,10 @@ snapshots: wsl-utils@0.1.0: dependencies: is-wsl: 3.1.0 + optional: true - xdg-basedir@5.1.0: {} + xdg-basedir@5.1.0: + optional: true xhr2@0.2.1: {} @@ -14094,9 +14276,11 @@ snapshots: yoctocolors-cjs@2.1.3: {} - yoctocolors@2.1.2: {} + yoctocolors@2.1.2: + optional: true - yoga-layout@3.2.1: {} + yoga-layout@3.2.1: + optional: true zod-to-json-schema@3.24.6(zod@3.25.76): dependencies: