import fs from 'fs'; import { pathToFileURL } from 'url'; const [, , pluginPath, scenario] = process.argv; if (!pluginPath || !['present', 'missing'].includes(scenario)) { console.error('Usage: node test-bootstrap-caching.mjs PLUGIN_PATH present|missing'); process.exit(2); } let existsCount = 0; let readCount = 0; const originalExistsSync = fs.existsSync; const originalReadFileSync = fs.readFileSync; fs.existsSync = function (...args) { if (isBootstrapSkillPath(args[0])) { existsCount += 1; } return originalExistsSync.apply(this, args); }; fs.readFileSync = function (...args) { if (isBootstrapSkillPath(args[0])) { readCount += 1; } return originalReadFileSync.apply(this, args); }; const mod = await import(pathToFileURL(pluginPath).href); const plugin = await mod.SuperpowersPlugin({ client: {}, directory: '.' }); const transform = plugin['experimental.chat.messages.transform']; const firstOutput = makeOutput(`${scenario} bootstrap first step`); await transform({}, firstOutput); const afterFirst = { existsCount, readCount }; const secondOutput = makeOutput(`${scenario} bootstrap second step`); await transform({}, secondOutput); const afterSecond = { existsCount, readCount }; const result = { scenario, firstBootstrapParts: countBootstrapParts(firstOutput), secondBootstrapParts: countBootstrapParts(secondOutput), firstReadCount: afterFirst.readCount, secondReadCount: afterSecond.readCount, firstExistsCount: afterFirst.existsCount, secondExistsCount: afterSecond.existsCount, }; const failures = scenario === 'present' ? assertPresentBootstrap(result) : assertMissingBootstrap(result); if (failures.length > 0) { console.error(JSON.stringify(result, null, 2)); for (const failure of failures) { console.error(`FAIL: ${failure}`); } process.exit(1); } console.log(JSON.stringify(result, null, 2)); function isBootstrapSkillPath(filePath) { return String(filePath).replaceAll('\\', '/').includes('using-superpowers/SKILL.md'); } function makeOutput(text) { return { messages: [{ info: { role: 'user' }, parts: [{ type: 'text', text }], }], }; } function countBootstrapParts(output) { return output.messages[0].parts.filter( (part) => part.type === 'text' && part.text.includes('EXTREMELY_IMPORTANT') ).length; } function assertPresentBootstrap(result) { const failures = []; if (result.firstBootstrapParts !== 1) { failures.push(`expected first transform to inject one bootstrap part, got ${result.firstBootstrapParts}`); } if (result.secondBootstrapParts !== 1) { failures.push(`expected second transform to inject one bootstrap part, got ${result.secondBootstrapParts}`); } if (result.firstReadCount !== 1) { failures.push(`expected first transform to read SKILL.md once, got ${result.firstReadCount}`); } if (result.secondReadCount !== result.firstReadCount) { failures.push(`expected cached second transform to do no additional reads, got ${result.secondReadCount - result.firstReadCount}`); } if (result.secondExistsCount !== result.firstExistsCount) { failures.push(`expected cached second transform to do no additional exists checks, got ${result.secondExistsCount - result.firstExistsCount}`); } return failures; } function assertMissingBootstrap(result) { const failures = []; if (result.firstBootstrapParts !== 0) { failures.push(`expected no bootstrap when SKILL.md is missing, got ${result.firstBootstrapParts}`); } if (result.secondBootstrapParts !== 0) { failures.push(`expected no bootstrap on second missing-file transform, got ${result.secondBootstrapParts}`); } if (result.firstReadCount !== 0 || result.secondReadCount !== 0) { failures.push(`expected missing file path to avoid reads, got ${result.secondReadCount}`); } if (result.firstExistsCount < 1) { failures.push('expected first transform to check whether SKILL.md exists'); } if (result.secondExistsCount !== result.firstExistsCount) { failures.push(`expected missing-file result to be cached, got ${result.secondExistsCount - result.firstExistsCount} extra exists checks`); } return failures; }