@jmoak/vibrissa 0.1.0 → 2.0.0-alpha.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/LICENSE +21 -21
- package/README.md +268 -254
- package/bin/vib-test.js +1 -1
- package/dist/chunk-7GFB72TI.js +10706 -0
- package/dist/chunk-7GFB72TI.js.map +1 -0
- package/dist/chunk-TFXZJODE.js +2329 -0
- package/dist/chunk-TFXZJODE.js.map +1 -0
- package/dist/cli.d.ts +57 -0
- package/dist/cli.js +5896 -613
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +837 -58
- package/dist/index.js +211 -10
- package/dist/index.js.map +1 -1
- package/dist/runner-J_V7pgax.d.ts +1194 -0
- package/dist/vitest.d.ts +44 -0
- package/dist/vitest.js +240 -0
- package/dist/vitest.js.map +1 -0
- package/package.json +27 -9
- package/schema/case.schema.json +405 -14
- package/schema/vibrissa.schema.json +528 -12
- package/dist/chunk-FTVETYUK.js +0 -656
- package/dist/chunk-FTVETYUK.js.map +0 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/args.ts","../src/cli/format.ts","../src/cli/resolve.ts","../src/config.ts","../src/cli/call.ts","../src/cli/init.ts","../src/cli/inspect.ts","../src/cli/record.ts","../src/cli/run.ts","../src/cli/tools.ts","../src/cli.ts"],"sourcesContent":["import path from 'node:path'\nimport type { JsonValue } from '../types.js'\n\nexport function takeFlag(argv: string[], name: string): string | undefined {\n const index = argv.indexOf(name)\n if (index === -1) return undefined\n return argv[index + 1]\n}\n\nexport function hasFlag(argv: string[], name: string): boolean {\n return argv.includes(name)\n}\n\nexport function takeAllFlags(argv: string[], name: string): string[] {\n const values: string[] = []\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === name && argv[i + 1] !== undefined) {\n values.push(argv[i + 1])\n i++\n }\n }\n return values\n}\n\nexport function splitCommandLine(input: string): { cmd: string; args: string[] } {\n const tokens: string[] = []\n let current = ''\n let quote: '\"' | \"'\" | null = null\n for (let i = 0; i < input.length; i++) {\n const ch = input[i]\n if (quote) {\n if (ch === quote) quote = null\n else current += ch\n continue\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch\n continue\n }\n if (/\\s/.test(ch)) {\n if (current) {\n tokens.push(current)\n current = ''\n }\n continue\n }\n current += ch\n }\n if (current) tokens.push(current)\n if (tokens.length === 0) throw new Error('Empty --server command')\n return { cmd: tokens[0], args: tokens.slice(1) }\n}\n\nexport function parseEnvPairs(pairs: string[]): Record<string, string> {\n const env: Record<string, string> = {}\n for (const pair of pairs) {\n const eq = pair.indexOf('=')\n if (eq <= 0) throw new Error(`Invalid --env value \"${pair}\" (expected KEY=VALUE)`)\n env[pair.slice(0, eq)] = pair.slice(eq + 1)\n }\n return env\n}\n\nexport function parseArgValue(raw: string): JsonValue {\n if (raw === 'true') return true\n if (raw === 'false') return false\n if (raw === 'null') return null\n if (/^-?\\d+(\\.\\d+)?$/.test(raw)) return Number(raw)\n if (\n (raw.startsWith('{') && raw.endsWith('}')) ||\n (raw.startsWith('[') && raw.endsWith(']')) ||\n (raw.startsWith('\"') && raw.endsWith('\"'))\n ) {\n try {\n return JSON.parse(raw) as JsonValue\n } catch {\n return raw\n }\n }\n return raw\n}\n\nexport function parseToolArgs(argv: string[]): Record<string, JsonValue> {\n const json = takeFlag(argv, '--args')\n const pairs = takeAllFlags(argv, '--arg')\n let args: Record<string, JsonValue> = {}\n if (json !== undefined) {\n let parsed: unknown\n try {\n parsed = JSON.parse(json)\n } catch (err) {\n throw new Error(`Invalid --args JSON: ${err instanceof Error ? err.message : String(err)}`)\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error('--args must be a JSON object')\n }\n args = { ...(parsed as Record<string, JsonValue>) }\n }\n for (const pair of pairs) {\n const eq = pair.indexOf('=')\n if (eq <= 0) throw new Error(`Invalid --arg value \"${pair}\" (expected key=value)`)\n args[pair.slice(0, eq)] = parseArgValue(pair.slice(eq + 1))\n }\n return args\n}\n\nexport function resolvePathFromCwd(value: string): string {\n return path.isAbsolute(value) ? value : path.resolve(process.cwd(), value)\n}\n\nexport function printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2))\n}\n","import type { ToolSummary } from '../mcp-session.js'\n\nconst RESET = '\\x1b[0m'\nconst BOLD = '\\x1b[1m'\nconst DIM = '\\x1b[2m'\nconst FG_CYAN = '\\x1b[36m'\nconst FG_GRAY = '\\x1b[90m'\nconst FG_GREEN = '\\x1b[32m'\nconst FG_RED = '\\x1b[31m'\nconst FG_YELLOW = '\\x1b[33m'\n\nfunction color(text: string, code: string): string {\n return `${code}${text}${RESET}`\n}\n\nexport function formatToolList(tools: ToolSummary[]): string {\n if (tools.length === 0) return 'No tools registered on this server.'\n const lines: string[] = [\n color(`${tools.length} tool${tools.length === 1 ? '' : 's'}`, BOLD + FG_CYAN),\n '',\n ]\n for (const tool of tools) {\n lines.push(`${color('▸', FG_GREEN)} ${color(tool.name, BOLD + FG_CYAN)}`)\n if (tool.description) lines.push(` ${color(tool.description, FG_GRAY)}`)\n const schema = tool.inputSchema\n if (schema && typeof schema === 'object' && !Array.isArray(schema)) {\n const props =\n typeof schema.properties === 'object' && schema.properties !== null\n ? Object.keys(schema.properties as Record<string, unknown>)\n : []\n const required = Array.isArray(schema.required)\n ? (schema.required as unknown[]).filter((v): v is string => typeof v === 'string')\n : []\n if (props.length > 0) {\n const rendered = props\n .map((name) => (required.includes(name) ? `${name}*` : name))\n .join(', ')\n lines.push(` ${color(`args: ${rendered}`, DIM)}`)\n }\n }\n lines.push('')\n }\n return lines.join('\\n').trimEnd()\n}\n\nexport function formatCallHeader(tool: string, args: unknown): string {\n return `${color('call', FG_CYAN)} ${color(tool, BOLD)} ${color(JSON.stringify(args), FG_GRAY)}`\n}\n\nexport function formatSuccessBanner(text: string): string {\n return color(text, FG_GREEN)\n}\n\nexport function formatErrorBanner(text: string): string {\n return color(text, FG_RED)\n}\n\nexport function formatWarnBanner(text: string): string {\n return color(text, FG_YELLOW)\n}\n","import path from 'node:path'\nimport { resolveOptions } from '../config.js'\nimport { resolveRootDir, resolveServerConfig } from '../paths.js'\nimport type { RunCasesOptions, ServerConfig } from '../types.js'\nimport {\n hasFlag,\n parseEnvPairs,\n resolvePathFromCwd,\n splitCommandLine,\n takeAllFlags,\n takeFlag,\n} from './args.js'\n\nexport interface CommonCliFlags {\n configPath?: string\n serverCmd?: string\n serverArgs?: string[]\n serverCwd?: string\n env?: Record<string, string>\n timeoutMs?: number\n json?: boolean\n}\n\nexport function parseCommonFlags(argv: string[]): CommonCliFlags {\n const configPath = takeFlag(argv, '--config')\n const serverRaw = takeFlag(argv, '--server')\n const serverCwd = takeFlag(argv, '--server-cwd')\n const timeoutRaw = takeFlag(argv, '--timeout')\n const env = parseEnvPairs(takeAllFlags(argv, '--env'))\n\n let serverCmd: string | undefined\n let serverArgs: string[] | undefined\n if (serverRaw !== undefined) {\n const split = splitCommandLine(serverRaw)\n serverCmd = split.cmd\n serverArgs = split.args\n }\n\n return {\n configPath,\n serverCmd,\n serverArgs,\n serverCwd,\n env: Object.keys(env).length > 0 ? env : undefined,\n timeoutMs:\n timeoutRaw !== undefined && Number.isFinite(Number(timeoutRaw))\n ? Number(timeoutRaw)\n : undefined,\n json: hasFlag(argv, '--json'),\n }\n}\n\nexport function mergeCliOptions(\n flags: CommonCliFlags,\n overrides: Partial<RunCasesOptions> = {},\n): RunCasesOptions {\n const resolved = resolveOptions(process.cwd(), flags.configPath)\n const serverCwd = flags.serverCwd\n ? path.isAbsolute(flags.serverCwd)\n ? flags.serverCwd\n : resolvePathFromCwd(flags.serverCwd)\n : undefined\n\n return {\n ...resolved,\n ...overrides,\n server: {\n ...resolved.server,\n ...(overrides.server ?? {}),\n ...(flags.serverCmd ? { cmd: flags.serverCmd } : {}),\n ...(flags.serverArgs ? { args: flags.serverArgs } : {}),\n ...(serverCwd ? { cwd: serverCwd } : {}),\n env: {\n ...(resolved.server.env ?? {}),\n ...(overrides.server?.env ?? {}),\n ...(flags.env ?? {}),\n },\n },\n ...(typeof flags.timeoutMs === 'number' ? { timeoutMs: flags.timeoutMs } : {}),\n }\n}\n\nexport function openSessionOptions(flags: CommonCliFlags): {\n options: RunCasesOptions\n server: ServerConfig\n rootDir: string\n timeoutMs: number\n} {\n const options = mergeCliOptions(flags)\n return {\n options,\n server: resolveServerConfig(options),\n rootDir: resolveRootDir(options),\n timeoutMs: options.timeoutMs,\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { defaultRunCasesOptions } from './defaults.js'\nimport type { RunCasesOptions } from './types.js'\n\nexport function stripJsonComments(input: string): string {\n let result = ''\n let inString = false\n let stringQuote: string | null = null\n let escaped = false\n let inBlockComment = false\n let inLineComment = false\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i]\n const next = i + 1 < input.length ? input[i + 1] : ''\n\n if (inLineComment) {\n if (char === '\\n') {\n inLineComment = false\n result += char\n }\n continue\n }\n\n if (inBlockComment) {\n if (char === '*' && next === '/') {\n inBlockComment = false\n i++\n }\n continue\n }\n\n if (!inString && char === '/' && next === '*') {\n inBlockComment = true\n i++\n continue\n }\n if (!inString && char === '/' && next === '/') {\n inLineComment = true\n i++\n continue\n }\n\n if (inString) {\n result += char\n if (!escaped && char === stringQuote) {\n inString = false\n stringQuote = null\n }\n escaped = !escaped && char === '\\\\'\n continue\n }\n\n if (char === '\"' || char === \"'\" || char === '`') {\n inString = true\n stringQuote = char\n result += char\n escaped = false\n continue\n }\n\n result += char\n }\n\n return result\n}\n\nexport function loadConfigObjectFromPath(configPath: string): Partial<RunCasesOptions> {\n const raw = fs.readFileSync(configPath, 'utf8')\n const json = JSON.parse(stripJsonComments(raw))\n return json as Partial<RunCasesOptions>\n}\n\nexport interface LoadedConfig {\n config: Partial<RunCasesOptions>\n rootDir: string\n configPath?: string\n}\n\nexport function loadConfigFile(cwd: string, explicitPath?: string): LoadedConfig | undefined {\n if (explicitPath) {\n const abs = path.isAbsolute(explicitPath) ? explicitPath : path.join(cwd, explicitPath)\n if (!fs.existsSync(abs)) throw new Error(`Config not found: ${abs}`)\n return {\n config: loadConfigObjectFromPath(abs),\n rootDir: path.dirname(abs),\n configPath: abs,\n }\n }\n\n const candidates = ['vibrissa.json', 'vibrissa.jsonc']\n for (const name of candidates) {\n const file = path.join(cwd, name)\n if (fs.existsSync(file)) {\n return {\n config: loadConfigObjectFromPath(file),\n rootDir: path.dirname(file),\n configPath: file,\n }\n }\n }\n\n const pkgPath = path.join(cwd, 'package.json')\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'))\n if (pkg?.vibrissa && typeof pkg.vibrissa === 'object') {\n return {\n config: pkg.vibrissa as Partial<RunCasesOptions>,\n rootDir: path.dirname(pkgPath),\n configPath: pkgPath,\n }\n }\n }\n return undefined\n}\n\nexport function resolveOptions(cwd: string, explicitPath?: string): RunCasesOptions {\n const loaded = loadConfigFile(cwd, explicitPath)\n const fileConfig = loaded?.config\n const rootDir = loaded?.rootDir ?? path.resolve(cwd)\n const resolved: RunCasesOptions = {\n ...defaultRunCasesOptions,\n ...fileConfig,\n server: {\n ...defaultRunCasesOptions.server,\n ...(fileConfig?.server ?? {}),\n },\n rootDir,\n }\n return resolved\n}\n","import { McpSession } from '../mcp-session.js'\nimport { parseToolArgs, printJson } from './args.js'\nimport { formatCallHeader, formatErrorBanner, formatSuccessBanner } from './format.js'\nimport { openSessionOptions, parseCommonFlags } from './resolve.js'\n\nexport async function callCommand(argv: string[]): Promise<number> {\n const tool = argv[0] && !argv[0].startsWith('--') ? argv[0] : undefined\n if (!tool) {\n console.error('Usage: vib-test call <tool> [--args \\'{\"key\":\"value\"}\\'] [--arg key=value]')\n return 1\n }\n const flags = parseCommonFlags(argv.slice(1))\n const args = parseToolArgs(argv.slice(1))\n const { server, timeoutMs } = openSessionOptions(flags)\n const spawnTimeoutMs = Math.max(2000, Math.min(10000, timeoutMs))\n const session = await McpSession.start(server, spawnTimeoutMs)\n try {\n if (!flags.json) console.log(formatCallHeader(tool, args))\n const outcome = await session.callTool(tool, args, timeoutMs)\n if (outcome.kind === 'error') {\n if (flags.json) {\n printJson({ ok: false, error: outcome.error })\n } else {\n const label = outcome.error.codeName ? ` [${outcome.error.codeName}]` : ''\n console.error(\n formatErrorBanner(`error${label} (${outcome.error.kind}): ${outcome.error.message}`),\n )\n }\n return 1\n }\n if (flags.json) printJson({ ok: true, result: outcome.result })\n else {\n console.log(formatSuccessBanner('ok'))\n printJson(outcome.result)\n }\n return 0\n } finally {\n await session.close()\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { hasFlag, resolvePathFromCwd, takeFlag } from './args.js'\nimport { formatSuccessBanner, formatWarnBanner } from './format.js'\nimport { parseCommonFlags } from './resolve.js'\n\nfunction writeFile(pathName: string, contents: string, force: boolean): 'wrote' | 'skipped' {\n if (fs.existsSync(pathName) && !force) return 'skipped'\n fs.mkdirSync(path.dirname(pathName), { recursive: true })\n fs.writeFileSync(pathName, contents, 'utf8')\n return 'wrote'\n}\n\nfunction detectServerCommand(dir: string): { cmd: string; args: string[] } {\n const distCandidates = ['dist/index.js', 'build/index.js', 'src/index.js']\n for (const candidate of distCandidates) {\n if (fs.existsSync(path.join(dir, candidate))) {\n return { cmd: 'node', args: [candidate] }\n }\n }\n return { cmd: 'node', args: ['dist/index.js'] }\n}\n\nfunction schemaRef(fromFile: string, rootDir: string, schemaName: string): string {\n const local = path.join(rootDir, 'node_modules', 'vibrissa', 'schema', schemaName)\n if (fs.existsSync(local)) {\n return path.relative(path.dirname(fromFile), local).replace(/\\\\/g, '/')\n }\n return `https://unpkg.com/vibrissa/schema/${schemaName}`\n}\n\nexport async function initCommand(argv: string[]): Promise<number> {\n const flags = parseCommonFlags(argv)\n const dir = resolvePathFromCwd(takeFlag(argv, '--dir') ?? '.')\n const force = hasFlag(argv, '--force')\n const serverOverride = flags.serverCmd\n ? { cmd: flags.serverCmd, args: flags.serverArgs ?? [] }\n : detectServerCommand(dir)\n\n const configPath = path.join(dir, 'vibrissa.json')\n const casesDir = path.join(dir, 'tests', 'integration')\n const samplePath = path.join(casesDir, 'echo.basic.json')\n\n const config = {\n $schema: schemaRef(configPath, dir, 'vibrissa.schema.json'),\n server: {\n cmd: serverOverride.cmd,\n args: serverOverride.args,\n cwd: '.',\n },\n globs: ['tests/integration/**/*.json'],\n timeoutMs: 15000,\n failFast: false,\n }\n\n const sample = {\n $schema: schemaRef(samplePath, dir, 'case.schema.json'),\n name: 'echo basic',\n tool: 'echo',\n args: { text: 'hello', uppercase: true },\n expect: {\n content: [{ type: 'text', text: 'HELLO' }],\n },\n }\n\n const configStatus = writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, force)\n fs.mkdirSync(casesDir, { recursive: true })\n const sampleStatus = writeFile(samplePath, `${JSON.stringify(sample, null, 2)}\\n`, force)\n\n const pkgPath = path.join(dir, 'package.json')\n let pkgNote = 'no package.json found (skipped script)'\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as {\n scripts?: Record<string, string>\n }\n pkg.scripts ??= {}\n if (!pkg.scripts['test:integration'] || force) {\n pkg.scripts['test:integration'] = 'vib-test run'\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8')\n pkgNote = 'added scripts.test:integration'\n } else {\n pkgNote = 'scripts.test:integration already present'\n }\n }\n\n console.log(formatSuccessBanner('vibrissa init'))\n console.log(` config: ${configStatus.padEnd(7)} ${configPath}`)\n console.log(` sample: ${sampleStatus.padEnd(7)} ${samplePath}`)\n console.log(` package: ${pkgNote}`)\n console.log('')\n console.log('Next:')\n console.log(' 1. vib-test tools')\n console.log(' 2. vib-test call <tool> --arg key=value')\n console.log(' 3. vib-test record <tool> --arg key=value')\n console.log(' 4. vib-test run')\n console.log(' 5. vib-test inspect # open MCP Inspector with this server')\n if (configStatus === 'skipped' || sampleStatus === 'skipped') {\n console.log(\n formatWarnBanner('Some files already existed; re-run with --force to replace them.'),\n )\n }\n return 0\n}\n","import { spawn } from 'node:child_process'\nimport { hasFlag } from './args.js'\nimport { formatSuccessBanner, formatWarnBanner } from './format.js'\nimport { openSessionOptions, parseCommonFlags } from './resolve.js'\n\nexport async function inspectCommand(argv: string[]): Promise<number> {\n const dash = argv.indexOf('--')\n const ownArgs = dash === -1 ? argv : argv.slice(0, dash)\n const passthrough = dash === -1 ? [] : argv.slice(dash + 1)\n const flags = parseCommonFlags(ownArgs)\n const { server } = openSessionOptions(flags)\n\n const cliMode = hasFlag(ownArgs, '--cli') || passthrough[0] === '--cli'\n const rest = passthrough[0] === '--cli' ? passthrough.slice(1) : passthrough\n\n const inspectorArgs = [\n '--yes',\n '@modelcontextprotocol/inspector',\n ...(cliMode ? ['--cli'] : []),\n server.cmd,\n ...(server.args ?? []),\n ...rest,\n ]\n\n console.log(\n formatSuccessBanner(\n `Opening MCP Inspector for: ${server.cmd} ${(server.args ?? []).join(' ')}`.trim(),\n ),\n )\n console.log(\n formatWarnBanner(\n 'Inspector = visual exploration · Vibrissa tools/call/record/run = the regression loop',\n ),\n )\n\n const child = spawn('npx', inspectorArgs, {\n cwd: server.cwd ?? process.cwd(),\n env: { ...process.env, ...(server.env ?? {}) },\n stdio: 'inherit',\n shell: process.platform === 'win32',\n })\n\n return await new Promise<number>((resolve) => {\n child.on('error', (err) => {\n console.error(`Failed to launch MCP Inspector: ${err.message}`)\n resolve(1)\n })\n child.on('exit', (code, signal) => {\n if (signal) {\n resolve(1)\n return\n }\n resolve(code ?? 1)\n })\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { McpSession } from '../mcp-session.js'\nimport type { JsonValue, TestCase } from '../types.js'\nimport { hasFlag, parseToolArgs, printJson, resolvePathFromCwd, takeFlag } from './args.js'\nimport {\n formatCallHeader,\n formatErrorBanner,\n formatSuccessBanner,\n formatWarnBanner,\n} from './format.js'\nimport { openSessionOptions, parseCommonFlags } from './resolve.js'\n\nfunction slugify(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 48)\n}\n\nfunction defaultOutPath(rootDir: string, tool: string, name: string): string {\n const dir = path.join(rootDir, 'tests', 'integration')\n return path.join(dir, `${slugify(name) || slugify(tool) || 'case'}.json`)\n}\n\nfunction caseSchemaRef(outPath: string, rootDir: string): string {\n const localSchema = path.join(rootDir, 'node_modules', 'vibrissa', 'schema', 'case.schema.json')\n if (fs.existsSync(localSchema)) {\n return path.relative(path.dirname(outPath), localSchema).replace(/\\\\/g, '/')\n }\n return 'https://unpkg.com/vibrissa/schema/case.schema.json'\n}\n\nexport async function recordCommand(argv: string[]): Promise<number> {\n const tool = argv[0] && !argv[0].startsWith('--') ? argv[0] : undefined\n if (!tool) {\n console.error(\n 'Usage: vib-test record <tool> [--args \\'{\"key\":\"value\"}\\'] [--out path] [--name \"...\"] [--partial]',\n )\n return 1\n }\n\n const rest = argv.slice(1)\n const flags = parseCommonFlags(rest)\n const args = parseToolArgs(rest)\n const name = takeFlag(rest, '--name') ?? `${tool} recorded`\n const outFlag = takeFlag(rest, '--out')\n const partial = hasFlag(rest, '--partial')\n const force = hasFlag(rest, '--force')\n\n const { server, rootDir, timeoutMs } = openSessionOptions(flags)\n const outPath = outFlag ? resolvePathFromCwd(outFlag) : defaultOutPath(rootDir, tool, name)\n\n if (fs.existsSync(outPath) && !force) {\n console.error(formatErrorBanner(`Refusing to overwrite ${outPath} (pass --force to replace)`))\n return 1\n }\n\n const spawnTimeoutMs = Math.max(2000, Math.min(10000, timeoutMs))\n const session = await McpSession.start(server, spawnTimeoutMs)\n try {\n if (!flags.json) console.log(formatCallHeader(tool, args))\n const outcome = await session.callTool(tool, args, timeoutMs)\n\n const testCase: TestCase & { $schema?: string } = {\n $schema: caseSchemaRef(outPath, rootDir),\n name,\n tool,\n args,\n }\n\n if (outcome.kind === 'error') {\n testCase.expectError = {\n ...(outcome.error.codeName ? { code: outcome.error.codeName } : {}),\n message: { $regex: escapeRegex(outcome.error.message.slice(0, 80)) },\n }\n if (!flags.json) {\n console.log(\n formatWarnBanner(\n `Captured ${outcome.error.kind} error into expectError (${outcome.error.codeName ?? 'tool'})`,\n ),\n )\n }\n } else {\n const expect = outcome.result as JsonValue\n testCase.expect = partial\n ? ({ $partial: true, ...(expect as Record<string, JsonValue>) } as JsonValue)\n : expect\n if (!flags.json) console.log(formatSuccessBanner('Captured result into expect'))\n }\n\n fs.mkdirSync(path.dirname(outPath), { recursive: true })\n fs.writeFileSync(outPath, `${JSON.stringify(testCase, null, 2)}\\n`, 'utf8')\n\n if (flags.json) printJson({ ok: true, path: outPath, case: testCase })\n else console.log(`${formatSuccessBanner('wrote')} ${outPath}`)\n return 0\n } finally {\n await session.close()\n }\n}\n\nfunction escapeRegex(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n","import path from 'node:path'\nimport { ConsoleResultsDisplay, PrettyConsoleResultsDisplay } from '../display.js'\nimport { Runner } from '../runner.js'\nimport { hasFlag, resolvePathFromCwd, takeFlag } from './args.js'\nimport { mergeCliOptions, parseCommonFlags } from './resolve.js'\n\nexport async function runCommand(argv: string[]): Promise<number> {\n const flags = parseCommonFlags(argv)\n const casesGlob = takeFlag(argv, '--cases')\n const failFast = hasFlag(argv, '--fail-fast')\n const allowEmpty = hasFlag(argv, '--allow-empty')\n let display: 'plain' | 'pretty' | undefined\n if (hasFlag(argv, '--pretty')) display = 'pretty'\n if (hasFlag(argv, '--no-pretty')) display = 'plain'\n const displayFlag = takeFlag(argv, '--display')\n if (displayFlag === 'plain' || displayFlag === 'pretty') display = displayFlag\n\n const options = mergeCliOptions(flags, {\n ...(display ? { display } : {}),\n ...(casesGlob\n ? {\n globs: [\n path.isAbsolute(casesGlob)\n ? casesGlob\n : resolvePathFromCwd(casesGlob).replace(/\\\\/g, '/'),\n ],\n }\n : {}),\n ...(failFast ? { failFast: true } : {}),\n ...(allowEmpty ? { allowEmpty: true } : {}),\n })\n\n const runner = new Runner(\n options,\n options.display === 'pretty' ? new PrettyConsoleResultsDisplay() : new ConsoleResultsDisplay(),\n )\n return runner.run()\n}\n","import { McpSession } from '../mcp-session.js'\nimport { printJson } from './args.js'\nimport { formatToolList } from './format.js'\nimport { openSessionOptions, parseCommonFlags } from './resolve.js'\n\nexport async function toolsCommand(argv: string[]): Promise<number> {\n const flags = parseCommonFlags(argv)\n const { server, timeoutMs } = openSessionOptions(flags)\n const spawnTimeoutMs = Math.max(2000, Math.min(10000, timeoutMs))\n const session = await McpSession.start(server, spawnTimeoutMs)\n try {\n const tools = await session.listTools()\n if (flags.json) printJson(tools)\n else console.log(formatToolList(tools))\n return 0\n } finally {\n await session.close()\n }\n}\n","#!/usr/bin/env node\nimport { callCommand } from './cli/call.js'\nimport { initCommand } from './cli/init.js'\nimport { inspectCommand } from './cli/inspect.js'\nimport { recordCommand } from './cli/record.js'\nimport { runCommand } from './cli/run.js'\nimport { toolsCommand } from './cli/tools.js'\n\nconst COMMANDS = new Set(['run', 'tools', 'call', 'record', 'init', 'inspect'])\n\nfunction printHelp(): void {\n console.log(\n [\n 'vib-test — JSON-driven MCP integration runner + authoring loop',\n '',\n 'Usage:',\n ' vib-test run [options] Run JSON cases (default)',\n ' vib-test tools [options] List tools on the server',\n ' vib-test call <tool> [options] Call a tool and print the result',\n ' vib-test record <tool> [options] Call a tool and write a case file',\n ' vib-test init [options] Scaffold vibrissa.json + sample case',\n ' vib-test inspect [options] [-- ...] Open MCP Inspector with this server',\n '',\n 'Shared options:',\n ' --config <path> vibrissa.json / .jsonc / package.json#vibrissa',\n ' --server \"<cmd ...>\" Override server command',\n ' --server-cwd <dir> Working directory for the server process',\n ' --env KEY=VALUE Extra env var (repeatable)',\n ' --timeout <ms> Per-call / spawn timeout',\n ' --json Machine-readable output (tools/call/record)',\n '',\n 'run options:',\n ' --cases <glob> Case glob (relative to shell cwd)',\n ' --fail-fast Stop on first failure',\n ' --allow-empty Exit 0 when no cases match',\n ' --pretty / --no-pretty',\n '',\n 'call / record options:',\n \" --args '{...}' JSON object of tool arguments\",\n ' --arg key=value Tool argument (repeatable; JSON-ish values ok)',\n '',\n 'record options:',\n ' --out <path> Case file path (default: tests/integration/<name>.json)',\n ' --name <string> Case name',\n ' --partial Wrap expect in \"$partial\": true',\n ' --force Overwrite an existing case file',\n '',\n 'init options:',\n ' --dir <path> Target directory (default: .)',\n ' --force Overwrite existing scaffold files',\n '',\n 'inspect options:',\n ' --cli Use Inspector CLI mode',\n ' -- ... Extra args forwarded after the server command',\n '',\n 'Workflow:',\n ' init → tools → call → record → run → inspect (when you want the UI)',\n ].join('\\n'),\n )\n}\n\nconst argv = process.argv.slice(2)\nif (argv.includes('-h') || argv.includes('--help')) {\n printHelp()\n process.exit(0)\n}\n\nlet command = 'run'\nlet rest = argv\nif (argv[0] && COMMANDS.has(argv[0])) {\n command = argv[0]\n rest = argv.slice(1)\n}\n\nlet code = 1\ntry {\n switch (command) {\n case 'run':\n code = await runCommand(rest)\n break\n case 'tools':\n code = await toolsCommand(rest)\n break\n case 'call':\n code = await callCommand(rest)\n break\n case 'record':\n code = await recordCommand(rest)\n break\n case 'init':\n code = await initCommand(rest)\n break\n case 'inspect':\n code = await inspectCommand(rest)\n break\n default:\n printHelp()\n code = 1\n }\n} catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(message)\n code = 1\n}\nprocess.exit(code)\n"],"mappings":"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","names":["argv","code","path","path","path","argv","path","argv","fs","path","fs","path","argv","argv","rest","code","fs","path","path","fs","argv","rest","path","argv","path","argv"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/cli/call.ts","../src/cli/format.ts","../src/cli/resolve.ts","../src/cli/resources.ts","../src/cli/check.ts","../src/cli/diff.ts","../src/cli/manifest.ts","../src/cli/run.ts","../src/cli/discover.ts","../src/cli/explain.ts","../src/cli/fuzz.ts","../src/cli/record.ts","../src/tap/entries.ts","../src/cli/volatile.ts","../src/cli/get-prompt.ts","../src/cli/init.ts","../src/cli/inspect.ts","../src/cli/migrate.ts","../src/cli/prompts.ts","../src/cli/read.ts","../src/cli/tap.ts","../src/tap/proxy.ts","../src/cli/tools.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * `vib` / `vib-test` entry point: the command table, help, flag checks, and the error →\n * exit-code mapping (0 ok · 1 failed · 2 usage / config / connection error).\n *\n * Under `--json` every outcome is one JSON object on stdout: `{ ok: true, ... }` on success,\n * `{ ok: false, error: { type, code, message, hint }, next? }` on any failure (nothing is\n * duplicated on stderr).\n */\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport {\n UsageError,\n assertKnownFlags,\n closest,\n normalizeArgv,\n printJson,\n setJsonStyle,\n splitAtDoubleDash,\n} from './cli/args.js'\nimport { callCommand } from './cli/call.js'\nimport { checkCommand } from './cli/check.js'\nimport { diffCommand, diffHelp } from './cli/diff.js'\nimport { discoverCommand } from './cli/discover.js'\nimport { explainCommand } from './cli/explain.js'\nimport { type CommandHelp, acceptedFlags, colors, formatCommandHelp } from './cli/format.js'\nimport { fuzzCommand } from './cli/fuzz.js'\nimport { getPromptCommand } from './cli/get-prompt.js'\nimport { initCommand } from './cli/init.js'\nimport { conformanceCommand, inspectCommand } from './cli/inspect.js'\nimport { manifestCommand, manifestHelp } from './cli/manifest.js'\nimport { migrateCommand } from './cli/migrate.js'\nimport { promptsCommand } from './cli/prompts.js'\nimport { readCommand } from './cli/read.js'\nimport { recordCommand } from './cli/record.js'\nimport { resourcesCommand } from './cli/resources.js'\nimport { runCommand, runHelp } from './cli/run.js'\nimport { tapCommand } from './cli/tap.js'\nimport { toolsCommand } from './cli/tools.js'\nimport { ConfigError } from './config.js'\nimport { SessionRequestError, SessionStartError } from './session/index.js'\n\nexport interface CommandSpec extends CommandHelp {\n run: (argv: string[]) => Promise<number>\n /** stdout carries a protocol stream: never print errors/JSON there. */\n protocolStdout?: boolean\n}\n\nconst GROUPS: Array<[string, string]> = [\n ['setup', 'Setup — create or upgrade a project'],\n ['explore', 'Explore — what does the server offer?'],\n ['probe', 'Probe — try one operation'],\n ['capture', 'Capture — turn reality into cases'],\n ['gate', 'Gate — run and review the suite'],\n ['harden', 'Harden — checks and fuzzing'],\n ['wrappers', 'Wrappers — official tools, pre-configured'],\n]\n\nconst MRTR_FLAGS = [\n {\n flag: '--respond <json>',\n text: 'Scripted answers for input requests, keyed by method: \\'{\"elicitation/create\": {\"action\": \"accept\", \"content\": {...}}}\\' (repeatable)',\n },\n {\n flag: '--respond-key m=<json>',\n text: 'One scripted answer: elicitation/create=\\'{\"action\":\"accept\"}\\' (repeatable)',\n },\n { flag: '--await', text: 'Tasks extension: poll tasks/get until the task finishes' },\n {\n flag: '--await-timeout <ms>',\n text: 'Give up polling after this long (implies --await; default 30000)',\n },\n]\n\nconst ARG_FLAGS = [\n { flag: \"--args '<json>'\", text: 'Arguments as a JSON object' },\n {\n flag: '--arg key=value',\n text: 'One argument (repeatable; true/false/null/numbers/JSON parsed)',\n },\n]\n\nconst EXPECT_MISSING = {\n flag: '--expect-missing',\n text: 'Skip the check that the name is listed by the server (to probe unknown names)',\n}\n\nconst BRIEF = { flag: '--brief', text: 'Only failures and warnings' }\n\nexport const COMMANDS: Record<string, CommandSpec> = {\n init: {\n name: 'init',\n group: 'setup',\n summary:\n 'Scaffold vibrissa.json, a real sample case from your server, a sample flow, optionally CI',\n usage: [\n 'vib init [--dir .] [--server \"<cmd>\"|<url>] [--from-claude-config [file]] [--force]',\n 'vib init --ci (only writes .github/workflows/vibrissa.yml when vibrissa.json exists)',\n ],\n description:\n 'Detects the server command: package.json bin/main/dist, pyproject.toml (python -m <pkg>), go.mod (go run .).\\nThe server is named \"default\". If it starts, the first tool is called with minimal generated args and\\nrecorded as a real case; otherwise a skipped sample is written for you to edit. Adds reports/ to .gitignore.\\n--from-claude-config reads .mcp.json, else Claude Desktop\\'s claude_desktop_config.json (mcpServers);\\nliteral secrets in env/headers are replaced with ${VAR} references.',\n flags: [\n { flag: '--dir <path>', text: 'Target directory (default .)' },\n { flag: '--server <cmd|url>', text: 'Server command line or URL (skips detection)' },\n { flag: '--from-claude-config [file]', text: 'Pre-fill servers from a Claude config' },\n {\n flag: '--ci',\n text: 'Write .github/workflows/vibrissa.yml (runs vib run --profile ci; the profile carries the flags)',\n },\n {\n flag: '--no-call',\n text: 'Do not call a tool for the sample (writes a skipped placeholder instead)',\n },\n { flag: '--protocol <mode>', text: 'Set protocol on the scaffolded servers' },\n { flag: '--timeout <ms>', text: 'timeoutMs for the config (default 15000)' },\n { flag: '--force', text: 'Overwrite existing files' },\n { flag: '--json', text: 'Machine-readable output' },\n ],\n examples: [\n 'vib init',\n 'vib init --server \"uv run my-server\"',\n 'vib init --from-claude-config',\n 'vib init --ci',\n ],\n run: initCommand,\n },\n migrate: {\n name: 'migrate',\n group: 'setup',\n summary: 'Rewrite v1 config and case files to v2 in place (idempotent)',\n usage: ['vib migrate [--dry-run] [--manifest] [--cases <glob>] [--force]'],\n description:\n 'server → servers.default + defaultServer (also in profiles); $schema added / fixed to @jmoak/vibrissa;\\nexpectError.code aliases renamed (RequestTimedOut → RequestTimeout) and v1 numeric codes named\\n(-32001 → RequestTimeout, -32002 → ResourceNotFound). Leftover v1 keys (display) are reported.\\nFiles with comments are left alone unless --force. Exit 1 when a file could not be migrated.',\n flags: [\n { flag: '--dry-run', text: 'Show what would change; write nothing' },\n { flag: '--manifest', text: 'Also record the manifest lock (vib manifest record)' },\n { flag: '--cases <glob>', text: 'Case files to migrate (default: config globs)' },\n {\n flag: '--force',\n text: 'Rewrite files even if they contain comments (comments are dropped)',\n },\n ],\n common: true,\n examples: ['vib migrate --dry-run', 'vib migrate --manifest'],\n run: migrateCommand,\n },\n discover: {\n name: 'discover',\n group: 'explore',\n summary: 'Show protocol era/version, server identity, capabilities, extensions, instructions',\n usage: ['vib discover [--json]'],\n description:\n 'Calls server/discover (2026-07-28) or reads the initialize result (2025 era).\\n--json: { ok, era, protocolVersion, supportedVersions, serverInfo, capabilities, extensions, instructions, synthesized, transport, next }.',\n common: true,\n examples: [\n 'vib discover',\n 'vib discover --server staging --json',\n 'vib discover --protocol legacy',\n ],\n run: discoverCommand,\n },\n tools: {\n name: 'tools',\n group: 'explore',\n summary: 'List tools (name, title, description, arguments, hints), or show one in detail',\n usage: ['vib tools [--json]', 'vib tools <name> [--json]'],\n description:\n '--json: { ok, tools: ToolSummary[], listMeta: { tools: { ttlMs, cacheScope } } }; with <name>: { ok, tool }.',\n flags: [EXPECT_MISSING],\n common: true,\n examples: ['vib tools', 'vib tools echo', 'vib tools --json | jq \".tools[].name\"'],\n run: toolsCommand,\n },\n resources: {\n name: 'resources',\n group: 'explore',\n summary: 'List resources (uri, mime type) and resource templates',\n usage: ['vib resources [--json]'],\n description:\n '--json: { ok, resources, resourceTemplates, listMeta: { resources, resourceTemplates } }; a list the server does not support has listMeta.<list>.unsupported = true.',\n common: true,\n run: resourcesCommand,\n },\n prompts: {\n name: 'prompts',\n group: 'explore',\n summary: 'List prompts and their arguments',\n usage: ['vib prompts [--json]'],\n description: '--json: { ok, prompts, listMeta: { prompts } }.',\n common: true,\n run: promptsCommand,\n },\n call: {\n name: 'call',\n group: 'probe',\n summary: 'Call a tool once and print the (normalized) result',\n usage: [\n \"vib call <tool> [--args '{...}'] [--arg k=v] [--respond '{...}'] [--await] [--validate] [--raw]\",\n ],\n description:\n 'Prints the result after config \"normalize\" (what a golden would hold); --raw shows the wire result.\\nThe tool must be listed by the server (did-you-mean otherwise; --expect-missing skips the check).\\nstructuredContent is always checked against the outputSchema: a violation is a warning, or a failure with --validate.\\nWhen the server asks for input (MRTR) and nothing answers, the request is printed with a ready-to-paste --respond.\\nExit 1 on an error, an unanswered input request, or a failed --validate.',\n flags: [\n ...ARG_FLAGS,\n ...MRTR_FLAGS,\n {\n flag: '--validate',\n text: 'Fail (exit 1) when structuredContent violates the outputSchema, and print the verdict',\n },\n { flag: '--raw', text: 'Print the raw wire result (skip normalization)' },\n EXPECT_MISSING,\n ],\n common: true,\n examples: [\n 'vib call echo --arg text=hello',\n 'vib call typed --args \\'{\"a\": 1, \"b\": 2}\\' --validate',\n 'vib call confirm --respond \\'{\"elicitation/create\": {\"action\": \"accept\", \"content\": {\"confirm\": true}}}\\'',\n 'vib call slow --await --json',\n ],\n run: callCommand,\n },\n read: {\n name: 'read',\n group: 'probe',\n summary: 'Read a resource by URI (or expand a URI template with --arg)',\n usage: ['vib read <uri> [--raw]', \"vib read '<uri-template>' --arg key=value\"],\n description:\n 'The URI must be listed by resources/list or match a listed template (--expect-missing skips the check).',\n flags: [\n ...ARG_FLAGS,\n ...MRTR_FLAGS.slice(0, 2),\n { flag: '--raw', text: 'Print the raw wire result' },\n EXPECT_MISSING,\n ],\n common: true,\n examples: ['vib read file:///README.md', \"vib read 'users://{id}' --arg id=42 --json\"],\n run: readCommand,\n },\n 'get-prompt': {\n name: 'get-prompt',\n group: 'probe',\n summary: 'Get a prompt with arguments and print its messages',\n usage: [\"vib get-prompt <name> [--args '{...}'] [--arg key=value] [--raw]\"],\n description:\n 'Prompt arguments are strings on the wire; non-string --arg values are sent as JSON text.',\n flags: [\n ...ARG_FLAGS,\n ...MRTR_FLAGS.slice(0, 2),\n { flag: '--raw', text: 'Print the raw wire result' },\n EXPECT_MISSING,\n ],\n common: true,\n examples: ['vib get-prompt greet --arg name=Jordan --arg style=terse'],\n run: getPromptCommand,\n },\n record: {\n name: 'record',\n group: 'capture',\n summary: 'Run an operation live and write it as a case file (the golden is reality)',\n usage: [\n 'vib record <tool> [--arg k=v] [--respond ...] [--await] [--partial]',\n 'vib record --resource <uri> | --resource-template <tpl> --arg k=v | --prompt <name> --arg k=v',\n 'vib record --flow [--name \"...\"] (stdin: one step per line)',\n 'vib record --from-tap <file> [--select <n|name|all>]',\n ],\n description:\n 'Results go through config \"normalize\", then matcher-like keys are escaped ($literal), so the golden matches what vib run compares.\\nVolatile values are loosened: ISO timestamps, UUIDs, epoch-ms numbers, and anything that differs between two back-to-back\\ncalls (--no-stable-check skips the second call; --exact keeps everything verbatim). See docs/CASES.md \"Generated ids and timestamps\".\\nErrors become expectError (code name + message prefix). Input requests are recorded as respond + expectInputRequired;\\nwithout --respond you are asked in a terminal, and non-interactive runs fail with the exact --respond to pass.\\nA result that violates the tool\\'s outputSchema is refused unless --allow-invalid-output.\\nFiles go to the directory of the first config glob (deduplicated names); --server <name> writes \"server\" into the case.\\n--flow reads steps until an empty line: `<tool> {\"json\": \"args\"}`, `<tool> key=value ...`, or NDJSON objects\\n({\"tool\": ..., \"args\": ..., \"respond\": ...}). Server-minted ids reused by later steps become {{captures}} automatically (--no-capture to disable).\\n--from-tap lists the calls in a vib tap capture; --select picks them (1-based index, range 2-5, tool/prompt name or URI, all).',\n flags: [\n ...ARG_FLAGS,\n { flag: '--resource <uri>', text: 'Record resources/read' },\n {\n flag: '--resource-template <tpl>',\n text: 'Record a URI template read (expanded with --arg)',\n },\n { flag: '--prompt <name>', text: 'Record prompts/get' },\n ...MRTR_FLAGS,\n { flag: '--partial', text: 'Wrap the expectation in \"$partial\": true' },\n { flag: '--exact', text: 'Keep every value verbatim (no volatile-field loosening)' },\n {\n flag: '--no-stable-check',\n text: 'Do not repeat the call to find values that change between calls',\n },\n {\n flag: '--allow-invalid-output',\n text: 'Write the golden even if structuredContent violates the outputSchema',\n },\n EXPECT_MISSING,\n { flag: '--flow', text: 'Record a multi-step flow from stdin' },\n { flag: '--no-capture', text: '--flow: do not infer {{captures}}' },\n { flag: '--from-tap <file>', text: 'Turn calls captured by vib tap into cases' },\n { flag: '--select <sel>', text: '--from-tap: which calls (repeatable, comma-separated)' },\n { flag: '--out-dir <dir>', text: '--from-tap: where to write (default <suite dir>/tap)' },\n { flag: '--out <path>', text: 'Case file (default <suite dir>/<name>.json)' },\n { flag: '--name <text>', text: 'Case name (default \"<tool> <args>\")' },\n { flag: '--tag <tag>', text: 'Add a tag (repeatable)' },\n { flag: '--force', text: 'Overwrite an existing case file' },\n ],\n common: true,\n examples: [\n 'vib record echo --arg text=hello',\n 'vib record --resource fixture://readme',\n 'vib record confirm --respond \\'{\"elicitation/create\": {\"action\": \"accept\", \"content\": {\"confirm\": true}}}\\'',\n 'printf \\'%s\\\\n\\' \\'{\"tool\":\"session.create\",\"args\":{\"user\":\"jo\"}}\\' \\'{\"tool\":\"session.get\",\"args\":{\"sessionId\":\"<id>\"}}\\' | vib record --flow --name \"session\"',\n 'vib record --from-tap reports/tap/2026-10-28T12-00-00-000Z.ndjson --select 1,3',\n ],\n run: (argv) => recordCommand(argv),\n },\n tap: {\n name: 'tap',\n group: 'capture',\n summary: 'Transparent stdio proxy that captures real client usage to NDJSON',\n usage: [\n 'vib tap [--out reports/tap/<ts>.ndjson] [--quiet] -- <server command...>',\n 'vib tap [--server <name>] (proxy the configured stdio server)',\n ],\n description:\n 'Put it between a real client and your server, e.g. in .mcp.json:\\n \"command\": \"npx\", \"args\": [\"vib\", \"tap\", \"--\", \"node\", \"dist/index.js\"]\\nBytes pass through unchanged (newline-delimited and Content-Length framing). Each tools/call, resources/read,\\nprompts/get (plus initialize/discover/list/tasks context) is appended as {ts, seq, from, method, id, params, result|error, durationMs}.\\nstdout is the protocol channel: vib tap prints status only to stderr. Exits with the server\\'s exit code.\\nThen: vib record --from-tap <file>.',\n flags: [\n {\n flag: '--out <file>',\n text: 'Capture file (default reports/tap/<timestamp>.ndjson; appended, seq continues)',\n },\n { flag: '--quiet', text: 'No status lines on stderr' },\n { flag: '--env KEY=VALUE', text: 'Extra env var for the server (repeatable)' },\n { flag: '--server-cwd <dir>', text: 'Working directory for the server' },\n { flag: '--config <path>', text: 'Config to read the server from (without --)' },\n { flag: '--server <name>', text: 'Configured server to proxy (without --)' },\n { flag: '--profile <name>', text: 'Profile for the configured server (without --)' },\n ],\n protocolStdout: true,\n examples: [\n 'vib tap -- node dist/index.js',\n 'vib tap --out reports/tap/session.ndjson -- python -m my_server',\n ],\n run: tapCommand,\n },\n // Help for run / manifest / diff lives with those commands (src/cli/{run,manifest,diff}.ts).\n manifest: { ...manifestHelp, group: 'capture', run: manifestCommand },\n run: { ...runHelp, group: 'gate', run: runCommand },\n diff: { ...diffHelp, group: 'gate', run: diffCommand },\n explain: {\n name: 'explain',\n group: 'gate',\n summary: 'Paraphrase what cases do and assert, and flag weak assertions',\n usage: [\n 'vib explain (every case in the configured suite)',\n 'vib explain <case.json | \"case name\" | \"glob/**/*.json\"> ... [--brief] [--full] [--json]',\n ],\n description:\n 'Loads cases exactly like vib run (validation, $ref fragments, placeholder checks) and reports the same load errors.\\nNames every matcher in plain words (docs/MATCHERS.md), and flags weak assertions: expectError {}, a bare root\\n$partial, no expectation, validateOutput: false, ignoreErrors outside teardown, skipped cases. Exit 1 on load errors.',\n flags: [\n BRIEF,\n { flag: '--full', text: 'Show every assertion (default: first 40 per expectation)' },\n { flag: '--config <path>', text: 'Config whose suite (globs, servers) to use' },\n { flag: '--json', text: 'Structured explanation: { ok, cases: [...] }' },\n ],\n examples: [\n 'vib explain',\n 'vib explain tests/integration/echo.basic.json',\n 'vib explain \"echo basic\"',\n 'vib explain --brief --json',\n ],\n run: explainCommand,\n },\n check: {\n name: 'check',\n group: 'harden',\n summary: 'Spec-sanity checks + tool-description lint (poisoning, shadowing, exfiltration)',\n usage: ['vib check [--allow <id>] [--brief] [--verbose] [--json]', 'vib check --list'],\n description:\n 'Offline, deterministic checks over the live manifest (docs/CHECKS.md). Config:\\n \"checks\": { \"allow\": [\"desc/long-description\", \"desc/sensitive-paths:ssh.list_keys\"], \"severity\": { \"desc/embedded-url\": \"failed\" } }\\nExit 1 when any check failed (warnings never fail).',\n flags: [\n { flag: '--allow <id>', text: 'Skip a check (id, prefix/*, or id:subject; repeatable)' },\n { flag: '--list', text: 'List every check id with its default severity' },\n BRIEF,\n { flag: '--verbose', text: 'List passed checks individually' },\n ],\n common: true,\n run: checkCommand,\n },\n fuzz: {\n name: 'fuzz',\n group: 'harden',\n summary: 'Generate args from inputSchema and check invariants (no goldens needed)',\n usage: [\n 'vib fuzz <tool> [--runs 100] [--seed S] [--strategy s] [--inject] [--budget ms] [--record-failures]',\n 'vib fuzz <tool> --seed S --runs N --id <case-id> (reproduce one case)',\n ],\n description:\n 'Strategies: valid, boundary, invalid (default) and inject (prompt-injection payloads, via --inject).\\nInvariants: valid args never get a protocol error or time out; invalid args get InvalidParams (or a tool error);\\nthe server never crashes (it is restarted and fuzzing continues); structuredContent matches outputSchema;\\nerrors do not echo injection payloads (warning). Afterwards: server alive, tools/list unchanged.\\nDeterministic: the seed (default: the tool name) and --runs reproduce the same cases.',\n flags: [\n { flag: '--runs <n>', text: 'Cases to generate (default 100)' },\n {\n flag: '--seed <n|text>',\n text: 'Seed (default: the tool name); printed in every reproduce line',\n },\n {\n flag: '--strategy <s>',\n text: 'valid | boundary | invalid | inject (repeatable or comma-separated)',\n },\n { flag: '--inject', text: 'Add the inject strategy' },\n { flag: '--budget <ms>', text: 'Also fail calls slower than this' },\n {\n flag: '--strict-invalid',\n text: 'Invalid args must get JSON-RPC InvalidParams (a tool error fails)',\n },\n { flag: '--id <case-id>', text: 'Run a single case (same --seed/--runs as the report)' },\n {\n flag: '--record-failures',\n text: 'Write each failing case to <suite dir>/fuzz/<tool>-<id>.json',\n },\n { flag: '--out-dir <dir>', text: 'Where --record-failures writes' },\n BRIEF,\n ],\n common: true,\n examples: [\n 'vib fuzz search --runs 200',\n 'vib fuzz echo --inject --record-failures',\n 'vib fuzz echo --seed echo --runs 100 --id invalid-3f9a1c2b7e',\n ],\n run: fuzzCommand,\n },\n inspect: {\n name: 'inspect',\n group: 'wrappers',\n summary: 'Open MCP Inspector on the configured server',\n usage: ['vib inspect [--cli] [-- extra inspector args]'],\n flags: [{ flag: '--cli', text: 'Inspector CLI mode instead of the UI' }],\n common: true,\n run: inspectCommand,\n },\n conformance: {\n name: 'conformance',\n group: 'wrappers',\n summary: 'Run the official MCP conformance suite against an HTTP server',\n usage: ['vib conformance [--server <url|name>] [-- extra conformance args]'],\n description:\n 'Wraps npx @modelcontextprotocol/conformance server --url <url>. The official suite is HTTP-first;\\nfor stdio servers use vib check (the deterministic subset).',\n common: true,\n run: conformanceCommand,\n },\n}\n\n/** `vib help cases`: everything needed to write a case, in about 2 KB. */\nexport const CASES_CHEATSHEET = `Vibrissa case files — cheat sheet (full reference: docs/CASES.md, docs/MATCHERS.md)\n\nOne JSON file = one case. One operation:\n \"tool\": \"echo\" | \"resource\": \"file:///x\" | \"resourceTemplate\": \"users://{id}\" | \"prompt\": \"greet\"\n \"args\": { ... } tool args, template variables, or prompt args\n \"expect\": <expectation> the normalized result; plain JSON = exact deep equality\n \"expectError\": { \"code\": \"InvalidParams\", \"message\": { \"$regex\": \"must be\" } } (a tool isError counts)\nAlso: name, tags, server, skip, flaky, timeoutMs, budgetMs, validateOutput, normalize\n\nMatchers (anywhere inside expect):\n {\"$partial\": true, ...} extra keys / trailing items allowed below\n {\"$regex\": \"^ok\", \"flags\": \"i\"} {\"$wildcard\": \"req_*\"} strings\n {\"$type\": \"string\"} {\"$any\": true} (present) {\"$ignore\": true} (may be missing)\n {\"$number\": {\"gte\": 0, \"lt\": 10}} {\"$length\": {\"min\": 1}}\n {\"$contains\": {...}, \"count\": 1} {\"$unordered\": true, \"value\": [...]} arrays\n {\"$oneOf\": [a, b]} {\"$schema\": {...JSON Schema...}} {\"$ref\": \"./shared/x.json\"} {\"$literal\": {...}}\n Timestamps: {\"$schema\": {\"type\": \"string\", \"format\": \"date-time\"}}\n\nFlows: \"steps\": [ step, ... ], plus \"setup\" / \"teardown\" (teardown runs on failure; \"ignoreErrors\": true)\n \"capture\": { \"sid\": \"structuredContent.sessionId\" } then \"{{sid}}\" in later args / expect\n \"{{env.NAME}}\" reads an environment variable\nInput requests (MRTR):\n \"respond\": { \"elicitation/create\": { \"action\": \"accept\", \"content\": { \"confirm\": true } } }\n \"expectInputRequired\": { \"elicitation/create\": { \"$partial\": true, \"message\": \"Proceed?\" } }\nTasks: \"await\": true or { \"pollMs\": 500, \"timeoutMs\": 30000 }; \"expectTask\": { \"$partial\": true, ... }\n\nExamples:\n {\"tool\": \"echo\", \"args\": {\"text\": \"hi\"}, \"expect\": {\"content\": [{\"type\": \"text\", \"text\": \"hi\"}]}}\n {\"tool\": \"echo\", \"args\": {}, \"expectError\": {\"code\": \"InvalidParams\"}}\n {\"steps\": [\n {\"tool\": \"session.create\", \"args\": {\"user\": \"jo\"}, \"capture\": {\"sid\": \"structuredContent.id\"}},\n {\"tool\": \"session.get\", \"args\": {\"id\": \"{{sid}}\"},\n \"expect\": {\"$partial\": true, \"structuredContent\": {\"user\": \"jo\"}}}]}\n\nWrite cases: vib record <tool> --arg k=v · review: vib explain <file> · run: vib run`\n\nconst HELP_TOPICS: Record<string, () => string> = { cases: () => CASES_CHEATSHEET }\n\nfunction version(): string {\n try {\n const here = path.dirname(fileURLToPath(import.meta.url))\n const pkg = JSON.parse(fs.readFileSync(path.join(here, '..', 'package.json'), 'utf8')) as {\n version?: string\n }\n return pkg.version ?? 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\nexport function formatGlobalHelp(): string {\n const c = colors()\n const out = [\n `${c.bold('vib')} ${c.dim(`(vib-test) ${version()}`)} — contract tests for MCP servers, written as JSON`,\n '',\n `${c.bold('Usage:')} vib <command> [options] (no command = run)`,\n ]\n const width = Math.max(...Object.keys(COMMANDS).map((name) => name.length))\n for (const [group, title] of GROUPS) {\n out.push('', c.bold(title))\n for (const spec of Object.values(COMMANDS).filter((s) => s.group === group)) {\n out.push(` ${c.cyan(spec.name.padEnd(width))} ${spec.summary}`)\n }\n }\n out.push(\n '',\n c.bold('Every command:'),\n ' --config <path> · --server <name|cmd|url> · --profile <name> · --protocol auto|legacy|modern|<date>',\n ' --timeout <ms> · --env KEY=VALUE · --json (one JSON object on stdout; --compact for one line)',\n '',\n `Help for one command: ${c.cyan('vib <command> --help')} · case syntax: ${c.cyan('vib help cases')} · full flag reference: docs/CLI.md`,\n 'Typical loop: vib init → vib discover → vib tools → vib call → vib record → vib manifest record → vib run --check',\n 'Exit codes: 0 ok · 1 failed (assertion, check, tool error) · 2 usage/config/connection error',\n )\n return out.join('\\n')\n}\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\nexport interface ErrorEnvelope {\n ok: false\n error: { type: string; code: string; message: string; hint: string }\n next?: string[]\n}\n\nfunction lastSentence(message: string): { detail: string; hint?: string } {\n const parts = message.trim().split(/(?<=[.!?])\\s+(?=[A-Z])/)\n if (parts.length < 2) return { detail: message.trim() }\n return { detail: parts.slice(0, -1).join(' '), hint: parts[parts.length - 1] }\n}\n\n/** Map anything thrown by a command to exit code + the `--json` envelope + human text. */\nexport function describeError(\n err: unknown,\n command: string,\n): { exit: number; envelope: ErrorEnvelope; human: string } {\n const type = err instanceof Error ? err.name : 'Error'\n const fallbackHint = `Run vib ${command} --help for usage.`\n let exit = 1\n let code = 'internal'\n let message = err instanceof Error ? err.message : String(err)\n let hint: string | undefined\n let next: string[] | undefined\n if (err instanceof UsageError) {\n exit = 2\n code = err.code\n message = err.detail\n hint = err.hint\n next = err.next\n } else if (err instanceof ConfigError) {\n exit = 2\n code = 'config'\n } else if (err instanceof SessionStartError) {\n exit = 2\n code = err.code\n // The message may end with the server's stderr tail; the next step is about the server.\n hint = SERVER_START_HINT\n next = ['vib discover --server \"<cmd>\"', 'vib init --server \"<cmd>\"']\n } else if (err instanceof SessionRequestError) {\n code = err.error.codeName ?? 'request'\n } else if (type === 'ManifestFileError') {\n exit = 2\n code = 'manifest'\n }\n if (hint === undefined) {\n const split = lastSentence(message)\n if (\n split.hint &&\n /\\b(run|pass|use|check|add|set|fix|try|make|point|export|start|edit|delete|re-run|quote)\\b/i.test(\n split.hint,\n )\n ) {\n message = split.detail\n hint = split.hint\n }\n }\n hint ??= fallbackHint\n message = endSentence(message)\n return {\n exit,\n envelope: { ok: false, error: { type, code, message, hint }, ...(next ? { next } : {}) },\n human: `${message} ${hint}`,\n }\n}\n\nconst SERVER_START_HINT =\n 'Fix the server command in vibrissa.json, or try one with --server \"<cmd> <args>\" (vib init --server \"<cmd>\" writes it to the config).'\n\n/** Close a message as a sentence (`..., ` / `...:` → `....`) so a hint can follow it. */\nexport function endSentence(text: string): string {\n const trimmed = text.trim().replace(/[\\s,;:]+$/, '')\n return /[.!?)\"'`]$/.test(trimmed) ? trimmed : `${trimmed}.`\n}\n\nfunction reportError(\n err: unknown,\n command: string,\n json: boolean,\n protocolStdout: boolean,\n): number {\n const { exit, envelope, human } = describeError(err, command)\n if (json && !protocolStdout) printJson(envelope)\n else console.error(colors().red(`error: ${human}`))\n if (process.env.VIB_DEBUG && err instanceof Error && err.stack) console.error(err.stack)\n return exit\n}\n\n// ---------------------------------------------------------------------------\n// Dispatch\n// ---------------------------------------------------------------------------\n\n/** Run the CLI with `argv` (without node/script). Returns the exit code. */\nexport async function main(rawArgv: string[]): Promise<number> {\n const argv = normalizeArgv(rawArgv)\n const [ownAll] = splitAtDoubleDash(argv)\n const json = ownAll.includes('--json')\n setJsonStyle(ownAll.includes('--compact') ? 'compact' : 'auto')\n const first = argv[0]\n if (first === '--help' || first === '-h' || first === 'help') {\n const topic = first === 'help' ? argv[1] : undefined\n if (topic === undefined) console.log(formatGlobalHelp())\n else if (Object.hasOwn(COMMANDS, topic)) console.log(formatCommandHelp(COMMANDS[topic]))\n else if (Object.hasOwn(HELP_TOPICS, topic)) console.log(HELP_TOPICS[topic]())\n else {\n const topics = [...Object.keys(HELP_TOPICS), ...Object.keys(COMMANDS)]\n const suggestion = closest(topic, topics)\n return reportError(\n new UsageError(`Unknown help topic \"${topic}\".`, {\n code: 'unknown-topic',\n hint: `${suggestion ? `Did you mean \"vib help ${suggestion}\"? ` : ''}Topics: cases, or any command name.`,\n next: ['vib help cases', 'vib --help'],\n }),\n 'help',\n json,\n false,\n )\n }\n return 0\n }\n if (first === '--version' || first === '-v') {\n console.log(version())\n return 0\n }\n let name = 'run'\n let args = argv\n if (first !== undefined && !first.startsWith('-')) {\n if (!Object.hasOwn(COMMANDS, first)) {\n const suggestion = closest(first, Object.keys(COMMANDS))\n return reportError(\n new UsageError(`Unknown command \"${first}\".`, {\n code: 'unknown-command',\n hint: `${suggestion ? `Did you mean \"vib ${suggestion}\"? ` : ''}Run vib --help to list commands.`,\n next: suggestion ? [`vib ${suggestion} --help`] : ['vib --help'],\n }),\n first,\n json,\n false,\n )\n }\n name = first\n args = argv.slice(1)\n }\n const spec = COMMANDS[name]\n const [own] = splitAtDoubleDash(args)\n if (own.includes('--help') || own.includes('-h')) {\n console.log(formatCommandHelp(spec))\n return 0\n }\n try {\n assertKnownFlags(own, acceptedFlags(spec), name)\n return await spec.run(args)\n } catch (err) {\n return reportError(err, name, json, Boolean(spec.protocolStdout))\n }\n}\n\n/**\n * Grace period before a forced exit. The process normally exits on its own once `main`\n * returned (every session is closed by then); calling process.exit while a socket or pipe\n * is still closing aborts on Windows (UV_HANDLE_CLOSING), so it is only the fallback for\n * something holding the event loop open.\n */\nconst FORCE_EXIT_AFTER_MS = 2000\n\n/** Run `main` and exit with its code once pending I/O has drained. */\nexport async function runCli(argv: string[] = process.argv.slice(2)): Promise<void> {\n const code = await main(argv)\n process.exitCode = code\n setTimeout(() => process.exit(code), FORCE_EXIT_AFTER_MS).unref()\n}\n\nfunction isEntryModule(): boolean {\n const entry = process.argv[1]\n if (!entry) return false\n try {\n return fs.realpathSync(path.resolve(entry)) === fs.realpathSync(fileURLToPath(import.meta.url))\n } catch {\n return false\n }\n}\n\n// `node dist/cli.js ...` runs directly; bin/vib-test.js imports this module and calls runCli().\nif (isEntryModule()) await runCli()\n","import { UriTemplate } from '@modelcontextprotocol/client'\nimport { normalizeResult } from '../normalize.js'\nimport { suggestRespond } from '../respond-hint.js'\nimport { validate } from '../schema.js'\nimport {\n type CallOptions,\n type McpSession,\n type Outcome,\n type ToolError,\n expandUriTemplate,\n} from '../session/index.js'\nimport type { AwaitOptions, JsonValue, NormalizeConfig, ToolSummary } from '../types.js'\nimport {\n UsageError,\n hasFlag,\n parseRespond,\n parseToolArgs,\n positionals,\n printJson,\n stringifyArgs,\n takeNumberFlag,\n unknownNameError,\n} from './args.js'\nimport { colors, formatCallHeader, formatInputRequests, isObject, preview } from './format.js'\nimport { parseCommonFlags, startSession } from './resolve.js'\nimport { listOptional } from './resources.js'\n\nexport type OpKind = 'tool' | 'resource' | 'resourceTemplate' | 'prompt'\n\nexport interface OpSpec {\n kind: OpKind\n /** Tool name, resource URI, URI template, or prompt name. */\n target: string\n args: Record<string, JsonValue>\n}\n\nexport const OP_METHOD: Record<OpKind, string> = {\n tool: 'tools/call',\n resource: 'resources/read',\n resourceTemplate: 'resources/read',\n prompt: 'prompts/get',\n}\n\nexport function opLabel(op: OpSpec): string {\n return `${OP_METHOD[op.kind]} ${op.target}`\n}\n\n/** Run one operation on the session. Templates are expanded with `args`. */\nexport function executeOp(\n session: McpSession,\n op: OpSpec,\n opts: CallOptions = {},\n): Promise<Outcome> {\n switch (op.kind) {\n case 'tool':\n return session.callTool(op.target, op.args, opts)\n case 'resource':\n return session.readResource(op.target, opts)\n case 'resourceTemplate':\n return session.readResourceTemplate(op.target, op.args, opts)\n case 'prompt':\n return session.getPrompt(op.target, stringifyArgs(op.args), opts)\n }\n}\n\n/** `--await` / `--await-timeout <ms>` → CallOptions.await. */\nexport function parseAwait(argv: string[]): AwaitOptions | true | undefined {\n const timeoutMs = takeNumberFlag(argv, '--await-timeout', { min: 1 })\n if (timeoutMs !== undefined) return { timeoutMs }\n return hasFlag(argv, '--await') ? true : undefined\n}\n\n/**\n * Check that the operation's target is something the server lists: a tool, a prompt, a\n * listed resource URI (or one matching a listed template), or a listed template. Throws a\n * did-you-mean UsageError otherwise. Returns the tool definition for tool operations.\n * Lists the server does not support are not checked.\n */\nexport async function resolveTarget(\n session: McpSession,\n op: OpSpec,\n): Promise<{ tool?: ToolSummary }> {\n if (op.kind === 'tool') {\n const tools = await session.listTools()\n const tool = tools.find((t) => t.name === op.target)\n if (!tool)\n throw unknownNameError(\n 'tool',\n op.target,\n tools.map((t) => t.name),\n 'vib tools',\n )\n return { tool }\n }\n const info = await session.discover()\n if (op.kind === 'prompt') {\n const prompts = await listOptional(info.capabilities, 'prompts', 'prompts/list', () =>\n session.listPromptsResult(),\n )\n if (prompts.meta.unsupported) return {}\n if (!prompts.items.some((p) => p.name === op.target)) {\n throw unknownNameError(\n 'prompt',\n op.target,\n prompts.items.map((p) => p.name),\n 'vib prompts',\n )\n }\n return {}\n }\n const templates = await listOptional(\n info.capabilities,\n 'resources',\n 'resources/templates/list',\n () => session.listResourceTemplatesResult(),\n )\n if (op.kind === 'resourceTemplate') {\n if (templates.meta.unsupported) return {}\n if (!templates.items.some((t) => t.uriTemplate === op.target)) {\n throw unknownNameError(\n 'resource template',\n op.target,\n templates.items.map((t) => t.uriTemplate),\n 'vib resources',\n )\n }\n return {}\n }\n const resources = await listOptional(info.capabilities, 'resources', 'resources/list', () =>\n session.listResourcesResult(),\n )\n if (resources.meta.unsupported) return {}\n const listed = resources.items.some((r) => r.uri === op.target)\n const matchesTemplate = templates.items.some((t) => {\n try {\n return new UriTemplate(t.uriTemplate).match(op.target) !== null\n } catch {\n return false\n }\n })\n if (!listed && !matchesTemplate) {\n throw unknownNameError(\n 'resource',\n op.target,\n [...resources.items.map((r) => r.uri), ...templates.items.map((t) => t.uriTemplate)],\n 'vib resources',\n )\n }\n return {}\n}\n\nexport interface Validation {\n /** False when there was nothing to validate against (no outputSchema / not a result). */\n checked: boolean\n ok?: boolean\n errors?: Array<{ path: string; message: string }>\n reason?: string\n}\n\n/** Validate a tools/call result's structuredContent against the tool's outputSchema. */\nexport function validateStructured(tool: ToolSummary | undefined, outcome: Outcome): Validation {\n if (!tool) return { checked: false, reason: 'tool not found in tools/list' }\n if (tool.outputSchema === undefined) {\n return { checked: false, reason: `tool \"${tool.name}\" declares no outputSchema` }\n }\n if (outcome.kind !== 'result') {\n return { checked: false, reason: `no result to validate (${outcome.kind})` }\n }\n const result = outcome.result\n if (isObject(result) && result.resultType === 'task') {\n return { checked: false, reason: 'the server answered with a task (use --await)' }\n }\n if (!isObject(result) || result.structuredContent === undefined) {\n return {\n ok: false,\n checked: true,\n errors: [\n {\n path: 'structuredContent',\n message: 'missing: a tool that declares outputSchema must return structuredContent',\n },\n ],\n }\n }\n const verdict = validate(tool.outputSchema, result.structuredContent)\n return verdict.ok\n ? { checked: true, ok: true }\n : {\n checked: true,\n ok: false,\n errors: verdict.errors.map((e) => ({\n path: e.path ? `structuredContent.${e.path}`.replace('.[', '[') : 'structuredContent',\n message: e.message,\n })),\n }\n}\n\n/** One-line summary of a failed validation: `structuredContent.sum: must be number, got string`. */\nexport function validationSummary(validation: Validation): string {\n return (validation.errors ?? []).map((e) => `${e.path}: ${e.message}`).join('; ')\n}\n\nexport interface OutcomeReport {\n ok: boolean\n operation: OpKind\n method: string\n target: string\n uri?: string\n args: Record<string, JsonValue>\n kind: Outcome['kind']\n durationMs: number\n /** Normalized with config `normalize`, unless `normalized` is false (--raw). */\n result?: JsonValue\n normalized: boolean\n /** The failure, with a next step in `hint`. */\n error?: ToolError & { type: 'ToolError'; hint: string }\n /** The unanswered InputRequests map (kind input_required). */\n requests?: JsonValue\n /** Every InputRequests map answered during the call (one per round). */\n inputRequests?: JsonValue[]\n task?: JsonValue\n validation?: Validation\n warnings?: string[]\n hint?: string\n}\n\nexport function buildReport(\n op: OpSpec,\n outcome: Outcome,\n {\n raw,\n normalize,\n strict = false,\n }: { raw: boolean; normalize: NormalizeConfig; strict?: boolean },\n validation?: Validation,\n replay?: string,\n): OutcomeReport {\n const norm = (value: JsonValue) => (raw ? value : normalizeResult(value, normalize))\n const invalidOutput = validation?.checked === true && validation.ok === false\n const report: OutcomeReport = {\n ok: outcome.kind === 'result' && !(strict && invalidOutput),\n operation: op.kind,\n method: OP_METHOD[op.kind],\n target: op.target,\n ...(op.kind === 'resourceTemplate' ? { uri: expandUriTemplate(op.target, op.args) } : {}),\n args: op.args,\n kind: outcome.kind,\n durationMs: outcome.durationMs,\n normalized: !raw,\n }\n if (outcome.kind === 'result') report.result = norm(outcome.result)\n if (outcome.kind === 'error') {\n report.error = { type: 'ToolError', ...outcome.error, hint: errorHint(outcome.error, op) }\n if (outcome.result !== undefined) report.result = norm(outcome.result)\n }\n if (outcome.kind === 'input_required') {\n report.requests = outcome.requests\n const respond = JSON.stringify(suggestRespond(outcome.requests))\n report.hint = `The server asked for input and nothing answered. Re-run with --respond '${respond}'${replay ? ` (e.g. ${replay} --respond '${respond}')` : ''}.`\n } else if (outcome.inputRequests) report.inputRequests = outcome.inputRequests\n if (outcome.task !== undefined) {\n report.task = outcome.task\n if (\n outcome.kind === 'result' &&\n isObject(outcome.result) &&\n outcome.result.resultType === 'task'\n )\n report.hint =\n 'The server answered with a task. Re-run with --await to poll tasks/get until it finishes.'\n }\n if (validation) report.validation = validation\n if (invalidOutput) {\n const text = `structuredContent does not match the outputSchema of \"${op.target}\": ${validationSummary(validation as Validation)}`\n if (strict) report.hint ??= 'Fix the tool so its structuredContent matches its outputSchema.'\n else report.warnings = [`${text}. vib run would fail this; re-run with --validate for details.`]\n }\n return report\n}\n\nfunction errorHint(error: ToolError, op: OpSpec): string {\n if (error.kind === 'timeout') return 'Raise --timeout if the server is legitimately slow.'\n if (error.kind === 'transport')\n return 'The connection failed; run the server command by hand to see why it exits.'\n if (error.kind === 'tool')\n return 'The tool ran and reported an error (isError: true). Use vib record to capture it as expectError.'\n if (error.code === -32602 && op.kind === 'tool')\n return `Check the arguments against the tool's inputSchema (vib tools ${op.target} shows it).`\n if (error.code === -32601) return 'The server does not implement this method.'\n return 'See the server logs for details.'\n}\n\nexport function printReport(report: OutcomeReport): void {\n const c = colors()\n const time = c.dim(`(${report.durationMs}ms)`)\n if (report.kind === 'result') {\n console.log(`${c.green('✓ result')} ${time}`)\n console.log(JSON.stringify(report.result, null, 2))\n } else if (report.kind === 'error' && report.error) {\n const e = report.error\n const code = [e.codeName, e.code].filter((v) => v !== undefined).join(' ')\n console.error(\n `${c.red('✗ error')}${code ? ` [${code}]` : ''} ${c.dim(`(${e.kind}${e.local ? ', raised locally' : ''})`)} ${time}`,\n )\n console.error(` ${e.message}`)\n if (e.data !== undefined) console.error(` data: ${preview(e.data, 200)}`)\n if (report.result !== undefined) console.log(JSON.stringify(report.result, null, 2))\n console.error(c.dim(`hint: ${e.hint}`))\n } else if (report.kind === 'input_required') {\n console.error(`${c.yellow('⏸ input required')} ${time} — the server asked for:`)\n for (const line of formatInputRequests(report.requests ?? null)) console.error(line)\n }\n const v = report.validation\n if (v?.checked && v.ok === false) {\n const paint = report.ok ? c.yellow : c.red\n console.log(\n paint(`${report.ok ? '!' : '✗'} structuredContent does not match the outputSchema:`),\n )\n for (const e of v.errors ?? []) console.log(` ${e.path}: ${e.message}`)\n if (report.ok)\n console.log(c.dim(' vib run would fail this; --validate makes it fail here too.'))\n } else if (v?.checked && v.ok) console.log(c.green('✓ structuredContent matches outputSchema'))\n else if (v && !v.checked) console.log(c.dim(`validation skipped: ${v.reason}`))\n if (report.hint && report.kind !== 'result') console.error(c.dim(`hint: ${report.hint}`))\n else if (report.hint) console.log(c.dim(`hint: ${report.hint}`))\n}\n\n/** Shell-ish rendering of a replay command (for hints). */\nexport function replayCommand(parts: string[]): string {\n return parts.map((p) => (/^[\\w./:@=-]+$/.test(p) ? p : `'${p.replace(/'/g, \"'\\\\''\")}'`)).join(' ')\n}\n\nexport interface OneShotSpec {\n command: 'call' | 'read' | 'get-prompt'\n usage: string\n build(positional: string, argv: string[]): OpSpec\n}\n\n/** Shared body of `call`, `read`, `get-prompt`. */\nexport async function runOneShot(spec: OneShotSpec, argv: string[]): Promise<number> {\n const [positional] = positionals(argv)\n if (!positional) {\n throw new UsageError('Missing argument.', {\n code: 'missing-argument',\n hint: `Usage: ${spec.usage}`,\n })\n }\n const op = spec.build(positional, argv)\n const flags = parseCommonFlags(argv)\n const raw = hasFlag(argv, '--raw')\n const strict = hasFlag(argv, '--validate')\n if (strict && op.kind !== 'tool') {\n throw new UsageError('--validate only applies to vib call (tools with an outputSchema).', {\n code: 'invalid-argument',\n hint: 'Drop --validate.',\n })\n }\n const respond = parseRespond(argv)\n const awaitOpt = parseAwait(argv)\n const { session, options } = await startSession(flags)\n try {\n let tool: ToolSummary | undefined\n if (!hasFlag(argv, '--expect-missing')) tool = (await resolveTarget(session, op)).tool\n else if (op.kind === 'tool')\n tool = (await session.listTools()).find((t) => t.name === op.target)\n if (!flags.json) console.log(formatCallHeader(opLabel(op), op.args))\n const outcome = await executeOp(session, op, {\n ...(respond ? { respond } : {}),\n ...(awaitOpt !== undefined ? { await: awaitOpt } : {}),\n })\n const validation = op.kind === 'tool' ? validateStructured(tool, outcome) : undefined\n const report = buildReport(\n op,\n outcome,\n { raw, normalize: options.normalize, strict },\n validation?.checked || strict ? validation : undefined,\n replayCommand(['vib', spec.command, positional, ...argv.filter((a) => a !== positional)]),\n )\n if (flags.json) printJson(report)\n else printReport(report)\n return report.ok ? 0 : 1\n } finally {\n await session.close()\n }\n}\n\nexport const CALL_SPEC: OneShotSpec = {\n command: 'call',\n usage: `vib call <tool> [--args '{\"key\":\"value\"}'] [--arg key=value] [--respond '{...}'] [--await] [--validate] [--raw]`,\n build: (tool, argv) => ({ kind: 'tool', target: tool, args: parseToolArgs(argv) }),\n}\n\nexport async function callCommand(argv: string[]): Promise<number> {\n return runOneShot(CALL_SPEC, argv)\n}\n","/**\n * Human output for the CLI: colors (only on a TTY, honoring NO_COLOR / FORCE_COLOR),\n * aligned tables, schema summaries, and help pages. `--json` output never goes through\n * this module.\n */\nimport { type Colors, createColors, resolveStyle, visibleLength } from '../reporters/ansi.js'\nimport type {\n JsonValue,\n PromptSummary,\n ResourceSummary,\n ResourceTemplateSummary,\n ToolSummary,\n} from '../types.js'\n\nlet cached: Colors | undefined\n\n/** Colors for stdout: enabled on a TTY unless NO_COLOR / TERM=dumb; FORCE_COLOR forces. */\nexport function colors(): Colors {\n cached ??= createColors(\n resolveStyle(true, process.env, Boolean(process.stdout.isTTY)) === 'pretty',\n )\n return cached\n}\n\n/** Reset the cached color decision (tests toggle TTY/env). */\nexport function resetColors(): void {\n cached = undefined\n}\n\nexport function isObject(value: unknown): value is Record<string, JsonValue> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function firstLine(text: string | undefined): string {\n if (!text) return ''\n const trimmed = text.trim()\n const idx = trimmed.search(/\\r?\\n/)\n return idx === -1 ? trimmed : trimmed.slice(0, idx).trim()\n}\n\nexport function truncate(text: string, max: number): string {\n if (max <= 1) return text.length > 0 ? '…' : ''\n return text.length > max ? `${text.slice(0, max - 1)}…` : text\n}\n\nexport function plural(count: number, one: string, many = `${one}s`): string {\n return `${count} ${count === 1 ? one : many}`\n}\n\n/** Compact one-line JSON, truncated. */\nexport function preview(value: unknown, max = 80): string {\n const text = value === undefined ? 'undefined' : (JSON.stringify(value) ?? String(value))\n return truncate(text, max)\n}\n\n/** Terminal width for tables: the TTY's columns, else 120. */\nexport function terminalWidth(): number {\n const cols = process.stdout.columns\n return typeof cols === 'number' && cols > 40 ? cols : 120\n}\n\n// ---------------------------------------------------------------------------\n// Tables\n// ---------------------------------------------------------------------------\n\nexport interface Column {\n header: string\n /** The column that shrinks (truncated with …) when the table is too wide. */\n flex?: boolean\n paint?: (text: string) => string\n}\n\n/**\n * Render rows as an aligned table: a header row, then one line per row. Cells are plain\n * strings (painted after padding, so alignment survives colors). The flex column is\n * truncated so the table fits `width`.\n */\nexport function renderTable(columns: Column[], rows: string[][], width = terminalWidth()): string {\n const c = colors()\n const gap = 2\n const widths = columns.map((col, i) =>\n Math.max(col.header.length, ...rows.map((row) => visibleLength(row[i] ?? ''))),\n )\n const total = widths.reduce((a, b) => a + b, 0) + gap * (columns.length - 1)\n const flex = columns.findIndex((col) => col.flex)\n if (flex !== -1 && total > width) {\n widths[flex] = Math.max(columns[flex].header.length, 12, widths[flex] - (total - width))\n }\n const line = (cells: string[], header: boolean) =>\n cells\n .map((cell, i) => {\n const text = truncate(cell ?? '', widths[i])\n const padded = i === cells.length - 1 ? text : text.padEnd(widths[i])\n if (header) return c.dim(padded)\n const paint = columns[i].paint\n return paint ? paint(padded) : padded\n })\n .join(' '.repeat(gap))\n .trimEnd()\n return [\n line(\n columns.map((col) => col.header),\n true,\n ),\n ...rows.map((row) => line(row, false)),\n ].join('\\n')\n}\n\n// ---------------------------------------------------------------------------\n// Schema summaries\n// ---------------------------------------------------------------------------\n\n/** Short type label for a JSON Schema node: `string`, `integer[]`, `\"a\"|\"b\"`, `object`. */\nexport function schemaTypeLabel(schema: JsonValue | undefined): string {\n if (!isObject(schema)) return schema === true || schema === undefined ? 'any' : 'never'\n if (Array.isArray(schema.enum)) {\n const values = schema.enum.slice(0, 4).map((v) => JSON.stringify(v))\n return `${values.join('|')}${schema.enum.length > 4 ? '|…' : ''}`\n }\n if (schema.const !== undefined) return JSON.stringify(schema.const)\n const type = schema.type\n if (Array.isArray(type)) return type.map(String).join('|')\n if (type === 'array') {\n const items = schema.items\n return `${isObject(items) ? schemaTypeLabel(items) : 'any'}[]`\n }\n if (typeof type === 'string') return type\n for (const key of ['anyOf', 'oneOf'] as const) {\n const branches = schema[key]\n if (Array.isArray(branches)) return branches.map((b) => schemaTypeLabel(b)).join('|')\n }\n if (typeof schema.$ref === 'string') return schema.$ref.split('/').pop() ?? 'ref'\n if (isObject(schema.properties)) return 'object'\n return 'any'\n}\n\n/** `text*: string, uppercase: boolean` (required args marked `*`). '' when no properties. */\nexport function argSummary(inputSchema: JsonValue | undefined, max = 6): string {\n if (!isObject(inputSchema) || !isObject(inputSchema.properties)) return ''\n const required = Array.isArray(inputSchema.required)\n ? inputSchema.required.filter((v): v is string => typeof v === 'string')\n : []\n const entries = Object.entries(inputSchema.properties)\n const parts = entries\n .slice(0, max)\n .map(([name, prop]) => `${name}${required.includes(name) ? '*' : ''}: ${schemaTypeLabel(prop)}`)\n if (entries.length > max) parts.push(`+${entries.length - max} more`)\n return parts.join(', ')\n}\n\n/** `name*, style` from prompt arguments. */\nexport function promptArgSummary(prompt: PromptSummary): string {\n return (prompt.arguments ?? []).map((a) => `${a.name}${a.required ? '*' : ''}`).join(', ')\n}\n\nfunction toolHints(tool: ToolSummary): string {\n const hints: string[] = []\n const ann = isObject(tool.annotations) ? tool.annotations : {}\n if (ann.readOnlyHint === true) hints.push('read-only')\n if (ann.destructiveHint === true) hints.push('destructive')\n if (ann.idempotentHint === true) hints.push('idempotent')\n if (ann.openWorldHint === true) hints.push('open-world')\n if (tool.outputSchema !== undefined) hints.push('structured')\n const execution = isObject(tool.execution) ? tool.execution : {}\n if (typeof execution.taskSupport === 'string' && execution.taskSupport !== 'forbidden') {\n hints.push(`task:${execution.taskSupport}`)\n }\n return hints.join(' ')\n}\n\nexport interface ListMetaLike {\n ttlMs?: number\n cacheScope?: string\n}\n\n/** `cache: 60000 ms (public)` from list-level ttlMs / cacheScope ('' when neither is set). */\nexport function formatListMeta(meta: ListMetaLike | undefined): string {\n if (!meta || (meta.ttlMs === undefined && meta.cacheScope === undefined)) return ''\n const ttl = meta.ttlMs !== undefined ? `${meta.ttlMs} ms` : 'no ttl'\n return `cache: ${ttl}${meta.cacheScope !== undefined ? ` (${meta.cacheScope})` : ''}`\n}\n\nfunction heading(text: string, meta?: ListMetaLike): string {\n const c = colors()\n const suffix = formatListMeta(meta)\n return `${c.bold(c.cyan(text))}${suffix ? ` ${c.dim(suffix)}` : ''}`\n}\n\nexport function formatToolList(tools: ToolSummary[], meta?: ListMetaLike): string {\n if (tools.length === 0) {\n return 'No tools registered on this server. If you expected some, check the server logs (vib discover shows its capabilities).'\n }\n const c = colors()\n const rows = tools.map((tool) => [\n tool.name,\n tool.title ?? '',\n firstLine(tool.description),\n argSummary(tool.inputSchema) || '-',\n toolHints(tool),\n ])\n return [\n heading(plural(tools.length, 'tool'), meta),\n '',\n renderTable(\n [\n { header: 'NAME', paint: (t) => c.bold(t) },\n { header: 'TITLE' },\n { header: 'DESCRIPTION', flex: true, paint: (t) => c.gray(t) },\n { header: 'ARGS (* required)' },\n { header: 'HINTS', paint: (t) => c.dim(t) },\n ],\n rows,\n ),\n '',\n c.dim('Next: vib call <tool> --arg key=value · vib record <tool> --arg key=value'),\n ].join('\\n')\n}\n\n/** `vib tools <name>`: everything about one tool. */\nexport function formatToolDetail(tool: ToolSummary): string {\n const c = colors()\n const out: string[] = [`${c.bold(c.cyan(tool.name))}${tool.title ? ` ${tool.title}` : ''}`]\n const hints = toolHints(tool)\n if (hints) out.push(c.dim(hints))\n out.push('')\n out.push(c.bold('Description'))\n out.push(\n ...(tool.description?.trim() ? tool.description.trim().split(/\\r?\\n/) : ['(none)']).map(\n (line) => ` ${line}`,\n ),\n )\n const schema = isObject(tool.inputSchema) ? tool.inputSchema : {}\n const props = isObject(schema.properties) ? schema.properties : {}\n const required = Array.isArray(schema.required) ? schema.required.map(String) : []\n out.push('', c.bold('Arguments'))\n if (Object.keys(props).length === 0) out.push(' (none)')\n for (const [name, prop] of Object.entries(props)) {\n const description =\n isObject(prop) && typeof prop.description === 'string' ? ` ${c.gray(prop.description)}` : ''\n out.push(\n ` ${c.bold(name)}${required.includes(name) ? '*' : ''}: ${schemaTypeLabel(prop)}${description}`,\n )\n }\n out.push('', c.bold('inputSchema'), indentJson(tool.inputSchema))\n if (tool.outputSchema !== undefined)\n out.push('', c.bold('outputSchema'), indentJson(tool.outputSchema))\n if (tool.annotations !== undefined)\n out.push('', c.bold('annotations'), indentJson(tool.annotations))\n if (tool.execution !== undefined) out.push('', c.bold('execution'), indentJson(tool.execution))\n out.push(\n '',\n c.dim(\n `Next: vib call ${tool.name} --arg key=value · vib record ${tool.name} · vib fuzz ${tool.name}`,\n ),\n )\n return out.join('\\n')\n}\n\nexport function formatResourceList(\n resources: ResourceSummary[],\n templates: ResourceTemplateSummary[],\n meta: { resources?: ListMetaLike; resourceTemplates?: ListMetaLike } = {},\n notes: string[] = [],\n): string {\n const c = colors()\n const out: string[] = []\n out.push(heading(plural(resources.length, 'resource'), meta.resources))\n if (resources.length > 0) {\n out.push(\n '',\n renderTable(\n [\n { header: 'URI', paint: (t) => c.bold(t) },\n { header: 'NAME' },\n { header: 'MIME' },\n { header: 'DESCRIPTION', flex: true, paint: (t) => c.gray(t) },\n ],\n resources.map((r) => [r.uri, r.name, r.mimeType ?? '', firstLine(r.description)]),\n ),\n )\n }\n out.push('', heading(plural(templates.length, 'resource template'), meta.resourceTemplates))\n if (templates.length > 0) {\n out.push(\n '',\n renderTable(\n [\n { header: 'URI TEMPLATE', paint: (t) => c.bold(t) },\n { header: 'NAME' },\n { header: 'MIME' },\n { header: 'DESCRIPTION', flex: true, paint: (t) => c.gray(t) },\n ],\n templates.map((t) => [t.uriTemplate, t.name, t.mimeType ?? '', firstLine(t.description)]),\n ),\n )\n }\n for (const note of notes) out.push('', c.yellow(note))\n out.push(\n '',\n c.dim(\n \"Next: vib read <uri> · vib read '<template>' --arg id=42 · vib record --resource <uri>\",\n ),\n )\n return out.join('\\n')\n}\n\nexport function formatPromptList(\n prompts: PromptSummary[],\n meta?: ListMetaLike,\n notes: string[] = [],\n): string {\n const c = colors()\n const out = [heading(plural(prompts.length, 'prompt'), meta)]\n if (prompts.length > 0) {\n out.push(\n '',\n renderTable(\n [\n { header: 'NAME', paint: (t) => c.bold(t) },\n { header: 'TITLE' },\n { header: 'DESCRIPTION', flex: true, paint: (t) => c.gray(t) },\n { header: 'ARGS (* required)' },\n ],\n prompts.map((p) => [p.name, p.title ?? '', firstLine(p.description), promptArgSummary(p)]),\n ),\n )\n }\n for (const note of notes) out.push('', c.yellow(note))\n out.push(\n '',\n c.dim('Next: vib get-prompt <name> --arg key=value · vib record --prompt <name>'),\n )\n return out.join('\\n')\n}\n\n// ---------------------------------------------------------------------------\n// Banners\n// ---------------------------------------------------------------------------\n\nexport function formatCallHeader(op: string, args: unknown): string {\n const c = colors()\n const shown = args && isObject(args) && Object.keys(args).length === 0 ? '' : preview(args, 200)\n return `${c.cyan('→')} ${c.bold(op)}${shown ? ` ${c.gray(shown)}` : ''}`\n}\n\nexport function formatSuccessBanner(text: string): string {\n return colors().green(text)\n}\n\nexport function formatErrorBanner(text: string): string {\n return colors().red(text)\n}\n\nexport function formatWarnBanner(text: string): string {\n return colors().yellow(text)\n}\n\n/** Pretty JSON, indented by `indent` spaces. */\nexport function indentJson(value: unknown, indent = 2): string {\n const pad = ' '.repeat(indent)\n return (JSON.stringify(value, null, 2) ?? 'undefined')\n .split('\\n')\n .map((line) => pad + line)\n .join('\\n')\n}\n\n/**\n * Describe an InputRequests map ({ key: { method, params } }) for humans: one block per\n * request with the message and requested fields.\n */\nexport function formatInputRequests(requests: JsonValue): string[] {\n const c = colors()\n const lines: string[] = []\n const entries = isObject(requests) ? Object.entries(requests) : []\n for (const [key, entry] of entries) {\n const request = isObject(entry) ? entry : {}\n const method = typeof request.method === 'string' ? request.method : '(unknown method)'\n const params = isObject(request.params) ? request.params : {}\n lines.push(` ${c.bold(method)} ${c.dim(`(request \"${key}\")`)}`)\n if (typeof params.message === 'string') lines.push(` message: ${params.message}`)\n if (typeof params.url === 'string') lines.push(` url: ${params.url}`)\n const schema = isObject(params.requestedSchema) ? params.requestedSchema : undefined\n if (schema) lines.push(` fields: ${argSummary(schema) || preview(schema)}`)\n if (method === 'sampling/createMessage' && Array.isArray(params.messages)) {\n lines.push(` messages: ${preview(params.messages, 160)}`)\n }\n }\n if (lines.length === 0) lines.push(` ${preview(requests, 200)}`)\n return lines\n}\n\n/** @deprecated name; use `suggestRespond` from src/respond-hint.ts. */\nexport { suggestRespond, suggestRespond as sampleRespond } from '../respond-hint.js'\n\n// ---------------------------------------------------------------------------\n// Help\n// ---------------------------------------------------------------------------\n\nexport interface FlagHelp {\n flag: string\n text: string\n}\n\nexport interface CommandHelp {\n name: string\n group: string\n summary: string\n usage: string[]\n description?: string\n flags?: FlagHelp[]\n /** Include the shared connection flags section (--config, --server, ...). */\n common?: boolean\n examples?: string[]\n /** Accepted flags beyond `flags` / common ones (for unknown-flag checks). */\n extraFlags?: string[]\n}\n\nexport const COMMON_FLAGS: FlagHelp[] = [\n { flag: '--config <path>', text: 'vibrissa.json / .jsonc / package.json#vibrissa' },\n {\n flag: '--server <name|cmd|url>',\n text: 'A server from config, a command line (\"node dist/index.js\"), or an http(s) URL',\n },\n { flag: '--profile <name>', text: 'Merge profiles.<name> over the config' },\n { flag: '--protocol <mode>', text: 'auto (default) | legacy | modern | <YYYY-MM-DD>' },\n { flag: '--timeout <ms>', text: 'Per-request timeout (also bounds spawn)' },\n { flag: '--env KEY=VALUE', text: 'Extra env var for stdio servers (repeatable)' },\n { flag: '--server-cwd <dir>', text: 'Working directory for a stdio server' },\n { flag: '--json', text: 'Machine-readable output (one stable JSON object on stdout)' },\n { flag: '--compact', text: 'Single-line JSON even on a terminal (piped output is compact)' },\n]\n\nfunction flagTable(flags: FlagHelp[]): string[] {\n const width = Math.min(30, Math.max(...flags.map((f) => f.flag.length)))\n return flags.map((f) =>\n f.flag.length > width\n ? ` ${f.flag}\\n ${' '.repeat(width)} ${f.text}`\n : ` ${f.flag.padEnd(width)} ${f.text}`,\n )\n}\n\nexport function formatCommandHelp(help: CommandHelp): string {\n const c = colors()\n const out: string[] = [`${c.bold(`vib ${help.name}`)} — ${help.summary}`, '', c.bold('Usage:')]\n for (const usage of help.usage) out.push(` ${usage}`)\n if (help.description) out.push('', ...help.description.split('\\n').map((l) => ` ${l}`.trimEnd()))\n if (help.flags?.length) out.push('', c.bold('Options:'), ...flagTable(help.flags))\n if (help.common) out.push('', c.bold('Connection options:'), ...flagTable(COMMON_FLAGS))\n if (help.examples?.length) {\n out.push('', c.bold('Examples:'), ...help.examples.map((e) => ` ${e}`))\n }\n out.push(\n '',\n c.dim(\n 'Exit codes: 0 ok · 1 failed (assertion, check, tool error) · 2 usage/config/connection error',\n ),\n )\n return out.join('\\n')\n}\n\n/** Every flag a command accepts (for unknown-flag detection). */\nexport function acceptedFlags(help: CommandHelp): Set<string> {\n const names = new Set<string>(['--help', '--json', '--compact'])\n for (const f of [...(help.flags ?? []), ...(help.common ? COMMON_FLAGS : [])]) {\n for (const raw of f.flag.split(/[\\s,/]+/)) {\n // `--update[=all]` → `--update`; `--seed=<n>` → `--seed`\n const token = raw.replace(/\\[.*$/, '').replace(/=.*$/, '')\n if (token.startsWith('--')) names.add(token)\n }\n }\n for (const extra of help.extraFlags ?? []) names.add(extra)\n return names\n}\n","import path from 'node:path'\nimport { type ConfigOverrides, loadConfig, loadConfigFile, parseProtocolMode } from '../config.js'\nimport { resolveRootDir, resolveServerConfig } from '../paths.js'\nimport { McpSession, type SessionOptions, SessionStartError } from '../session/index.js'\nimport type { ProtocolMode, RunOptions, ServerConfig } from '../types.js'\nimport { isHttpServerConfig } from '../types.js'\nimport {\n UsageError,\n hasFlag,\n parseEnvPairs,\n resolvePathFromCwd,\n splitCommandLine,\n takeAllFlags,\n takeFlag,\n} from './args.js'\n\nexport interface CommonCliFlags {\n configPath?: string\n /** Raw `--server` value: a server name from config, an http(s) URL, or a command line. */\n server?: string\n /** `--server` split as a command line (meaningful when it is not a server name or URL). */\n serverCmd?: string\n serverArgs?: string[]\n serverCwd?: string\n env?: Record<string, string>\n timeoutMs?: number\n json?: boolean\n profile?: string\n protocol?: ProtocolMode\n}\n\nexport function parseCommonFlags(argv: string[]): CommonCliFlags {\n const configPath = takeFlag(argv, '--config')\n const serverRaw = takeFlag(argv, '--server')\n const serverCwd = takeFlag(argv, '--server-cwd')\n const timeoutRaw = takeFlag(argv, '--timeout')\n const profile = takeFlag(argv, '--profile')\n const protocolRaw = takeFlag(argv, '--protocol')\n const env = parseEnvPairs(takeAllFlags(argv, '--env'))\n\n let serverCmd: string | undefined\n let serverArgs: string[] | undefined\n if (serverRaw !== undefined && serverRaw.trim() === '') {\n throw new UsageError('Empty --server value.', {\n code: 'invalid-argument',\n hint: 'Pass a server name from vibrissa.json, a command line (\"node dist/index.js\") or a URL.',\n })\n }\n if (serverRaw !== undefined && !/^https?:\\/\\//i.test(serverRaw.trim())) {\n const split = splitCommandLine(serverRaw)\n serverCmd = split.cmd\n serverArgs = split.args\n }\n\n let protocol: ProtocolMode | undefined\n if (protocolRaw !== undefined) {\n protocol = parseProtocolMode(protocolRaw, () => {\n throw new UsageError(`Invalid --protocol value \"${protocolRaw}\".`, {\n code: 'invalid-argument',\n hint: 'Use auto, legacy, modern, or a revision like 2026-07-28.',\n })\n })\n }\n let timeoutMs: number | undefined\n if (timeoutRaw !== undefined) {\n timeoutMs = Number(timeoutRaw)\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new UsageError(`Invalid --timeout value \"${timeoutRaw}\".`, {\n code: 'invalid-argument',\n hint: 'Pass milliseconds, e.g. --timeout 5000.',\n })\n }\n }\n\n return {\n configPath,\n server: serverRaw,\n serverCmd,\n serverArgs,\n serverCwd,\n env: Object.keys(env).length > 0 ? env : undefined,\n timeoutMs,\n json: hasFlag(argv, '--json'),\n profile,\n protocol,\n }\n}\n\n/** Translate parsed CLI flags into the config loader's override layer. */\nexport function cliOverrides(flags: CommonCliFlags, extra: ConfigOverrides = {}): ConfigOverrides {\n const serverCwd = flags.serverCwd\n ? path.isAbsolute(flags.serverCwd)\n ? flags.serverCwd\n : resolvePathFromCwd(flags.serverCwd)\n : undefined\n return {\n ...extra,\n ...(flags.server !== undefined ? { server: flags.server } : {}),\n ...(serverCwd ? { serverCwd } : {}),\n ...(flags.env || extra.env ? { env: { ...(extra.env ?? {}), ...(flags.env ?? {}) } } : {}),\n ...(typeof flags.timeoutMs === 'number' ? { timeoutMs: flags.timeoutMs } : {}),\n ...(flags.protocol !== undefined ? { protocol: flags.protocol } : {}),\n }\n}\n\n/**\n * Resolve RunOptions for a CLI command: defaults → config file → --profile → flags/overrides.\n * Config warnings are printed to stderr unless `quiet`.\n */\nexport function mergeCliOptions(\n flags: CommonCliFlags,\n overrides: ConfigOverrides = {},\n { quiet = false }: { quiet?: boolean } = {},\n): RunOptions {\n const { options, warnings } = loadConfig(process.cwd(), {\n configPath: flags.configPath,\n profile: flags.profile,\n overrides: cliOverrides(flags, overrides),\n })\n if (!quiet) for (const warning of warnings) console.warn(`warning: ${warning}`)\n return options\n}\n\n/** True when no config file is found for these flags (built-in defaults apply). */\nexport function usingDefaultConfig(flags: CommonCliFlags): boolean {\n if (flags.configPath) return false\n try {\n return loadConfigFile(process.cwd()) === undefined\n } catch {\n return false\n }\n}\n\nexport const NO_CONFIG_HINT =\n \"No vibrissa.json found; using the default server command `node dist/index.js`. Run vib init --server '<cmd>' to configure yours (or pass --server).\"\n\nexport function openSessionOptions(flags: CommonCliFlags): {\n options: RunOptions\n server: ServerConfig\n serverName: string\n rootDir: string\n timeoutMs: number\n /** No config file and no --server: the built-in `node dist/index.js` is used. */\n defaulted: boolean\n} {\n const options = mergeCliOptions(flags)\n const defaulted = flags.server === undefined && usingDefaultConfig(flags)\n if (defaulted && !flags.json) console.warn(`note: ${NO_CONFIG_HINT}`)\n return {\n defaulted,\n options,\n server: resolveServerConfig(options),\n serverName: options.defaultServer,\n rootDir: resolveRootDir(options),\n timeoutMs: options.timeoutMs,\n }\n}\n\n/** Human label for a server: `stdio: node dist/index.js` / `http: https://...`. */\nexport function describeServerTarget(server: ServerConfig): string {\n if (isHttpServerConfig(server)) return `http: ${server.url}`\n return `stdio: ${[server.cmd, ...(server.args ?? [])].join(' ')}`\n}\n\nexport interface StartedSession {\n session: McpSession\n options: RunOptions\n server: ServerConfig\n serverName: string\n rootDir: string\n timeoutMs: number\n}\n\n/**\n * Resolve config + flags and connect. Server stderr is captured (kept off the console,\n * shown in start errors) unless `stderr` is overridden.\n */\nexport async function startSession(\n flags: CommonCliFlags,\n extra: Partial<SessionOptions> = {},\n resolved: ReturnType<typeof openSessionOptions> = openSessionOptions(flags),\n): Promise<StartedSession> {\n let session: McpSession\n try {\n session = await McpSession.start(resolved.server, {\n timeoutMs: resolved.timeoutMs,\n stderr: 'capture',\n ...extra,\n })\n } catch (err) {\n // The note was already printed unless --json suppressed it; say it once.\n if (resolved.defaulted && flags.json && err instanceof SessionStartError) {\n throw new SessionStartError(`${err.message} ${NO_CONFIG_HINT}`, err.code, err.stderr, {\n cause: err,\n })\n }\n throw err\n }\n return { session, ...resolved }\n}\n\n/**\n * The server name `vib record` should write into a case: `--server X` when X is a server\n * configured in vibrissa.json other than its defaultServer; undefined otherwise (no flag,\n * the default server, or a command line / URL, which a case cannot name).\n */\nexport function caseServerName(flags: CommonCliFlags): string | undefined {\n if (flags.server === undefined) return undefined\n const base = mergeCliOptions(\n { ...flags, server: undefined, serverCmd: undefined, serverArgs: undefined },\n {},\n { quiet: true },\n )\n if (!Object.hasOwn(base.servers, flags.server)) return undefined\n return flags.server === base.defaultServer ? undefined : flags.server\n}\n\nexport interface ChecksConfig {\n allow?: string[]\n severity?: Record<string, 'failed' | 'warned'>\n}\n\n/**\n * The `checks` section (allow-list + severity overrides for `vib check` / `--check`), as\n * resolved by config.ts (file → profile, allow lists accumulated). Pass already-resolved\n * `options` to avoid loading the config twice.\n */\nexport function loadChecksConfig(flags: CommonCliFlags, options?: RunOptions): ChecksConfig {\n const resolved = options ?? mergeCliOptions(flags, {}, { quiet: true })\n if (resolved.checks !== undefined) return resolved.checks\n return rawChecksConfig(flags)\n}\n\n/** Fallback for a config loader that does not resolve `checks`: read the raw file. */\nfunction rawChecksConfig(flags: CommonCliFlags): ChecksConfig {\n const loaded = loadConfigFile(process.cwd(), flags.configPath)\n if (!loaded) return {}\n const raw = loaded.config as Record<string, unknown>\n const base = pickChecks(raw.checks)\n const profiles = raw.profiles as Record<string, Record<string, unknown>> | undefined\n const profile =\n flags.profile !== undefined ? pickChecks(profiles?.[flags.profile]?.checks) : undefined\n return {\n ...(base.allow || profile?.allow\n ? { allow: [...(base.allow ?? []), ...(profile?.allow ?? [])] }\n : {}),\n ...(base.severity || profile?.severity\n ? { severity: { ...(base.severity ?? {}), ...(profile?.severity ?? {}) } }\n : {}),\n }\n}\n\nfunction pickChecks(value: unknown): ChecksConfig {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return {}\n const record = value as Record<string, unknown>\n const out: ChecksConfig = {}\n if (Array.isArray(record.allow)) {\n out.allow = record.allow.filter((v): v is string => typeof v === 'string')\n }\n if (typeof record.severity === 'object' && record.severity !== null) {\n const severity: Record<string, 'failed' | 'warned'> = {}\n for (const [id, level] of Object.entries(record.severity as Record<string, unknown>)) {\n if (level === 'failed' || level === 'warned') severity[id] = level\n }\n out.severity = severity\n }\n return out\n}\n","import { type McpSession, SessionRequestError } from '../session/index.js'\nimport type { JsonValue, ListResult } from '../types.js'\nimport { printJson } from './args.js'\nimport { formatResourceList, isObject } from './format.js'\nimport { parseCommonFlags, startSession } from './resolve.js'\n\nexport interface ListMetaEntry {\n ttlMs?: number\n cacheScope?: string\n _meta?: JsonValue\n /** The list was not fetched: capability not advertised, or MethodNotFound. */\n unsupported?: true\n}\n\nexport interface OptionalList<T> {\n items: T[]\n meta: ListMetaEntry\n /** Human note when the list was skipped. */\n note?: string\n}\n\nexport function metaOf<T>(list: ListResult<T>): ListMetaEntry {\n return {\n ...(list.ttlMs !== undefined ? { ttlMs: list.ttlMs } : {}),\n ...(list.cacheScope !== undefined ? { cacheScope: list.cacheScope } : {}),\n ...(list._meta !== undefined ? { _meta: list._meta } : {}),\n }\n}\n\n/**\n * Fetch a list the server may not support: skipped (with a note) when the capability is\n * not advertised, and treated as empty on MethodNotFound. Other errors propagate.\n */\nexport async function listOptional<T>(\n capabilities: JsonValue,\n capability: 'tools' | 'resources' | 'prompts',\n method: string,\n fetch: () => Promise<ListResult<T>>,\n): Promise<OptionalList<T>> {\n if (isObject(capabilities) && capabilities[capability] === undefined) {\n return {\n items: [],\n meta: { unsupported: true },\n note: `Server does not advertise the \"${capability}\" capability; ${method} was not called.`,\n }\n }\n try {\n const list = await fetch()\n return { items: list.items, meta: metaOf(list) }\n } catch (err) {\n if (err instanceof SessionRequestError && err.error.code === -32601) {\n return {\n items: [],\n meta: { unsupported: true },\n note: `Server answered MethodNotFound for ${method} although it advertises \"${capability}\".`,\n }\n }\n throw err\n }\n}\n\nexport async function listResourcesAndTemplates(session: McpSession) {\n const info = await session.discover()\n const resources = await listOptional(info.capabilities, 'resources', 'resources/list', () =>\n session.listResourcesResult(),\n )\n const resourceTemplates = await listOptional(\n info.capabilities,\n 'resources',\n 'resources/templates/list',\n () => session.listResourceTemplatesResult(),\n )\n return { resources, resourceTemplates }\n}\n\nexport async function resourcesCommand(argv: string[]): Promise<number> {\n const flags = parseCommonFlags(argv)\n const { session } = await startSession(flags)\n try {\n const { resources, resourceTemplates } = await listResourcesAndTemplates(session)\n if (flags.json) {\n printJson({\n ok: true,\n resources: resources.items,\n resourceTemplates: resourceTemplates.items,\n listMeta: { resources: resources.meta, resourceTemplates: resourceTemplates.meta },\n })\n } else {\n const notes = [...new Set([resources.note, resourceTemplates.note].filter(Boolean))]\n console.log(\n formatResourceList(\n resources.items,\n resourceTemplates.items,\n { resources: resources.meta, resourceTemplates: resourceTemplates.meta },\n notes as string[],\n ),\n )\n }\n return 0\n } finally {\n await session.close()\n }\n}\n","import type { CheckOutcome } from '../events.js'\nimport { listChecks, runChecks, summarizeChecks } from '../lint/index.js'\nimport { captureManifest } from '../manifest.js'\nimport { printJson, takeAllFlags } from './args.js'\nimport { colors, plural, renderTable } from './format.js'\nimport { loadChecksConfig, openSessionOptions, parseCommonFlags, startSession } from './resolve.js'\n\nexport function formatChecks(outcomes: CheckOutcome[], verbose: boolean, brief = false): string {\n const c = colors()\n const groups: Array<[CheckOutcome['status'], string, (t: string) => string]> = [\n ['failed', 'Failed', c.red],\n ['warned', 'Warned', c.yellow],\n ['passed', 'Passed', c.green],\n ]\n const out: string[] = []\n for (const [status, label, paint] of groups) {\n const items = outcomes.filter((o) => o.status === status)\n if (items.length === 0 || (brief && status === 'passed')) continue\n out.push(paint(c.bold(`${label} (${items.length})`)))\n if (status === 'passed' && !verbose) {\n const ids = [...new Set(items.map((o) => o.id))]\n out.push(` ${c.dim(ids.join(', '))}`, '')\n continue\n }\n for (const o of items) {\n out.push(\n ` ${paint(status === 'failed' ? '✗' : status === 'warned' ? '!' : '✓')} ${c.bold(o.id)} ${c.dim(o.title)}`,\n )\n if (o.detail) for (const line of o.detail.split(/\\r?\\n/)) out.push(` ${line}`)\n }\n out.push('')\n }\n return out.join('\\n').trimEnd()\n}\n\nexport async function checkCommand(argv: string[]): Promise<number> {\n const flags = parseCommonFlags(argv)\n if (argv.includes('--list')) {\n const checks = listChecks()\n if (flags.json) printJson({ ok: true, checks })\n else {\n console.log(\n renderTable(\n [{ header: 'ID' }, { header: 'DEFAULT' }, { header: 'TITLE', flex: true }],\n checks.map((check) => [check.id, check.severity, check.title]),\n ),\n )\n console.log(\n colors().dim(\n '\\nSkip a check with \"checks\": { \"allow\": [\"<id>\" | \"<id>:<subject>\" | \"desc/*\"] } in vibrissa.json, or --allow <id>.',\n ),\n )\n }\n return 0\n }\n\n const resolved = openSessionOptions(flags)\n const config = loadChecksConfig(flags, resolved.options)\n const allow = [...(config.allow ?? []), ...takeAllFlags(argv, '--allow')]\n const { session, serverName } = await startSession(flags, {}, resolved)\n try {\n const captured = await captureManifest(session, { toolsListSamples: 2 })\n const outcomes = runChecks(captured.manifest, {\n toolsListSamples: captured.toolsListSamples,\n ...(allow.length > 0 ? { allow } : {}),\n ...(config.severity ? { severity: config.severity } : {}),\n }).map((o) => ({ ...o, server: serverName }))\n const summary = summarizeChecks(outcomes)\n const ok = summary.failed === 0\n if (flags.json) {\n printJson({\n ok,\n server: serverName,\n protocolVersion: captured.manifest.protocolVersion,\n serverInfo: captured.manifest.server,\n summary,\n outcomes: argv.includes('--brief')\n ? outcomes.filter((o) => o.status !== 'passed')\n : outcomes,\n })\n } else {\n const c = colors()\n const who = [captured.manifest.server.name, captured.manifest.server.version]\n .filter(Boolean)\n .join(' ')\n console.log(c.bold(`vib check · ${who || serverName} · ${captured.manifest.protocolVersion}`))\n console.log('')\n console.log(formatChecks(outcomes, argv.includes('--verbose'), argv.includes('--brief')))\n console.log('')\n const line = `${plural(summary.failed, 'failed check')}, ${plural(summary.warned, 'warning')}, ${summary.passed} passed`\n console.log(ok ? c.green(line) : c.red(line))\n if (!ok) {\n console.log(\n c.dim(\n 'Fix the server, or allow-list a reviewed finding with \"checks\": { \"allow\": [\"<id>:<subject>\"] } (see docs/CHECKS.md).',\n ),\n )\n }\n }\n return ok ? 0 : 1\n } finally {\n await session.close()\n }\n}\n","import { diffLinesUnified } from 'jest-diff'\nimport { type LoadedCase, loadCases } from '../cases.js'\nimport { ConfigError, type ConfigOverrides, loadConfig } from '../config.js'\nimport {\n type Manifest,\n type ManifestDiff,\n captureManifest,\n diffManifest,\n formatDiff,\n jsonEqual,\n summarizeDiff,\n} from '../manifest.js'\nimport { isMatcherObject, matchValue } from '../match.js'\nimport { resolveRootDir, resolveServerConfig } from '../paths.js'\nimport { executeCase } from '../runner.js'\nimport { McpSession } from '../session/index.js'\nimport type {\n JsonObject,\n JsonValue,\n RunOptions,\n ServerConfig,\n Step,\n ToolSummary,\n} from '../types.js'\nimport { isHttpServerConfig, isStdioServerConfig } from '../types.js'\nimport {\n UsageError,\n VALUE_FLAGS,\n hasFlag,\n normalizeArgv,\n printJson,\n resolvePathFromCwd,\n splitCommandLine,\n takeAllFlags,\n takeFlag,\n} from './args.js'\nimport { type CommandHelp, formatCommandHelp } from './format.js'\nimport { manifestIgnoreOf } from './manifest.js'\nimport { cliOverrides, describeServerTarget, parseCommonFlags } from './resolve.js'\nimport { assertCommandFlags, usageFailure } from './run.js'\n\nconst DIFF_VALUE_FLAGS: ReadonlySet<string> = new Set([...VALUE_FLAGS, '--against', '--cases'])\n\nexport const diffHelp: CommandHelp = {\n name: 'diff',\n group: 'contract',\n summary: 'Contract diff between two servers: manifest changes and per-case result changes',\n usage: [\n 'vib diff --against \"<cmd | url | server name>\" [--cases <glob>] [--manifest-only] [--json]',\n ],\n description: [\n 'The base server is the configured default (or --server). Both servers get the same',\n 'manifest snapshot and, unless --manifest-only, every case runs against both; results are',\n 'normalized and compared. Exit 1 when anything differs. Release notes and migration check.',\n \"A command line runs in the base server's cwd and env. Full reference: docs/CLI.md.\",\n ].join('\\n'),\n flags: [\n {\n flag: '--against <target>',\n text: 'The other server: a server name, a command line, or a URL',\n },\n {\n flag: '--cases <glob>',\n text: 'Cases to compare, relative to the shell cwd (default: config globs; repeatable)',\n },\n { flag: '--manifest-only', text: 'Compare only the manifests (no cases are run)' },\n ],\n common: true,\n examples: [\n 'vib diff --against \"node ../v1/dist/index.js\"',\n 'vib diff --against staging --manifest-only',\n 'vib diff --against https://staging.example.com/mcp --cases \"tests/integration/smoke/*.json\" --json',\n ],\n}\n\n/** Full `vib diff --help` text. */\nexport const help: string = formatCommandHelp(diffHelp)\n\ninterface Side {\n name: string\n config: ServerConfig\n session?: McpSession\n manifest?: Manifest\n tools?: Map<string, ToolSummary>\n}\n\n/** One step's observed result, as compared (see projectObservation). */\nexport interface ObservedStep {\n /** `tool echo`, `resource fixture://readme`, ... */\n step: string\n observed: JsonValue\n}\n\nexport interface CaseComparison {\n id: string\n name: string\n same: boolean\n /** Observed results only (no pass/fail status: vib diff compares servers, not goldens). */\n base: ObservedStep[]\n against: ObservedStep[]\n diff?: string\n}\n\n/** The `--against` target as a ServerConfig (a configured name, a URL, or a command line). */\nexport function resolveAgainst(\n options: RunOptions,\n against: string,\n base: ServerConfig,\n): ServerConfig {\n const trimmed = against.trim()\n if (Object.hasOwn(options.servers, trimmed)) return resolveServerConfig(options, trimmed)\n const common = {\n ...(base.protocol !== undefined ? { protocol: base.protocol } : {}),\n ...(base.spawnTimeoutMs !== undefined ? { spawnTimeoutMs: base.spawnTimeoutMs } : {}),\n }\n if (/^https?:\\/\\//i.test(trimmed)) {\n return {\n url: trimmed,\n ...(isHttpServerConfig(base) && base.headers ? { headers: base.headers } : {}),\n ...common,\n }\n }\n const { cmd, args } = splitCommandLine(trimmed)\n return {\n cmd,\n args,\n cwd: isStdioServerConfig(base) && base.cwd ? base.cwd : process.cwd(),\n ...(isStdioServerConfig(base) && base.env ? { env: base.env } : {}),\n ...common,\n }\n}\n\nconst plain = (s: string) => s\n\nfunction textDiff(a: unknown, b: unknown): string {\n return diffLinesUnified(\n (JSON.stringify(a, null, 2) ?? 'undefined').split('\\n'),\n (JSON.stringify(b, null, 2) ?? 'undefined').split('\\n'),\n {\n aAnnotation: 'base',\n bAnnotation: 'against',\n expand: false,\n contextLines: 2,\n aColor: plain,\n bColor: plain,\n changeColor: plain,\n commonColor: plain,\n patchColor: plain,\n },\n )\n}\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction matcherLabel(expected: JsonObject): string {\n return `<matches ${Object.keys(expected)\n .filter((key) => key.startsWith('$'))\n .join(' + ')}>`\n}\n\n/**\n * Project an observed value through what the case asserts: values a matcher accepts become\n * `\"<matches $type>\"` (so timestamps and ids that the case itself treats as variable do not\n * count as differences), `{{captured}}` positions become `\"<captured>\"`, and keys a\n * `$partial` expectation does not mention are dropped. Without an expectation the value is\n * compared as is.\n */\nexport function projectThrough(\n expected: JsonValue | undefined,\n actual: JsonValue,\n partial = false,\n): JsonValue {\n if (expected === undefined) return actual\n if (typeof expected === 'string' && expected.includes('{{')) return '<captured>'\n if (isMatcherObject(expected)) {\n return matchValue(expected, actual, { partial }).length === 0 && isObject(expected)\n ? matcherLabel(expected)\n : actual\n }\n if (isObject(expected) && isObject(actual)) {\n const childPartial = typeof expected.$partial === 'boolean' ? expected.$partial : partial\n const out: JsonObject = {}\n for (const [key, value] of Object.entries(actual)) {\n if (Object.hasOwn(expected, key))\n out[key] = projectThrough(expected[key], value, childPartial)\n else if (!childPartial) out[key] = value\n }\n return out\n }\n if (Array.isArray(expected) && Array.isArray(actual)) {\n return actual.map((item, i) => projectThrough(expected[i], item, partial))\n }\n return actual\n}\n\nfunction projectObservation(step: Step, observed: JsonValue): JsonValue {\n if (isObject(observed) && isObject(observed.error)) {\n const error = observed.error\n if (step.expectError === undefined) return observed\n const message = typeof error.message === 'string' ? error.message : ''\n const expected = step.expectError.message\n return {\n error: {\n code: error.codeName ?? error.code ?? null,\n message:\n expected !== undefined && matchValue(expected as JsonValue, message).length === 0\n ? typeof expected === 'string'\n ? message\n : '<matches $regex>'\n : message,\n },\n }\n }\n if (isObject(observed) && observed.inputRequired !== undefined) return observed\n return projectThrough(step.expect, observed)\n}\n\nasync function observe(\n side: Side,\n loaded: LoadedCase,\n options: RunOptions,\n): Promise<ObservedStep[]> {\n if (!side.session || !loaded.data) return []\n const execution = await executeCase(loaded.data, {\n session: side.session,\n normalize: options.normalize,\n timeoutMs: options.timeoutMs,\n budgetMs: options.budgetMs,\n tools: side.tools,\n env: process.env,\n update: 'off',\n updateHint: false,\n caseId: loaded.ref.id,\n })\n return execution.observations.map((o) => ({\n step: `${o.step.kind} ${o.step.target}`,\n observed: projectObservation(o.planned.step, o.observed),\n }))\n}\n\n/** `vib diff --against`: exit 0 identical, 1 different, 2 usage / connection error. */\nexport async function diffCommand(rawArgv: string[]): Promise<number> {\n if (rawArgv.includes('--help') || rawArgv.includes('-h')) {\n console.log(help)\n return 0\n }\n const argv = normalizeArgv(rawArgv, DIFF_VALUE_FLAGS)\n const json = argv.includes('--json')\n try {\n assertCommandFlags(argv, diffHelp, DIFF_VALUE_FLAGS)\n } catch (err) {\n return usageFailure(err, 'diff', json)\n }\n const against = takeFlag(argv, '--against')\n if (!against) {\n return usageFailure(\n new UsageError(\n 'Missing --against: pass the other server as a name from vibrissa.json, a command line, or a URL.',\n {\n code: 'missing-argument',\n hint: 'Example: vib diff --against \"node ../v1/dist/index.js\"',\n next: ['vib diff --help'],\n },\n ),\n 'diff',\n json,\n )\n }\n const manifestOnly = hasFlag(argv, '--manifest-only')\n let options: RunOptions\n let flags: ReturnType<typeof parseCommonFlags>\n try {\n flags = parseCommonFlags(argv)\n const overrides: ConfigOverrides = {}\n const cases = takeAllFlags(argv, '--cases')\n if (cases.length > 0)\n overrides.globs = cases.map((g) => resolvePathFromCwd(g).replace(/\\\\/g, '/'))\n const loaded = loadConfig(process.cwd(), {\n configPath: flags.configPath,\n profile: flags.profile,\n overrides: cliOverrides(flags, overrides),\n })\n options = loaded.options\n } catch (err) {\n return usageFailure(err, 'diff', json)\n }\n\n const baseConfig = resolveServerConfig(options)\n const sides: [Side, Side] = [\n { name: options.defaultServer, config: baseConfig },\n { name: against, config: resolveAgainst(options, against, baseConfig) },\n ]\n try {\n for (const side of sides) {\n side.session = await McpSession.start(side.config, {\n timeoutMs: options.timeoutMs,\n stderr: 'capture',\n })\n side.manifest = (await captureManifest(side.session)).manifest\n side.tools = new Map(side.manifest.tools.map((tool) => [tool.name, tool]))\n }\n const manifestDiff: ManifestDiff = diffManifest(\n sides[0].manifest as Manifest,\n sides[1].manifest as Manifest,\n { ignore: manifestIgnoreOf(options) },\n )\n\n const comparisons: CaseComparison[] = []\n if (!manifestOnly) {\n const loaded = await loadCases({\n rootDir: resolveRootDir(options),\n globs: options.globs,\n defaultServer: options.defaultServer,\n servers: Object.keys(options.servers),\n manifest: options.manifest,\n tags: options.tags,\n excludeTags: options.excludeTags,\n grep: options.grep,\n })\n for (const c of loaded.cases) {\n if (c.skip || c.ref.server !== options.defaultServer) continue\n const base = await observe(sides[0], c, options)\n const other = await observe(sides[1], c, options)\n const same = jsonEqual(base, other)\n comparisons.push({\n id: c.ref.id,\n name: c.ref.name,\n same,\n base,\n against: other,\n ...(same ? {} : { diff: textDiff(base, other) }),\n })\n }\n }\n\n const differing = comparisons.filter((c) => !c.same)\n const identical = manifestDiff.identical && differing.length === 0\n if (flags.json) {\n printJson({\n ok: identical,\n identical,\n base: {\n server: sides[0].name,\n target: describeServerTarget(sides[0].config),\n info: sides[0].manifest?.server,\n },\n against: {\n server: sides[1].name,\n target: describeServerTarget(sides[1].config),\n info: sides[1].manifest?.server,\n },\n manifest: {\n identical: manifestDiff.identical,\n summary: summarizeDiff(manifestDiff),\n diff: manifestDiff,\n },\n cases: comparisons,\n summary: { cases: comparisons.length, different: differing.length },\n })\n } else {\n console.log(`base: ${describeServerTarget(sides[0].config)}`)\n console.log(`against: ${describeServerTarget(sides[1].config)}`)\n console.log('')\n console.log(formatDiff(manifestDiff))\n if (!manifestOnly) {\n console.log('')\n for (const c of comparisons) {\n console.log(`${c.same ? 'same' : 'DIFF'} ${c.name} (${c.id})`)\n if (!c.same && c.diff) for (const line of c.diff.split('\\n')) console.log(` ${line}`)\n }\n console.log('')\n console.log(\n `${differing.length} of ${comparisons.length} case${comparisons.length === 1 ? '' : 's'} differ${manifestDiff.identical ? '' : '; manifest differs'}.`,\n )\n }\n }\n return identical ? 0 : 1\n } catch (err) {\n if (err instanceof ConfigError) {\n console.error(err.message)\n return 2\n }\n throw err\n } finally {\n for (const side of sides) await side.session?.close()\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport {\n DEFAULT_MANIFEST_IGNORE,\n type Manifest,\n captureManifest,\n diffManifest,\n formatDiff,\n manifestPathFor,\n readManifest,\n summarizeDiff,\n writeManifest,\n} from '../manifest.js'\nimport type { RunOptions } from '../types.js'\nimport {\n UsageError,\n VALUE_FLAGS,\n normalizeArgv,\n printJson,\n resolvePathFromCwd,\n takeFlag,\n} from './args.js'\nimport { type CommandHelp, formatCommandHelp } from './format.js'\nimport {\n type CommonCliFlags,\n describeServerTarget,\n parseCommonFlags,\n startSession,\n} from './resolve.js'\nimport { assertCommandFlags, usageFailure } from './run.js'\n\nexport const manifestHelp: CommandHelp = {\n name: 'manifest',\n group: 'contract',\n summary: 'Record, diff or show the manifest lock (tools, schemas, descriptions, capabilities)',\n usage: [\n 'vib manifest record [--out <path>] [--server <name|cmd|url>] [--json]',\n 'vib manifest diff [--out <path>] [--strict] [--json]',\n 'vib manifest show [--json]',\n ],\n description: [\n 'record snapshot server/discover + tools/list + resources + templates + prompts into the',\n ' lock file (default: \"manifest\" in vibrissa.json, tests/integration/__manifest__.json).',\n 'diff compare the live server with the lock; exit 1 on drift. `vib run` does this too.',\n ' Each change says whether it is breaking (removed tool/property, newly required, ...).',\n 'show print the live manifest without writing anything.',\n 'Servers other than defaultServer use a sibling lock: __manifest__.<server>.json.',\n 'Paths in \"manifestIgnore\" (default server.version, protocolVersion, listMeta) are not',\n 'compared, so one lock serves both protocol eras; --strict compares everything.',\n 'Full reference: docs/CLI.md.',\n ].join('\\n'),\n flags: [\n {\n flag: '--out <path>',\n text: 'Lock file to write (record) or compare (diff); relative to the shell cwd',\n },\n { flag: '--strict', text: 'diff: compare everything (ignore no paths)' },\n ],\n common: true,\n examples: [\n 'vib manifest record',\n 'vib manifest diff --json',\n 'vib manifest show',\n 'vib manifest record --server staging --out tests/integration/__manifest__.staging.json',\n ],\n extraFlags: ['--manifest'],\n}\n\nconst MANIFEST_VALUE_FLAGS: ReadonlySet<string> = new Set([...VALUE_FLAGS, '--out', '--manifest'])\n\n/** Full `vib manifest --help` text. */\nexport const help: string = formatCommandHelp(manifestHelp)\n\n/** `manifestIgnore` from resolved options (config → profile), else the default. */\nexport function manifestIgnoreOf(options: Pick<RunOptions, 'manifestIgnore'>): readonly string[] {\n return options.manifestIgnore ?? DEFAULT_MANIFEST_IGNORE\n}\n\nfunction display(file: string): string {\n const rel = path.relative(process.cwd(), file)\n return (rel && !rel.startsWith('..') ? rel : file).replace(/\\\\/g, '/')\n}\n\nfunction counts(manifest: Manifest): string {\n const parts = [\n `${manifest.tools.length} tool${manifest.tools.length === 1 ? '' : 's'}`,\n `${manifest.resources.length} resource${manifest.resources.length === 1 ? '' : 's'}`,\n `${manifest.resourceTemplates.length} template${manifest.resourceTemplates.length === 1 ? '' : 's'}`,\n `${manifest.prompts.length} prompt${manifest.prompts.length === 1 ? '' : 's'}`,\n ]\n return parts.join(', ')\n}\n\nexport function formatManifest(manifest: Manifest, target?: string): string {\n const who =\n [manifest.server.name, manifest.server.version].filter(Boolean).join(' ') || '(unnamed server)'\n const lines = [`${who} · protocol ${manifest.protocolVersion}${target ? ` · ${target}` : ''}`]\n lines.push(` ${counts(manifest)}`)\n const section = (title: string, items: Array<{ key: string; description?: string }>) => {\n if (items.length === 0) return\n lines.push('', `${title}:`)\n for (const item of items) {\n const description = item.description ? ` — ${item.description.split(/\\r?\\n/)[0]}` : ''\n lines.push(\n ` ${item.key}${description.length > 100 ? `${description.slice(0, 99)}…` : description}`,\n )\n }\n }\n section(\n 'tools',\n manifest.tools.map((t) => ({ key: t.name, description: t.description })),\n )\n section(\n 'resources',\n manifest.resources.map((r) => ({ key: r.uri, description: r.description })),\n )\n section(\n 'resource templates',\n manifest.resourceTemplates.map((t) => ({ key: t.uriTemplate, description: t.description })),\n )\n section(\n 'prompts',\n manifest.prompts.map((p) => ({ key: p.name, description: p.description })),\n )\n return lines.join('\\n')\n}\n\n/** `vib manifest record|diff|show`. */\nexport async function manifestCommand(argv: string[]): Promise<number> {\n if (argv.includes('--help') || argv.includes('-h')) {\n console.log(help)\n return 0\n }\n const json = argv.includes('--json')\n const sub = argv[0] && !argv[0].startsWith('-') ? argv[0] : undefined\n if (sub !== 'record' && sub !== 'diff' && sub !== 'show') {\n return usageFailure(\n new UsageError(\n `Unknown manifest action ${sub ? `\"${sub}\"` : '(none)'}: expected record, diff or show.`,\n {\n code: 'unknown-action',\n hint: 'Example: vib manifest record',\n next: ['vib manifest --help'],\n },\n ),\n 'manifest',\n json,\n )\n }\n const rest = normalizeArgv(argv.slice(1), MANIFEST_VALUE_FLAGS)\n let flags: CommonCliFlags\n try {\n assertCommandFlags(rest, manifestHelp, MANIFEST_VALUE_FLAGS)\n flags = parseCommonFlags(rest)\n } catch (err) {\n return usageFailure(err, 'manifest', json)\n }\n const outFlag = takeFlag(rest, '--out') ?? takeFlag(rest, '--manifest')\n const strict = rest.includes('--strict')\n\n const { session, options, server, serverName } = await startSession(flags)\n try {\n const file = outFlag ? resolvePathFromCwd(outFlag) : manifestPathFor(options, serverName)\n const { manifest } = await captureManifest(session)\n\n if (sub === 'show') {\n if (flags.json) printJson({ ok: true, server: serverName, manifest })\n else console.log(formatManifest(manifest, describeServerTarget(server)))\n return 0\n }\n\n if (sub === 'record') {\n const existed = fs.existsSync(file)\n let summary: string | undefined\n if (existed) {\n try {\n summary = summarizeDiff(diffManifest(readManifest(file), manifest, { ignore: [] }))\n } catch {\n summary = undefined\n }\n }\n writeManifest(file, manifest)\n if (flags.json) {\n printJson({\n ok: true,\n path: file,\n server: serverName,\n created: !existed,\n ...(summary ? { changes: summary } : {}),\n manifest,\n })\n } else {\n console.log(`wrote ${display(file)} (${counts(manifest)})`)\n if (summary && summary !== 'no changes')\n console.log(` changes vs previous lock: ${summary}`)\n console.log('Commit it; vib run now fails when the live surface drifts from it.')\n }\n return 0\n }\n\n // diff\n if (!fs.existsSync(file)) {\n const named = flags.server !== undefined && Object.hasOwn(options.servers, flags.server)\n const record = `vib manifest record${named ? ` --server ${flags.server}` : ''}`\n return usageFailure(\n new UsageError(`No manifest lock at ${display(file)}.`, {\n code: 'manifest-missing',\n hint: `Create it with \"${record}\".`,\n next: [record],\n }),\n 'manifest',\n Boolean(flags.json),\n )\n }\n const diff = diffManifest(readManifest(file), manifest, {\n ignore: strict ? [] : manifestIgnoreOf(options),\n })\n if (flags.json) {\n printJson({\n ok: diff.identical,\n path: file,\n server: serverName,\n identical: diff.identical,\n summary: summarizeDiff(diff),\n diff,\n })\n } else if (diff.identical) {\n console.log(`manifest ${display(file)}: no drift (${counts(manifest)})`)\n } else {\n console.log(`manifest ${display(file)}:`)\n console.log(formatDiff(diff))\n console.log('')\n console.log(\n 'Review the change, then accept it with \"vib manifest record\" or \"vib run --update-manifest\".',\n )\n }\n return diff.identical ? 0 : 1\n } finally {\n await session.close()\n }\n}\n","import { ConfigError, type ConfigOverrides, loadConfig, parseShard } from '../config.js'\nimport type { Reporter, ReporterContext, RunEvent } from '../events.js'\nimport { resolveRootDir } from '../paths.js'\nimport {\n ConsoleReporter,\n type JsonReport,\n JsonReporter,\n UnknownReporterError,\n} from '../reporters/index.js'\nimport { Runner, type RunnerOptions } from '../runner.js'\nimport {\n UsageError,\n VALUE_FLAGS,\n assertKnownFlags,\n hasFlag,\n normalizeArgv,\n printJson,\n resolvePathFromCwd,\n takeAllFlags,\n takeFlag,\n} from './args.js'\nimport { type CommandHelp, acceptedFlags, formatCommandHelp } from './format.js'\nimport { type CommonCliFlags, cliOverrides, parseCommonFlags } from './resolve.js'\n\n/** Value-taking flags of `vib run` (on top of the shared ones), for `--flag=value` splitting. */\nexport const RUN_VALUE_FLAGS: ReadonlySet<string> = new Set([\n ...VALUE_FLAGS,\n '--cases',\n '--tag',\n '--exclude-tag',\n '--grep',\n '--shard',\n '--repeat',\n '--concurrency',\n '--baseline',\n '--reporter',\n '--out-dir',\n])\n\nexport const runHelp: CommandHelp = {\n name: 'run',\n group: 'test',\n summary: 'Run JSON cases (and the manifest lock / checks) against the server',\n usage: ['vib run [options]'],\n description: [\n 'Runs every case matched by \"globs\" (minus tag/grep/shard filters), verifies the manifest',\n 'lock, and reports through the configured reporters. Failures write reports/traces/.',\n '--json prints one JSON object (the results.json report) on stdout; logs go to stderr.',\n 'Full reference: docs/CLI.md (flags), docs/CASES.md (case keys), docs/CONFIG.md.',\n ].join('\\n'),\n flags: [\n { flag: '--cases <glob>', text: 'Case glob, relative to the shell cwd (repeatable)' },\n { flag: '--tag <t>', text: 'Only cases with this tag (repeatable, comma ok)' },\n { flag: '--exclude-tag <t>', text: 'Skip cases with this tag (repeatable, comma ok)' },\n {\n flag: '--grep <pattern>',\n text: 'Only cases whose name or file matches (regex, case-insensitive)',\n },\n { flag: '--shard <i/n>', text: 'Run shard i of n (stable split by case id)' },\n {\n flag: '--repeat <n>',\n text: 'Run every case n times; reports pass rates (flaky: true gets a floor)',\n },\n { flag: '--concurrency <n>', text: 'Workers per server, one session each (flows never split)' },\n {\n flag: '--update[=all]',\n text: 'Rewrite failing goldens from live output (=all: also matcher goldens)',\n },\n { flag: '--update-manifest', text: 'Accept manifest drift (rewrite or create the lock)' },\n {\n flag: '--check',\n text: 'Also run spec-sanity + description checks (failed checks fail the run)',\n },\n { flag: '--baseline <file>', text: 'Fail only on regressions vs a previous results.json' },\n {\n flag: '--trace',\n text: 'Write reports/traces/<case>.ndjson for every case (default: failures)',\n },\n {\n flag: '--reporter <name>',\n text: 'console | json | junit | github | tap (repeatable, comma ok)',\n },\n { flag: '--out-dir <dir>', text: 'Directory for reports (default: reports/)' },\n { flag: '--fail-fast', text: 'Stop after the first failing case' },\n { flag: '--allow-empty', text: 'Exit 0 when no cases match' },\n { flag: '--pretty / --no-pretty', text: 'Force colors and glyphs on or off' },\n {\n flag: '--brief',\n text: 'Only what needs attention: failures, warnings, drift (with --json: no passing cases, no empty arrays)',\n },\n ],\n common: true,\n examples: [\n 'vib run',\n 'vib run --profile ci --check --reporter junit',\n 'vib run --tag smoke --fail-fast',\n 'vib run --repeat 5 --concurrency 2',\n 'vib run --update',\n 'vib run --baseline reports/last-green.json',\n ],\n extraFlags: ['--update', '--update=all', '--pretty', '--no-pretty', '--display'],\n}\n\n/** Full `vib run --help` text. */\nexport const help: string = formatCommandHelp(runHelp)\n\nfunction splitList(values: string[]): string[] {\n return values\n .flatMap((value) => value.split(','))\n .map((value) => value.trim())\n .filter(Boolean)\n}\n\nfunction intFlag(argv: string[], name: string, min: number): number | undefined {\n const raw = takeFlag(argv, name)\n if (raw === undefined) return undefined\n const value = Number(raw)\n if (!Number.isInteger(value) || value < min) {\n throw new ConfigError(\n `Invalid ${name} value \"${raw}\": expected an integer >= ${min}. Example: ${name} ${Math.max(min, 2)}.`,\n )\n }\n return value\n}\n\n/** CLI flags → RunnerOptions (config file → profile → flags). Throws ConfigError on bad flags. */\nexport function resolveRunOptions(rawArgv: string[]): RunnerOptions {\n const argv = normalizeArgv(rawArgv, RUN_VALUE_FLAGS)\n const flags: CommonCliFlags = parseCommonFlags(argv)\n const overrides: ConfigOverrides = {}\n\n const cases = takeAllFlags(argv, '--cases')\n if (cases.length > 0) {\n overrides.globs = cases.map((glob) => {\n const negated = glob.startsWith('!')\n const body = negated ? glob.slice(1) : glob\n const abs = resolvePathFromCwd(body).replace(/\\\\/g, '/')\n return negated ? `!${abs}` : abs\n })\n }\n const tags = splitList(takeAllFlags(argv, '--tag'))\n if (tags.length > 0) overrides.tags = tags\n const excludeTags = splitList(takeAllFlags(argv, '--exclude-tag'))\n if (excludeTags.length > 0) overrides.excludeTags = excludeTags\n const grep = takeFlag(argv, '--grep')\n if (grep !== undefined) overrides.grep = grep\n const shardRaw = takeFlag(argv, '--shard')\n if (shardRaw !== undefined) {\n const shard = parseShard(shardRaw)\n if (!shard) {\n throw new ConfigError(\n `Invalid --shard value \"${shardRaw}\": expected <index>/<total> with 1 <= index <= total, e.g. --shard 1/4.`,\n )\n }\n overrides.shard = shard\n }\n const repeat = intFlag(argv, '--repeat', 1)\n if (repeat !== undefined) overrides.repeat = repeat\n const concurrency = intFlag(argv, '--concurrency', 1)\n if (concurrency !== undefined) overrides.concurrency = concurrency\n const updateAll = argv.includes('--update=all')\n if (hasFlag(argv, '--update') || updateAll) overrides.update = true\n if (hasFlag(argv, '--trace')) overrides.trace = true\n if (hasFlag(argv, '--check')) overrides.check = true\n const baseline = takeFlag(argv, '--baseline')\n if (baseline !== undefined) overrides.baseline = resolvePathFromCwd(baseline)\n if (hasFlag(argv, '--fail-fast')) overrides.failFast = true\n if (hasFlag(argv, '--allow-empty')) overrides.allowEmpty = true\n const reporterFlags = splitList(takeAllFlags(argv, '--reporter'))\n if (reporterFlags.length > 0) overrides.reporters = reporterFlags\n\n const { options, warnings } = loadConfig(process.cwd(), {\n configPath: flags.configPath,\n profile: flags.profile,\n overrides: cliOverrides(flags, overrides),\n })\n for (const warning of warnings) console.warn(`warning: ${warning}`)\n\n let pretty: boolean | undefined\n const display = takeFlag(argv, '--display')\n if (hasFlag(argv, '--pretty') || display === 'pretty') pretty = true\n if (hasFlag(argv, '--no-pretty') || display === 'plain') pretty = false\n\n let reporters = options.reporters\n let stdout: RunnerOptions['stdout']\n let stderr: RunnerOptions['stderr']\n if (flags.json) {\n // stdout carries exactly one JSON object (printed by runCommand); stderr only warnings and\n // errors. The console / tap streams are dropped, the json reporter is attached by\n // runCommand, and other reporters' stdout (github annotations) goes to stderr.\n const names = reporters.flatMap((r) => r.split(',')).map((r) => r.trim().toLowerCase())\n reporters = [...new Set(names)].filter(\n (r) => r && r !== 'json' && r !== 'console' && r !== 'tap',\n )\n stdout = (line) => console.error(line)\n stderr = (line) => {\n if (!/^vibrissa: wrote /.test(line)) console.error(line)\n }\n pretty = false\n }\n\n // checks / manifestIgnore / outDir come resolved from config (defaults → file → profile).\n const outDir = takeFlag(argv, '--out-dir')\n const runner: RunnerOptions = {\n ...options,\n reporters,\n ...(outDir !== undefined ? { outDir: resolvePathFromCwd(outDir) } : {}),\n ...(pretty !== undefined ? { pretty } : {}),\n ...(stdout ? { stdout } : {}),\n ...(stderr ? { stderr } : {}),\n ...(updateAll ? { updateAll: true } : {}),\n ...(hasFlag(argv, '--update-manifest') ? { updateManifest: true } : {}),\n }\n return runner\n}\n\n/**\n * Reject flags the command does not know (a typo like `--chek` must not silently run the\n * whole suite without checks). Throws UsageError with a did-you-mean.\n */\nexport function assertCommandFlags(\n rawArgv: string[],\n spec: CommandHelp,\n valueFlags: ReadonlySet<string>,\n extra: string[] = [],\n): void {\n const argv = normalizeArgv(rawArgv, valueFlags)\n assertKnownFlags(argv, [...acceptedFlags(spec), ...extra], spec.name, valueFlags)\n}\n\nexport interface ErrorEnvelope {\n ok: false\n error: { type: string; code: string; message: string; hint: string }\n next?: string[]\n}\n\n/**\n * The CLI's `--json` failure envelope (same shape as the dispatcher's):\n * `{ ok: false, error: { type, code, message, hint }, next? }`.\n */\nexport function errorEnvelope(err: unknown, command: string): ErrorEnvelope {\n const type = err instanceof Error ? err.name : 'Error'\n const fallback = `Run vib ${command} --help for usage.`\n if (err instanceof UsageError) {\n return {\n ok: false,\n error: { type, code: err.code, message: err.detail, hint: err.hint ?? fallback },\n ...(err.next ? { next: err.next } : {}),\n }\n }\n const message = err instanceof Error ? err.message : String(err)\n const code =\n err instanceof UnknownReporterError\n ? 'unknown-reporter'\n : err instanceof ConfigError\n ? 'config'\n : 'usage'\n return { ok: false, error: { type, code, message, hint: fallback } }\n}\n\n/** Print a usage / config failure (envelope on stdout with --json, text on stderr); exit 2. */\nexport function usageFailure(err: unknown, command: string, json: boolean): number {\n const envelope = errorEnvelope(err, command)\n if (json) printJson(envelope)\n console.error(err instanceof Error ? err.message : String(err))\n return 2\n}\n\n/** Console reporter that prints only what needs attention (`--brief`). */\nfunction briefConsole(inner: Reporter): Reporter {\n return {\n name: 'console',\n onEvent(event: RunEvent) {\n switch (event.type) {\n case 'case:start':\n case 'step:start':\n case 'step:end':\n case 'session:start':\n case 'session:end':\n case 'manifest:ok':\n return\n case 'check':\n if (event.outcome.status === 'passed') return\n break\n case 'case:end':\n if (event.outcome.status === 'passed' || event.outcome.status === 'skipped') return\n break\n default:\n break\n }\n return inner.onEvent(event)\n },\n close: () => inner.close?.(),\n }\n}\n\n/** Reporter that writes run warnings to stderr (`--json` keeps stderr to warnings/errors). */\nfunction warningsToStderr(): Reporter {\n return {\n name: 'stderr-warnings',\n onEvent(event: RunEvent) {\n if (event.type === 'warning') console.error(`warning: ${event.message}`)\n },\n }\n}\n\nfunction dropEmpty(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(dropEmpty)\n if (value === null || typeof value !== 'object') return value\n const out: Record<string, unknown> = {}\n for (const [key, child] of Object.entries(value)) {\n if (Array.isArray(child) && child.length === 0) continue\n if (\n child &&\n typeof child === 'object' &&\n !Array.isArray(child) &&\n Object.keys(child).length === 0\n ) {\n continue\n }\n out[key] = dropEmpty(child)\n }\n return out\n}\n\n/** `--brief --json`: only what needs attention, no empty arrays or objects. */\nexport function briefReport(report: JsonReport): unknown {\n return dropEmpty({\n ...report,\n cases: report.cases.filter((c) => c.status === 'failed' || c.status === 'updated'),\n checks: (report.checks ?? []).filter((c) => c.status !== 'passed'),\n manifests: (report.manifests ?? []).filter((m) => m.status !== 'ok'),\n })\n}\n\n/**\n * `vib run`: exit 0 ok, 1 failures / drift / failed checks, 2 usage or config error.\n * With `--json`, stdout carries exactly one JSON object — the JsonReport also written to\n * `<outDir>/results.json` (or `{ ok: false, error }` on a usage error); everything else\n * (console reporter, warnings) goes to stderr.\n */\nexport async function runCommand(argv: string[]): Promise<number> {\n if (argv.includes('--help') || argv.includes('-h')) {\n console.log(help)\n return 0\n }\n const json = argv.includes('--json')\n const brief = argv.includes('--brief')\n let options: RunnerOptions\n try {\n assertCommandFlags(argv, runHelp, RUN_VALUE_FLAGS)\n options = resolveRunOptions(argv)\n } catch (err) {\n return usageFailure(err, 'run', json)\n }\n // Informational lines would break the one-JSON-object stdout / the brief view.\n if (json || brief) options = { ...options, info: () => {} }\n const ctx: ReporterContext = {\n rootDir: resolveRootDir(options),\n outDir: options.outDir ?? 'reports',\n pretty: options.pretty ?? true,\n stdout: (line) => console.log(line),\n stderr: (line) => console.error(line),\n }\n let jsonReporter: JsonReporter | undefined\n const extra: Reporter[] = [...(options.extraReporters ?? [])]\n if (json) {\n jsonReporter = new JsonReporter({ ...ctx, pretty: false, stderr: () => {} })\n extra.push(jsonReporter, warningsToStderr())\n } else if (brief && options.reporters.some((r) => /(^|,)\\s*console\\s*(,|$)/i.test(r))) {\n extra.push(briefConsole(new ConsoleReporter(ctx)))\n options = {\n ...options,\n reporters: options.reporters\n .flatMap((r) => r.split(','))\n .filter((r) => r.trim().toLowerCase() !== 'console'),\n }\n }\n options = { ...options, extraReporters: extra }\n try {\n const code = await new Runner(options).run()\n if (jsonReporter) printJson(brief ? briefReport(jsonReporter.report()) : jsonReporter.report())\n return code\n } catch (err) {\n if (err instanceof UnknownReporterError || err instanceof ConfigError) {\n return usageFailure(err, 'run', json)\n }\n throw err\n }\n}\n","import type { DiscoverInfo, JsonValue, ServerConfig } from '../types.js'\nimport { isHttpServerConfig } from '../types.js'\nimport { printJson } from './args.js'\nimport { colors, isObject, preview } from './format.js'\nimport { describeServerTarget, parseCommonFlags, startSession } from './resolve.js'\n\n/** Capability names with a short note on their sub-flags (`tools (listChanged)`). */\nfunction capabilityLines(capabilities: JsonValue): string[] {\n if (!isObject(capabilities)) return [preview(capabilities)]\n const lines: string[] = []\n for (const [name, value] of Object.entries(capabilities)) {\n if (name === 'extensions') continue\n const flags = isObject(value)\n ? Object.entries(value)\n .filter(([, v]) => v === true)\n .map(([k]) => k)\n : []\n lines.push(flags.length > 0 ? `${name} (${flags.join(', ')})` : name)\n }\n return lines\n}\n\nexport function formatDiscover(info: DiscoverInfo, target?: string): string {\n const c = colors()\n const identity = info.serverInfo\n const name = identity?.name ?? '(no name)'\n const version = identity?.version ? ` ${identity.version}` : ''\n const title = identity?.title ? ` — ${identity.title}` : ''\n const rows: Array<[string, string]> = [\n ['server', `${c.bold(name)}${version}${title}`],\n [\n 'protocol',\n `${info.protocolVersion || '(unknown)'} ${c.dim(`(${info.era} era${info.synthesized ? ', from initialize' : ', from server/discover'})`)}`,\n ],\n ]\n if (info.supportedVersions.length > 0) rows.push(['supports', info.supportedVersions.join(', ')])\n if (target) rows.push(['transport', target])\n const caps = capabilityLines(info.capabilities)\n rows.push(['capabilities', caps.length > 0 ? caps.join(', ') : c.dim('(none)')])\n rows.push([\n 'extensions',\n info.extensions.length > 0 ? info.extensions.join(', ') : c.dim('(none)'),\n ])\n const width = Math.max(...rows.map(([k]) => k.length))\n const out = rows.map(([k, v]) => `${c.dim(k.padEnd(width))} ${v}`)\n if (info.instructions) {\n out.push('', c.dim('instructions:'))\n for (const line of info.instructions.trim().split(/\\r?\\n/)) out.push(` ${line}`)\n }\n out.push('', c.dim('Next: vib tools · vib resources · vib prompts · vib check'))\n return out.join('\\n')\n}\n\n/** `{ type: 'stdio', command }` or `{ type: 'http', url }` for --json output. */\nexport function transportOf(server: ServerConfig): JsonValue {\n if (isHttpServerConfig(server)) return { type: 'http', url: server.url }\n return { type: 'stdio', command: [server.cmd, ...(server.args ?? [])].join(' ') }\n}\n\nexport const DISCOVER_NEXT = ['vib tools', 'vib resources', 'vib prompts', 'vib check']\n\nexport async function discoverCommand(argv: string[]): Promise<number> {\n const flags = parseCommonFlags(argv)\n const { session, server } = await startSession(flags)\n try {\n const info = await session.discover()\n if (flags.json) {\n const { raw: _raw, ...rest } = info\n printJson({ ok: true, ...rest, transport: transportOf(server), next: DISCOVER_NEXT })\n } else console.log(formatDiscover(info, describeServerTarget(server)))\n return 0\n } finally {\n await session.close()\n }\n}\n","/**\n * `vib explain <case...>`: a plain-English paraphrase of what a case does and asserts,\n * for reviewing agent-authored suites in PRs. Matcher wording follows docs/MATCHERS.md.\n */\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport fg from 'fast-glob'\nimport { type LoadedCase, loadCaseFile, loadCasesSync, resolveCaseFilesSync } from '../cases.js'\nimport { defaultRunOptions } from '../defaults.js'\nimport { appendIndex, appendKey } from '../schema.js'\nimport type { JsonValue, RunOptions } from '../types.js'\nimport { UsageError, closest, hasFlag, positionals, printJson, pruneEmpty } from './args.js'\nimport { colors, isObject, plural, preview } from './format.js'\nimport { mergeCliOptions, parseCommonFlags } from './resolve.js'\n\nexport interface Assertion {\n /** Where in the result (matcher path format; `(root)` for the whole value). */\n path: string\n text: string\n depth: number\n}\n\nexport interface StepExplanation {\n phase: 'main' | 'setup' | 'teardown'\n /** 1-based within its phase. */\n index: number\n name?: string\n operation?: { kind: string; method: string; target: string; args?: JsonValue }\n summary: string\n uses: string[]\n expect: Assertion[]\n expectError?: string\n expectInputRequired: Assertion[]\n expectTask: Assertion[]\n respond: string[]\n captures: string[]\n notes: string[]\n}\n\nexport interface WeakAssertion {\n /** `any-error` | `bare-partial` | `no-expectation` | `no-output-validation` | `ignore-errors` | `skipped` */\n code: string\n /** `case`, `step 2`, `setup 1`, `teardown 1`. */\n at: string\n message: string\n}\n\nexport interface CaseExplanation {\n file: string\n name?: string\n kind: 'single' | 'flow'\n tags: string[]\n server?: string\n skip?: string\n flaky?: boolean\n steps: StepExplanation[]\n /** Assertions weaker than they look (expectError {}, bare $partial, ...). */\n flags: WeakAssertion[]\n /** Load problems, exactly as vib run reports them (the case was not explained). */\n errors: string[]\n /** Load warnings (unknown keys, ...). */\n warnings?: string[]\n /** `$ref` fragments the case pulls in (already inlined in the prose). */\n refs?: Array<{ path: string; ref: string }>\n}\n\nconst MATCHERS = new Set([\n '$regex',\n '$wildcard',\n '$unordered',\n '$any',\n '$type',\n '$schema',\n '$oneOf',\n '$contains',\n '$length',\n '$number',\n '$ignore',\n '$ref',\n '$literal',\n])\n\nfunction isDirective(node: Record<string, JsonValue>): boolean {\n return Object.keys(node).some(\n (key) => MATCHERS.has(key) && !(key === '$schema' && typeof node[key] === 'string'),\n )\n}\n\nconst COMPACT_WIDTH = 72\n\n/** No matcher keys anywhere inside (a `$partial` flag is allowed at the top). */\nfunction isPlainData(node: JsonValue, top = true): boolean {\n if (Array.isArray(node)) return node.every((item) => isPlainData(item, false))\n if (!isObject(node)) return true\n return Object.entries(node).every(([key, value]) =>\n key === '$partial'\n ? top && typeof value === 'boolean'\n : !key.startsWith('$') && isPlainData(value, false),\n )\n}\n\nfunction root(path: string): string {\n return path === '' ? '(root)' : path\n}\n\nconst BOUND_WORDS: Record<string, string> = { gt: '>', gte: '>=', lt: '<', lte: '<=', eq: '=' }\n\nfunction boundsText(spec: JsonValue): string {\n if (!isObject(spec)) return preview(spec)\n return Object.entries(spec)\n .map(([k, v]) => `${BOUND_WORDS[k] ?? k} ${v}`)\n .join(' and ')\n}\n\nfunction lengthText(spec: JsonValue): string {\n if (typeof spec === 'number') return `has length ${spec}`\n if (!isObject(spec)) return `has length ${preview(spec)}`\n const { min, max } = spec\n if (min !== undefined && max !== undefined) return `has length between ${min} and ${max}`\n if (min !== undefined) return `has length at least ${min}`\n if (max !== undefined) return `has length at most ${max}`\n return 'has any length'\n}\n\nfunction countText(count: JsonValue | undefined): string {\n if (count === undefined) return 'at least one item'\n if (typeof count === 'number')\n return count === 0 ? 'no item' : `exactly ${count} item${count === 1 ? '' : 's'}`\n if (isObject(count)) {\n const { min, max } = count\n if (min !== undefined && max !== undefined) return `between ${min} and ${max} items`\n if (min !== undefined) return `at least ${min} items`\n if (max !== undefined) return max === 0 ? 'no item' : `at most ${max} items`\n }\n return `${preview(count)} items`\n}\n\nfunction schemaText(schema: JsonValue): string {\n if (schema === true) return 'validates against the JSON Schema `true` (anything)'\n if (schema === false) return 'validates against the JSON Schema `false` (nothing passes)'\n if (!isObject(schema)) return 'validates against an inline JSON Schema'\n const parts: string[] = []\n if (schema.type !== undefined)\n parts.push(`type ${Array.isArray(schema.type) ? schema.type.join('|') : schema.type}`)\n if (Array.isArray(schema.required) && schema.required.length > 0)\n parts.push(`required: ${schema.required.join(', ')}`)\n if (typeof schema.format === 'string') parts.push(`format ${schema.format}`)\n if (isObject(schema.properties))\n parts.push(`properties: ${Object.keys(schema.properties).join(', ')}`)\n return `validates against an inline JSON Schema${parts.length ? ` (${parts.join('; ')})` : ''}`\n}\n\n/** Walk an expectation tree into human assertions (docs/MATCHERS.md semantics). */\nexport function describeExpectation(\n node: JsonValue,\n at = '',\n partial = false,\n depth = 0,\n out: Assertion[] = [],\n): Assertion[] {\n const push = (text: string, where = at) => out.push({ path: root(where), text, depth })\n // Short plain-data subtrees read better as one line.\n if (depth > 0 && (Array.isArray(node) || isObject(node)) && isPlainData(node)) {\n const isPartial = isObject(node) && typeof node.$partial === 'boolean' ? node.$partial : partial\n const data = isObject(node)\n ? Object.fromEntries(Object.entries(node).filter(([key]) => key !== '$partial'))\n : node\n const text = JSON.stringify(data)\n const empty = Array.isArray(data) ? data.length === 0 : Object.keys(data).length === 0\n if (text.length <= COMPACT_WIDTH && !empty) {\n if (!isPartial) push(`equals ${text}`)\n else if (Array.isArray(data)) push(`starts with ${text} (extra trailing items allowed)`)\n else push(`includes ${text} (extra keys allowed)`)\n return out\n }\n }\n if (Array.isArray(node)) {\n if (node.length === 0) push(partial ? 'is an array (partial: any items)' : 'is an empty array')\n else\n push(\n partial\n ? `starts with ${node.length === 1 ? 'this item' : `these ${node.length} items in order`} (extra trailing items allowed)`\n : `has exactly ${node.length} item${node.length === 1 ? '' : 's'}, in this order`,\n )\n node.forEach((item, i) =>\n describeExpectation(item, appendIndex(at, i), partial, depth + 1, out),\n )\n return out\n }\n if (!isObject(node)) {\n push(`equals ${JSON.stringify(node)}`)\n return out\n }\n if (isDirective(node)) {\n const parts: string[] = []\n const nested: Array<() => void> = []\n const childPartial = typeof node.$partial === 'boolean' ? node.$partial : partial\n if (node.$any !== undefined) parts.push('is present (any value, null included)')\n if (node.$type !== undefined) {\n const types = Array.isArray(node.$type) ? node.$type.map(String) : [String(node.$type)]\n parts.push(`is of type ${types.join(' or ')}`)\n }\n if (node.$number !== undefined) parts.push(`is a number ${boundsText(node.$number)}`)\n if (node.$length !== undefined) parts.push(lengthText(node.$length))\n if (node.$regex !== undefined)\n parts.push(`matches /${node.$regex}/${typeof node.flags === 'string' ? node.flags : ''}`)\n if (node.$wildcard !== undefined)\n parts.push(\n `matches the pattern ${JSON.stringify(node.$wildcard)} (* = anything, ? = one character)`,\n )\n if (node.$schema !== undefined && typeof node.$schema !== 'string')\n parts.push(schemaText(node.$schema))\n if (node.$contains !== undefined) {\n const containsPartial = typeof node.$partial === 'boolean' ? node.$partial : true\n parts.push(`contains ${countText(node.count)} matching${containsPartial ? '' : ' exactly'}:`)\n nested.push(() =>\n describeExpectation(node.$contains, `${root(at)}[*]`, containsPartial, depth + 1, out),\n )\n }\n if (node.$unordered !== undefined) {\n const items = Array.isArray(node.value) ? node.value : []\n parts.push(\n `${items.length === 1 ? 'has this item (any position)' : `has these ${items.length} items in any order`}${childPartial ? ' (other items allowed)' : ' (and nothing else)'}:`,\n )\n nested.push(() =>\n items.forEach((item, i) =>\n describeExpectation(item, `${root(at)}[any #${i + 1}]`, childPartial, depth + 1, out),\n ),\n )\n }\n if (node.$oneOf !== undefined) {\n const alternatives = Array.isArray(node.$oneOf) ? node.$oneOf : []\n parts.push(`matches any one of ${alternatives.length} alternatives:`)\n nested.push(() =>\n alternatives.forEach((alt, i) => {\n if (isObject(alt) && alt.$ignore === true) {\n out.push({\n path: `${root(at)} #${i + 1}`,\n text: 'is missing (or anything)',\n depth: depth + 1,\n })\n } else describeExpectation(alt, `${root(at)} #${i + 1}`, childPartial, depth + 1, out)\n }),\n )\n }\n if (node.$ignore !== undefined) parts.push('is ignored (may be missing)')\n if (node.$ref !== undefined)\n parts.push(`matches the shared fragment ${JSON.stringify(node.$ref)}`)\n if (node.$literal !== undefined)\n parts.push(`equals exactly ${preview(node.$literal, 100)} (as plain data)`)\n push(parts.join(' and '))\n for (const run of nested) run()\n return out\n }\n const isPartial = typeof node.$partial === 'boolean' ? node.$partial : partial\n const keys = Object.keys(node).filter((key) => key !== '$partial')\n if (keys.length === 0) push(isPartial ? 'is any object' : 'is an empty object')\n else\n push(\n isPartial\n ? `is an object with at least: ${keys.join(', ')} (extra keys allowed)`\n : `is an object with exactly: ${keys.join(', ')}`,\n )\n for (const key of keys)\n describeExpectation(node[key], appendKey(at, key), isPartial, depth + 1, out)\n return out\n}\n\nconst METHODS: Record<string, string> = {\n tool: 'tools/call',\n resource: 'resources/read',\n resourceTemplate: 'resources/read',\n prompt: 'prompts/get',\n}\n\nfunction placeholders(value: unknown, found = new Set<string>()): Set<string> {\n if (typeof value === 'string') {\n for (const m of value.matchAll(/\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g)) found.add(m[1])\n } else if (Array.isArray(value)) for (const v of value) placeholders(v, found)\n else if (isObject(value)) for (const v of Object.values(value)) placeholders(v, found)\n return found\n}\n\nfunction errorText(expectError: JsonValue): string {\n if (!isObject(expectError)) return 'fails with an error'\n const parts: string[] = []\n if (expectError.code !== undefined) parts.push(`code ${expectError.code}`)\n const message = expectError.message\n if (typeof message === 'string') parts.push(`message exactly ${JSON.stringify(message)}`)\n else if (isObject(message) && typeof message.$regex === 'string')\n parts.push(\n `message matching /${message.$regex}/${typeof message.flags === 'string' ? message.flags : ''}`,\n )\n return parts.length > 0\n ? `fails with an error (${parts.join(', ')}); a tool isError result counts`\n : 'fails with any error (protocol error or tool isError result)'\n}\n\nexport function explainStep(\n step: Record<string, JsonValue>,\n phase: StepExplanation['phase'],\n index: number,\n): StepExplanation {\n const kind = ['tool', 'resource', 'resourceTemplate', 'prompt'].find((k) => step[k] !== undefined)\n const target = kind ? String(step[kind]) : ''\n const args = step.args\n const hasArgs = isObject(args) && Object.keys(args).length > 0\n const argText = hasArgs ? ` with ${preview(args, 160)}` : ''\n const summary =\n kind === 'tool'\n ? `Calls tool \"${target}\"${argText || ' with no arguments'}`\n : kind === 'resource'\n ? `Reads resource ${target}`\n : kind === 'resourceTemplate'\n ? `Reads resource template ${target}${hasArgs ? ` expanded with ${preview(args, 160)}` : ''}`\n : kind === 'prompt'\n ? `Gets prompt \"${target}\"${argText}`\n : 'No operation (missing tool / resource / resourceTemplate / prompt)'\n const notes: string[] = []\n if (typeof step.budgetMs === 'number')\n notes.push(`must finish within ${step.budgetMs}ms (budget)`)\n if (typeof step.timeoutMs === 'number') notes.push(`times out after ${step.timeoutMs}ms`)\n if (step.validateOutput === false)\n notes.push('does not validate structuredContent against outputSchema')\n if (step.normalize === false) notes.push('compares the raw result (normalization off)')\n else if (isObject(step.normalize)) notes.push(`custom normalization ${preview(step.normalize)}`)\n if (step.ignoreErrors === true) notes.push('never fails the case (ignoreErrors)')\n if (step.await === true)\n notes.push('polls the task (tasks/get) until it finishes, then checks the final result')\n else if (isObject(step.await))\n notes.push(`polls the task until it finishes (${preview(step.await)})`)\n if (\n kind === 'tool' &&\n step.expect === undefined &&\n step.expectError === undefined &&\n step.expectTask === undefined &&\n step.expectInputRequired === undefined\n ) {\n notes.push('asserts only that the call succeeds')\n }\n return {\n phase,\n index,\n ...(typeof step.name === 'string' ? { name: step.name } : {}),\n ...(kind\n ? {\n operation: {\n kind,\n method: METHODS[kind],\n target,\n ...(args !== undefined ? { args } : {}),\n },\n }\n : {}),\n summary,\n uses: [...placeholders(args)],\n expect: step.expect !== undefined ? describeExpectation(step.expect) : [],\n ...(step.expectError !== undefined ? { expectError: errorText(step.expectError) } : {}),\n expectInputRequired:\n step.expectInputRequired !== undefined ? describeExpectation(step.expectInputRequired) : [],\n expectTask: step.expectTask !== undefined ? describeExpectation(step.expectTask) : [],\n respond: isObject(step.respond)\n ? Object.entries(step.respond).map(\n ([method, answer]) => `answers ${method} with ${preview(answer, 120)}`,\n )\n : [],\n captures: isObject(step.capture)\n ? Object.entries(step.capture).map(([name, from]) => `captures {{${name}}} = ${String(from)}`)\n : [],\n notes,\n }\n}\n\nexport function explainCase(value: unknown, file: string): CaseExplanation {\n if (!isObject(value))\n return { file, kind: 'single', tags: [], steps: [], errors: ['not a JSON object'], flags: [] }\n const steps: StepExplanation[] = []\n const list = (key: 'setup' | 'steps' | 'teardown', phase: StepExplanation['phase']) => {\n const items = value[key]\n if (Array.isArray(items))\n items.forEach((s, i) => isObject(s) && steps.push(explainStep(s, phase, i + 1)))\n }\n list('setup', 'setup')\n const flow = Array.isArray(value.steps)\n if (flow) list('steps', 'main')\n else steps.push(explainStep(value, 'main', 1))\n list('teardown', 'teardown')\n return {\n file,\n ...(typeof value.name === 'string' ? { name: value.name } : {}),\n kind: flow ? 'flow' : 'single',\n tags: Array.isArray(value.tags) ? value.tags.map(String) : [],\n ...(typeof value.server === 'string' ? { server: value.server } : {}),\n ...(value.skip !== undefined && value.skip !== false\n ? { skip: typeof value.skip === 'string' ? value.skip : 'yes' }\n : {}),\n ...(value.flaky === true ? { flaky: true } : {}),\n steps,\n flags: weakAssertions(value),\n errors: [],\n }\n}\n\nfunction stepLabel(phase: StepExplanation['phase'], index: number, flow: boolean): string {\n if (phase === 'setup') return `setup ${index}`\n if (phase === 'teardown') return `teardown ${index}`\n return flow ? `step ${index}` : 'case'\n}\n\n/** Assertions that pass more than the author probably meant (for PR review). */\nexport function weakAssertions(testCase: Record<string, JsonValue>): WeakAssertion[] {\n const flags: WeakAssertion[] = []\n if (testCase.skip !== undefined && testCase.skip !== false) {\n flags.push({\n code: 'skipped',\n at: 'case',\n message: `skipped${typeof testCase.skip === 'string' ? `: ${testCase.skip}` : ''} (never runs)`,\n })\n }\n const flow = Array.isArray(testCase.steps)\n const phases: Array<[StepExplanation['phase'], JsonValue[]]> = [\n ['setup', Array.isArray(testCase.setup) ? testCase.setup : []],\n ['main', flow ? (testCase.steps as JsonValue[]) : [testCase]],\n ['teardown', Array.isArray(testCase.teardown) ? testCase.teardown : []],\n ]\n for (const [phase, steps] of phases) {\n steps.forEach((raw, i) => {\n if (!isObject(raw)) return\n const at = stepLabel(phase, i + 1, flow)\n const isOp = ['tool', 'resource', 'resourceTemplate', 'prompt'].some(\n (k) => raw[k] !== undefined,\n )\n if (isObject(raw.expectError) && Object.keys(raw.expectError).length === 0) {\n flags.push({\n code: 'any-error',\n at,\n message: 'expectError {} accepts any error (add a code or message)',\n })\n }\n if (\n isObject(raw.expect) &&\n Object.keys(raw.expect).length === 1 &&\n raw.expect.$partial === true\n ) {\n flags.push({\n code: 'bare-partial',\n at,\n message: 'expect {\"$partial\": true} accepts any object result',\n })\n }\n const asserts = ['expect', 'expectError', 'expectTask', 'expectInputRequired'].some(\n (k) => raw[k] !== undefined,\n )\n if (\n isOp &&\n !asserts &&\n !(phase === 'teardown' && raw.ignoreErrors === true) &&\n phase !== 'setup'\n ) {\n flags.push({\n code: 'no-expectation',\n at,\n message: 'no expectation: only checks that the call succeeds',\n })\n }\n if (raw.validateOutput === false) {\n flags.push({\n code: 'no-output-validation',\n at,\n message:\n 'validateOutput: false: structuredContent is not checked against the outputSchema',\n })\n }\n if (raw.ignoreErrors === true && phase !== 'teardown') {\n flags.push({\n code: 'ignore-errors',\n at,\n message: 'ignoreErrors outside teardown: failures of this step are hidden',\n })\n }\n })\n }\n return flags\n}\n\n/** `$ref`s in the case as written: where they sit and which fragment they pull in. */\nfunction refsIn(value: JsonValue, at = ''): Array<{ path: string; ref: string }> {\n const out: Array<{ path: string; ref: string }> = []\n if (Array.isArray(value)) value.forEach((v, i) => out.push(...refsIn(v, appendIndex(at, i))))\n else if (isObject(value)) {\n if (typeof value.$ref === 'string' && Object.keys(value).length === 1) {\n out.push({ path: at === '' ? '(root)' : at, ref: value.$ref })\n } else if (!(Object.keys(value).length === 1 && value.$literal !== undefined)) {\n for (const [key, child] of Object.entries(value)) {\n if (key === '$schema' && isObject(child)) continue\n out.push(...refsIn(child, appendKey(at, key)))\n }\n }\n }\n return out\n}\n\nexport function formatExplanation(\n ex: CaseExplanation,\n { full = false, brief = false, maxLines = 40 } = {},\n): string {\n const c = colors()\n const out: string[] = []\n out.push(`${c.bold(ex.name ?? '(unnamed case)')} ${c.dim(ex.file)}`)\n for (const error of ex.errors) out.push(c.red(` ✗ ${error}`))\n for (const warning of ex.warnings ?? []) out.push(c.yellow(` ! ${warning}`))\n for (const flag of ex.flags) out.push(c.yellow(` ! ${flag.at}: ${flag.message}`))\n if (ex.errors.length > 0 || brief) return out.join('\\n')\n const meta: string[] = []\n if (ex.kind === 'flow')\n meta.push(`flow of ${ex.steps.filter((s) => s.phase === 'main').length} steps`)\n if (ex.tags.length) meta.push(`tags: ${ex.tags.join(', ')}`)\n if (ex.server) meta.push(`server: ${ex.server}`)\n if (ex.flaky) meta.push('flaky (pass-rate floor under --repeat)')\n if (meta.length) out.push(` ${c.dim(meta.join(' · '))}`)\n for (const ref of ex.refs ?? []) {\n out.push(` ${c.dim(`${ref.path} is inlined from the fragment ${ref.ref}`)}`)\n }\n const assertionLines = (list: Assertion[], indent: string) => {\n const shown = full ? list : list.slice(0, maxLines)\n for (const a of shown)\n out.push(`${indent}${' '.repeat(Math.min(a.depth, 8))}${c.cyan(a.path)} ${a.text}`)\n if (shown.length < list.length)\n out.push(`${indent}${c.dim(`… ${list.length - shown.length} more (use --full)`)}`)\n }\n for (const step of ex.steps) {\n const label =\n ex.kind === 'flow' || step.phase !== 'main'\n ? `${step.phase === 'main' ? 'Step' : step.phase === 'setup' ? 'Setup' : 'Teardown'} ${step.index}${step.name ? ` \"${step.name}\"` : ''}: `\n : ''\n out.push('', ` ${c.bold(label)}${step.summary}`)\n const indent = ' '\n if (step.uses.length)\n out.push(`${indent}uses captured ${step.uses.map((u) => `{{${u}}}`).join(', ')}`)\n for (const r of step.respond) out.push(`${indent}if the server asks for input: ${r}`)\n if (step.expectInputRequired.length) {\n out.push(`${indent}expects the server to ask for input:`)\n assertionLines(step.expectInputRequired, `${indent} `)\n }\n if (step.expectTask.length) {\n out.push(`${indent}expects a task:`)\n assertionLines(step.expectTask, `${indent} `)\n }\n if (step.expectError) out.push(`${indent}expects it ${step.expectError}`)\n if (step.expect.length) {\n out.push(`${indent}expects the result (after normalization):`)\n assertionLines(step.expect, `${indent} `)\n }\n for (const capture of step.captures) out.push(`${indent}then ${capture}`)\n for (const note of step.notes) out.push(`${indent}${c.dim(note)}`)\n }\n return out.join('\\n')\n}\n\ninterface Suite {\n options: RunOptions\n /** Every case file the config's globs match. */\n files(): string[]\n /** Ids of `$ref` fragment files the globs match (same detection as vib run). */\n fragments(): Set<string>\n}\n\nfunction loadSuite(flags: ReturnType<typeof parseCommonFlags>): Suite {\n let options: RunOptions\n try {\n options = mergeCliOptions(flags, {}, { quiet: true })\n } catch (err) {\n if (flags.configPath) throw err\n options = { ...defaultRunOptions, rootDir: process.cwd() }\n }\n let fragments: Set<string> | undefined\n return {\n options,\n files: () => resolveCaseFilesSync(options.globs, options.rootDir),\n fragments: () => {\n fragments ??= new Set(\n loadCasesSync({\n rootDir: options.rootDir,\n globs: options.globs,\n defaultServer: options.defaultServer,\n servers: Object.keys(options.servers),\n hooks: options.hooks,\n manifest: options.manifest,\n }).fragments ?? [],\n )\n return fragments\n },\n }\n}\n\nfunction loadOne(file: string, suite: Suite): LoadedCase & { warnings: string[] } {\n const warnings: string[] = []\n const loaded = loadCaseFile(\n file,\n {\n rootDir: suite.options.rootDir,\n defaultServer: suite.options.defaultServer,\n servers: Object.keys(suite.options.servers),\n hooks: suite.options.hooks,\n },\n warnings,\n )\n return { ...loaded, warnings }\n}\n\nfunction explainLoaded(loaded: LoadedCase & { warnings: string[] }): CaseExplanation {\n const shown = path.relative(process.cwd(), loaded.path).replace(/\\\\/g, '/') || loaded.path\n if (loaded.error || !loaded.data) {\n return {\n file: shown,\n ...(loaded.ref.name ? { name: loaded.ref.name } : {}),\n kind: 'single',\n tags: loaded.ref.tags,\n steps: [],\n flags: [],\n errors: [loaded.error ?? 'not a case file'],\n warnings: loaded.warnings,\n }\n }\n const ex = explainCase(loaded.data, shown)\n const refs = loaded.source ? refsIn(loaded.source as unknown as JsonValue) : []\n return { ...ex, warnings: loaded.warnings, ...(refs.length > 0 ? { refs } : {}) }\n}\n\n/** Files for the inputs: paths, globs, or case names (matched against the suite). */\nfunction resolveInputs(inputs: string[], suite: Suite): string[] {\n const files: string[] = []\n let suiteCases: Array<{ file: string; name: string; id: string }> | undefined\n const byName = () => {\n suiteCases ??= suite\n .files()\n .map((file) => loadOne(file, suite))\n .filter((loaded) => !loaded.notACase && !suite.fragments().has(loaded.ref.id))\n .map((loaded) => ({ file: loaded.path, name: loaded.ref.name, id: loaded.ref.id }))\n return suiteCases\n }\n for (const input of inputs) {\n if (/[*?[\\]{}]/.test(input)) {\n const hits = fg.sync(input.replace(/\\\\/g, '/'), { absolute: true, onlyFiles: true })\n if (hits.length === 0)\n throw new UsageError(`No case files match ${input}.`, {\n code: 'not-found',\n hint: 'Check the glob (quote it so the shell does not expand it).',\n })\n files.push(...hits.map((f) => path.resolve(f)).sort())\n continue\n }\n const asPath = path.resolve(input)\n if (fs.existsSync(asPath) && fs.statSync(asPath).isFile()) {\n files.push(asPath)\n continue\n }\n const cases = byName()\n const lower = input.toLowerCase()\n let hits = cases.filter((c) => c.name.toLowerCase() === lower || c.id === input)\n if (hits.length === 0) hits = cases.filter((c) => c.name.toLowerCase().includes(lower))\n if (hits.length === 0) {\n const suggestion = closest(\n input,\n cases.map((c) => c.name),\n )\n const looksLikePath = /[\\\\/]|\\.jsonc?$/i.test(input)\n throw new UsageError(\n looksLikePath\n ? `Case file not found: ${asPath}.`\n : `No case named \"${input}\" in the suite.`,\n {\n code: looksLikePath ? 'not-found' : 'unknown-case',\n hint: `${suggestion ? `Did you mean \"${suggestion}\"? ` : ''}Pass a case file path, a glob, or a case name (${cases.length} cases in the suite; vib explain lists them all).`,\n next: ['vib explain --brief'],\n },\n )\n }\n files.push(...hits.map((h) => h.file))\n }\n return [...new Set(files)]\n}\n\nexport async function explainCommand(argv: string[]): Promise<number> {\n const flags = parseCommonFlags(argv)\n const inputs = positionals(argv)\n const brief = hasFlag(argv, '--brief')\n const suite = loadSuite(flags)\n const files = inputs.length === 0 ? suite.files() : resolveInputs(inputs, suite)\n if (files.length === 0) {\n throw new UsageError(\n `No case files match the suite globs (${suite.options.globs.join(', ')}).`,\n {\n code: 'not-found',\n hint: 'Record one with vib record <tool>, or pass a case file path.',\n next: ['vib record <tool>'],\n },\n )\n }\n const explanations: CaseExplanation[] = []\n const fragments: string[] = []\n for (const file of files) {\n const loaded = loadOne(file, suite)\n // Like vib run: manifest locks and `$ref` fragments under the globs are not cases.\n if (suite.fragments().has(loaded.ref.id)) {\n fragments.push(loaded.ref.id)\n continue\n }\n if (loaded.notACase && inputs.length === 0) continue\n explanations.push(explainLoaded(loaded))\n }\n const ok = explanations.every((e) => e.errors.length === 0)\n const shown = brief\n ? explanations.filter(\n (e) => e.errors.length > 0 || e.flags.length > 0 || (e.warnings ?? []).length > 0,\n )\n : explanations\n const summary = {\n cases: explanations.length,\n errors: explanations.filter((e) => e.errors.length > 0).length,\n flagged: explanations.filter((e) => e.flags.length > 0).length,\n }\n if (flags.json) {\n printJson(pruneEmpty({ ok, summary, cases: shown, fragments }))\n return ok ? 0 : 1\n }\n const c = colors()\n if (shown.length > 0) {\n console.log(\n shown.map((e) => formatExplanation(e, { full: hasFlag(argv, '--full'), brief })).join('\\n\\n'),\n )\n }\n if (fragments.length > 0) {\n const shownIds = fragments.slice(0, 5).join(', ')\n const more = fragments.length > 5 ? `, +${fragments.length - 5} more` : ''\n console.log(\n c.dim(\n `${shown.length > 0 ? '\\n' : ''}info: skipped ${plural(fragments.length, '$ref fragment file')} (not cases): ${shownIds}${more}`,\n ),\n )\n }\n if (explanations.length > 1 || brief) {\n console.log('')\n const line = `${plural(summary.cases, 'case')} · ${plural(summary.errors, 'load error')} · ${summary.flagged} with weak assertions`\n console.log(ok ? c.green(line) : c.red(line))\n }\n return ok ? 0 : 1\n}\n","import path from 'node:path'\nimport {\n ALL_STRATEGIES,\n DEFAULT_STRATEGIES,\n type EvaluatedVerdict,\n type FuzzOutcome,\n type GeneratedCase,\n type InvariantLevel,\n type Strategy,\n canonicalJson,\n createDefaultInvariants,\n evaluate,\n findCase,\n generateArgs,\n schemaWarnings,\n} from '../fuzz/index.js'\nimport { validate } from '../schema.js'\nimport type { McpSession, Outcome } from '../session/index.js'\nimport type { JsonValue, TestCase, ToolSummary } from '../types.js'\nimport {\n UsageError,\n hasFlag,\n positionals,\n printJson,\n resolvePathFromCwd,\n schemaRefFor,\n slugify,\n suiteLayout,\n takeAllFlags,\n takeFlag,\n takeNumberFlag,\n unknownNameError,\n writeJsonFile,\n} from './args.js'\nimport { replayCommand } from './call.js'\nimport { colors, isObject, plural, preview, renderTable } from './format.js'\nimport { inSuite, outsideSuiteNote, suiteDir } from './record.js'\nimport { openSessionOptions, parseCommonFlags, startSession } from './resolve.js'\n\nexport const DEFAULT_FUZZ_RUNS = 100\n\nexport interface FuzzCaseReport {\n id: string\n strategy: Strategy\n expectation: GeneratedCase['expectation']\n reason: string\n target?: string\n args: Record<string, JsonValue>\n outcome: {\n kind: FuzzOutcome['kind']\n durationMs: number\n isError?: boolean\n error?: FuzzOutcome['error']\n structuredValid?: boolean\n }\n verdicts: EvaluatedVerdict[]\n}\n\n/** Map a session Outcome to the fuzz module's FuzzOutcome. */\nexport function toFuzzOutcome(\n outcome: Outcome,\n sessionClosed: boolean,\n outputSchema: JsonValue | undefined,\n): FuzzOutcome {\n const base = { durationMs: outcome.durationMs }\n if (outcome.kind === 'error') {\n const error = {\n kind: outcome.error.kind,\n ...(outcome.error.code !== undefined ? { code: outcome.error.code } : {}),\n ...(outcome.error.codeName !== undefined ? { codeName: outcome.error.codeName } : {}),\n message: outcome.error.message,\n }\n if (sessionClosed) return { ...base, kind: 'crash', error }\n if (outcome.error.kind === 'timeout') return { ...base, kind: 'timeout', error }\n // A tool error (isError: true) is a result as far as the invariants are concerned.\n if (outcome.error.kind === 'tool' && outcome.result !== undefined) {\n return { ...base, kind: 'result', result: outcome.result }\n }\n return { ...base, kind: 'error', error }\n }\n if (outcome.kind === 'input_required') return { ...base, kind: 'input_required' }\n const result = outcome.result\n const out: FuzzOutcome = { ...base, kind: 'result', result }\n if (outputSchema !== undefined && !(isObject(result) && result.isError === true)) {\n out.structuredValid =\n isObject(result) && result.structuredContent !== undefined\n ? validate(outputSchema, result.structuredContent).ok\n : false\n }\n return out\n}\n\nfunction parseStrategies(argv: string[]): Strategy[] {\n const raw = takeAllFlags(argv, '--strategy')\n .flatMap((s) => s.split(','))\n .map((s) => s.trim())\n .filter(Boolean)\n for (const s of raw) {\n if (!(ALL_STRATEGIES as readonly string[]).includes(s)) {\n throw new UsageError(`Unknown --strategy \"${s}\".`, {\n code: 'invalid-argument',\n hint: `Use one of ${ALL_STRATEGIES.join(', ')} (repeatable or comma-separated).`,\n })\n }\n }\n const strategies = raw.length > 0 ? (raw as Strategy[]) : [...DEFAULT_STRATEGIES]\n if (hasFlag(argv, '--inject') && !strategies.includes('inject')) strategies.push('inject')\n return strategies\n}\n\nfunction parseSeed(raw: string): number | string {\n return /^\\d+$/.test(raw) && Number(raw) <= 0xffffffff ? Number(raw) : raw\n}\n\n/** The case file `--record-failures` writes (docs/FUZZ.md \"Reproducing a failure\"). */\nexport function fuzzCaseFile(\n tool: ToolSummary,\n c: GeneratedCase,\n failed: EvaluatedVerdict[],\n { timeoutMs, budgetMs }: { timeoutMs: number; budgetMs?: number },\n): TestCase {\n const testCase: TestCase = {\n name: `fuzz ${c.id}: ${c.reason}`,\n tags: ['fuzz'],\n tool: tool.name,\n args: c.args,\n }\n const wantsError =\n c.expectation === 'invalid-params' ||\n (c.expectation === 'any' && !validate(tool.inputSchema, c.args).ok)\n if (wantsError) testCase.expectError = { code: 'InvalidParams' }\n else testCase.expect = { $partial: true }\n if (failed.some((v) => v.invariant === 'valid-args-no-timeout')) testCase.timeoutMs = timeoutMs\n if (budgetMs !== undefined && failed.some((v) => v.invariant === 'latency-under-budget')) {\n testCase.budgetMs = budgetMs\n }\n return testCase\n}\n\ninterface InvariantRow {\n id: string\n title: string\n level: string\n passed: number\n failed: number\n skipped: number\n}\n\nfunction tally(\n cases: FuzzCaseReport[],\n invariantIds: Array<{ id: string; title: string; level: string }>,\n): InvariantRow[] {\n return invariantIds.map(({ id, title, level }) => {\n const row = { id, title, level, passed: 0, failed: 0, skipped: 0 }\n for (const c of cases) {\n for (const v of c.verdicts) {\n if (v.invariant !== id) continue\n if (v.skipped) row.skipped++\n else if (v.ok) row.passed++\n else row.failed++\n }\n }\n return row\n })\n}\n\n/** A failure's root cause: the invariant plus its detail without case-specific parts. */\nexport function rootCauseKey(v: EvaluatedVerdict): string {\n let detail = v.detail ?? v.title\n for (let i = 0; i < 3; i++) detail = detail.replace(/\\s*\\([^()]*\\)/g, '')\n detail = detail\n .replace(/\"[^\"]*\"|'[^']*'/g, '…')\n .replace(/\\d+ms/g, 'Nms')\n .replace(/\\s+/g, ' ')\n .trim()\n return `${v.invariant}: ${detail}`\n}\n\nexport interface RootCause {\n invariant: string\n level: InvariantLevel\n /** The shared detail (case-specific parts removed). */\n summary: string\n /** Case ids, in generation order. */\n cases: string[]\n}\n\nexport function groupRootCauses(\n failures: Array<{ r: FuzzCaseReport; failed: EvaluatedVerdict[] }>,\n): RootCause[] {\n const groups = new Map<string, RootCause>()\n for (const { r, failed } of failures) {\n for (const v of failed) {\n const key = rootCauseKey(v)\n const group = groups.get(key) ?? {\n invariant: v.invariant,\n level: v.level,\n summary: key.slice(v.invariant.length + 2),\n cases: [],\n }\n if (!group.cases.includes(r.id)) group.cases.push(r.id)\n groups.set(key, group)\n }\n }\n return [...groups.values()].sort((a, b) =>\n a.level === b.level ? b.cases.length - a.cases.length : a.level === 'error' ? -1 : 1,\n )\n}\n\nexport async function fuzzCommand(argv: string[]): Promise<number> {\n const [toolName] = positionals(argv)\n if (!toolName) {\n throw new UsageError('Missing tool name.', {\n code: 'missing-argument',\n hint: 'Usage: vib fuzz <tool> [--runs 100] [--seed S] [--inject] [--record-failures]. Run vib tools to list tools.',\n next: ['vib tools'],\n })\n }\n const flags = parseCommonFlags(argv)\n const runs = takeNumberFlag(argv, '--runs', { min: 1, integer: true }) ?? DEFAULT_FUZZ_RUNS\n const seedRaw = takeFlag(argv, '--seed') ?? toolName\n const seed = parseSeed(seedRaw)\n const strategies = parseStrategies(argv)\n const budgetMs = takeNumberFlag(argv, '--budget', { min: 1 })\n const onlyId = takeFlag(argv, '--id')\n const recordFailures = hasFlag(argv, '--record-failures')\n const brief = hasFlag(argv, '--brief')\n const acceptToolError = !hasFlag(argv, '--strict-invalid')\n const resolved = openSessionOptions(flags)\n const { timeoutMs, rootDir, options } = resolved\n const c = colors()\n const progress = !flags.json && Boolean(process.stderr.isTTY)\n\n let started = await startSession(flags, {}, resolved)\n let session: McpSession = started.session\n let restarts = 0\n const t0 = performance.now()\n try {\n const toolsBefore = await session.listTools()\n const tool = toolsBefore.find((t) => t.name === toolName)\n if (!tool) {\n throw unknownNameError(\n 'tool',\n toolName,\n toolsBefore.map((t) => t.name),\n 'vib tools',\n )\n }\n const genOpts = { seed, count: runs, strategies, selfCheck: true }\n let cases: GeneratedCase[]\n if (onlyId) {\n const found = findCase(tool.inputSchema, { ...genOpts, id: onlyId })\n if (!found) {\n throw new UsageError(\n `Case ${onlyId} not found for seed ${JSON.stringify(seedRaw)} with --runs ${runs}.`,\n {\n code: 'not-found',\n hint: 'Use the same --seed, --runs (at least as large) and --strategy/--inject flags as the run that reported it.',\n },\n )\n }\n cases = [found]\n } else {\n cases = generateArgs(tool.inputSchema, genOpts)\n }\n const warnings = schemaWarnings(tool.inputSchema)\n const invariants = createDefaultInvariants({\n acceptToolError,\n ...(budgetMs !== undefined ? { budgetMs } : {}),\n })\n const byStrategy = strategies\n .map((s) => `${s} ${cases.filter((x) => x.strategy === s).length}`)\n .join(' · ')\n const expectations: Array<[GeneratedCase['expectation'], string]> = [\n ['success', 'should succeed'],\n ['invalid-params', 'should be rejected'],\n ['any', 'must not crash'],\n ]\n const byExpectation = expectations\n .map(([e, label]) => [cases.filter((x) => x.expectation === e).length, label] as const)\n .filter(([n]) => n > 0)\n .map(([n, label]) => `${n} ${label}`)\n .join(' · ')\n const reproduceBase = [\n 'vib',\n 'fuzz',\n toolName,\n '--seed',\n String(seedRaw),\n '--runs',\n String(runs),\n ]\n const base = strategies.filter((s) => s !== 'inject')\n const isDefault =\n base.length === DEFAULT_STRATEGIES.length &&\n DEFAULT_STRATEGIES.every((s) => (base as string[]).includes(s))\n if (base.length === 0) reproduceBase.push('--strategy', 'inject')\n else {\n if (!isDefault) reproduceBase.push('--strategy', base.join(','))\n if (strategies.includes('inject')) reproduceBase.push('--inject')\n }\n if (!flags.json) {\n console.log(\n c.bold(`vib fuzz ${toolName}`) +\n c.dim(\n ` · seed ${JSON.stringify(seedRaw)} · ${plural(cases.length, 'case')}: ${byStrategy}`,\n ),\n )\n if (!brief) console.log(c.dim(` by expectation: ${byExpectation}`))\n for (const w of warnings) console.log(c.yellow(`schema: ${w}`))\n }\n\n const reports: FuzzCaseReport[] = []\n let failing = 0\n for (const [i, gc] of cases.entries()) {\n if (progress) {\n process.stderr.write(\n `\\r\\x1b[2K${c.dim(`[fuzz] ${i + 1}/${cases.length} · ${failing} failing · ${gc.id}`)}`,\n )\n }\n const outcome = await session.callTool(tool.name, gc.args, { timeoutMs })\n const fuzzOutcome = toFuzzOutcome(outcome, session.closed, tool.outputSchema)\n const verdicts = evaluate(gc, fuzzOutcome, invariants)\n if (verdicts.some((v) => !v.ok && v.level === 'error')) failing++\n reports.push({\n id: gc.id,\n strategy: gc.strategy,\n expectation: gc.expectation,\n reason: gc.reason,\n ...(gc.target !== undefined ? { target: gc.target } : {}),\n args: gc.args,\n outcome: {\n kind: fuzzOutcome.kind,\n durationMs: fuzzOutcome.durationMs,\n ...(isObject(fuzzOutcome.result) && fuzzOutcome.result.isError === true\n ? { isError: true }\n : {}),\n ...(fuzzOutcome.error ? { error: fuzzOutcome.error } : {}),\n ...(fuzzOutcome.structuredValid !== undefined\n ? { structuredValid: fuzzOutcome.structuredValid }\n : {}),\n },\n verdicts,\n })\n if (session.closed) {\n await session.close()\n restarts++\n started = await startSession(flags, {}, resolved)\n session = started.session\n }\n }\n if (progress) process.stderr.write('\\r\\x1b[2K')\n\n // Run-level checks: the server is still alive and its tool surface did not change.\n const alive = await session.ping()\n let toolsAfter: ToolSummary[] | undefined\n try {\n toolsAfter = alive ? await session.listTools() : undefined\n } catch {\n toolsAfter = undefined\n }\n const unchanged =\n toolsAfter !== undefined &&\n canonicalJson(toolsAfter as unknown as JsonValue) ===\n canonicalJson(toolsBefore as unknown as JsonValue)\n const runChecks = [\n {\n id: 'server-alive',\n level: 'error' as const,\n ok: alive,\n ...(alive ? {} : { detail: 'the server did not answer a liveness request after the run' }),\n },\n {\n id: 'tools-list-unchanged',\n level: 'error' as const,\n ok: unchanged,\n ...(unchanged\n ? {}\n : {\n detail: toolsAfter\n ? 'tools/list differs from before the run (tool definitions changed under fuzzing)'\n : 'tools/list could not be fetched after the run',\n }),\n },\n ]\n\n const notApplicable = (id: string): string | undefined => {\n if (id === 'output-matches-output-schema' && tool.outputSchema === undefined)\n return 'the tool declares no outputSchema'\n if (id === 'no-echo-of-injection-payload-in-error-message' && !strategies.includes('inject'))\n return 'only with --inject'\n return undefined\n }\n const rows = tally(\n reports,\n invariants.map(({ id, title, level }) => ({ id, title, level })),\n ).map((row) => {\n const na = notApplicable(row.id)\n return { ...row, applicable: row.passed + row.failed + row.skipped, ...(na ? { na } : {}) }\n })\n const failures = reports\n .map((r) => ({ r, failed: r.verdicts.filter((v) => !v.ok) }))\n .filter((x) => x.failed.length > 0)\n const errorFailures = failures.filter((x) => x.failed.some((v) => v.level === 'error'))\n const warnFailures = failures.filter((x) => !errorFailures.includes(x))\n const causes = groupRootCauses(failures)\n const ok = errorFailures.length === 0 && runChecks.every((check) => check.ok)\n\n const recorded: Array<{ path: string; inSuite: boolean }> = []\n if (recordFailures) {\n const outDirFlag = takeFlag(argv, '--out-dir')\n const outDir = outDirFlag ? resolvePathFromCwd(outDirFlag) : suiteDir(options, 'fuzz')\n const { suffix } = suiteLayout(options.globs)\n for (const { r, failed } of errorFailures) {\n const gc = cases.find((x) => x.id === r.id) as GeneratedCase\n const file = path.join(outDir, `${slugify(tool.name) || 'tool'}-${r.id}${suffix}`)\n const body = fuzzCaseFile(\n tool,\n gc,\n failed.filter((v) => v.level === 'error'),\n { timeoutMs, budgetMs },\n )\n writeJsonFile(file, { $schema: schemaRefFor(file, rootDir, 'case.schema.json'), ...body })\n recorded.push({ path: file, inSuite: inSuite(file, options) })\n }\n }\n const outside = recorded.filter((r) => !r.inSuite)\n\n const reproduce = (id?: string) =>\n replayCommand([...reproduceBase, ...(id ? ['--id', id] : [])])\n const durationMs = Math.round(performance.now() - t0)\n if (flags.json) {\n printJson({\n ok,\n tool: tool.name,\n server: started.serverName,\n seed: seedRaw,\n runs,\n strategies,\n generated: cases.length,\n durationMs,\n restarts,\n schemaWarnings: warnings,\n invariants: rows,\n runChecks,\n rootCauses: causes.map((cause) => ({ ...cause, reproduce: reproduce(cause.cases[0]) })),\n failures: failures.map(({ r, failed }) => ({\n id: r.id,\n strategy: r.strategy,\n expectation: r.expectation,\n reason: r.reason,\n args: r.args,\n outcome: r.outcome,\n failed,\n reproduce: reproduce(r.id),\n })),\n ...(brief ? {} : { cases: reports }),\n recorded,\n ...(outside.length > 0 ? { notes: [outsideSuiteNote(outside[0].path, options)] } : {}),\n reproduce: reproduce(),\n })\n return ok ? 0 : 1\n }\n\n if (!brief) {\n console.log('')\n console.log(\n renderTable(\n [\n { header: 'INVARIANT' },\n { header: 'LEVEL' },\n { header: 'CASES' },\n { header: 'PASS' },\n { header: 'FAIL', paint: (t) => (/^[1-9]/.test(t.trim()) ? c.red(t) : t) },\n { header: 'SKIP', paint: (t) => c.dim(t) },\n ],\n rows\n .filter((row) => row.id !== 'no-echo-of-injection-payload-in-error-message' || !row.na)\n .map((row) =>\n row.na\n ? [row.id, row.level, 'n/a', '-', '-', c.dim(`(${row.na})`)]\n : [\n row.id,\n row.level,\n String(row.applicable),\n String(row.passed),\n String(row.failed),\n String(row.skipped),\n ],\n ),\n ),\n )\n console.log('')\n }\n const failedChecks = runChecks.filter((check) => !check.ok)\n if (!brief || failedChecks.length > 0) {\n console.log(\n (brief ? failedChecks : runChecks)\n .map(\n (check) =>\n `${check.ok ? c.green('✓') : c.red('✗')} ${check.id}${check.detail ? c.dim(` (${check.detail})`) : ''}`,\n )\n .join(' '),\n )\n }\n if (restarts > 0)\n console.log(c.yellow(`The server crashed and was restarted ${plural(restarts, 'time')}.`))\n const show = (\n title: string,\n list: RootCause[],\n glyph: string,\n paint: (t: string) => string,\n ) => {\n if (list.length === 0) return\n const total = new Set(list.flatMap((cause) => cause.cases)).size\n console.log('')\n console.log(\n paint(c.bold(`${title} (${plural(list.length, 'root cause')}, ${plural(total, 'case')})`)),\n )\n for (const cause of list.slice(0, 8)) {\n const example = reports.find((r) => r.id === cause.cases[0]) as FuzzCaseReport\n const verdict = example.verdicts.find((v) => !v.ok && v.invariant === cause.invariant)\n console.log(\n ` ${paint(glyph)} ${c.bold(cause.invariant)} · ${plural(cause.cases.length, 'case')}`,\n )\n console.log(` ${verdict?.detail ?? cause.summary}`)\n console.log(c.dim(` e.g. ${example.id}: ${example.reason}`))\n console.log(c.dim(` args: ${preview(example.args, 140)}`))\n console.log(c.dim(` reproduce: ${reproduce(example.id)}`))\n if (cause.cases.length > 1) {\n const others = cause.cases.slice(1, 6)\n const more = cause.cases.length - 1 - others.length\n console.log(c.dim(` also: ${others.join(', ')}${more > 0 ? `, +${more} more` : ''}`))\n }\n }\n if (list.length > 8) console.log(c.dim(` … ${list.length - 8} more (use --json for all)`))\n }\n show(\n 'Failures',\n causes.filter((cause) => cause.level === 'error'),\n '✗',\n c.red,\n )\n show(\n 'Warnings',\n causes.filter((cause) => cause.level !== 'error'),\n '!',\n c.yellow,\n )\n for (const file of recorded) console.log(`${c.green('wrote')} ${file.path}`)\n if (outside.length > 0)\n console.log(c.yellow(`note: ${outsideSuiteNote(outside[0].path, options)}`))\n console.log('')\n const parts = [\n `${plural(cases.length, 'case')} in ${durationMs}ms`,\n plural(errorFailures.length, 'failing case'),\n ...(warnFailures.length > 0 ? [plural(warnFailures.length, 'warning')] : []),\n ]\n console.log(ok ? c.green(parts.join(' · ')) : c.red(parts.join(' · ')))\n if (!ok && !recordFailures) {\n console.log(\n c.dim(\n 'Next: fix the server, or keep the counterexamples as regression cases with --record-failures.',\n ),\n )\n }\n return ok ? 0 : 1\n } finally {\n if (progress) process.stderr.write('\\r\\x1b[2K')\n await session.close()\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport readline from 'node:readline'\nimport type { Readable } from 'node:stream'\nimport { resolveCaseFilesSync } from '../cases.js'\nimport { escapeDirectives } from '../match.js'\nimport { normalizeResult } from '../normalize.js'\nimport { suggestRespond } from '../respond-hint.js'\nimport {\n type CallOptions,\n type InputResponder,\n type McpSession,\n type Outcome,\n type ToolError,\n fromJsonRpcError,\n isResourceNotFound,\n textFromContent,\n} from '../session/index.js'\nimport { type TapCall, readTapFile, reconstructCalls, selectCalls } from '../tap/entries.js'\nimport type {\n AwaitOptions,\n ExpectError,\n JsonValue,\n NormalizeConfig,\n RunOptions,\n Step,\n TestCase,\n ToolSummary,\n} from '../types.js'\nimport {\n UsageError,\n argsSummary,\n escapeRegex,\n hasFlag,\n parseArgValue,\n parseRespond,\n parseToolArgs,\n positionals,\n printJson,\n resolvePathFromCwd,\n schemaRefFor,\n slugify,\n stringifyArgs,\n suiteLayout,\n takeAllFlags,\n takeFlag,\n uniquePath,\n writeJsonFile,\n} from './args.js'\nimport {\n type OpKind,\n type OpSpec,\n executeOp,\n opLabel,\n parseAwait,\n replayCommand,\n resolveTarget,\n validateStructured,\n validationSummary,\n} from './call.js'\nimport {\n colors,\n firstLine,\n formatCallHeader,\n formatInputRequests,\n isObject,\n plural,\n preview,\n} from './format.js'\nimport {\n caseServerName,\n mergeCliOptions,\n openSessionOptions,\n parseCommonFlags,\n startSession,\n} from './resolve.js'\nimport { type Loosened, VOLATILE_DOCS, loosenVolatile, loosenedSummary } from './volatile.js'\n\n/** Injectable I/O for tests (stdin lines for --flow and MRTR prompts). */\nexport interface RecordIo {\n stdin?: Readable\n /** Treat input as an interactive terminal (prompts, line syntax). Default: stdin.isTTY. */\n interactive?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Line input\n// ---------------------------------------------------------------------------\n\n/** Sequential line reader over stdin; prompts go to stderr (stdout stays clean for --json). */\nexport class LineReader {\n private readonly lines: string[] = []\n private readonly waiters: Array<(line: string | undefined) => void> = []\n private ended = false\n private readonly rl: readline.Interface\n\n constructor(\n input: Readable,\n readonly interactive: boolean,\n ) {\n this.rl = readline.createInterface({\n input,\n output: interactive ? process.stderr : undefined,\n terminal: interactive,\n })\n this.rl.on('line', (line) => {\n const waiter = this.waiters.shift()\n if (waiter) waiter(line)\n else this.lines.push(line)\n })\n this.rl.on('close', () => {\n this.ended = true\n for (const waiter of this.waiters.splice(0)) waiter(undefined)\n })\n }\n\n /** Next line (undefined at end of input). Shows `prompt` on interactive terminals. */\n next(prompt = ''): Promise<string | undefined> {\n if (this.interactive && prompt) process.stderr.write(prompt)\n const queued = this.lines.shift()\n if (queued !== undefined) return Promise.resolve(queued)\n if (this.ended) return Promise.resolve(undefined)\n return new Promise((resolve) => this.waiters.push(resolve))\n }\n\n close(): void {\n this.rl.close()\n }\n}\n\n// ---------------------------------------------------------------------------\n// Turning observations into case fields\n// ---------------------------------------------------------------------------\n\n/** What happened, in a shape shared by live calls and tap captures. */\nexport interface Observed {\n kind: 'result' | 'error' | 'input_required'\n result?: JsonValue\n error?: ToolError\n requests?: JsonValue\n inputRequests?: JsonValue[]\n task?: JsonValue\n}\n\nexport function observedFromOutcome(outcome: Outcome): Observed {\n return {\n kind: outcome.kind,\n ...(outcome.kind === 'result' ? { result: outcome.result } : {}),\n ...(outcome.kind === 'error' ? { error: outcome.error, result: outcome.result } : {}),\n ...(outcome.kind === 'input_required' ? { requests: outcome.requests } : {}),\n ...(outcome.inputRequests ? { inputRequests: outcome.inputRequests } : {}),\n ...(outcome.task !== undefined ? { task: outcome.task } : {}),\n }\n}\n\n/** `expectError` for an observed error: stable code name + message prefix as a $regex. */\nexport function expectErrorFrom(error: ToolError): ExpectError {\n const code = isResourceNotFound(error) ? 'ResourceNotFound' : (error.codeName ?? error.code)\n const message = firstLine(error.message).slice(0, 80)\n // Locally raised errors (timeouts, closed connections) carry our own long text.\n const useMessage = message !== '' && !error.local\n return {\n ...(code !== undefined ? { code } : {}),\n ...(useMessage ? { message: { $regex: escapeRegex(message) } } : {}),\n }\n}\n\n/** Golden value: normalized like the runner does, with matcher-like keys escaped. */\nexport function golden(value: JsonValue, normalize: NormalizeConfig): JsonValue {\n return escapeDirectives(normalizeResult(value, normalize))\n}\n\n/**\n * `expectInputRequired` in the runner's era-portable *method view*:\n * `{ \"elicitation/create\": <params> }` (a method asked several times → array of params).\n * 2025-era rounds are keyed by JSON-RPC ids, so the key view would not replay across eras.\n */\nexport function inputRequiredExpectation(\n rounds: JsonValue[],\n normalize: NormalizeConfig,\n): JsonValue {\n const byMethod: Record<string, JsonValue> = {}\n const repeated = new Set<string>()\n for (const round of rounds) {\n if (!isObject(round)) continue\n for (const entry of Object.values(round)) {\n if (!isObject(entry) || typeof entry.method !== 'string') continue\n const params = entry.params ?? {}\n const method = entry.method\n if (!Object.hasOwn(byMethod, method)) byMethod[method] = params\n else if (repeated.has(method)) (byMethod[method] as JsonValue[]).push(params)\n else {\n byMethod[method] = [byMethod[method], params]\n repeated.add(method)\n }\n }\n }\n return golden(byMethod, normalize)\n}\n\nfunction withPartial(expect: JsonValue, notes: string[]): JsonValue {\n if (isObject(expect) && expect.$literal === undefined) return { $partial: true, ...expect }\n notes.push('--partial skipped: the recorded value is not a plain object.')\n return expect\n}\n\nexport interface StepOptions {\n normalize: NormalizeConfig\n partial?: boolean\n respond?: Record<string, JsonValue>\n awaitOpt?: AwaitOptions | true\n /** Keep every value verbatim (no volatile loosening). */\n exact?: boolean\n /** Raw result of an identical second call (stable check). */\n second?: JsonValue\n /** Collects what was loosened. */\n loosened?: Loosened[]\n}\n\n/** Operation fields for a case/step. Prompt args are strings on the wire. */\nexport function opFields(op: OpSpec): Partial<Step> {\n switch (op.kind) {\n case 'tool':\n return { tool: op.target, args: op.args }\n case 'resource':\n return { resource: op.target }\n case 'resourceTemplate':\n return { resourceTemplate: op.target, args: op.args }\n case 'prompt':\n return { prompt: op.target, args: stringifyArgs(op.args) }\n }\n}\n\n/**\n * Build a step from an observation. `notes` collects warnings for the user. Returns\n * undefined when the observation cannot become a case (unanswered input_required).\n */\nexport function stepFromObserved(\n op: OpSpec,\n observed: Observed,\n opts: StepOptions,\n notes: string[],\n): Step | undefined {\n if (observed.kind === 'input_required') return undefined\n const step: Step = { ...opFields(op) } as Step\n if (opts.respond && Object.keys(opts.respond).length > 0) step.respond = opts.respond\n if (observed.inputRequests && observed.inputRequests.length > 0) {\n step.expectInputRequired = inputRequiredExpectation(observed.inputRequests, opts.normalize)\n }\n const isTask =\n observed.task !== undefined &&\n observed.kind === 'result' &&\n isObject(observed.result) &&\n observed.result.resultType === 'task'\n if (opts.awaitOpt !== undefined) {\n if (observed.task !== undefined) step.await = opts.awaitOpt\n else notes.push('--await ignored: the server did not answer with a task.')\n }\n if (isTask) {\n // Not awaited: the CreateTaskResult has a fresh taskId and timestamps on every run.\n step.expectTask = { $partial: true, taskId: { $type: 'string' }, status: { $type: 'string' } }\n notes.push(\n 'The server answered with a task; recorded expectTask only. Re-record with --await to capture the final result.',\n )\n return step\n }\n if (observed.kind === 'error' && observed.error) {\n step.expectError = expectErrorFrom(observed.error)\n return step\n }\n let expect = golden(observed.result ?? null, opts.normalize)\n if (!opts.exact) {\n const second = opts.second !== undefined ? golden(opts.second, opts.normalize) : undefined\n const loosened = loosenVolatile(expect, second)\n expect = loosened.value\n opts.loosened?.push(...loosened.loosened)\n }\n step.expect = opts.partial ? withPartial(expect, notes) : expect\n return step\n}\n\n// ---------------------------------------------------------------------------\n// MRTR answers\n// ---------------------------------------------------------------------------\n\n/**\n * A per-call responder: scripted answers first; otherwise (interactive only) ask on the\n * terminal. Every answer used is collected into `used` (keyed by method).\n */\nfunction makeResponder(\n scripted: Record<string, JsonValue> | undefined,\n reader: LineReader | undefined,\n used: Record<string, JsonValue>,\n): InputResponder {\n return async (method, params) => {\n if (scripted && Object.hasOwn(scripted, method)) {\n used[method] = scripted[method]\n return scripted[method]\n }\n if (Object.hasOwn(used, method)) return used[method]\n if (!reader?.interactive) return undefined\n const c = colors()\n const suggestion = JSON.stringify(\n suggestRespond({ request: { method, params } })[method] ?? { action: 'accept' },\n )\n process.stderr.write(`${c.yellow('⏸ the server asks for input:')}\\n`)\n for (const line of formatInputRequests({ request: { method, params } })) {\n process.stderr.write(`${line}\\n`)\n }\n while (true) {\n const answer = await reader.next(\n `answer for ${method} as JSON [${suggestion}], \"-\" to leave unanswered: `,\n )\n if (answer === undefined || answer.trim() === '-') return undefined\n const text = answer.trim() === '' ? suggestion : answer\n try {\n const value = JSON.parse(text) as JsonValue\n used[method] = value\n return value\n } catch (err) {\n process.stderr.write(\n `${c.red(`not JSON: ${err instanceof Error ? err.message : String(err)}`)}; try again.\\n`,\n )\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Flow capture inference\n// ---------------------------------------------------------------------------\n\ntype PathSeg = string | number\n\nfunction walkStrings(\n value: JsonValue | undefined,\n visit: (text: string, at: PathSeg[]) => void,\n at: PathSeg[] = [],\n): void {\n if (typeof value === 'string') visit(value, at)\n else if (Array.isArray(value)) value.forEach((v, i) => walkStrings(v, visit, [...at, i]))\n else if (isObject(value)) {\n if (value.$literal !== undefined && Object.keys(value).length === 1) return\n for (const [k, v] of Object.entries(value)) walkStrings(v, visit, [...at, k])\n }\n}\n\nfunction mapStrings(value: JsonValue, fn: (text: string) => JsonValue): JsonValue {\n if (typeof value === 'string') return fn(value)\n if (Array.isArray(value)) return value.map((v) => mapStrings(v, fn))\n if (isObject(value)) {\n if (value.$literal !== undefined && Object.keys(value).length === 1) return value\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, mapStrings(v, fn)]))\n }\n return value\n}\n\n/** Dotted capture path (`structuredContent.sessionId`, `content[0].text`). */\nexport function dottedPath(at: PathSeg[]): string {\n return at.reduce<string>(\n (out, seg) => (typeof seg === 'number' ? `${out}[${seg}]` : out ? `${out}.${seg}` : seg),\n '',\n )\n}\n\nfunction captureName(at: PathSeg[], taken: Set<string>): string {\n const last = [...at].reverse().find((seg) => typeof seg === 'string') as string | undefined\n const base = (last ?? 'value').replace(/[^A-Za-z0-9_]/g, '_').replace(/^(\\d)/, '_$1') || 'value'\n let name = base\n for (let n = 2; taken.has(name); n++) name = `${base}${n}`\n taken.add(name)\n return name\n}\n\nconst MIN_HANDLE_LENGTH = 6\n\n/**\n * Detect server-minted handles: a string arg of a later step that equals a string leaf in\n * an earlier step's (normalized) result, and was not an input of that earlier step.\n * Adds `capture` to the producing step, replaces the value with `{{name}}` in later\n * steps' args and expectations, and loosens the producing step's own expectation\n * (`{\"$type\": \"string\"}`) since the handle differs on every run.\n */\nexport function inferCaptures(steps: Step[], results: Array<JsonValue | undefined>): string[] {\n const notes: string[] = []\n const taken = new Set<string>(steps.flatMap((s) => Object.keys(s.capture ?? {})))\n const inputs = steps.map((s) => {\n const set = new Set<string>()\n walkStrings(s.args as JsonValue, (text) => set.add(text))\n return set\n })\n const handles: Array<{ value: string; name: string; producer: number }> = []\n for (let j = 1; j < steps.length; j++) {\n walkStrings(steps[j].args as JsonValue, (text) => {\n if (text.length < MIN_HANDLE_LENGTH || text.includes('{{')) return\n if (handles.some((h) => h.value === text)) return\n for (let i = j - 1; i >= 0; i--) {\n if (inputs.slice(0, i + 1).some((set) => set.has(text))) return\n let found: PathSeg[] | undefined\n const prefer = (at: PathSeg[]) =>\n !found || (at[0] === 'structuredContent' && found[0] !== 'structuredContent')\n walkStrings(results[i], (leaf, at) => {\n if (leaf === text && prefer(at)) found = at\n })\n if (!found) continue\n const name = captureName(found, taken)\n steps[i].capture = { ...(steps[i].capture ?? {}), [name]: dottedPath(found) }\n handles.push({ value: text, name, producer: i })\n notes.push(\n `step ${i + 1} → step ${j + 1}: captured {{${name}}} from ${dottedPath(found)} (value ${preview(text, 40)})`,\n )\n return\n }\n })\n }\n for (const { value, name, producer } of handles) {\n const producerStep = steps[producer]\n if (producerStep.expect !== undefined) {\n producerStep.expect = mapStrings(producerStep.expect, (text): JsonValue => {\n if (text === value) return { $type: 'string' }\n if (!text.includes(value)) return text\n const parts = text.split(value)\n return parts.some((p) => /[*?]/.test(p))\n ? { $regex: `^${parts.map(escapeRegex).join('.+')}$`, flags: 's' }\n : { $wildcard: parts.join('*') }\n })\n }\n for (let k = producer + 1; k < steps.length; k++) {\n const swap = (text: string) =>\n text.includes(value) ? text.split(value).join(`{{${name}}}`) : text\n if (steps[k].args)\n steps[k].args = mapStrings(steps[k].args as JsonValue, swap) as Step['args']\n if (steps[k].expect !== undefined)\n steps[k].expect = mapStrings(steps[k].expect as JsonValue, swap)\n }\n }\n return notes\n}\n\n// ---------------------------------------------------------------------------\n// Where cases go\n// ---------------------------------------------------------------------------\n\nexport interface CaseTarget {\n rootDir: string\n outPath: string\n /** The path was derived (not --out), so it may be deduplicated. */\n derived: boolean\n}\n\n/** Default directory for new cases: the first positive config glob's base (+ `subdir`). */\nexport function suiteDir(options: Pick<RunOptions, 'globs' | 'rootDir'>, subdir = ''): string {\n const { dir } = suiteLayout(options.globs)\n return path.resolve(options.rootDir, dir, subdir)\n}\n\n/** `--out`, else `<suite dir>/<slug(name)><suffix>` (deduplicated). */\nexport function caseTarget(\n argv: string[],\n options: Pick<RunOptions, 'globs' | 'rootDir'>,\n name: string,\n subdir = '',\n): CaseTarget {\n const out = takeFlag(argv, '--out')\n if (out) return { rootDir: options.rootDir, outPath: resolvePathFromCwd(out), derived: false }\n const { suffix } = suiteLayout(options.globs)\n const file = path.join(suiteDir(options, subdir), `${slugify(name) || 'case'}${suffix}`)\n return { rootDir: options.rootDir, outPath: uniquePath(file, suffix), derived: true }\n}\n\n/** Would `vib run` (config globs) pick this file up? */\nexport function inSuite(file: string, options: Pick<RunOptions, 'globs' | 'rootDir'>): boolean {\n const norm = (p: string) =>\n process.platform === 'win32' ? path.resolve(p).toLowerCase() : path.resolve(p)\n const target = norm(file)\n try {\n return resolveCaseFilesSync(options.globs, options.rootDir).some((f) => norm(f) === target)\n } catch {\n return false\n }\n}\n\nexport function outsideSuiteNote(file: string, options: Pick<RunOptions, 'globs'>): string {\n return `${shellPath(file)} is outside the suite globs (${options.globs.join(', ')}), so vib run will not pick it up. Move it under ${suiteLayout(options.globs).dir}/ or add a glob in vibrissa.json.`\n}\n\nfunction refuseOverwrite(target: CaseTarget, force: boolean): void {\n if (!target.derived && fs.existsSync(target.outPath) && !force) {\n throw new UsageError(`Refusing to overwrite ${target.outPath}: it already exists.`, {\n code: 'file-exists',\n hint: 'Pass --force to replace it, or a different --out.',\n })\n }\n}\n\nfunction caseHeader(target: CaseTarget, name: string, tags: string[], server?: string): TestCase {\n return {\n $schema: schemaRefFor(target.outPath, target.rootDir, 'case.schema.json'),\n name,\n ...(tags.length > 0 ? { tags } : {}),\n ...(server ? { server } : {}),\n }\n}\n\n/** A path for copy-paste hints: cwd-relative with forward slashes, double-quoted if needed. */\nexport function shellPath(file: string): string {\n const rel = path.relative(process.cwd(), file)\n const inside = rel !== '' && !rel.startsWith('..') && !path.isAbsolute(rel)\n const shown = (inside ? rel : file).replace(/\\\\/g, '/')\n return /\\s/.test(shown) ? `\"${shown}\"` : shown\n}\n\n/** `echo text=hello`, `read fixture://readme`, `prompt greet name=Jo`. */\nexport function defaultName(op: OpSpec): string {\n const verb: Record<OpKind, string> = {\n tool: '',\n resource: 'read ',\n resourceTemplate: 'read ',\n prompt: 'prompt ',\n }\n const summary = op.kind === 'resource' ? '' : argsSummary(op.args)\n return `${verb[op.kind]}${op.target}${summary ? ` ${summary}` : ''}`\n}\n\ninterface WriteResult {\n path: string\n inSuite: boolean\n loosened: Loosened[]\n notes: string[]\n}\n\nfunction looseningNote(loosened: Loosened[]): string {\n return `${loosenedSummary(loosened)}; see ${VOLATILE_DOCS}. Pass --exact to keep values verbatim.`\n}\n\nfunction finishWrite(\n target: CaseTarget,\n testCase: TestCase,\n options: Pick<RunOptions, 'globs' | 'rootDir'>,\n loosened: Loosened[],\n notes: string[],\n): WriteResult {\n writeJsonFile(target.outPath, testCase)\n const suite = inSuite(target.outPath, options)\n if (loosened.length > 0) notes.push(looseningNote(loosened))\n if (!suite) notes.push(outsideSuiteNote(target.outPath, options))\n return { path: target.outPath, inSuite: suite, loosened, notes }\n}\n\nfunction printWritten(result: WriteResult, testCase: TestCase, json: boolean): void {\n if (json) {\n printJson({\n ok: true,\n path: result.path,\n inSuite: result.inSuite,\n case: testCase,\n ...(result.loosened.length > 0 ? { loosened: result.loosened } : {}),\n ...(result.notes.length > 0 ? { notes: result.notes } : {}),\n })\n return\n }\n const c = colors()\n for (const note of result.notes) console.log(c.yellow(`note: ${note}`))\n console.log(`${c.green('wrote')} ${result.path}`)\n const shown = shellPath(result.path)\n console.log(c.dim(`Next: vib explain ${shown} · vib run --cases ${shown}`))\n}\n\nfunction unansweredHint(requests: JsonValue, replay: string): string {\n const respond = JSON.stringify(suggestRespond(requests))\n return `The server asked for input and no answer was given. Re-run with --respond '${respond}' (e.g. ${replay} --respond '${respond}'), or run in a terminal to answer interactively.`\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nfunction parseOp(argv: string[]): OpSpec {\n const resource = takeFlag(argv, '--resource')\n const template = takeFlag(argv, '--resource-template')\n const prompt = takeFlag(argv, '--prompt')\n const [tool] = positionals(argv)\n const chosen = [tool, resource, template, prompt].filter((v) => v !== undefined)\n if (chosen.length === 0) {\n throw new UsageError('Nothing to record.', {\n code: 'missing-argument',\n hint: 'Usage: vib record <tool> [--arg k=v] | --resource <uri> | --resource-template <tpl> --arg k=v | --prompt <name> | --flow | --from-tap <file>. Run vib tools to see tool names.',\n next: ['vib tools'],\n })\n }\n if (chosen.length > 1) {\n throw new UsageError('Record one operation at a time.', {\n code: 'invalid-argument',\n hint: 'Pass a tool name OR --resource OR --resource-template OR --prompt (use --flow for several).',\n })\n }\n const args = parseToolArgs(argv)\n if (resource !== undefined) return { kind: 'resource', target: resource, args: {} }\n if (template !== undefined) return { kind: 'resourceTemplate', target: template, args }\n if (prompt !== undefined) return { kind: 'prompt', target: prompt, args }\n return { kind: 'tool', target: tool as string, args }\n}\n\n/** Calls that may change server state are not repeated for the stable check. */\nfunction mayHaveSideEffects(tool: ToolSummary | undefined): boolean {\n const ann = isObject(tool?.annotations) ? tool.annotations : {}\n return ann.destructiveHint === true && ann.idempotentHint !== true\n}\n\n/** Repeat the call for the stable check; the raw result, or undefined (with a note). */\nasync function secondCall(\n session: McpSession,\n op: OpSpec,\n first: Observed,\n callOpts: CallOptions,\n notes: string[],\n): Promise<JsonValue | undefined> {\n if (first.kind !== 'result') return undefined\n const outcome = await executeOp(session, op, callOpts)\n if (outcome.kind !== 'result') {\n notes.push(\n `The repeated call (stable check) answered ${outcome.kind}; only pattern-based loosening was applied.`,\n )\n return undefined\n }\n return outcome.result\n}\n\nexport async function recordCommand(argv: string[], io: RecordIo = {}): Promise<number> {\n if (takeFlag(argv, '--from-tap') !== undefined) return recordFromTap(argv)\n const stdin = io.stdin ?? process.stdin\n const interactive = io.interactive ?? Boolean((stdin as { isTTY?: boolean }).isTTY)\n if (hasFlag(argv, '--flow')) return recordFlow(argv, stdin, interactive)\n\n const op = parseOp(argv)\n const flags = parseCommonFlags(argv)\n const name = takeFlag(argv, '--name') ?? defaultName(op)\n const tags = takeAllFlags(argv, '--tag')\n const force = hasFlag(argv, '--force')\n const exact = hasFlag(argv, '--exact')\n const stableCheck = !exact && !hasFlag(argv, '--no-stable-check')\n const scripted = parseRespond(argv)\n const awaitOpt = parseAwait(argv)\n const resolved = openSessionOptions(flags)\n const target = caseTarget(argv, resolved.options, name)\n refuseOverwrite(target, force)\n const server = caseServerName(flags)\n const { session, options, timeoutMs } = await startSession(flags, {}, resolved)\n const reader = interactive ? new LineReader(stdin, true) : undefined\n try {\n let tool: ToolSummary | undefined\n if (!hasFlag(argv, '--expect-missing')) tool = (await resolveTarget(session, op)).tool\n if (!flags.json) console.log(formatCallHeader(opLabel(op), op.args))\n const used: Record<string, JsonValue> = {}\n const callOpts: CallOptions = {\n respond: makeResponder(scripted, reader, used),\n ...(awaitOpt !== undefined ? { await: awaitOpt } : {}),\n // A human answering in the terminal needs more than the per-request timeout.\n ...(reader ? { timeoutMs: Math.max(timeoutMs, 10 * 60_000) } : {}),\n }\n const outcome = await executeOp(session, op, callOpts)\n const observed = observedFromOutcome(outcome)\n if (observed.kind === 'input_required') {\n const replay = replayCommand(['vib', 'record', ...argv])\n const hint = unansweredHint(observed.requests ?? null, replay)\n if (flags.json) {\n printJson({ ok: false, kind: 'input_required', requests: observed.requests, hint })\n } else {\n console.error(\n colors().yellow('⏸ input required — nothing was written. The server asked for:'),\n )\n for (const line of formatInputRequests(observed.requests ?? null)) console.error(line)\n console.error(colors().dim(`hint: ${hint}`))\n }\n return 1\n }\n const validation = op.kind === 'tool' ? validateStructured(tool, outcome) : undefined\n if (\n validation?.checked &&\n validation.ok === false &&\n !hasFlag(argv, '--allow-invalid-output')\n ) {\n const message = `Not writing a golden that violates the outputSchema of \"${op.target}\": ${validationSummary(validation)}.`\n const hint =\n 'Fix the tool so structuredContent matches its outputSchema, or pass --allow-invalid-output to record it anyway (vib run will still fail it unless the case sets \"validateOutput\": false).'\n if (flags.json) {\n printJson({\n ok: false,\n error: { type: 'OutputSchemaViolation', code: 'invalid-output', message, hint },\n validation,\n })\n } else {\n console.error(colors().red(`✗ ${message}`))\n console.error(colors().dim(`hint: ${hint}`))\n }\n return 1\n }\n const notes: string[] = []\n if (validation?.checked && validation.ok === false) {\n notes.push(`structuredContent violates the outputSchema: ${validationSummary(validation)}.`)\n }\n let second: JsonValue | undefined\n if (stableCheck && observed.kind === 'result') {\n if (mayHaveSideEffects(tool)) {\n notes.push(\n `Stable check skipped: \"${op.target}\" is annotated destructive, so it was called once. Loosen changing values by hand, or pass --no-stable-check to silence this.`,\n )\n } else {\n second = await secondCall(session, op, observed, { ...callOpts, respond: used }, notes)\n }\n }\n const respond = { ...(scripted ?? {}), ...used }\n const loosened: Loosened[] = []\n const step = stepFromObserved(\n op,\n observed,\n {\n normalize: options.normalize,\n partial: hasFlag(argv, '--partial'),\n respond: Object.keys(respond).length > 0 ? respond : undefined,\n awaitOpt,\n exact,\n second,\n loosened,\n },\n notes,\n ) as Step\n if (!flags.json) {\n const c = colors()\n if (step.expectError) {\n console.log(\n c.yellow(\n `Captured ${observed.error?.kind ?? ''} error into expectError${step.expectError.code !== undefined ? ` (${step.expectError.code})` : ''}`,\n ),\n )\n } else if (step.expect !== undefined) console.log(c.green('Captured result into expect'))\n }\n const testCase: TestCase = { ...caseHeader(target, name, tags, server), ...step }\n const written = finishWrite(target, testCase, options, loosened, notes)\n printWritten(written, testCase, Boolean(flags.json))\n return 0\n } finally {\n reader?.close()\n await session.close()\n }\n}\n\n// ---------------------------------------------------------------------------\n// --flow\n// ---------------------------------------------------------------------------\n\n/** One flow input line: a JSON step object, or `<tool> [json | key=value ...]`. */\nexport function parseFlowLine(line: string): Step {\n const text = line.trim()\n if (text.startsWith('{')) {\n let value: unknown\n try {\n value = JSON.parse(text)\n } catch (err) {\n throw new UsageError(\n `Invalid flow line (JSON): ${err instanceof Error ? err.message : String(err)}.`,\n { code: 'invalid-argument', hint: 'Expected {\"tool\": \"name\", \"args\": {...}}.' },\n )\n }\n if (!isObject(value))\n throw new UsageError('Invalid flow line: expected a JSON object.', {\n code: 'invalid-argument',\n hint: 'Example: {\"tool\": \"echo\", \"args\": {\"text\": \"hi\"}}.',\n })\n const ops = ['tool', 'resource', 'resourceTemplate', 'prompt'].filter(\n (k) => value[k] !== undefined,\n )\n if (ops.length !== 1) {\n throw new UsageError(\n 'Invalid flow line: give exactly one of \"tool\", \"resource\", \"resourceTemplate\", \"prompt\".',\n { code: 'invalid-argument', hint: 'Example: {\"tool\": \"echo\", \"args\": {\"text\": \"hi\"}}.' },\n )\n }\n return value as unknown as Step\n }\n const [tool, ...rest] = text.split(/\\s+/)\n const remainder = text.slice(tool.length).trim()\n let args: Record<string, JsonValue> = {}\n if (remainder.startsWith('{')) {\n try {\n args = JSON.parse(remainder) as Record<string, JsonValue>\n } catch (err) {\n throw new UsageError(\n `Invalid args JSON for ${tool}: ${err instanceof Error ? err.message : String(err)}.`,\n { code: 'invalid-argument', hint: `Example: ${tool} {\"text\": \"hi\"}.` },\n )\n }\n } else {\n for (const pair of rest) {\n const eq = pair.indexOf('=')\n if (eq <= 0)\n throw new UsageError(`Invalid arg \"${pair}\" for ${tool}: expected key=value.`, {\n code: 'invalid-argument',\n hint: `Example: ${tool} text=hi.`,\n })\n args[pair.slice(0, eq)] = parseArgValue(pair.slice(eq + 1))\n }\n }\n return { tool, args }\n}\n\nfunction opFromStep(step: Step): OpSpec {\n const args = (step.args ?? {}) as Record<string, JsonValue>\n if (step.tool !== undefined) return { kind: 'tool', target: step.tool, args }\n if (step.resource !== undefined) return { kind: 'resource', target: step.resource, args: {} }\n if (step.resourceTemplate !== undefined)\n return { kind: 'resourceTemplate', target: step.resourceTemplate, args }\n return { kind: 'prompt', target: step.prompt as string, args }\n}\n\nasync function recordFlow(argv: string[], stdin: Readable, interactive: boolean): Promise<number> {\n const flags = parseCommonFlags(argv)\n const name = takeFlag(argv, '--name') ?? 'recorded flow'\n const tags = takeAllFlags(argv, '--tag')\n const force = hasFlag(argv, '--force')\n const exact = hasFlag(argv, '--exact')\n const expectMissing = hasFlag(argv, '--expect-missing')\n const scripted = parseRespond(argv)\n const resolved = openSessionOptions(flags)\n const target = caseTarget(argv, resolved.options, name)\n refuseOverwrite(target, force)\n const server = caseServerName(flags)\n const { session, options, timeoutMs } = await startSession(flags, {}, resolved)\n const reader = new LineReader(stdin, interactive)\n const c = colors()\n const say = (text: string) => (flags.json ? console.error(text) : console.log(text))\n try {\n if (interactive) {\n say(c.bold('Recording a flow. One step per line; an empty line finishes.'))\n say(\n c.dim(\n ' <tool> {\"json\": \"args\"} or <tool> key=value ... or {\"resource\": \"uri\"} / {\"prompt\": \"name\", \"args\": {...}}',\n ),\n )\n }\n const steps: Step[] = []\n const results: Array<JsonValue | undefined> = []\n const notes: string[] = []\n const loosened: Loosened[] = []\n while (true) {\n const line = await reader.next(c.cyan(`step ${steps.length + 1}> `))\n if (line === undefined || line.trim() === '') break\n let input: Step\n let op: OpSpec\n try {\n input = parseFlowLine(line)\n op = opFromStep(input)\n if (!expectMissing) await resolveTarget(session, op)\n } catch (err) {\n if (!interactive) throw err\n say(c.red(err instanceof Error ? err.message : String(err)))\n continue\n }\n const used: Record<string, JsonValue> = {}\n const stepScripted = {\n ...(scripted ?? {}),\n ...((input.respond ?? {}) as Record<string, JsonValue>),\n }\n const awaitOpt =\n input.await === true || isObject(input.await)\n ? (input.await as AwaitOptions | true)\n : undefined\n const outcome = await executeOp(session, op, {\n respond: makeResponder(stepScripted, interactive ? reader : undefined, used),\n ...(awaitOpt !== undefined ? { await: awaitOpt } : {}),\n ...(interactive ? { timeoutMs: Math.max(timeoutMs, 10 * 60_000) } : {}),\n })\n const observed = observedFromOutcome(outcome)\n if (observed.kind === 'input_required') {\n const hint = `Step ${steps.length + 1} (${opLabel(op)}) needs input. Add \"respond\" to that line, e.g. ${JSON.stringify({ ...input, respond: suggestRespond(observed.requests ?? null) })}`\n if (!interactive) {\n if (flags.json)\n printJson({\n ok: false,\n kind: 'input_required',\n step: steps.length + 1,\n requests: observed.requests,\n hint,\n })\n else {\n console.error(\n c.yellow(`⏸ input required at step ${steps.length + 1} — nothing was written.`),\n )\n for (const l of formatInputRequests(observed.requests ?? null)) console.error(l)\n console.error(c.dim(`hint: ${hint}`))\n }\n return 1\n }\n say(c.yellow('Left unanswered; this step was not recorded. Enter it again to retry.'))\n continue\n }\n const respond = { ...((input.respond ?? {}) as Record<string, JsonValue>), ...used }\n // Flows are stateful: steps are never repeated, so only pattern loosening applies.\n const step = stepFromObserved(\n op,\n observed,\n {\n normalize: options.normalize,\n respond: Object.keys(respond).length > 0 ? respond : undefined,\n awaitOpt,\n exact,\n loosened,\n },\n notes,\n ) as Step\n const recorded: Step = {\n ...(input.name ? { name: input.name } : {}),\n ...step,\n ...(input.capture ? { capture: input.capture } : {}),\n }\n steps.push(recorded)\n results.push(\n observed.result !== undefined\n ? normalizeResult(observed.result, options.normalize)\n : undefined,\n )\n const status =\n observed.kind === 'error'\n ? c.yellow(`error (${observed.error?.codeName ?? observed.error?.kind}) → expectError`)\n : c.green('ok → expect')\n say(` ${c.dim(`#${steps.length}`)} ${opLabel(op)}: ${status}`)\n }\n if (steps.length === 0) {\n throw new UsageError('No steps recorded: the input was empty.', {\n code: 'missing-argument',\n hint: 'Pipe NDJSON lines like {\"tool\": \"echo\", \"args\": {\"text\": \"hi\"}}, or run in a terminal.',\n })\n }\n if (!hasFlag(argv, '--no-capture')) notes.push(...inferCaptures(steps, results))\n const testCase: TestCase = { ...caseHeader(target, name, tags, server), steps }\n const written = finishWrite(target, testCase, options, loosened, notes)\n printWritten(written, testCase, Boolean(flags.json))\n return 0\n } finally {\n reader.close()\n await session.close()\n }\n}\n\n// ---------------------------------------------------------------------------\n// --from-tap\n// ---------------------------------------------------------------------------\n\nfunction tapError(error: JsonValue): ToolError {\n return fromJsonRpcError(isObject(error) ? error : { message: String(error) })\n}\n\n/** Observation from a reconstructed tap call. */\nexport function observedFromTap(call: TapCall): Observed {\n const inputRequests = call.inputRequests.length > 0 ? { inputRequests: call.inputRequests } : {}\n if (call.error !== undefined) {\n return { kind: 'error', error: tapError(call.error), ...inputRequests }\n }\n const result = call.result ?? null\n if (call.method === 'tools/call' && isObject(result) && result.isError === true) {\n return {\n kind: 'error',\n error: { kind: 'tool', message: textFromContent(result.content) },\n result,\n ...inputRequests,\n }\n }\n return {\n kind: 'result',\n result,\n ...inputRequests,\n ...(call.task !== undefined && !call.taskAwaited ? { task: call.task } : {}),\n }\n}\n\nfunction opFromTap(call: TapCall): OpSpec {\n if (call.method === 'resources/read') return { kind: 'resource', target: call.target, args: {} }\n if (call.method === 'prompts/get') return { kind: 'prompt', target: call.target, args: call.args }\n return { kind: 'tool', target: call.target, args: call.args }\n}\n\n/** ok | error | no response, as `--from-tap` lists it (isError results count as errors). */\nexport function tapCallStatus(call: TapCall): 'ok' | 'error' | 'no response' {\n if (call.incomplete) return 'no response'\n if (call.error !== undefined) return 'error'\n if (isObject(call.result) && call.result.isError === true) return 'error'\n return 'ok'\n}\n\nfunction tapListing(calls: TapCall[]): string {\n const c = colors()\n if (calls.length === 0)\n return 'No tools/call, resources/read or prompts/get entries in this capture.'\n return calls\n .map((call) => {\n const status = tapCallStatus(call)\n const outcome =\n status === 'error'\n ? c.red('error')\n : status === 'no response'\n ? c.yellow(status)\n : c.green('ok')\n const extras = [\n Object.keys(call.respond).length > 0 ? 'answered input' : '',\n call.task !== undefined ? (call.taskAwaited ? 'task (completed)' : 'task') : '',\n ].filter(Boolean)\n return ` ${c.dim(`#${String(call.index).padEnd(3)}`)} ${call.method.padEnd(15)} ${c.bold(call.target)} ${c.gray(preview(call.args, 60))} ${outcome}${extras.length ? c.dim(` (${extras.join(', ')})`) : ''}`\n })\n .join('\\n')\n}\n\nasync function recordFromTap(argv: string[]): Promise<number> {\n const file = resolvePathFromCwd(takeFlag(argv, '--from-tap') as string)\n if (!fs.existsSync(file)) {\n throw new UsageError(`Tap capture not found: ${file}.`, {\n code: 'not-found',\n hint: 'Captures are written by vib tap (default reports/tap/*.ndjson).',\n })\n }\n const flags = parseCommonFlags(argv)\n const { entries, badLines } = readTapFile(file)\n const calls = reconstructCalls(entries)\n const selectors = takeAllFlags(argv, '--select')\n const c = colors()\n if (selectors.length === 0) {\n const hint = `Pick calls with --select <n|name|all> (repeatable, e.g. --select 1,3 or --select ${calls[0]?.target ?? 'echo'}).`\n if (flags.json) {\n printJson({\n ok: true,\n source: file,\n calls: calls.map(({ index, method, target, args }, i) => ({\n index,\n method,\n target,\n args,\n status: tapCallStatus(calls[i]),\n })),\n written: [],\n hint,\n })\n } else {\n console.log(c.bold(`${plural(calls.length, 'call')} in ${file}`))\n console.log(tapListing(calls))\n console.log(c.dim(hint))\n }\n return 0\n }\n const { picked, unmatched } = selectCalls(calls, selectors)\n if (unmatched.length > 0) {\n throw new UsageError(`--select matched nothing for: ${unmatched.join(', ')}.`, {\n code: 'invalid-argument',\n hint: `${calls.length} call(s) available; run vib record --from-tap ${shellPath(file)} to list them.`,\n })\n }\n // Normalization config comes from the project config (no server is started).\n const options = mergeCliOptions(flags)\n const rootDir = options.rootDir\n const force = hasFlag(argv, '--force')\n const exact = hasFlag(argv, '--exact')\n const tags = takeAllFlags(argv, '--tag')\n const server = caseServerName(flags)\n const outDirFlag = takeFlag(argv, '--out-dir')\n const outDir = outDirFlag ? resolvePathFromCwd(outDirFlag) : suiteDir(options, 'tap')\n const { suffix } = suiteLayout(options.globs)\n const single = picked.length === 1\n const written: Array<{ path: string; index: number; inSuite: boolean; case: TestCase }> = []\n const skipped: Array<{ index: number; reason: string }> = []\n const notes: string[] = []\n const loosened: Loosened[] = []\n for (const call of picked) {\n if (call.incomplete) {\n skipped.push({\n index: call.index,\n reason: 'no response in the capture (server exited first)',\n })\n continue\n }\n const op = opFromTap(call)\n const name =\n (single ? takeFlag(argv, '--name') : undefined) ?? `${defaultName(op)} (tap #${call.index})`\n const outPath =\n single && takeFlag(argv, '--out')\n ? resolvePathFromCwd(takeFlag(argv, '--out') as string)\n : path.join(outDir, `${slugify(call.target) || 'call'}-${call.index}${suffix}`)\n if (fs.existsSync(outPath) && !force) {\n skipped.push({ index: call.index, reason: `${outPath} exists (pass --force to replace)` })\n continue\n }\n const callLoosened: Loosened[] = []\n const step = stepFromObserved(\n op,\n observedFromTap(call),\n {\n normalize: options.normalize,\n partial: hasFlag(argv, '--partial'),\n respond: Object.keys(call.respond).length > 0 ? call.respond : undefined,\n awaitOpt: call.taskAwaited ? true : undefined,\n exact,\n loosened: callLoosened,\n },\n notes,\n ) as Step\n if (call.taskAwaited) step.await = true\n const target: CaseTarget = { rootDir, outPath, derived: false }\n const testCase: TestCase = {\n ...caseHeader(target, name, tags.length > 0 ? tags : ['tap'], server),\n ...step,\n }\n writeJsonFile(outPath, testCase)\n loosened.push(...callLoosened.map((l) => ({ ...l, path: `#${call.index} ${l.path}` })))\n written.push({\n path: outPath,\n index: call.index,\n inSuite: inSuite(outPath, options),\n case: testCase,\n })\n }\n if (badLines.length > 0)\n notes.push(\n `Skipped ${plural(badLines.length, 'unreadable line')} in the capture (lines ${badLines.slice(0, 5).join(', ')}).`,\n )\n if (loosened.length > 0) notes.push(looseningNote(loosened))\n const outside = written.filter((w) => !w.inSuite)\n if (outside.length > 0) notes.push(outsideSuiteNote(outside[0].path, options))\n if (flags.json) {\n printJson({\n ok: written.length > 0,\n source: file,\n written,\n ...(skipped.length > 0 ? { skipped } : {}),\n ...(loosened.length > 0 ? { loosened } : {}),\n ...(notes.length > 0 ? { notes } : {}),\n })\n } else {\n for (const note of notes) console.log(c.yellow(`note: ${note}`))\n for (const w of written) console.log(`${c.green('wrote')} ${w.path} ${c.dim(`(#${w.index})`)}`)\n for (const s of skipped) console.log(`${c.yellow('skipped')} #${s.index}: ${s.reason}`)\n if (written.length > 0) {\n console.log(\n c.dim(\n 'Next: review with vib explain <file>, then vib run. Recorded goldens are exact; loosen volatile fields with matchers.',\n ),\n )\n }\n }\n return written.length > 0 ? 0 : 1\n}\n","/**\n * The `vib tap` capture format (one JSON object per line, NDJSON) and the logic that turns\n * a capture back into replayable calls for `vib record --from-tap`.\n *\n * Entry (written when the response arrives, so file order = completion order):\n *\n * { \"ts\": \"2026-10-28T12:00:00.000Z\", // when the request was seen (ISO 8601)\n * \"seq\": 4, // 1-based request counter for this tap session\n * \"from\": \"client\", // who sent the request: client | server\n * \"method\": \"tools/call\", \"id\": 7, \"params\": { ... },\n * \"result\": { ... } | \"error\": { \"code\": -32602, \"message\": \"...\" },\n * \"durationMs\": 12,\n * \"incomplete\": true } // only when no response arrived (server exited)\n */\nimport fs from 'node:fs'\nimport type { JsonValue } from '../types.js'\n\nexport interface TapEntry {\n ts: string\n seq: number\n from: 'client' | 'server'\n method: string\n id?: string | number\n params?: JsonValue\n result?: JsonValue\n error?: JsonValue\n durationMs: number\n incomplete?: true\n}\n\n/** Client → server methods worth recording (calls) and context methods. */\nexport const TAP_CALL_METHODS = ['tools/call', 'resources/read', 'prompts/get'] as const\nexport const TAP_CONTEXT_METHODS = [\n 'initialize',\n 'server/discover',\n 'tools/list',\n 'resources/list',\n 'resources/templates/list',\n 'prompts/list',\n 'tasks/get',\n 'tasks/update',\n] as const\n/** Server → client requests (2025-era elicitation / sampling / roots). */\nexport const TAP_SERVER_METHODS = [\n 'elicitation/create',\n 'sampling/createMessage',\n 'roots/list',\n] as const\n\nexport function isTappedMethod(method: string, from: 'client' | 'server'): boolean {\n if (from === 'server') return (TAP_SERVER_METHODS as readonly string[]).includes(method)\n return (\n (TAP_CALL_METHODS as readonly string[]).includes(method) ||\n (TAP_CONTEXT_METHODS as readonly string[]).includes(method)\n )\n}\n\nexport interface ParsedTapFile {\n entries: TapEntry[]\n /** 1-based line numbers that were not valid entries. */\n badLines: number[]\n}\n\nexport function parseTapText(text: string): ParsedTapFile {\n const entries: TapEntry[] = []\n const badLines: number[] = []\n text.split(/\\r?\\n/).forEach((line, i) => {\n if (line.trim() === '') return\n try {\n const value = JSON.parse(line) as TapEntry\n if (typeof value?.method !== 'string') throw new Error('no method')\n entries.push(value)\n } catch {\n badLines.push(i + 1)\n }\n })\n return { entries, badLines }\n}\n\nexport function readTapFile(file: string): ParsedTapFile {\n return parseTapText(fs.readFileSync(file, 'utf8'))\n}\n\nfunction isObject(value: unknown): value is Record<string, JsonValue> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** One user-visible call reconstructed from a capture (MRTR retries and task polls merged). */\nexport interface TapCall {\n /** 1-based position in the list of calls (what `--select <n>` refers to). */\n index: number\n method: (typeof TAP_CALL_METHODS)[number]\n /** Tool name, resource URI, or prompt name. */\n target: string\n args: Record<string, JsonValue>\n /** The final answer (after MRTR rounds / task polling). */\n result?: JsonValue\n error?: JsonValue\n /** InputRequests maps the server sent, one per round. */\n inputRequests: JsonValue[]\n /** Answers the client gave, keyed by request method. */\n respond: Record<string, JsonValue>\n /** Set when the server answered with a task. */\n task?: JsonValue\n /** The task reached a terminal state in the capture (so the case can `await`). */\n taskAwaited?: boolean\n durationMs: number\n ts: string\n incomplete?: boolean\n}\n\nfunction targetOf(entry: TapEntry): string {\n const params = isObject(entry.params) ? entry.params : {}\n if (entry.method === 'resources/read') return String(params.uri ?? '')\n return String(params.name ?? '')\n}\n\nfunction argsOf(entry: TapEntry): Record<string, JsonValue> {\n const params = isObject(entry.params) ? entry.params : {}\n return isObject(params.arguments) ? { ...params.arguments } : {}\n}\n\nfunction resultType(entry: TapEntry): string | undefined {\n return isObject(entry.result) && typeof entry.result.resultType === 'string'\n ? entry.result.resultType\n : undefined\n}\n\nfunction startMs(entry: TapEntry): number {\n const ms = Date.parse(entry.ts)\n return Number.isFinite(ms) ? ms : 0\n}\n\n/**\n * Reconstruct calls from a capture:\n * - 2026 MRTR: a `tools/call` answered `input_required`, followed by a retry of the same\n * call carrying `inputResponses`, becomes one call with `respond` + `inputRequests`.\n * - 2025 elicitation: server→client requests made while a call was pending become its\n * `respond` / `inputRequests`.\n * - Tasks: a `resultType: \"task\"` answer followed by `tasks/get` polls that reach\n * `completed` becomes one call whose result is the task's final result.\n */\nexport function reconstructCalls(entries: TapEntry[]): TapCall[] {\n const ordered = [...entries].sort((a, b) => a.seq - b.seq)\n const calls: TapCall[] = []\n const consumed = new Set<TapEntry>()\n\n for (const entry of ordered) {\n if (consumed.has(entry) || entry.from !== 'client') continue\n if (!(TAP_CALL_METHODS as readonly string[]).includes(entry.method)) continue\n consumed.add(entry)\n const call: TapCall = {\n index: 0,\n method: entry.method as TapCall['method'],\n target: targetOf(entry),\n args: argsOf(entry),\n inputRequests: [],\n respond: {},\n durationMs: entry.durationMs,\n ts: entry.ts,\n ...(entry.incomplete ? { incomplete: true } : {}),\n }\n let current = entry\n // 2026 MRTR rounds: input_required → retry with inputResponses.\n while (resultType(current) === 'input_required') {\n const requests =\n isObject(current.result) && isObject(current.result.inputRequests)\n ? current.result.inputRequests\n : {}\n call.inputRequests.push(requests)\n const retry = ordered.find(\n (e) =>\n !consumed.has(e) &&\n e.from === 'client' &&\n e.method === current.method &&\n e.seq > current.seq &&\n targetOf(e) === call.target &&\n isObject(e.params) &&\n isObject(e.params.inputResponses),\n )\n if (!retry) break\n consumed.add(retry)\n const responses = (retry.params as Record<string, JsonValue>).inputResponses as Record<\n string,\n JsonValue\n >\n for (const [key, answer] of Object.entries(responses)) {\n const request = requests[key]\n const method =\n isObject(request) && typeof request.method === 'string' ? request.method : key\n if (call.respond[method] === undefined) call.respond[method] = answer\n }\n call.durationMs += retry.durationMs\n current = retry\n }\n // 2025 server→client requests made while this call was pending.\n const from = startMs(entry)\n const to = startMs(current) + current.durationMs\n for (const serverReq of ordered) {\n if (serverReq.from !== 'server' || consumed.has(serverReq)) continue\n const at = startMs(serverReq)\n if (at < from || at > to) continue\n consumed.add(serverReq)\n call.inputRequests.push({\n [String(serverReq.id ?? serverReq.seq)]: {\n method: serverReq.method,\n params: serverReq.params ?? {},\n },\n })\n if (serverReq.result !== undefined && call.respond[serverReq.method] === undefined) {\n call.respond[serverReq.method] = serverReq.result\n }\n }\n if (current.error !== undefined) call.error = current.error\n else if (current.result !== undefined) call.result = current.result\n if (current.incomplete) call.incomplete = true\n // Tasks: follow tasks/get polls to a terminal state.\n if (resultType(current) === 'task' && isObject(current.result)) {\n call.task = current.result\n const taskId = current.result.taskId\n const polls = ordered.filter(\n (e) =>\n e.method === 'tasks/get' &&\n e.seq > current.seq &&\n isObject(e.params) &&\n e.params.taskId === taskId,\n )\n for (const poll of polls) consumed.add(poll)\n const terminal = polls.find(\n (p) =>\n isObject(p.result) &&\n ['completed', 'failed', 'cancelled'].includes(String(p.result.status)),\n )\n if (terminal && isObject(terminal.result)) {\n call.taskAwaited = true\n if (terminal.result.status === 'completed') {\n call.result = isObject(terminal.result.result) ? terminal.result.result : {}\n } else {\n call.result = undefined\n call.error = isObject(terminal.result.error)\n ? terminal.result.error\n : { message: String(terminal.result.statusMessage ?? `task ${terminal.result.status}`) }\n }\n }\n }\n calls.push(call)\n }\n calls.forEach((call, i) => {\n call.index = i + 1\n })\n return calls\n}\n\n/**\n * Pick calls by `--select` values: `all`, a 1-based index (`3`), a range (`2-5`), or a\n * tool / prompt name or resource URI (every call to it). Comma-separated lists allowed.\n */\nexport function selectCalls(\n calls: TapCall[],\n selectors: string[],\n): { picked: TapCall[]; unmatched: string[] } {\n const picked = new Set<TapCall>()\n const unmatched: string[] = []\n for (const raw of selectors\n .flatMap((s) => s.split(','))\n .map((s) => s.trim())\n .filter(Boolean)) {\n if (raw === 'all') {\n for (const call of calls) picked.add(call)\n continue\n }\n const range = /^(\\d+)-(\\d+)$/.exec(raw)\n if (/^\\d+$/.test(raw) || range) {\n const lo = Number(range ? range[1] : raw)\n const hi = Number(range ? range[2] : raw)\n const hits = calls.filter((c) => c.index >= lo && c.index <= hi)\n if (hits.length === 0) unmatched.push(raw)\n for (const hit of hits) picked.add(hit)\n continue\n }\n const hits = calls.filter((c) => c.target === raw)\n if (hits.length === 0) unmatched.push(raw)\n for (const hit of hits) picked.add(hit)\n }\n return { picked: calls.filter((c) => picked.has(c)), unmatched }\n}\n","/**\n * Volatile-field loosening for recorded goldens (`vib record`). Values that will not\n * repeat on the next run are replaced with matchers:\n *\n * - ISO date-time strings → {\"$schema\": {\"type\": \"string\", \"format\": \"date-time\"}}\n * - UUID strings → {\"$schema\": {\"type\": \"string\", \"format\": \"uuid\"}}\n * - epoch-millisecond integers → {\"$type\": \"integer\"}\n * - timestamps / UUIDs inside text → {\"$regex\": \"^literal…<pattern>…literal$\"}\n * - anything that differed between two back-to-back calls (the stable check):\n * strings → {\"$regex\"} on the common prefix/suffix (or {\"$type\": \"string\"}), other\n * values → {\"$type\": ...}, keys present only once → {\"$ignore\": true}\n *\n * Works on the escaped golden (after normalizeResult + escapeDirectives) and never looks\n * inside `{\"$literal\": ...}`. Paths use the matcher format (`structuredContent.at`).\n */\nimport { appendIndex, appendKey } from '../schema.js'\nimport type { JsonValue } from '../types.js'\nimport { escapeRegex } from './args.js'\n\nexport type VolatileReason = 'date-time' | 'uuid' | 'epoch-ms' | 'embedded' | 'changed'\n\nexport interface Loosened {\n path: string\n reason: VolatileReason\n /** The recorded value that was replaced. */\n was: JsonValue\n}\n\n/** RFC 3339 date-time as ajv-formats accepts it (seconds and offset required). */\nconst DATE_TIME =\n /^\\d{4}-\\d{2}-\\d{2}[Tt ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:[Zz]|[+-]\\d{2}(?::?\\d{2})?)$/\n/** Local date-time (no offset): not a JSON Schema date-time, so matched by $regex. */\nconst LOCAL_DATE_TIME = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?$/\nconst UUID = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/\n/** 2000-01-01 .. 2100-01-01 in milliseconds. */\nconst EPOCH_MS_MIN = 946_684_800_000\nconst EPOCH_MS_MAX = 4_102_444_800_000\n\nconst EMBEDDED: Array<{ find: string; pattern: string }> = [\n {\n find: '\\\\d{4}-\\\\d{2}-\\\\d{2}[Tt ]\\\\d{2}:\\\\d{2}(?::\\\\d{2}(?:\\\\.\\\\d+)?)?(?:[Zz]|[+-]\\\\d{2}(?::?\\\\d{2})?)?',\n pattern: '\\\\d{4}-\\\\d{2}-\\\\d{2}[Tt ][0-9:.]+(?:[Zz]|[+-][0-9:]+)?',\n },\n {\n find: '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}',\n pattern: '[0-9a-fA-F-]{36}',\n },\n { find: '(?<!\\\\d)[1-4]\\\\d{12}(?!\\\\d)', pattern: '\\\\d{13}' },\n]\nconst EMBEDDED_RE = new RegExp(EMBEDDED.map((e) => `(${e.find})`).join('|'), 'g')\n\nfunction isObject(value: unknown): value is Record<string, JsonValue> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isLiteral(value: Record<string, JsonValue>): boolean {\n return Object.keys(value).length === 1 && value.$literal !== undefined\n}\n\nfunction root(path: string): string {\n return path === '' ? '(root)' : path\n}\n\n/** A $regex for a string whose embedded timestamps / UUIDs / epoch-ms vary; undefined if none. */\nfunction embeddedRegex(text: string): string | undefined {\n EMBEDDED_RE.lastIndex = 0\n if (!EMBEDDED_RE.test(text)) return undefined\n EMBEDDED_RE.lastIndex = 0\n let out = '^'\n let last = 0\n for (const match of text.matchAll(EMBEDDED_RE)) {\n const index = match.index ?? 0\n out += escapeRegex(text.slice(last, index))\n const group = match.slice(1).findIndex((g) => g !== undefined)\n out += EMBEDDED[group].pattern\n last = index + match[0].length\n }\n return `${out}${escapeRegex(text.slice(last))}$`\n}\n\nfunction typeName(value: JsonValue): string {\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'array'\n if (typeof value === 'number') return Number.isInteger(value) ? 'integer' : 'number'\n return typeof value\n}\n\n/** Matcher for a string that changed between calls: common prefix/suffix, else any string. */\nfunction changedString(a: string, b: string): JsonValue {\n let prefix = 0\n while (prefix < a.length && prefix < b.length && a[prefix] === b[prefix]) prefix++\n let suffix = 0\n while (\n suffix < a.length - prefix &&\n suffix < b.length - prefix &&\n a[a.length - 1 - suffix] === b[b.length - 1 - suffix]\n )\n suffix++\n if (prefix + suffix < 3) return { $type: 'string' }\n return {\n $regex: `^${escapeRegex(a.slice(0, prefix))}[\\\\s\\\\S]*${escapeRegex(a.slice(a.length - suffix))}$`,\n }\n}\n\n/**\n * Loosen volatile values in `golden`. `second` is the normalized result of an identical\n * second call (the stable check); leave it undefined to use the patterns only.\n */\nexport function loosenVolatile(\n golden: JsonValue,\n second?: JsonValue,\n): { value: JsonValue; loosened: Loosened[] } {\n const loosened: Loosened[] = []\n const compare = second !== undefined\n const walk = (\n node: JsonValue,\n other: JsonValue | undefined,\n hasOther: boolean,\n path: string,\n ): JsonValue => {\n if (typeof node === 'string') {\n if (DATE_TIME.test(node)) {\n loosened.push({ path: root(path), reason: 'date-time', was: node })\n return { $schema: { type: 'string', format: 'date-time' } }\n }\n if (UUID.test(node)) {\n loosened.push({ path: root(path), reason: 'uuid', was: node })\n return { $schema: { type: 'string', format: 'uuid' } }\n }\n if (LOCAL_DATE_TIME.test(node)) {\n loosened.push({ path: root(path), reason: 'date-time', was: node })\n return { $regex: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T[0-9:.]+$' }\n }\n const embedded = embeddedRegex(node)\n if (embedded) {\n loosened.push({ path: root(path), reason: 'embedded', was: node })\n return { $regex: embedded }\n }\n if (compare && hasOther && typeof other === 'string' && other !== node) {\n loosened.push({ path: root(path), reason: 'changed', was: node })\n return changedString(node, other)\n }\n } else if (typeof node === 'number') {\n if (Number.isInteger(node) && node >= EPOCH_MS_MIN && node <= EPOCH_MS_MAX) {\n loosened.push({ path: root(path), reason: 'epoch-ms', was: node })\n return { $type: 'integer' }\n }\n if (compare && hasOther && typeof other === 'number' && other !== node) {\n loosened.push({ path: root(path), reason: 'changed', was: node })\n return { $type: Number.isInteger(node) && Number.isInteger(other) ? 'integer' : 'number' }\n }\n } else if (Array.isArray(node)) {\n if (compare && hasOther && Array.isArray(other) && other.length !== node.length) {\n loosened.push({ path: root(path), reason: 'changed', was: node })\n return { $type: 'array' }\n }\n const others = Array.isArray(other) ? other : []\n return node.map((item, i) =>\n walk(item, others[i], hasOther && Array.isArray(other), appendIndex(path, i)),\n )\n } else if (isObject(node)) {\n if (isLiteral(node)) return node\n const others = isObject(other) ? other : {}\n const out: Record<string, JsonValue> = {}\n for (const [key, child] of Object.entries(node)) {\n if (key === '$partial') {\n out[key] = child\n continue\n }\n const present = hasOther && isObject(other) && Object.hasOwn(others, key)\n if (compare && hasOther && isObject(other) && !present) {\n loosened.push({ path: root(appendKey(path, key)), reason: 'changed', was: child })\n out[key] = { $ignore: true }\n continue\n }\n out[key] = walk(child, others[key], present, appendKey(path, key))\n }\n return out\n } else if (\n typeof node === 'boolean' &&\n compare &&\n hasOther &&\n typeof other === 'boolean' &&\n other !== node\n ) {\n loosened.push({ path: root(path), reason: 'changed', was: node })\n return { $type: 'boolean' }\n }\n if (compare && hasOther && other !== undefined && typeName(other) !== typeName(node)) {\n loosened.push({ path: root(path), reason: 'changed', was: node })\n return { $any: true }\n }\n return node\n }\n return { value: walk(golden, second, compare, ''), loosened }\n}\n\n/** `loosened 2 volatile fields (structuredContent.at, content[0].text)`. */\nexport function loosenedSummary(loosened: Loosened[]): string {\n const paths = loosened.slice(0, 4).map((l) => l.path)\n const more = loosened.length > paths.length ? `, +${loosened.length - paths.length} more` : ''\n return `loosened ${loosened.length} volatile field${loosened.length === 1 ? '' : 's'} (${paths.join(', ')}${more})`\n}\n\nexport const VOLATILE_DOCS = 'docs/CASES.md#generated-ids-and-timestamps'\n","import { parseToolArgs } from './args.js'\nimport { type OneShotSpec, runOneShot } from './call.js'\n\nexport const GET_PROMPT_SPEC: OneShotSpec = {\n command: 'get-prompt',\n usage: 'vib get-prompt <name> [--args \\'{\"key\":\"value\"}\\'] [--arg key=value] [--raw]',\n build: (name, argv) => ({ kind: 'prompt', target: name, args: parseToolArgs(argv) }),\n}\n\nexport async function getPromptCommand(argv: string[]): Promise<number> {\n return runOneShot(GET_PROMPT_SPEC, argv)\n}\n","/**\n * `vib init`: scaffold a v2 project — vibrissa.json (servers map + ci profile), a sample\n * case and a sample flow, optionally a GitHub workflow (--ci), with servers pre-filled from\n * Claude configs (--from-claude-config) or detected from the project (Node, Python, Go).\n */\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { loadConfig } from '../config.js'\nimport { generateArgs, validateAgainstSchema } from '../fuzz/index.js'\nimport { resolveServerConfig } from '../paths.js'\nimport { McpSession } from '../session/index.js'\nimport type { JsonValue, Step, ToolSummary } from '../types.js'\nimport {\n UsageError,\n hasFlag,\n printJson,\n resolvePathFromCwd,\n schemaRefFor,\n slugify,\n splitCommandLine,\n suiteLayout,\n takeFlag,\n takeOptionalFlag,\n uniquePath,\n} from './args.js'\nimport { type OpSpec, executeOp } from './call.js'\nimport { colors, firstLine, isObject, preview, truncate } from './format.js'\nimport { defaultName, observedFromOutcome, stepFromObserved } from './record.js'\nimport { parseCommonFlags } from './resolve.js'\nimport { type Loosened, loosenedSummary } from './volatile.js'\n\ntype ServerEntry = Record<string, JsonValue>\n\ninterface Detected {\n servers: Record<string, ServerEntry>\n source: string\n notes: string[]\n}\n\ntype WriteStatus = 'wrote' | 'skipped'\n\nfunction writeFile(file: string, contents: string, force: boolean): WriteStatus {\n if (fs.existsSync(file) && !force) return 'skipped'\n fs.mkdirSync(path.dirname(file), { recursive: true })\n fs.writeFileSync(file, contents, 'utf8')\n return 'wrote'\n}\n\nfunction readJson(file: string): Record<string, unknown> | undefined {\n try {\n const value = JSON.parse(fs.readFileSync(file, 'utf8')) as unknown\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined\n } catch {\n return undefined\n }\n}\n\n/** `[project] name = \"...\"` from pyproject.toml (no TOML parser needed for this). */\nexport function pyprojectName(text: string): string | undefined {\n const section = /^\\[project\\]\\s*$([\\s\\S]*?)(?=^\\[|$(?![\\s\\S]))/m.exec(text)\n const body = section ? section[1] : ''\n const match = /^\\s*name\\s*=\\s*[\"']([^\"']+)[\"']/m.exec(body)\n return match?.[1]\n}\n\n/** Guess how to start the server in `dir`: Node (bin/main/dist), Python, Go. */\nexport function detectServer(dir: string): Detected {\n const pkg = readJson(path.join(dir, 'package.json'))\n if (pkg) {\n const bin = pkg.bin\n const binPath =\n typeof bin === 'string'\n ? bin\n : typeof bin === 'object' && bin !== null\n ? (Object.values(bin as Record<string, unknown>).find((v) => typeof v === 'string') as\n | string\n | undefined)\n : undefined\n for (const candidate of [\n binPath,\n typeof pkg.main === 'string' ? pkg.main : undefined,\n 'dist/index.js',\n 'build/index.js',\n 'src/index.js',\n ]) {\n if (candidate && fs.existsSync(path.join(dir, candidate))) {\n return {\n servers: { default: { cmd: 'node', args: [candidate.replace(/^\\.\\//, '')], cwd: '.' } },\n source: `package.json (${candidate})`,\n notes: [],\n }\n }\n }\n }\n const pyproject = path.join(dir, 'pyproject.toml')\n if (fs.existsSync(pyproject)) {\n const name = pyprojectName(fs.readFileSync(pyproject, 'utf8'))\n const module = (name ?? path.basename(dir)).replace(/[-.]/g, '_').toLowerCase()\n return {\n servers: { default: { cmd: 'python', args: ['-m', module], cwd: '.' } },\n source: 'pyproject.toml',\n notes: [\n `Guessed \"python -m ${module}\" from pyproject.toml; adjust servers.default if your entry point differs (e.g. \"uv run <script>\").`,\n ],\n }\n }\n if (fs.existsSync(path.join(dir, 'go.mod'))) {\n return {\n servers: { default: { cmd: 'go', args: ['run', '.'], cwd: '.' } },\n source: 'go.mod',\n notes: [\n 'Guessed \"go run .\" from go.mod; point servers.default at your built binary for faster runs.',\n ],\n }\n }\n return {\n servers: { default: { cmd: 'node', args: ['dist/index.js'], cwd: '.' } },\n source: 'default',\n notes: [\n 'No server entry point found; using \"node dist/index.js\". Edit servers.default in vibrissa.json, or re-run with --server \"<cmd>\".',\n ],\n }\n}\n\n/** Where Claude Desktop keeps its config on this platform. */\nexport function claudeDesktopConfigPath(platform = process.platform, env = process.env): string {\n if (platform === 'win32') {\n return path.join(\n env.APPDATA ?? path.join(os.homedir(), 'AppData', 'Roaming'),\n 'Claude',\n 'claude_desktop_config.json',\n )\n }\n if (platform === 'darwin') {\n return path.join(\n os.homedir(),\n 'Library',\n 'Application Support',\n 'Claude',\n 'claude_desktop_config.json',\n )\n }\n return path.join(\n env.XDG_CONFIG_HOME ?? path.join(os.homedir(), '.config'),\n 'Claude',\n 'claude_desktop_config.json',\n )\n}\n\nconst SECRET_KEY = /token|secret|password|passwd|api[-_]?key|auth|credential|private/i\n\nfunction envRef(name: string): string {\n return `\\${${name.replace(/[^A-Za-z0-9_]/g, '_').toUpperCase()}}`\n}\n\n/** Replace literal secrets with `${VAR}` references (vibrissa.json gets committed). */\nfunction scrub(\n values: Record<string, unknown>,\n refName: (key: string) => string,\n notes: string[],\n where: string,\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [key, raw] of Object.entries(values)) {\n const value = String(raw)\n if (SECRET_KEY.test(key) && !/\\$\\{[^}]+\\}/.test(value) && value !== '') {\n const ref = envRef(refName(key))\n out[key] = ref\n notes.push(\n `${where}.${key}: replaced a literal secret with ${ref}; export it before running vib.`,\n )\n } else out[key] = value\n }\n return out\n}\n\n/** Map a Claude `mcpServers` object to Vibrissa `servers`. */\nexport function serversFromMcpConfig(\n mcpServers: Record<string, unknown>,\n notes: string[],\n): Record<string, ServerEntry> {\n const servers: Record<string, ServerEntry> = {}\n for (const [name, raw] of Object.entries(mcpServers)) {\n if (typeof raw !== 'object' || raw === null) continue\n const entry = raw as Record<string, unknown>\n const where = `servers.${name}`\n if (typeof entry.url === 'string') {\n if (entry.type === 'sse')\n notes.push(\n `${where}: legacy SSE transport; Vibrissa speaks Streamable HTTP, which may not work with this server.`,\n )\n servers[name] = {\n url: entry.url,\n ...(typeof entry.headers === 'object' && entry.headers !== null\n ? {\n headers: scrub(\n entry.headers as Record<string, unknown>,\n (k) => `${name}_${k}`,\n notes,\n `${where}.headers`,\n ),\n }\n : {}),\n }\n continue\n }\n if (typeof entry.command !== 'string') {\n notes.push(`${where}: skipped (no \"command\" or \"url\").`)\n continue\n }\n servers[name] = {\n cmd: entry.command,\n ...(Array.isArray(entry.args) ? { args: entry.args.map(String) } : {}),\n ...(typeof entry.cwd === 'string' ? { cwd: entry.cwd } : {}),\n ...(typeof entry.env === 'object' && entry.env !== null\n ? { env: scrub(entry.env as Record<string, unknown>, (k) => k, notes, `${where}.env`) }\n : {}),\n }\n }\n return servers\n}\n\nfunction fromClaudeConfig(dir: string, explicit: string): Detected {\n const candidates = explicit\n ? [resolvePathFromCwd(explicit)]\n : [path.join(dir, '.mcp.json'), claudeDesktopConfigPath()]\n for (const file of candidates) {\n if (!fs.existsSync(file)) continue\n const json = readJson(file)\n const mcpServers = json?.mcpServers\n if (typeof mcpServers !== 'object' || mcpServers === null) {\n if (explicit)\n throw new UsageError(\n `No \"mcpServers\" object in ${file}. Point --from-claude-config at a .mcp.json or claude_desktop_config.json.`,\n )\n continue\n }\n const notes: string[] = []\n const servers = serversFromMcpConfig(mcpServers as Record<string, unknown>, notes)\n if (Object.keys(servers).length === 0) {\n throw new UsageError(\n `${file} lists no usable servers (each needs \"command\" or \"url\"). Add one, or run vib init --server \"<cmd>\".`,\n )\n }\n const names = Object.keys(servers)\n if (names.length === 1 && names[0] !== 'default') {\n notes.push(`Named the server \"default\" (it is \"${names[0]}\" in ${path.basename(file)}).`)\n return { servers: { default: servers[names[0]] }, source: file, notes }\n }\n return { servers, source: file, notes }\n }\n throw new UsageError(\n `No Claude config found (looked for ${candidates.join(' and ')}). Pass the file explicitly: --from-claude-config <path>.`,\n )\n}\n\n/** Reporters of the scaffolded `ci` profile; the `--ci` workflow passes the same list. */\nexport const CI_REPORTERS = ['console', 'github', 'junit', 'json'] as const\n\n/** The GitHub Actions workflow `--ci` writes (uploads reports/ when the run fails). */\nexport function ciWorkflow(dir: string): string {\n const node = fs.existsSync(path.join(dir, 'package.json'))\n const python = fs.existsSync(path.join(dir, 'pyproject.toml'))\n const go = fs.existsSync(path.join(dir, 'go.mod'))\n const vib = node ? 'npx vib' : 'npx --yes --package @jmoak/vibrissa vib'\n const lines = [\n '# Vibrissa contract tests: cases + manifest lock + spec/description checks.',\n '# Generated by `vib init --ci`. Uses the \"ci\" profile in vibrissa.json; reports/ is uploaded on failure.',\n 'name: vibrissa',\n '',\n 'on:',\n ' push:',\n ' branches: [main]',\n ' pull_request:',\n '',\n 'jobs:',\n ' contract:',\n ' runs-on: ubuntu-latest',\n ' steps:',\n ' - uses: actions/checkout@v4',\n ' - uses: actions/setup-node@v4',\n ' with:',\n ' node-version: 22',\n ...(node ? [' cache: npm'] : []),\n ]\n if (python) {\n lines.push(\n ' - uses: actions/setup-python@v5',\n ' with:',\n \" python-version: '3.12'\",\n ' - run: pip install -e .',\n )\n }\n if (go)\n lines.push(' - uses: actions/setup-go@v5', ' with:', ' go-version: stable')\n if (node) lines.push(' - run: npm ci', ' - run: npm run build --if-present')\n lines.push(\n ` - run: ${vib} run --profile ci`,\n ' - uses: actions/upload-artifact@v4',\n ' if: failure()',\n ' with:',\n ' name: vibrissa-reports',\n ' path: reports/',\n '',\n )\n return lines.join('\\n')\n}\n\n/** Placeholder sample when no real call could be recorded (skipped until edited). */\nfunction skippedSample(\n file: string,\n dir: string,\n tool: string,\n args: Record<string, JsonValue>,\n why: string,\n): Record<string, JsonValue> {\n return {\n $schema: schemaRefFor(file, dir, 'case.schema.json'),\n name: `${tool} sample`,\n skip: `edit args for your server (${why}), then delete this line`,\n tool,\n args,\n expect: { $partial: true },\n }\n}\n\nfunction sampleFlow(file: string, dir: string): Record<string, JsonValue> {\n return {\n $schema: schemaRefFor(file, dir, 'case.schema.json'),\n name: 'sample flow: create, read back, clean up',\n skip: 'sample: replace notes.* with your own tools (or record one: vib record --flow), then delete this line',\n tags: ['sample'],\n steps: [\n {\n name: 'create',\n tool: 'notes.create',\n args: { title: 'hello' },\n capture: { noteId: 'structuredContent.id' },\n expect: { $partial: true, structuredContent: { id: { $type: 'string' } } },\n },\n {\n name: 'read back',\n tool: 'notes.get',\n args: { id: '{{noteId}}' },\n expect: { $partial: true, structuredContent: { title: 'hello' } },\n },\n ],\n teardown: [{ tool: 'notes.delete', args: { id: '{{noteId}}' }, ignoreErrors: true }],\n }\n}\n\n/** Pick the tool `init` may call: read-only first, never one annotated destructive. */\nexport function pickSampleTool(tools: ToolSummary[]): ToolSummary | undefined {\n const ann = (t: ToolSummary) => (isObject(t.annotations) ? t.annotations : {})\n return (\n tools.find((t) => ann(t).readOnlyHint === true) ??\n tools.find((t) => ann(t).destructiveHint !== true)\n )\n}\n\n/** A readable value for one property: example/default/const/enum, else a plain per-type value. */\nfunction friendlyValue(schema: JsonValue): JsonValue {\n if (!isObject(schema)) return 'hello'\n if (Array.isArray(schema.examples) && schema.examples.length > 0) return schema.examples[0]\n if (schema.default !== undefined) return schema.default\n if (schema.const !== undefined) return schema.const\n if (Array.isArray(schema.enum) && schema.enum.length > 0) return schema.enum[0]\n const type = Array.isArray(schema.type) ? schema.type.find((t) => t !== 'null') : schema.type\n switch (type) {\n case 'integer':\n case 'number':\n return typeof schema.minimum === 'number' ? schema.minimum : 1\n case 'boolean':\n return true\n case 'array':\n return []\n case 'object':\n return {}\n default:\n return 'hello'\n }\n}\n\n/**\n * Minimal schema-valid args for the sample call: readable values for the required\n * properties when they validate, else the fuzz generator's \"only required properties\" case.\n */\nexport function minimalArgs(inputSchema: JsonValue): Record<string, JsonValue> {\n const schema = isObject(inputSchema) ? inputSchema : {}\n const props = isObject(schema.properties) ? schema.properties : {}\n const required = Array.isArray(schema.required) ? schema.required.map(String) : []\n const friendly: Record<string, JsonValue> = {}\n for (const name of required) friendly[name] = friendlyValue(props[name] ?? {})\n if (validateAgainstSchema(inputSchema, friendly).ok) return friendly\n const cases = generateArgs(inputSchema, {\n seed: 'vib-init',\n count: 12,\n strategies: ['valid'],\n selfCheck: true,\n })\n return (cases.find((c) => /only required/i.test(c.reason)) ?? cases[0])?.args ?? {}\n}\n\ninterface SampleResult {\n path: string\n status: WriteStatus\n /** A real call was recorded (otherwise a skipped placeholder was written). */\n recorded: boolean\n tool?: string\n reason?: string\n}\n\n/**\n * Start the configured server, call one tool with minimal generated args and record it as\n * the sample case. Falls back to a skipped placeholder when the server does not start, lists\n * no callable tool, or the call fails.\n */\nasync function writeSample(\n dir: string,\n configPath: string,\n force: boolean,\n allowCall: boolean,\n notes: string[],\n): Promise<SampleResult> {\n const { options } = loadConfig(dir, { configPath })\n const { dir: casesDir, suffix } = suiteLayout(options.globs)\n const placeholder = (\n tool: string,\n args: Record<string, JsonValue>,\n why: string,\n ): SampleResult => {\n const file = path.join(dir, casesDir, `sample${suffix}`)\n const status = writeFile(\n file,\n `${JSON.stringify(skippedSample(file, dir, tool, args, why), null, 2)}\\n`,\n force,\n )\n return { path: file, status, recorded: false, tool, reason: why }\n }\n if (!allowCall) return placeholder('echo', { text: 'hello' }, '--no-call')\n let session: McpSession | undefined\n try {\n try {\n session = await McpSession.start(resolveServerConfig(options), {\n timeoutMs: Math.min(options.timeoutMs, 10_000),\n stderr: 'capture',\n })\n } catch (err) {\n const why = err instanceof Error ? firstLine(err.message) : String(err)\n return placeholder(\n 'echo',\n { text: 'hello' },\n `the server did not start: ${truncate(why, 120)}`,\n )\n }\n const tools = await session.listTools()\n const tool = pickSampleTool(tools)\n if (!tool) {\n return placeholder(\n tools[0]?.name ?? 'echo',\n {},\n tools.length\n ? 'every tool is annotated destructive, so none was called'\n : 'the server lists no tools',\n )\n }\n const args = minimalArgs(tool.inputSchema)\n const op: OpSpec = { kind: 'tool', target: tool.name, args }\n const outcome = await executeOp(session, op, { timeoutMs: options.timeoutMs })\n const observed = observedFromOutcome(outcome)\n if (observed.kind !== 'result') {\n const why =\n observed.kind === 'error'\n ? `calling ${tool.name} with generated args failed: ${truncate(firstLine(observed.error?.message ?? ''), 100)}`\n : `${tool.name} asked for input`\n return placeholder(tool.name, args, why)\n }\n const second = await executeOp(session, op, { timeoutMs: options.timeoutMs })\n const loosened: Loosened[] = []\n const step = stepFromObserved(\n op,\n observed,\n {\n normalize: options.normalize,\n loosened,\n ...(second.kind === 'result' ? { second: second.result } : {}),\n },\n notes,\n ) as Step\n const name = defaultName(op)\n const file = uniquePath(\n path.join(dir, casesDir, `${slugify(name) || 'sample'}${suffix}`),\n suffix,\n )\n const testCase = { $schema: schemaRefFor(file, dir, 'case.schema.json'), name, ...step }\n const status = writeFile(file, `${JSON.stringify(testCase, null, 2)}\\n`, force)\n notes.push(\n `Recorded a real sample by calling ${tool.name} ${preview(args, 80)} (pass --no-call to skip calling tools).`,\n )\n if (loosened.length > 0) notes.push(`${loosenedSummary(loosened)} in the sample.`)\n return { path: file, status, recorded: true, tool: tool.name }\n } catch (err) {\n const why = err instanceof Error ? firstLine(err.message) : String(err)\n return placeholder('echo', { text: 'hello' }, truncate(why, 120))\n } finally {\n await session?.close()\n }\n}\n\nconst GITIGNORE_LINE = 'reports/'\n\n/** Add `reports/` to .gitignore (created when missing). */\nfunction ensureGitignore(dir: string): 'created' | 'updated' | 'present' {\n const file = path.join(dir, '.gitignore')\n if (!fs.existsSync(file)) {\n fs.writeFileSync(file, `${GITIGNORE_LINE}\\n`, 'utf8')\n return 'created'\n }\n const text = fs.readFileSync(file, 'utf8')\n if (/^\\/?reports\\/?\\s*$/m.test(text)) return 'present'\n fs.writeFileSync(\n file,\n `${text}${text === '' || text.endsWith('\\n') ? '' : '\\n'}${GITIGNORE_LINE}\\n`,\n 'utf8',\n )\n return 'updated'\n}\n\n/** The scaffolded `ci` profile: the workflow runs `vib run --profile ci` and nothing else. */\nexport const CI_PROFILE = { reporters: [...CI_REPORTERS], check: true, requireManifest: true }\n\n/** Ensure an existing vibrissa.json has the `ci` profile the workflow uses. */\nfunction ensureCiProfile(configPath: string, notes: string[]): 'added' | 'present' | 'skipped' {\n const text = fs.readFileSync(configPath, 'utf8')\n let config: Record<string, JsonValue>\n try {\n config = JSON.parse(text) as Record<string, JsonValue>\n } catch {\n notes.push(\n `Add a \"ci\" profile to ${configPath} by hand: ${JSON.stringify({ ci: CI_PROFILE })}.`,\n )\n return 'skipped'\n }\n const profiles = isObject(config.profiles) ? config.profiles : {}\n if (profiles.ci !== undefined) return 'present'\n config.profiles = { ...profiles, ci: CI_PROFILE }\n fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`, 'utf8')\n return 'added'\n}\n\nfunction describeEntry(entry: ServerEntry): string {\n if (typeof entry.url === 'string') return entry.url\n return [entry.cmd, ...(Array.isArray(entry.args) ? entry.args : [])].join(' ')\n}\n\nexport async function initCommand(argv: string[]): Promise<number> {\n const flags = parseCommonFlags(argv)\n const dir = resolvePathFromCwd(takeFlag(argv, '--dir') ?? '.')\n const force = hasFlag(argv, '--force')\n const ci = hasFlag(argv, '--ci')\n const claude = takeOptionalFlag(argv, '--from-claude-config')\n const configPath = path.join(dir, 'vibrissa.json')\n const files: Array<{ path: string; status: string; what: string }> = []\n const notes: string[] = []\n const c = colors()\n\n // `vib init --ci` in a configured project: only the workflow (+ the ci profile it uses).\n if (ci && fs.existsSync(configPath) && !force) {\n const workflow = path.join(dir, '.github', 'workflows', 'vibrissa.yml')\n files.push({ what: 'ci', path: workflow, status: writeFile(workflow, ciWorkflow(dir), false) })\n const profile = ensureCiProfile(configPath, notes)\n files.push({\n what: 'profile',\n path: configPath,\n status: profile === 'added' ? 'updated' : profile,\n })\n if (flags.json) {\n printJson({\n ok: true,\n dir,\n files,\n ...(notes.length ? { notes } : {}),\n next: ['vib run --profile ci'],\n })\n return 0\n }\n console.log(\n `${c.green(c.bold('vib init --ci'))} ${c.dim('· vibrissa.json exists; writing CI only')}`,\n )\n for (const f of files) console.log(` ${f.what.padEnd(7)} ${f.status.padEnd(7)} ${f.path}`)\n for (const note of notes) console.log(c.yellow(`note: ${note}`))\n if (files[0].status === 'skipped')\n console.log(c.yellow('The workflow already exists; re-run with --force to replace it.'))\n return 0\n }\n\n let detected: Detected\n if (claude !== undefined) detected = fromClaudeConfig(dir, claude)\n else if (flags.server !== undefined) {\n const raw = flags.server.trim()\n if (/^https?:\\/\\//i.test(raw))\n detected = { servers: { default: { url: raw } }, source: '--server', notes: [] }\n else {\n const { cmd, args } = splitCommandLine(raw)\n detected = { servers: { default: { cmd, args, cwd: '.' } }, source: '--server', notes: [] }\n }\n } else detected = detectServer(dir)\n notes.push(...detected.notes)\n if (flags.protocol !== undefined) {\n for (const entry of Object.values(detected.servers))\n entry.protocol = flags.protocol as JsonValue\n }\n const names = Object.keys(detected.servers)\n const defaultServer = names.includes('default') ? 'default' : names[0]\n\n const config = {\n $schema: schemaRefFor(configPath, dir, 'vibrissa.schema.json'),\n servers: detected.servers,\n defaultServer,\n globs: ['tests/integration/**/*.json', '!tests/integration/**/__manifest__*.json'],\n manifest: 'tests/integration/__manifest__.json',\n timeoutMs: flags.timeoutMs ?? 15000,\n reporters: ['console'],\n profiles: { ci: CI_PROFILE },\n }\n files.push({\n what: 'config',\n path: configPath,\n status: writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, force),\n })\n const sample = await writeSample(dir, configPath, force, !hasFlag(argv, '--no-call'), notes)\n files.push({ what: 'sample', path: sample.path, status: sample.status })\n const flowPath = path.join(path.dirname(sample.path), 'flow.sample.json')\n files.push({\n what: 'flow',\n path: flowPath,\n status: writeFile(flowPath, `${JSON.stringify(sampleFlow(flowPath, dir), null, 2)}\\n`, force),\n })\n if (ci) {\n const workflow = path.join(dir, '.github', 'workflows', 'vibrissa.yml')\n files.push({ what: 'ci', path: workflow, status: writeFile(workflow, ciWorkflow(dir), force) })\n }\n const gitignore = ensureGitignore(dir)\n files.push({ what: 'gitignore', path: path.join(dir, '.gitignore'), status: gitignore })\n\n const pkgPath = path.join(dir, 'package.json')\n let pkgNote = 'no package.json (skipped the npm script)'\n const pkg = readJson(pkgPath)\n if (pkg) {\n const scripts = (pkg.scripts ?? {}) as Record<string, string>\n if (!scripts['test:integration'] || force) {\n pkg.scripts = { ...scripts, 'test:integration': 'vib run' }\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8')\n pkgNote = 'added scripts.test:integration = \"vib run\"'\n } else pkgNote = 'scripts.test:integration already present'\n }\n const skipped = files.some((f) => f.status === 'skipped')\n const next = [\n 'vib discover # what the server is and supports',\n 'vib tools # its tools (also: vib resources, vib prompts)',\n 'vib record <tool> --arg key=value',\n 'vib manifest record # lock the tool surface',\n 'vib run',\n ]\n\n if (flags.json) {\n printJson({\n ok: true,\n dir,\n servers: detected.servers,\n defaultServer,\n source: detected.source,\n files,\n sample: {\n recorded: sample.recorded,\n ...(sample.tool ? { tool: sample.tool } : {}),\n ...(sample.reason ? { reason: sample.reason } : {}),\n },\n package: pkgNote,\n ...(notes.length ? { notes } : {}),\n next,\n })\n return 0\n }\n const where =\n detected.source === 'default'\n ? 'a guess (no entry point found)'\n : detected.source === '--server'\n ? 'from --server'\n : `detected from ${detected.source}`\n const servers =\n names.length === 1\n ? `server \"${names[0]}\" = ${describeEntry(detected.servers[names[0]])} (${where})`\n : `${names.length} servers from ${detected.source}: ${names.join(', ')} (default \"${defaultServer}\")`\n console.log(`${c.green(c.bold('vib init'))} · ${servers}`)\n for (const f of files)\n console.log(\n ` ${f.what.padEnd(9)} ${(f.status === 'skipped' ? c.yellow : c.green)(f.status.padEnd(7))} ${f.path}`,\n )\n console.log(` ${'package'.padEnd(9)} ${pkgNote}`)\n if (!sample.recorded && sample.reason)\n console.log(c.yellow(`note: wrote a skipped sample: ${sample.reason}.`))\n for (const note of notes) console.log(c.yellow(`note: ${note}`))\n if (skipped)\n console.log(\n c.yellow(\n 'Some files already existed and were left alone; re-run with --force to replace them.',\n ),\n )\n console.log('')\n console.log(c.bold('Next:'))\n next.forEach((line, i) => console.log(` ${i + 1}. ${line}`))\n return 0\n}\n","/**\n * Wrappers around official tools: `vib inspect` (MCP Inspector) and `vib conformance`\n * (the official conformance suite, HTTP servers only). Vibrissa adds the server from\n * config so you never retype it.\n */\nimport { spawn } from 'node:child_process'\nimport { isHttpServerConfig } from '../types.js'\nimport { UsageError, hasFlag, printJson, splitAtDoubleDash } from './args.js'\nimport { colors } from './format.js'\nimport { describeServerTarget, openSessionOptions, parseCommonFlags } from './resolve.js'\n\nfunction runNpx(\n args: string[],\n cwd: string,\n env: Record<string, string>,\n label: string,\n): Promise<number> {\n const child = spawn('npx', args, {\n cwd,\n env: { ...process.env, ...env },\n stdio: 'inherit',\n shell: process.platform === 'win32',\n })\n return new Promise<number>((resolve) => {\n child.on('error', (err) => {\n console.error(\n `Failed to launch ${label}: ${err.message}. Is npx on your PATH (Node.js ≥ 20)?`,\n )\n resolve(2)\n })\n child.on('exit', (code, signal) => resolve(signal ? 1 : (code ?? 1)))\n })\n}\n\nexport async function inspectCommand(argv: string[]): Promise<number> {\n const [own, passthrough] = splitAtDoubleDash(argv)\n const flags = parseCommonFlags(own)\n const { server } = openSessionOptions(flags)\n const cliMode = hasFlag(own, '--cli') || passthrough[0] === '--cli'\n const rest = passthrough[0] === '--cli' ? passthrough.slice(1) : passthrough\n const c = colors()\n\n let inspectorArgs: string[]\n let cwd = process.cwd()\n let env: Record<string, string> = {}\n if (isHttpServerConfig(server)) {\n inspectorArgs = cliMode\n ? [\n '--yes',\n '@modelcontextprotocol/inspector',\n '--cli',\n server.url,\n '--transport',\n 'http',\n ...rest,\n ]\n : ['--yes', '@modelcontextprotocol/inspector', ...rest]\n if (!cliMode) {\n console.log(\n c.yellow(`In the Inspector UI choose \"Streamable HTTP\" and connect to ${server.url}`),\n )\n if (server.headers && Object.keys(server.headers).length > 0) {\n console.log(\n c.yellow(\n `and add the headers from vibrissa.json (${Object.keys(server.headers).join(', ')}).`,\n ),\n )\n }\n }\n } else {\n inspectorArgs = [\n '--yes',\n '@modelcontextprotocol/inspector',\n ...(cliMode ? ['--cli'] : []),\n server.cmd,\n ...(server.args ?? []),\n ...rest,\n ]\n cwd = server.cwd ?? cwd\n env = server.env ?? {}\n }\n console.log(c.green(`Opening MCP Inspector for ${describeServerTarget(server)}`))\n console.log(\n c.dim('Inspector = visual exploration · vib tools/call/record/run = the regression loop'),\n )\n return runNpx(inspectorArgs, cwd, env, 'MCP Inspector')\n}\n\n/**\n * `vib conformance`: run `npx @modelcontextprotocol/conformance server --url <url>` against\n * the configured HTTP server. The official suite is HTTP-first; stdio servers get\n * pointed at `vib check`, which runs the deterministic subset over stdio.\n */\nexport async function conformanceCommand(argv: string[]): Promise<number> {\n const [own, passthrough] = splitAtDoubleDash(argv)\n const flags = parseCommonFlags(own)\n const { server, serverName } = openSessionOptions(flags)\n if (!isHttpServerConfig(server)) {\n const message = `vib conformance needs an HTTP server: the official suite (@modelcontextprotocol/conformance) connects by URL, and \"${serverName}\" is a stdio server (${describeServerTarget(server)}).`\n const hint =\n 'Run vib check for the deterministic spec-sanity subset over stdio, or start the server over HTTP and pass --server http://127.0.0.1:<port>/mcp.'\n if (flags.json) {\n printJson({ ok: false, error: { code: 'stdio-server', message }, hint })\n return 2\n }\n throw new UsageError(`${message} ${hint}`)\n }\n const args = [\n '--yes',\n '@modelcontextprotocol/conformance',\n 'server',\n '--url',\n server.url,\n ...passthrough,\n ]\n if (!flags.json) {\n console.log(colors().green(`Running the official MCP conformance suite against ${server.url}`))\n console.log(colors().dim(`npx ${args.join(' ')}`))\n }\n return runNpx(args, process.cwd(), {}, 'the MCP conformance suite')\n}\n","/**\n * `vib migrate`: rewrite v1 config and case files to the v2 shape, in place. Idempotent:\n * a second run changes nothing.\n *\n * Config: `server` → `servers.default` + `defaultServer` (also inside profiles); `$schema`\n * added or pointed at the published `@jmoak/vibrissa` schema (v1 wrote\n * `node_modules/vibrissa/...`, which never resolves).\n * Cases: `$schema` likewise; `expectError.code` aliases renamed to canonical names\n * (`RequestTimedOut` → `RequestTimeout`), and v1 numeric codes that no longer arrive as\n * numbers (-32000 / -32001 are SDK errors in v2, -32002 became -32602 + {uri}) → names.\n */\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { caseFileHasComments, parseCaseText, resolveCaseFilesSync } from '../cases.js'\nimport { ConfigError, loadConfig, loadConfigFile } from '../config.js'\nimport { DEFAULT_SERVER_NAME } from '../defaults.js'\nimport { canonicalCodeName } from '../session/errors.js'\nimport type { JsonValue } from '../types.js'\nimport { UsageError, hasFlag, printJson, schemaRefFor, takeFlag } from './args.js'\nimport { colors, isObject, plural } from './format.js'\nimport { manifestCommand } from './manifest.js'\nimport { mergeCliOptions, parseCommonFlags } from './resolve.js'\n\ntype Obj = Record<string, JsonValue>\n\n/** v1 numeric codes → v2 names (see session/errors.ts NUMERIC_CODE_NAMES). */\nconst LEGACY_NUMERIC_CODES: Record<number, string> = {\n [-32000]: 'ConnectionClosed',\n [-32001]: 'RequestTimeout',\n [-32002]: 'ResourceNotFound',\n}\n\n/** `$schema` values written by v1 that never resolve (unscoped package name). */\nconst STALE_SCHEMA = /(^|\\/)node_modules\\/vibrissa\\/|unpkg\\.com\\/vibrissa\\//\n\nexport interface MigrationResult {\n value: Obj\n edits: string[]\n}\n\nfunction schemaEdit(obj: Obj, wanted: string, edits: string[]): Obj {\n const current = obj.$schema\n if (typeof current === 'string' && !STALE_SCHEMA.test(current)) return obj\n const { $schema: _old, ...rest } = obj\n edits.push(\n typeof current === 'string'\n ? `$schema \"${current}\" → \"${wanted}\" (v1 path never resolves)`\n : `$schema added: \"${wanted}\"`,\n )\n return { $schema: wanted, ...rest }\n}\n\n/** `server` → `servers.default` (+ `defaultServer`), keeping key order. */\nfunction serverEdit(obj: Obj, at: string, edits: string[], addDefault: boolean): Obj {\n if (obj.server === undefined) return obj\n const out: Obj = {}\n const servers = isObject(obj.servers) ? { ...obj.servers } : undefined\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'server') {\n if (servers && servers[DEFAULT_SERVER_NAME] !== undefined) {\n edits.push(`${at}server removed: servers.default already exists and wins`)\n continue\n }\n if (servers) {\n // Merged below where `servers` sits.\n continue\n }\n out.servers = { [DEFAULT_SERVER_NAME]: value }\n if (addDefault && obj.defaultServer === undefined) out.defaultServer = DEFAULT_SERVER_NAME\n edits.push(\n `${at}server → ${at}servers.default${addDefault && obj.defaultServer === undefined ? ' (+ defaultServer \"default\")' : ''}`,\n )\n continue\n }\n if (key === 'servers' && servers) {\n if (servers[DEFAULT_SERVER_NAME] === undefined) {\n out.servers = { [DEFAULT_SERVER_NAME]: obj.server, ...servers }\n edits.push(`${at}server → ${at}servers.default`)\n } else out.servers = servers\n continue\n }\n out[key] = value\n }\n return out\n}\n\n/** Migrate a config object (the file, or package.json#vibrissa). Pure. */\nexport function migrateConfig(config: Obj, opts: { schema?: string } = {}): MigrationResult {\n const edits: string[] = []\n let value = serverEdit(config, '', edits, true)\n if (isObject(value.profiles)) {\n const profiles: Obj = {}\n for (const [name, profile] of Object.entries(value.profiles)) {\n profiles[name] = isObject(profile)\n ? serverEdit(profile, `profiles.${name}.`, edits, false)\n : profile\n }\n value = { ...value, profiles }\n }\n if (opts.schema) value = schemaEdit(value, opts.schema, edits)\n return { value, edits }\n}\n\nfunction migrateExpectError(step: Obj, at: string, edits: string[]): Obj {\n const expectError = step.expectError\n if (!isObject(expectError) || expectError.code === undefined) return step\n const code = expectError.code\n let next: JsonValue = code\n if (typeof code === 'string') next = canonicalCodeName(code)\n else if (typeof code === 'number' && LEGACY_NUMERIC_CODES[code] !== undefined)\n next = LEGACY_NUMERIC_CODES[code]\n if (next === code) return step\n edits.push(`${at}expectError.code ${JSON.stringify(code)} → ${JSON.stringify(next)}`)\n return { ...step, expectError: { ...expectError, code: next } }\n}\n\n/** v1 config keys with no effect in v2, and what to do about them. */\nconst V1_ONLY_KEYS: Record<string, string> = {\n display: 'has no effect in v2; use --pretty / --no-pretty on vib run (or NO_COLOR) and delete it',\n}\n\n/** Notes for leftover v1 keys in a (migrated) config object, including its profiles. */\nexport function leftoverKeys(config: Obj, prefix = ''): string[] {\n const out: string[] = []\n const scan = (obj: Obj, at: string) => {\n for (const [key, why] of Object.entries(V1_ONLY_KEYS)) {\n if (obj[key] !== undefined) out.push(`${prefix}${at}${key} ${why}.`)\n }\n }\n scan(config, '')\n if (isObject(config.profiles)) {\n for (const [name, profile] of Object.entries(config.profiles)) {\n if (isObject(profile)) scan(profile, `profiles.${name}.`)\n }\n }\n return out\n}\n\nconst OP_KEYS = ['tool', 'resource', 'resourceTemplate', 'prompt', 'steps']\n\nexport function looksLikeCase(value: unknown): value is Obj {\n return isObject(value) && OP_KEYS.some((key) => value[key] !== undefined)\n}\n\n/** Migrate one case object. Pure. */\nexport function migrateCase(testCase: Obj, opts: { schema?: string } = {}): MigrationResult {\n const edits: string[] = []\n let value = migrateExpectError(testCase, '', edits)\n for (const list of ['steps', 'setup', 'teardown']) {\n const steps = value[list]\n if (!Array.isArray(steps)) continue\n value = {\n ...value,\n [list]: steps.map((step, i) =>\n isObject(step) ? migrateExpectError(step, `${list}[${i}].`, edits) : step,\n ),\n }\n }\n if (opts.schema) value = schemaEdit(value, opts.schema, edits)\n return { value, edits }\n}\n\ninterface FileChange {\n file: string\n kind: 'config' | 'case'\n edits: string[]\n written: boolean\n /** Why the change was not applied (comments would be lost without --force). */\n blocked?: string\n}\n\nfunction serialize(value: unknown, original: string): string {\n const text = `${JSON.stringify(value, null, 2)}\\n`\n return original.includes('\\r\\n') ? text.replace(/\\n/g, '\\r\\n') : text\n}\n\nexport async function migrateCommand(argv: string[]): Promise<number> {\n const flags = parseCommonFlags(argv)\n const dryRun = hasFlag(argv, '--dry-run')\n const force = hasFlag(argv, '--force')\n const loaded = loadConfigFile(process.cwd(), flags.configPath)\n if (!loaded?.configPath) {\n throw new UsageError(\n 'No vibrissa config found (vibrissa.json, vibrissa.jsonc or package.json#vibrissa).',\n {\n code: 'not-found',\n hint: 'Pass --config <path>, or run vib init to create one.',\n next: ['vib init'],\n },\n )\n }\n const { configPath, rootDir } = loaded\n const changes: FileChange[] = []\n const write = (\n file: string,\n text: string,\n kind: FileChange['kind'],\n edits: string[],\n value: unknown,\n ) => {\n if (edits.length === 0) return\n const change: FileChange = { file, kind, edits, written: false }\n if (caseFileHasComments(text) && !force) {\n change.blocked =\n 'the file has comments, which a rewrite would drop; edit by hand or pass --force'\n } else if (!dryRun) {\n fs.writeFileSync(file, serialize(value, text), 'utf8')\n change.written = true\n }\n changes.push(change)\n }\n\n // Config\n const configText = fs.readFileSync(configPath, 'utf8')\n const notes: string[] = []\n if (path.basename(configPath) === 'package.json') {\n const pkg = parseCaseText(configText, configPath) as Obj\n const { value, edits } = migrateConfig(isObject(pkg.vibrissa) ? pkg.vibrissa : {})\n notes.push(...leftoverKeys(value, 'vibrissa.'))\n write(\n configPath,\n configText,\n 'config',\n edits.map((e) => `vibrissa.${e}`),\n { ...pkg, vibrissa: value },\n )\n } else {\n const raw = parseCaseText(configText, configPath)\n if (!isObject(raw))\n throw new ConfigError(`Invalid config at ${configPath}: expected a JSON object.`)\n const { value, edits } = migrateConfig(raw, {\n schema: schemaRefFor(configPath, rootDir, 'vibrissa.schema.json'),\n })\n notes.push(...leftoverKeys(value))\n write(configPath, configText, 'config', edits, value)\n }\n // Keys the v2 loader does not know (typos, v1 leftovers it warns about).\n try {\n for (const warning of loadConfig(rootDir, { configPath }).warnings) {\n if (warning.startsWith('Unknown config key')) notes.push(warning)\n }\n } catch (err) {\n notes.push(\n `The migrated config does not load yet: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n // Cases (globs from the config, or --cases)\n const options = mergeCliOptions(flags, {}, { quiet: true })\n const casesFlag = takeFlag(argv, '--cases')\n const files = resolveCaseFilesSync(\n casesFlag ? [casesFlag] : options.globs,\n casesFlag ? process.cwd() : rootDir,\n )\n let unchanged = 0\n const skipped: Array<{ file: string; reason: string }> = []\n for (const file of files) {\n if (path.resolve(file) === path.resolve(configPath)) continue\n const text = fs.readFileSync(file, 'utf8')\n let parsed: unknown\n try {\n parsed = parseCaseText(text, file)\n } catch (err) {\n skipped.push({ file, reason: err instanceof Error ? err.message : String(err) })\n continue\n }\n if (!looksLikeCase(parsed)) continue // manifests, $ref fragments, other JSON\n const { value, edits } = migrateCase(parsed, {\n schema: schemaRefFor(file, rootDir, 'case.schema.json'),\n })\n if (edits.length === 0) unchanged++\n write(file, text, 'case', edits, value)\n }\n\n // Manifest\n let manifest: { requested: boolean; exitCode?: number } = {\n requested: hasFlag(argv, '--manifest'),\n }\n if (manifest.requested && !dryRun) {\n const pass: string[] = []\n for (const flag of [\n '--config',\n '--server',\n '--profile',\n '--protocol',\n '--timeout',\n '--server-cwd',\n ]) {\n const value = takeFlag(argv, flag)\n if (value !== undefined) pass.push(flag, value)\n }\n if (flags.json) pass.push('--json')\n manifest = { requested: true, exitCode: await manifestCommand(['record', ...pass]) }\n }\n\n const blocked = changes.filter((c) => c.blocked)\n // A case file that is not valid JSON was not migrated: that needs attention too.\n const ok = blocked.length === 0 && skipped.length === 0 && (manifest.exitCode ?? 0) === 0\n const hint = dryRun\n ? 'Dry run: nothing was written. Re-run without --dry-run to apply.'\n : manifest.requested\n ? undefined\n : 'Next: vib manifest record (or vib migrate --manifest) to lock the server surface.'\n if (flags.json) {\n printJson({\n ok,\n dryRun,\n config: configPath,\n changes,\n unchanged,\n skipped,\n manifest,\n ...(notes.length > 0 ? { notes } : {}),\n ...(hint ? { hint } : {}),\n })\n return ok ? 0 : 1\n }\n const c = colors()\n const rel = (file: string) => path.relative(process.cwd(), file).replace(/\\\\/g, '/') || file\n console.log(c.bold(`vib migrate${dryRun ? ' (dry run)' : ''}`))\n if (changes.length === 0) console.log(c.green(' Everything is already in v2 form.'))\n for (const change of changes) {\n const state = change.blocked\n ? c.yellow('needs manual edit')\n : change.written\n ? c.green('updated')\n : c.dim('would change')\n console.log(` ${c.bold(rel(change.file))} ${state}`)\n for (const edit of change.edits) console.log(` · ${edit}`)\n if (change.blocked) console.log(c.yellow(` ${change.blocked}`))\n }\n for (const s of skipped)\n console.log(` ${c.red('skipped')} ${rel(s.file)}: ${s.reason} (fix the JSON and re-run)`)\n for (const note of notes) console.log(c.yellow(` note: ${note}`))\n const changedCount = changes.filter((c) => !c.blocked).length\n console.log('')\n console.log(\n `${plural(changedCount, 'file')} ${dryRun ? 'would change' : 'changed'}, ${plural(unchanged, 'case')} already v2.`,\n )\n if (hint) console.log(c.dim(hint))\n return ok ? 0 : 1\n}\n","import { printJson } from './args.js'\nimport { formatPromptList } from './format.js'\nimport { parseCommonFlags, startSession } from './resolve.js'\nimport { listOptional } from './resources.js'\n\nexport async function promptsCommand(argv: string[]): Promise<number> {\n const flags = parseCommonFlags(argv)\n const { session } = await startSession(flags)\n try {\n const info = await session.discover()\n const prompts = await listOptional(info.capabilities, 'prompts', 'prompts/list', () =>\n session.listPromptsResult(),\n )\n if (flags.json) {\n printJson({ ok: true, prompts: prompts.items, listMeta: { prompts: prompts.meta } })\n } else {\n console.log(formatPromptList(prompts.items, prompts.meta, prompts.note ? [prompts.note] : []))\n }\n return 0\n } finally {\n await session.close()\n }\n}\n","import { parseToolArgs } from './args.js'\nimport { type OneShotSpec, runOneShot } from './call.js'\n\nexport const READ_SPEC: OneShotSpec = {\n command: 'read',\n usage: \"vib read <uri> | vib read '<uri-template>' --arg key=value [--raw]\",\n build: (uri, argv) => {\n const args = parseToolArgs(argv)\n // A URI with {placeholders} is an RFC 6570 template: expand it with --arg values.\n if (/\\{[^}]+\\}/.test(uri)) return { kind: 'resourceTemplate', target: uri, args }\n return { kind: 'resource', target: uri, args: {} }\n },\n}\n\nexport async function readCommand(argv: string[]): Promise<number> {\n return runOneShot(READ_SPEC, argv)\n}\n","import path from 'node:path'\nimport { runTapProxy } from '../tap/proxy.js'\nimport { isHttpServerConfig } from '../types.js'\nimport {\n UsageError,\n hasFlag,\n parseEnvPairs,\n resolvePathFromCwd,\n splitAtDoubleDash,\n takeAllFlags,\n takeFlag,\n} from './args.js'\nimport { openSessionOptions, parseCommonFlags } from './resolve.js'\n\n/** `reports/tap/2026-10-28T12-30-00-000Z.ndjson` under the current directory. */\nexport function defaultTapPath(now = new Date()): string {\n return path.join(\n process.cwd(),\n 'reports',\n 'tap',\n `${now.toISOString().replace(/[:.]/g, '-')}.ndjson`,\n )\n}\n\n/**\n * `vib tap [--out file] -- <server cmd...>`: stdout is the protocol channel, so this\n * command never prints to it; everything else goes to stderr.\n */\nexport async function tapCommand(argv: string[]): Promise<number> {\n const [own, server] = splitAtDoubleDash(argv)\n const outFlag = takeFlag(own, '--out')\n const out = outFlag ? resolvePathFromCwd(outFlag) : defaultTapPath()\n const quiet = hasFlag(own, '--quiet')\n let cmd: string\n let args: string[]\n let cwd: string | undefined\n let env: Record<string, string> = parseEnvPairs(takeAllFlags(own, '--env'))\n if (server.length > 0) {\n cmd = server[0]\n args = server.slice(1)\n const serverCwd = takeFlag(own, '--server-cwd')\n cwd = serverCwd ? resolvePathFromCwd(serverCwd) : undefined\n } else {\n // No `-- <cmd>`: proxy the configured (stdio) server. Config warnings go to stderr.\n const { server: configured, serverName } = openSessionOptions(parseCommonFlags(own))\n if (isHttpServerConfig(configured)) {\n throw new UsageError(\n `vib tap proxies stdio servers; \"${serverName}\" is an HTTP server (${configured.url}). Pass the stdio command after --: vib tap -- node dist/index.js`,\n )\n }\n cmd = configured.cmd\n args = configured.args ?? []\n cwd = configured.cwd\n env = { ...(configured.env ?? {}), ...env }\n }\n const result = await runTapProxy({ cmd, args, cwd, env, out, quiet, forwardSignals: true })\n return result.exitCode\n}\n","/**\n * `vib tap`: a transparent stdio proxy between an MCP client and a server that records\n * calls to an NDJSON capture (format: src/tap/entries.ts).\n *\n * Guarantees:\n * - Bytes are forwarded unchanged and immediately, in both directions (client stdin →\n * server stdin, server stdout → client stdout, server stderr → our stderr). Parsing\n * works on a copy; a frame that does not parse is forwarded all the same.\n * - Newline-delimited JSON-RPC (the MCP stdio framing) and LSP-style `Content-Length`\n * framing (some older clients) are both understood, including frames split across\n * chunks and several frames in one chunk.\n * - Nothing is ever written to stdout except the server's own bytes. Status goes to stderr.\n * - When the server exits, the proxy resolves with its exit code (128 + signal number for\n * a signal), after recording any calls still pending as `incomplete`.\n */\nimport { type ChildProcess, spawn } from 'node:child_process'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport type { Readable, Writable } from 'node:stream'\nimport type { JsonValue } from '../types.js'\nimport { type TapEntry, isTappedMethod } from './entries.js'\n\nconst CONTENT_LENGTH = Buffer.from('content-length:')\n/** A partial line or header larger than this is not JSON-RPC we can track; drop the copy. */\nconst MAX_PENDING_BYTES = 64 * 1024 * 1024\n\nfunction isWhitespace(byte: number): boolean {\n return byte === 0x20 || byte === 0x09 || byte === 0x0a || byte === 0x0d\n}\n\n/** Case-insensitive: does `buf` start with (a prefix of) `Content-Length:`? */\nfunction headerState(buf: Buffer): 'header' | 'maybe' | 'none' {\n const n = Math.min(buf.length, CONTENT_LENGTH.length)\n for (let i = 0; i < n; i++) {\n const byte = buf[i] >= 0x41 && buf[i] <= 0x5a ? buf[i] + 0x20 : buf[i]\n if (byte !== CONTENT_LENGTH[i]) return 'none'\n }\n return buf.length >= CONTENT_LENGTH.length ? 'header' : 'maybe'\n}\n\n/**\n * Incremental JSON-RPC frame parser over a byte stream (read-only side channel).\n * Emits each parsed message; batches (arrays) are emitted element by element.\n */\nexport class FrameParser {\n private buf: Buffer = Buffer.alloc(0)\n\n constructor(private readonly onMessage: (message: unknown) => void) {}\n\n push(chunk: Buffer | string): void {\n const bytes = typeof chunk === 'string' ? Buffer.from(chunk, 'utf8') : chunk\n this.buf = this.buf.length === 0 ? bytes : Buffer.concat([this.buf, bytes])\n this.drain()\n if (this.buf.length > MAX_PENDING_BYTES) this.buf = Buffer.alloc(0)\n }\n\n private emit(text: string): void {\n let value: unknown\n try {\n value = JSON.parse(text)\n } catch {\n return\n }\n if (Array.isArray(value)) for (const item of value) this.onMessage(item)\n else this.onMessage(value)\n }\n\n private drain(): void {\n while (true) {\n let start = 0\n while (start < this.buf.length && isWhitespace(this.buf[start])) start++\n if (start > 0) this.buf = this.buf.subarray(start)\n if (this.buf.length === 0) return\n const state = headerState(this.buf)\n if (state === 'maybe') return\n if (state === 'header') {\n let end = this.buf.indexOf('\\r\\n\\r\\n')\n let sep = 4\n if (end === -1) {\n end = this.buf.indexOf('\\n\\n')\n sep = 2\n }\n if (end === -1) return\n const headers = this.buf.subarray(0, end).toString('latin1')\n const match = /content-length:\\s*(\\d+)/i.exec(headers)\n if (!match) {\n // Not a real header block: treat the first line as garbage and move on.\n const nl = this.buf.indexOf(0x0a)\n this.buf = this.buf.subarray(nl === -1 ? this.buf.length : nl + 1)\n continue\n }\n const length = Number(match[1])\n const bodyStart = end + sep\n if (this.buf.length < bodyStart + length) return\n this.emit(this.buf.subarray(bodyStart, bodyStart + length).toString('utf8'))\n this.buf = this.buf.subarray(bodyStart + length)\n continue\n }\n const nl = this.buf.indexOf(0x0a)\n if (nl === -1) return\n const line = this.buf.subarray(0, nl).toString('utf8')\n this.buf = this.buf.subarray(nl + 1)\n if (line.trim() !== '') this.emit(line)\n }\n }\n}\n\ntype Message = Record<string, unknown>\n\nfunction isObject(value: unknown): value is Message {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\ninterface Pending {\n seq: number\n ts: string\n started: number\n from: 'client' | 'server'\n method: string\n id: string | number\n params?: JsonValue\n}\n\n/**\n * Pairs requests with responses for both directions and produces TapEntries.\n * `client` = messages the client wrote (our stdin); `server` = the server's stdout.\n */\nexport class TapRecorder {\n private seq: number\n private readonly pending = new Map<string, Pending>()\n\n /** `startSeq`: the last seq already in the capture file (appended sessions continue it). */\n constructor(\n private readonly write: (entry: TapEntry) => void,\n startSeq = 0,\n ) {\n this.seq = startSeq\n }\n\n observe(from: 'client' | 'server', message: unknown): void {\n if (!isObject(message)) return\n const id = message.id\n const hasId = typeof id === 'string' || typeof id === 'number'\n if (typeof message.method === 'string') {\n if (!hasId || !isTappedMethod(message.method, from)) return\n this.pending.set(`${from}:${id}`, {\n seq: ++this.seq,\n ts: new Date().toISOString(),\n started: performance.now(),\n from,\n method: message.method,\n id,\n ...(message.params !== undefined ? { params: message.params as JsonValue } : {}),\n })\n return\n }\n if (!hasId || !('result' in message || 'error' in message)) return\n // A response travels the other way: the client answers server requests and vice versa.\n const requester = from === 'client' ? 'server' : 'client'\n const key = `${requester}:${id}`\n const request = this.pending.get(key)\n if (!request) return\n this.pending.delete(key)\n this.write({\n ts: request.ts,\n seq: request.seq,\n from: request.from,\n method: request.method,\n id: request.id,\n ...(request.params !== undefined ? { params: request.params } : {}),\n ...('error' in message\n ? { error: message.error as JsonValue }\n : { result: message.result as JsonValue }),\n durationMs: Math.round(performance.now() - request.started),\n })\n }\n\n /** Record every request still waiting for an answer as incomplete. */\n flush(): void {\n for (const request of [...this.pending.values()].sort((a, b) => a.seq - b.seq)) {\n this.write({\n ts: request.ts,\n seq: request.seq,\n from: request.from,\n method: request.method,\n id: request.id,\n ...(request.params !== undefined ? { params: request.params } : {}),\n error: { message: 'no response: the server exited first' },\n durationMs: Math.round(performance.now() - request.started),\n incomplete: true,\n })\n }\n this.pending.clear()\n }\n}\n\nexport interface TapProxyOptions {\n cmd: string\n args?: string[]\n cwd?: string\n /** Extra env vars for the server (merged over this process's env). */\n env?: Record<string, string>\n /** NDJSON capture file (appended to; parent directories are created). */\n out: string\n stdin?: Readable\n stdout?: Writable\n /** Server stderr passthrough and status lines. */\n stderr?: Writable\n /** No status lines on stderr (server stderr still passes through). */\n quiet?: boolean\n /** Forward SIGINT/SIGTERM to the server (CLI use). */\n forwardSignals?: boolean\n}\n\nexport interface TapProxyResult {\n exitCode: number\n /** Entries written to the capture. */\n entries: number\n out: string\n}\n\n/** The highest `seq` in an existing capture (0 for a new or empty file). Reads the tail only. */\nexport function lastSeq(file: string): number {\n let fd: number | undefined\n try {\n fd = fs.openSync(file, 'r')\n const size = fs.fstatSync(fd).size\n const length = Math.min(size, 256 * 1024)\n const buf = Buffer.alloc(length)\n fs.readSync(fd, buf, 0, length, size - length)\n let max = 0\n for (const match of buf.toString('utf8').matchAll(/\"seq\":(\\d+)/g)) {\n max = Math.max(max, Number(match[1]))\n }\n return max\n } catch {\n return 0\n } finally {\n if (fd !== undefined) fs.closeSync(fd)\n }\n}\n\nconst SIGNAL_NUMBERS: Record<string, number> = { SIGHUP: 1, SIGINT: 2, SIGKILL: 9, SIGTERM: 15 }\n\nfunction quoteForShell(arg: string): string {\n return /^[\\w./:=@\\\\-]+$/.test(arg) ? arg : `\"${arg.replace(/\"/g, '\\\\\"')}\"`\n}\n\nexport function runTapProxy(opts: TapProxyOptions): Promise<TapProxyResult> {\n const stdin = opts.stdin ?? process.stdin\n const stdout = opts.stdout ?? process.stdout\n const stderr = opts.stderr ?? process.stderr\n const status = (text: string) => {\n if (!opts.quiet) stderr.write(`[vib tap] ${text}${os.EOL}`)\n }\n fs.mkdirSync(path.dirname(opts.out), { recursive: true })\n const startSeq = lastSeq(opts.out)\n // Create the capture up front, so an empty session still leaves a (0-entry) file.\n fs.appendFileSync(opts.out, '', 'utf8')\n let written = 0\n let writeFailed = false\n const recorder = new TapRecorder((entry) => {\n try {\n fs.appendFileSync(opts.out, `${JSON.stringify(entry)}\\n`, 'utf8')\n written++\n } catch (err) {\n if (!writeFailed) {\n writeFailed = true\n status(\n `cannot write ${opts.out}: ${err instanceof Error ? err.message : String(err)} (still proxying)`,\n )\n }\n }\n }, startSeq)\n const fromClient = new FrameParser((m) => recorder.observe('client', m))\n const fromServer = new FrameParser((m) => recorder.observe('server', m))\n\n return new Promise<TapProxyResult>((resolve) => {\n let child: ChildProcess\n let ready = false\n let triedShell = false\n let stdinEnded = false\n const early: Buffer[] = []\n\n const onClientData = (chunk: Buffer) => {\n if (!ready) {\n early.push(chunk)\n return\n }\n forward(chunk)\n }\n const forward = (chunk: Buffer) => {\n const sink = child.stdin\n if (sink && !sink.destroyed && sink.writable) {\n if (!sink.write(chunk)) {\n stdin.pause()\n sink.once('drain', () => stdin.resume())\n }\n }\n fromClient.push(chunk)\n }\n const onClientEnd = () => {\n stdinEnded = true\n if (ready) child.stdin?.end()\n }\n\n const signalHandlers: Array<[NodeJS.Signals, () => void]> = []\n const cleanup = () => {\n stdin.off('data', onClientData)\n stdin.off('end', onClientEnd)\n stdin.pause()\n // Our own stdin (the client's pipe) would keep the process alive after the server exited.\n if (!opts.stdin) stdin.destroy()\n for (const [signal, handler] of signalHandlers) process.off(signal, handler)\n }\n\n const start = (shell: boolean) => {\n const env = { ...process.env, ...(opts.env ?? {}) }\n child = shell\n ? spawn([opts.cmd, ...(opts.args ?? [])].map(quoteForShell).join(' '), {\n cwd: opts.cwd,\n env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: true,\n windowsHide: true,\n })\n : spawn(opts.cmd, opts.args ?? [], {\n cwd: opts.cwd,\n env,\n stdio: ['pipe', 'pipe', 'pipe'],\n windowsHide: true,\n })\n child.once('spawn', () => {\n ready = true\n status(`proxying ${[opts.cmd, ...(opts.args ?? [])].join(' ')} → capturing to ${opts.out}`)\n for (const chunk of early.splice(0)) forward(chunk)\n if (stdinEnded) child.stdin?.end()\n })\n child.once('error', (err: NodeJS.ErrnoException) => {\n if (\n !ready &&\n !triedShell &&\n process.platform === 'win32' &&\n (err.code === 'ENOENT' || err.code === 'EINVAL')\n ) {\n // Windows: .cmd/.bat shims (npx, npm, uv) need a shell.\n triedShell = true\n start(true)\n return\n }\n if (!ready) {\n cleanup()\n status(\n `could not start \"${opts.cmd}\": ${err.message}. Check the command after -- and your PATH.`,\n )\n resolve({ exitCode: 127, entries: written, out: opts.out })\n }\n })\n child.stdout?.on('data', (chunk: Buffer) => {\n if (!stdout.write(chunk)) {\n child.stdout?.pause()\n stdout.once('drain', () => child.stdout?.resume())\n }\n fromServer.push(chunk)\n })\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr.write(chunk)\n })\n child.stdin?.on('error', () => {\n // EPIPE after the server exited: nothing left to deliver.\n })\n child.once('close', (code, signal) => {\n if (!ready) return\n recorder.flush()\n cleanup()\n const exitCode = code ?? (signal ? 128 + (SIGNAL_NUMBERS[signal] ?? 1) : 1)\n const how = signal ?? `code ${code}`\n status(\n written === 0\n ? `server exited (${how}); nothing captured (no tools/call, resources/read or prompts/get answered); ${opts.out} is empty`\n : `server exited (${how}); ${written} entr${written === 1 ? 'y' : 'ies'} in ${opts.out}`,\n )\n resolve({ exitCode, entries: written, out: opts.out })\n })\n }\n\n stdin.on('data', onClientData)\n stdin.on('end', onClientEnd)\n if (opts.forwardSignals) {\n for (const signal of ['SIGINT', 'SIGTERM'] as NodeJS.Signals[]) {\n const handler = () => {\n if (child && !child.killed) child.kill(signal)\n }\n signalHandlers.push([signal, handler])\n process.on(signal, handler)\n }\n }\n start(false)\n })\n}\n","import { UsageError, hasFlag, positionals, printJson, unknownNameError } from './args.js'\nimport { formatToolDetail, formatToolList } from './format.js'\nimport { parseCommonFlags, startSession } from './resolve.js'\nimport { metaOf } from './resources.js'\n\nexport async function toolsCommand(argv: string[]): Promise<number> {\n const flags = parseCommonFlags(argv)\n const [name, extra] = positionals(argv)\n if (extra !== undefined) {\n throw new UsageError(`Unexpected argument \"${extra}\".`, {\n code: 'invalid-argument',\n hint: 'Usage: vib tools [<name>].',\n })\n }\n const { session } = await startSession(flags)\n try {\n const list = await session.listToolsResult()\n const meta = metaOf(list)\n if (name === undefined) {\n if (flags.json) printJson({ ok: true, tools: list.items, listMeta: { tools: meta } })\n else console.log(formatToolList(list.items, meta))\n return 0\n }\n const tool = list.items.find((t) => t.name === name)\n if (!tool) {\n if (hasFlag(argv, '--expect-missing')) {\n if (flags.json) printJson({ ok: true, tool: null, missing: name })\n else console.log(`Tool \"${name}\" is not listed (as expected).`)\n return 0\n }\n throw unknownNameError(\n 'tool',\n name,\n list.items.map((t) => t.name),\n 'vib tools',\n )\n }\n if (flags.json) printJson({ ok: true, tool })\n else console.log(formatToolDetail(tool))\n return 0\n } finally {\n await session.close()\n }\n}\n"],"mappings":"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","names":["fs","path","help","v","path","display","help","path","help","isObject","version","fs","path","path","isPartial","hits","fs","path","fs","path","fs","isObject","hits","isObject","root","path","golden","path","fs","runChecks","path","fs","path","fs","path","fs","path","fs","path","c","path","spawn","fs","os","path","nl","isObject","fs","os","path","spawn","path","path","fs"]}
|