{"_id":"tewip-ai","_rev":"41-5a09ac00d306226ca600d6a66e402ed3","name":"tewip-ai","dist-tags":{"latest":"0.29.0"},"versions":{"0.4.0":{"name":"tewip-ai","version":"0.4.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.4.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"b6544aa4100bc000994431ec03c5c5cb5b94dc1b","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.4.0.tgz","fileCount":66,"integrity":"sha512-2KNfzmz831OLza/WON/Ox+hJWpUQhBBL+Wl9eApkLpQdVTnGj2r9/954sBVOYkpE+/As4+oNiRqxZgwX4hjVPg==","signatures":[{"sig":"MEUCIFnXJfg0a8MXK1bwz0EgCqDPHY5FPHV5xlDUpyuAxuORAiEAhqp9mIwwpN3caXGtEgG/cbST5/lI/Reue0FvlwXo870=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":372182},"type":"module","engines":{"node":">=22.18"},"gitHead":"1c47814d0644e28b97a8febe64f47196873eca60","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.4.0_1790115648065_0.9528208251898553","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"tewip-ai","version":"0.5.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.5.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"c79c11ca7dc453d2ed061e604b3dfc4e1f7260b3","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.5.0.tgz","fileCount":83,"integrity":"sha512-KfiTvc2P4bMmZU40cLhSuQTIwgumJjOF+BebLnc+dFv3WfvrxThTU/LOh+q8SolM1GD9MhOh+dmtFWyWpCQsPg==","signatures":[{"sig":"MEQCIB3uw246u/K62sDyNkRvAwBGA2VJKX96kEKU+RKgSvArAiANh6fiFrgx1U+U4DBQTBKaRNrE0Qc2SDb3ZxfcxQ+WGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHfF+woooyI/dcmPyKkf/OB97Ft5ke+6AxHvKEhkC13hAiAJKJ8mJNMVwa2/Fl0K29dX/5/1MoDcvMK6XFhaPEMaOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":481017},"type":"module","engines":{"node":">=22.18"},"gitHead":"4c9bfce82ebe98a461f32b1c625c53c98230477e","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.5.0_1790164181325_0.8434710564206707","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"tewip-ai","version":"0.6.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.6.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"e4352cdf3dcc3fd2d9c444cb66edad4d97e0608f","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.6.0.tgz","fileCount":94,"integrity":"sha512-OIAD8pnBEw6w/kVF3u4tFcubrHnt/QLfnNkLQmHEpMFJV4QXdWq5VT/WoTU0QxDxxGDkB7zMxGGLoWrTSQzU+A==","signatures":[{"sig":"MEYCIQDOIOQJM10Pz3Z41jJLpceQUWsWjUlhvqyvcnwFU/a0xwIhAKuRaZ9sbHM9i1PpChN7q4+ksnmVBTo5nnMuoMcdtZL5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGq17vc8XYNbSxqDeWyOxz6S6lPHLV32DlfQgTP0zPpCAiEAw6sjq8gmVqtNGsMMrrRRQQ72ymhW0ppzriZIHz6e4Bg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":545541},"type":"module","engines":{"node":">=22.18"},"gitHead":"19f1c1b8c00032c7d50f6f22c43be4f2533ee5ec","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.6.0_1790168064582_0.6306368938600033","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"tewip-ai","version":"0.7.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.7.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"1c60adbaa4b0f9fcc25eab4ff3247f35231393cb","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.7.0.tgz","fileCount":99,"integrity":"sha512-/MMlIb7y/MsPleoFa2X6HoSRyY4YGbAqbNhOSvsAvtRoFub4JNCbkEHKgc+HAZm0tooyA8UAa8eiaN84FYmNTg==","signatures":[{"sig":"MEQCIBZfRQHVH5c5gjpRlZuHLs+uPhOPzDEsp05sqMT9um1cAiBjzLGP73lJCfK2mJFvFicerWQfHiBx1KX/fmgqheJcWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGQkrRU/I/McbUADCNutvUCCrIxdCwePnJsGil9P1tVqAiEAz5oFyOfGAvy3W3EP1sElgm9GD9Fw2S6LHtXaCUyt4c4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":580127},"type":"module","engines":{"node":">=22.18"},"gitHead":"48830ad79fbb79d21a392c60915bf1cf78a9beaa","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.7.0_1790170312283_0.8464318063158236","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"tewip-ai","version":"0.7.1","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.7.1","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"5ad47f7bc3dbd042fa78497af59b6296d0473035","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.7.1.tgz","fileCount":101,"integrity":"sha512-4zcW6th24un6YBmmhUrLLIs9zUZYuBRpFwjoLHgAHacYzavtpX7kcrGnahZOYG/joV52m66KjmdSgo8v/TKtAQ==","signatures":[{"sig":"MEUCIQCn3ng5jlVtkgWn4Fh97g84d7e+ItRAK/Le1D5YuJIBVwIgE3UIaqAtyLY5qdWp5IfR1SxeDCoJY6s7SdiDvn3HXF4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAk4Y9Itf8BS66vASXU02+Jc4sKKRh+pfC8WPI+FvroBAiBRRYX6BQOrgtrYmAAZkeAPLOm4Aum8oey1k0g5h03zlQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":596275},"type":"module","engines":{"node":">=22.18"},"gitHead":"9610faafcc4c18245ff2bfbfa4ec5bbb50206442","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.7.1_1790172337282_0.6593699182303951","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"tewip-ai","version":"0.8.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.8.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"7fc6a0ce6f277378139b71d14613a85040fdc527","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.8.0.tgz","fileCount":103,"integrity":"sha512-gE+k5YSegFgNLSePbx8iXwIQUeum99hUNDoNZQd2qdNZU44RilFam129by1qxwI3txaUcVRuay46QgrVg0L5ig==","signatures":[{"sig":"MEQCIC0WbqCqioAOCc7xl3Dso8yXS/p9WYXv3QyJhwrY4/05AiArxhYK21HHPeJ3flv0xmB+ugKZso3snP9WLgmGD1Cd7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDtDeyYUh+n0NRjdWAr1cz6NR1hLOarOvGGZr6QFrPHEwIgeO/QJ09xoG1fyGVDB+mga1p0dJVrmSYD5TecUW9qTnU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":612386},"type":"module","engines":{"node":">=22.18"},"gitHead":"a6b09cbf231b59b24da04a283e358a14a87ef077","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.8.0_1790173439676_0.19282655451820796","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"tewip-ai","version":"0.8.1","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.8.1","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"fbe9a3b30c62a661b638031d1f3164785ba58bb6","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.8.1.tgz","fileCount":103,"integrity":"sha512-81qdC5B3nbOzmUB3n2lTppmijVJ48/mf8Bi84hrTdUumCW9Kf/3Gca43VHNw5rXdhIYdMQWpARZJudXpGFq38Q==","signatures":[{"sig":"MEUCIQDWfZBxVgcOo/vo5yNoK5wUd6X5RkRhQcb+jFHdvdwEewIgdHTJhXcwnTDIgOYhqEUPgYrt044F4nyyri87Oc3YpzM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIF3osFyBa19mghoiRohore7WDfrUMEBj5M9m2bLhkh6kAiEA3aGVndhr02PcjCwJHER5CuFlL74pG/v90Ek8+Ggqqkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":613455},"type":"module","engines":{"node":">=22.18"},"gitHead":"702b4136742be9ae5a042e18df38e2712f49df54","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.8.1_1790173504712_0.2220904709013951","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"tewip-ai","version":"0.9.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.9.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"4018b0efbe7764c93c32544d8bdd937928cb5d7f","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.9.0.tgz","fileCount":106,"integrity":"sha512-dhJKYWqPyXG25PiJyDDJ20V9pt404afzhoho8dpJhwSAqpqDPhuqAL2AGS4D1PJT5xWQdE6D/niSeXi5InT2RA==","signatures":[{"sig":"MEUCIQD9QdYG67Y3l4iCbaUyX9v6GNRFHX24jpMBFup0XDMi2AIgZLGeGnFPwgdaa4R5fULzlKR/mfuKV+051hBHn+MXUnk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIC5/H8CwqdPghImDznbS5T37lZQsawMfXsMid+l+rWRQAiEA/kzbNW8N5JZgAPZinDGeMYnsu551t8GvaPTTJOI+rK4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":633112},"type":"module","engines":{"node":">=22.18"},"gitHead":"cf2d407ebaae70fe8e8deae5a53427a62b4e7f75","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.9.0_1790174252444_0.045941589014534046","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"tewip-ai","version":"0.10.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.10.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"3d06803f5692593acede41fc81378a49fcf20e38","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.10.0.tgz","fileCount":110,"integrity":"sha512-5vGcy8VB51U3y8x2lQ7C8G/G8gREzE09SNIvw1cf7AbMHB/orbj+g4hTHt7WKsxuLueYCwIU79iGs7oB6Ts+QA==","signatures":[{"sig":"MEQCIAxvJBJShA1+40Xd4GlDeI9q3YLyYD/MdHxk+P/RgOpdAiAy4CWNCuzejysjvXaMApsXC/vzHLLQnI1sASuiJQyOHQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDLR7ji3PGGYeQ8R0MWveQmf9gCbKQMO3fqpWoztMQihgIhAPAXvu2dRK8gFYpw/N5McKj6kdtI43OeZG468RHGBst3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":645092},"type":"module","engines":{"node":">=22.18"},"gitHead":"1a40671ae091a29ef4fe1f2350506de96b1fbfd8","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.10.0_1790174713591_0.027206911885088836","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"tewip-ai","version":"0.11.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.11.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"921e547400a9d78a0456c115f7ab11bbfe9278c2","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.11.0.tgz","fileCount":117,"integrity":"sha512-2eLaTnQ3wDTMRGYHQ6MvHrkRJG9Qyi/8LgQdHk+Q9Z6O0XloTrD2+auICO12G7a7V9cw1KkJ/YbrjEqtBeZLfg==","signatures":[{"sig":"MEUCIE1tAsemuKMrhJq6l3w2fldrdl+B1Ap+Wl/nFi0lxnUYAiEA2pcJBRlgsSeCir3gb3i6xdiUY3UH84yM7Tt/ru3nb3k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGcElpzForDa1wxlQ/TKFvXETmae2TxzXokNvxMxPs+rAiBG7zajPNdwVDdVCHBXOUUYZlGgGh/XyvEOt730vLttFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":692813},"type":"module","engines":{"node":">=22.18"},"gitHead":"541d151e383ec35031279d37f2e534e581cefc6f","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.11.0_1790176313096_0.14580662667032818","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"tewip-ai","version":"0.12.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.12.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"96dc10a063ee60d0475eca18ba6e342451f44d35","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.12.0.tgz","fileCount":120,"integrity":"sha512-utowm7YwtWblpXZRKk6A01xH0rnUT6MFofHHAkoXJQRRKOW/+NbxJw2VLYXf13dbYMHR9ZMkV1XWKoPFdv4OTg==","signatures":[{"sig":"MEUCIDJDGCM49Nmf5vapJEBizeRpJUh/18uRdam9ePegM4t0AiEAxsd8cUfVdqA9Oh9pi//mkjKTJTsi+sKPcVEd78hGcZo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDblcH8Fhporoh+I49heyNXgy+lClMW3HL34eibLfzVyAiEA/R2u2H98FI+Sx926tQNx3DKWnIfhN9VhC8VzYtRUIng=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":716346},"type":"module","engines":{"node":">=22.18"},"gitHead":"6393bd312f7ae68bbf7e8bd888296c9817c61d79","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.12.0_1790177839334_0.6026179875172311","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"tewip-ai","version":"0.13.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.13.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"2cb5fb438ff716d3b75299c230961eff90949c73","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.13.0.tgz","fileCount":121,"integrity":"sha512-pJXOSlkDaFM+lgb1kwWev3QQnMbK9KQfmHx4e5eIasaNKI7RAu2OAcUW0pGwEace+CfbUZeQjD/GrDRdlgjWag==","signatures":[{"sig":"MEQCICqYxCqARY3JUkdWutezQU6Bhuo5wq3YGj6zvwJSE8WGAiAEgqyhKqLjcYW18A1F8avacAIyG8JgX9kiW7BNpD/MrQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBkCPw0ey+gQCytDBV+Is4FrDNJ6ndtphgJFK7MHCuHhAiEAt36NIM2wjAD8/OlGBwybI50SompBLSLgLMJO5OQpSFU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":727535},"type":"module","engines":{"node":">=22.18"},"gitHead":"e6cc0ceaac979db148ff0404b5c8060f2ba4aebe","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.13.0_1790179078800_0.8044889006852409","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"tewip-ai","version":"0.14.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.14.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"a13ee654a21037e97843a636a9923d7d7a4eedf6","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.14.0.tgz","fileCount":123,"integrity":"sha512-Wzu74A6qBn7/qkYSeIBo5YAEVX2eJvLGXSZ4G+rddi+JRoeDqCslgTAfdgScs5Cc8RxlK9Cm+lQqg+MSr6RIdw==","signatures":[{"sig":"MEUCIQDfPqailRsrcYQAHJ3V7IOrNlUZtBDXOWzwi6s/p5VsfAIgBNjC32lt4zlGWCV4befxOTVfVBMIFr2wL2t4cf4LFlY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIClxVy7sNyuoWHvsI+GENi80KK+SF0FISbVgVl/MlqrDAiAJuA4GYoFA8U4627al26boYzbDyyCH+W8/1fRbyoFThA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":740625},"type":"module","engines":{"node":">=22.18"},"gitHead":"207d4d8b3b041fff54b266ce45e5fbb2d39bdb1d","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.14.0_1790179398963_0.21582426288087886","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"tewip-ai","version":"0.15.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.15.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"5323e3f70fb7fe31d01ede5eec5cd452bba569bb","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.15.0.tgz","fileCount":128,"integrity":"sha512-NmlvoO3+dcLT1NbOqh5maCT8FW2k8h69k8lcAp/wowCXxNETwlWThjiAUdk4h0J0vD0jteQluNE8qzr40ADK5g==","signatures":[{"sig":"MEYCIQD5KieAkr4/IztG76KKvfA4D2tkBp8SsPCMlPw0sYRuhgIhAIyG/JdVAxnGzuL9DEfx7FMIclOXVU4AMNcM8lYA6ojn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDbwovoUCe6TS5lCgGZdc9AWtiMXKJzZf+o4LYh7+a29QIgDTFk7yfBhdjODiuT20O6B8vH6p7Yg1/QRYi/0rTwhLA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":754612},"type":"module","engines":{"node":">=22.18"},"gitHead":"009d148bba27ee94a50e9a600a2ad24fa868f156","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.15.0_1790180523613_0.5891950295233026","host":"s3://npm-registry-packages-npm-production"}},"0.15.1":{"name":"tewip-ai","version":"0.15.1","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.15.1","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"bd8909634da1562a69fe6dd83d74d4813ad5ffd9","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.15.1.tgz","fileCount":128,"integrity":"sha512-p2SIyQQcN/d3Ih6pkD6LfC8BF38+EpM1SqeA7yZoU1bzrb+j4ELQO5p+QYJHCkTcMFwltWPjBgu0haJYkUxLVg==","signatures":[{"sig":"MEQCIAySP4k8/C6EGy59SK7ksyyV0jwy81v6SCtj80QT4qcLAiBE2muDaG0dQi+UAS24DlcOx1E+/iCcx8CtV4Ps+lebhw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG2JFimH+bqkz3Pz8NtAi4L1qLDceA1GlwjwcSA7fGfBAiEAryCzfdxj54ROhzEmwQ1TWGDmpAfHYf0Bh82UdZDvN5o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":755180},"type":"module","engines":{"node":">=22.18"},"gitHead":"59972c6db3982bb9a8f25758e2ceb128b55c87e7","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.15.1_1790184536813_0.658439443717528","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"tewip-ai","version":"0.16.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.16.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"2002aa6f9adb51bdd0eca5c30b933f62d319ba66","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.16.0.tgz","fileCount":129,"integrity":"sha512-chodkh0JhxYloYoqjyUBzsndxyubpvErZO01OMG0Yc0OUaKnXw6962nsyj1C75y11P7laTSkYITeUeLa8IW//w==","signatures":[{"sig":"MEQCIEMBCwubnphCT+wBGccNT1q5nP0fzHLHmsNMJ4KZUU3rAiAwriiKjf0euDBh7RJ0Rg2UbdYarcC4OuAD2OIoUroSTQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDM+gr7hvUSk/zhMNu65rHeQ0WsqbRTYOLsIj+vDgT2kAiEAmB2+TCC/X2iW4u6wCvdWkrHOJva7A5w2e3kXeMIJlM8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":760894},"type":"module","engines":{"node":">=22.18"},"gitHead":"3c0c3fb8964602e975e0cd7cec8fe16772cdabca","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.16.0_1790186030459_0.606326540381241","host":"s3://npm-registry-packages-npm-production"}},"0.16.1":{"name":"tewip-ai","version":"0.16.1","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.16.1","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"8e8a1a98de43c92b3c740ea996fb9d6dab013d66","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.16.1.tgz","fileCount":130,"integrity":"sha512-56pK0e77hTHw+qhj/u1GMx5rOSBh3L+Wgxc2RBLjqPqZvc9bqUTulCSQSEKHjOseJXRP+rlbHunb1X2bQ4ncQQ==","signatures":[{"sig":"MEQCIFnQzni1ofDW8OxF3xg1TegXtZRc/AfZ1hlj5zdY7QGNAiAY8YY5HHrqfSs84pPebYr5uMm2qFO7f0k37H30Glw5vQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDTOMYdtCHy4QZYDieO6ccj77ZwCGk33E3FAy2NIFwTPwIgNwMYTksYLLNAfqR4uN6XcbpYp1OYIqhBqKa1b1vwMgM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":765352},"type":"module","engines":{"node":">=22.18"},"gitHead":"d3faf9e89e864ecd07ad586139978d5836e84061","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.16.1_1790188327135_0.96440667116203","host":"s3://npm-registry-packages-npm-production"}},"0.16.2":{"name":"tewip-ai","version":"0.16.2","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.16.2","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"e1d786fad3b200b97a8cf0e4698f7fc7a99d76f9","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.16.2.tgz","fileCount":130,"integrity":"sha512-CdoJQBRd1CgnBN0WSTDePCa1gxl0Ne4NSt2eu+v0cFV949zpKKxBODFYxw9Cqt+YrgABLmXCxz4CBc6k3VdawQ==","signatures":[{"sig":"MEYCIQC74dRvvtSpZc1x828r79Vg2RFwMCPr3Fm0xoA9feuhIgIhAP8R3ofYoZARq66a245AY8ajxpG3avpkY0EDdX370Ykv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIB39AsVQDOH3QgS2DK8+VjStIV3rKA85GFJcRGLZ14+6AiEA4uw6bM4VoLeyD6m0xvtsdZPiNMxu3E0OvcyBNd/yiiw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":766304},"type":"module","engines":{"node":">=22.18"},"gitHead":"e785a72dde2a8ed9561bee22255b528ec61ef829","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.16.2_1790190154948_0.05508904751838961","host":"s3://npm-registry-packages-npm-production"}},"0.16.3":{"name":"tewip-ai","version":"0.16.3","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.16.3","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"e0470ecffd0f14ff796c6383640f81182f486958","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.16.3.tgz","fileCount":130,"integrity":"sha512-YhGqVMZPL6729kFXqTIsfs8t+fPvuJoFtwnVNAJ9JzpkJWi+9Jq3cP8w48ehTTht5GllWPG1uXJ0EtP20m7WsA==","signatures":[{"sig":"MEUCIQDC+H/i64oxAdrKy7PZ+Awuzg5xyoTdDwM4L/zqHDoqmgIgQA2x5VaTjfyZXvAfJOAOHLtBUTgDivzjGIGsIBzfTQA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHPl10NvEZUUuL135qGmo8+bBP/nmuZtuxmy76MaeKe6AiAPuDhXGyhPTbeNAC8GCgMvy5IjZtR3JwfZyxtoeuuv2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":767176},"type":"module","engines":{"node":">=22.18"},"gitHead":"d0ff943fa776f0f19af3b69dae2175a30c4a82b1","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.16.3_1790191558739_0.9581686358076154","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"tewip-ai","version":"0.17.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.17.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"8f9d0f1b3d6b2228400d6bfb81876c4afb25de2e","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.17.0.tgz","fileCount":131,"integrity":"sha512-cpS0DEuLeZ/845SLkqhNxlMBa3tKbQOaSsOqu8lR8w/EKmrCqTyXZcIwW1La/r2xQJPLCa0PbE0QPTaoN0AHag==","signatures":[{"sig":"MEUCIAhdTAN3kI7ZsbUwj7uZLHgFvGpxWJFX9F8Kv4h0frLTAiEAx5osviXTL+lMAwMCP7vpkEHRVfVsqowvKgO7bp+LF70=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBj5V/zCiim/UEoovuWBfcD+XF+n8eHphWWJ0h4Fhgl/AiEAswr27dxk7kuU7IuKXQ/ABAgHYKsbVLbGFXCHI4Gk/LU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":775332},"type":"module","engines":{"node":">=22.18"},"gitHead":"99d2fb63c1deb1afb31bad364a51b49bd7611934","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.17.0_1790193055497_0.4870730873972231","host":"s3://npm-registry-packages-npm-production"}},"0.17.1":{"name":"tewip-ai","version":"0.17.1","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.17.1","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"b391a3c46337c48c16b66c142b49ad53ad392c29","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.17.1.tgz","fileCount":132,"integrity":"sha512-FBW7lxchpulprd3zZxrCr7Gk0V7V1WWqybANEdlvnICM2+XOYfRBTilqh74zDFpeT/80b6EAcuCO5kG+MfItTQ==","signatures":[{"sig":"MEUCIQCicxb7nIrF0N/d04i0VSRiyeINFRgTtVZdTHfA3q8lAQIgNrrbyi8tBCwctjA0CL2zcVzh7iwAOZigt2jsvuiI78M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDbCQqZb1j+MkbNRHAlGebCRu5WyDDCX1/Mk1U7pS0vegIhANfz1CCyECEtdapAn8OzaDfVRP1wQHHKGsyxrThe0oGE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":785245},"type":"module","engines":{"node":">=22.18"},"gitHead":"7da168761e2018fff1bf84fdeb0431cc83a99322","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.17.1_1790195440277_0.054151910377149726","host":"s3://npm-registry-packages-npm-production"}},"0.17.2":{"name":"tewip-ai","version":"0.17.2","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.17.2","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"fdd7ed4e1f5935ff39b1f50b1abd53295814a9dd","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.17.2.tgz","fileCount":132,"integrity":"sha512-QhdJQeD6Rb79ulhtBuh6/qcFmGxAXx7MxfNw9gHhmdq9tMGjj+KiBOyCzPxq47nyO/nR6lP7C0HPclye/Jybqw==","signatures":[{"sig":"MEUCIGcc566r70z8FHNrsLoxN+T2FA/SQT0SLtlN9JhyzwvnAiEA9NBY+3OdozNDX7jtjsrd4SSsRebIshh9ZOyldSET4Rs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGc20HWJ3SiSOXFixh4t4yE7EB2rT1ARQmSWzhEmxRtEAiEAmo+s4kvMOsKk6EFvN9A2JJeyliA44qhnJhsrJzGEXIY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":785581},"type":"module","engines":{"node":">=22.18"},"gitHead":"fea1e41900b1449493d72affd82fa622ff4fbbdf","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.17.2_1790197899431_0.9107567408672814","host":"s3://npm-registry-packages-npm-production"}},"0.17.3":{"name":"tewip-ai","version":"0.17.3","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.17.3","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"04a445168046b0568d0c55fa57d729f45812f929","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.17.3.tgz","fileCount":132,"integrity":"sha512-V84AA1fFv7thRaICOKgmFuALb0gwxdrOe132NZw9vXhky8z4eRyiF38WwiOoVJ4p+tmXbVixWUes604UeIK3Lw==","signatures":[{"sig":"MEUCIQDQLMiR4bYRQ6b+lNe2NmQTyT9kfo4MCniPHea7YKV6uQIgQ5jhMgEPKflreBa2wpLAcrkUxe5lwGcyb1IZRxX1reM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICT1e21ZIm1AHjp4E79no6KGmH4uA+uvwpiFJ4gPABeHAiBgrkDMbHxhKTDYKxqImIOfphAB1fudjMRxLiZNLjdSmg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":787295},"type":"module","engines":{"node":">=22.18"},"gitHead":"c1e2104e77b90c68a062b24a94de702db11e7a24","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.17.3_1790198694664_0.07481641373267611","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"tewip-ai","version":"0.18.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.18.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"d60cf69b2e40794afb8025842c2e1c4bcd1882da","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.18.0.tgz","fileCount":133,"integrity":"sha512-559RBxB5PyPqaxhRuY+H3mYPXMv2EF9QPS40FR16NGPOqzMARqSJqr17rZHfkrh9oI+2z9KziUSCiWs5XhzJjw==","signatures":[{"sig":"MEUCIQCNRdTIwkxkEe6BA9hZQ9zkkKVxoLtJ6/rgGewGVOlb5gIgTjCgHoDrjhBTjBKo5i51dKGUQ/oBiRCR0Wa4JdiwvG4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG3FBmFmI6VgxXK2BRdHCTPYv/0GFvfQXPnvSxkIG+01AiEAnvKSi9Jb/WjPZVB6fhkMrrvgeVtH3CsouzqldfdOhps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":792355},"type":"module","engines":{"node":">=22.18"},"gitHead":"e1e37a571b2dbebfbe105f72a02021d282045f8c","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.18.0_1790199477681_0.4538916967931861","host":"s3://npm-registry-packages-npm-production"}},"0.18.1":{"name":"tewip-ai","version":"0.18.1","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.18.1","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"06c93b33345ad9e7a985300930bf834037c9bf8d","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.18.1.tgz","fileCount":133,"integrity":"sha512-A0KhF3tbfp6N1FmHX4f7zZ38NFsG4D4pQvxSUSNs5vL6lxt/vveXaTxMyTmTZdhp76Sb6bNBlWc5VkQJrvGsIQ==","signatures":[{"sig":"MEYCIQDBM2d2J1LGE+G7IE4tex2bakt4NmmInE/xJfyTAT7WoAIhALbb/Dh6VuEzMC6ymlNNeuq79v08vLYCrzd8mLyixTMq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCxtjZEBvkusEgtBWxI134xPDyGWl3emUliIVyZ5TVhTwIgHo1F1cTMqUj+d5CRtGVw/0oLAVaXRe7lBupFEL7ICK8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":793385},"type":"module","engines":{"node":">=22.18"},"gitHead":"a468608ab350cd57267e0eaefbdbcf5d813c229f","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.18.1_1790200131728_0.9358437759797826","host":"s3://npm-registry-packages-npm-production"}},"0.18.2":{"name":"tewip-ai","version":"0.18.2","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.18.2","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"39d9a6b3e5edf902aec06c1c4b083d40f512fbd5","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.18.2.tgz","fileCount":133,"integrity":"sha512-1tVE9biJY8NHdUpEz8H7BA89gNnG2kf02E/k5XWlZWs4n2eYX7w8xnbw+USVf8s2HsP2n1whHhW3Xn7newHt8Q==","signatures":[{"sig":"MEQCIHkDMMbrZy+6a7zD/AjJyy9JWvFm8C5eZrkGBzxWVus9AiB3cDJWz3ttDFulkXO5HXyl1YfpTkZ8EA073K6xMitp0g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFgjgb+N8bC+5L6GZHU0TQ313Kw8avJ7W36w6jp6SO6xAiEA7UuhsQTqTFh2bWHdbUIXph1yNwNMEGPkIjwRALZTTJA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":793705},"type":"module","engines":{"node":">=22.18"},"gitHead":"487c0c2073c1fd18f9441cf87b35396d80e50dbb","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.18.2_1790200451401_0.10138456954700681","host":"s3://npm-registry-packages-npm-production"}},"0.18.3":{"name":"tewip-ai","version":"0.18.3","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.18.3","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"7c7391d433db6a35bcb4aa9552fa8b0e4af540d4","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.18.3.tgz","fileCount":133,"integrity":"sha512-L5HKEm+ORrinxciFkuKBAb/4e2pM0V1/jTBcPpnmGW73h0tXwmjNedxeMLmXQXzdoJE9azh/I9wBgn/h0UAs6g==","signatures":[{"sig":"MEQCIEQTEhMba/B66KdWOrKJ9GiSu9MuMlR5sAxV1yb+nw47AiBU74A4dXQA95MUlVCgMNSBmfdwJkigGnJzLTR5a86Jqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICDN27GB9JMLFOIXX33205rXJpePQk2XG5jQVVxD7qjfAiBVf8h1ys7Lr9FtKTvWri+YQapw1hEJx1dGixT24Qmviw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":795020},"type":"module","engines":{"node":">=22.18"},"gitHead":"46c3e8b6cab87427fda51a10e99d9264e84ed764","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.18.3_1790201027260_0.9147724012708487","host":"s3://npm-registry-packages-npm-production"}},"0.18.4":{"name":"tewip-ai","version":"0.18.4","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.18.4","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"fd72f5f6b082ba3c846db0f34cf60419b46ee24b","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.18.4.tgz","fileCount":133,"integrity":"sha512-Yrk3OXxMgpQySy9yRbRL23a6AA0lAeexZ3Oh2CR2qYbtfgH+iXtUZuqe9fcrcITA+jwy+D2gmfM+ycxZNuiYkg==","signatures":[{"sig":"MEUCIDNvpv4bGNjaz39HQo+FpPBbePourcuFyeoNyhETNVOtAiEAiQQig2RlJo589arFOeORUKG9/+D8fbzg2IOm4/p2fv0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHxJa2RGuJqzjxzv+yl4OPVhEG/YhK/d121zg3Y5Au0mAiBMnX9oWmwG3/aIhzlpI6nkpWBsztYaiJhkjJGWbAwn6A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":796267},"type":"module","engines":{"node":">=22.18"},"gitHead":"6e0af3f1c7276fd1a9f2d68b2e032ff7cfb061b0","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.18.4_1790201348473_0.889059543168581","host":"s3://npm-registry-packages-npm-production"}},"0.18.5":{"name":"tewip-ai","version":"0.18.5","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.18.5","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"d5bd436637383a5a4f5eeca7b91eddff1c9b3c10","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.18.5.tgz","fileCount":133,"integrity":"sha512-gLDrAUSeE7rr4IcMmuQxi3n0n7A+2ervFCwMEXV3EMUnZ9G7Esiyx0Z+vlj3HpEoA2utxk/pZ+POb7/Ni5lu8g==","signatures":[{"sig":"MEYCIQD4W5bQx5Enp/os4hX3NU04xM9n9zMibkjdvVn80QhdSAIhAM7Bf5N2vx4VTcmdXepunsRr3sUO80TqARE1IS1Qpmuk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCxBG1GIbiHQXGJsu4PfIeXN3h8NlUxKK+MJxOLhNnRbAIhAMCTndB1BdbOA0bidLmIHivMAVqp3X1fDMbRivT5gzef","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":797647},"type":"module","engines":{"node":">=22.18"},"gitHead":"8282f88761d6ceca527c13d9782b1e33f1dc1bef","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.18.5_1790201725517_0.001696851918791431","host":"s3://npm-registry-packages-npm-production"}},"0.18.6":{"name":"tewip-ai","version":"0.18.6","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.18.6","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"62b00438cf5e38639fa3a6c94e07232ba51b3289","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.18.6.tgz","fileCount":134,"integrity":"sha512-cKOBSscK2ozfG+EPcz1Ej4oNCRlnGsngj/xkINf0ze6cFg4i/Uptt4A53uvod/5FmVxDhSaM6nApMteQDcpnFQ==","signatures":[{"sig":"MEUCIQC3hAwLaGT1oF8HdaeyP53tq0WYOzMMbVoTwoXQqf1c9gIgQpMGY/CvdmZjd4VJnmsrWqnsIKPrysZMrs46LAAiW7k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIF3sa/9ooLjwRZ4MtbaRHrqnq4pwp/mF2OQjnP73N1FrAiAmvqqKbGqoHYvAWJztNAUqm8v5ryijrbAEmtURd5ZuOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":799687},"type":"module","engines":{"node":">=22.18"},"gitHead":"8ac6088fcd52f21f8af5fcaa94736f508fdc47b5","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.18.6_1790202018247_0.15925958155757458","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"tewip-ai","version":"0.19.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.19.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"dadc7d6b464ff9006692f67d16ce9e7f7ca7d662","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.19.0.tgz","fileCount":136,"integrity":"sha512-9GMRPmBLrjNWdgUDgnzyqfiOiq50z0ddJoBdU4gY9Oh3IlRGyK+bRVXowAhsCC0iREtXGSLYMMzDwlZQWb/aHg==","signatures":[{"sig":"MEYCIQDLOY58uf5lMVnXNHgoWAgj+ey1ZzKswS1K6GwrX/MbOgIhAPzGVXJeMPpKC/xOCh0uaHKp4k4FMf0cjDS76hDGvWii","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCGFBOPl9J7sibWlG0GwYA+kW8lEE65Ysuyj8Brt/b0hgIgGNvgiuUV3adLq14QlUvkg9P/VpZk4a3Nf0Q3Vp5cCf0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":809156},"type":"module","engines":{"node":">=22.18"},"gitHead":"ca0e4d86c836b299fca717dff6bb3fc72bd8aee2","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.19.0_1790439050520_0.056984535411131354","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"tewip-ai","version":"0.20.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.20.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"4169fd4bdb40fd48a5d5dcb802d7ac5b0799cd13","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.20.0.tgz","fileCount":139,"integrity":"sha512-gn8ZKhfb/RZgAW8mUrL254gzpokh7D9FCvf518rgaGALstUXCSSO6zuWFh4HsSD8bQaDM0Eliozm7wJrSB55dQ==","signatures":[{"sig":"MEUCIBVRhkxPlG9GzphkxKP6+JG0YAlEoao+cIXy+mRZknFoAiEA4OLxWGhQT/5yMCV5deRyBgybpKN++riyL03Z9e8tTho=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDrFhpu4BPB+GS1bhLlMFDqx9BRElx7I1Asf2IR31XKLgIgG7a4LbzRJnMXiIQfdfOrsTDWVi9LWJW7XYqmhzQIykQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":828162},"type":"module","engines":{"node":">=22.18"},"gitHead":"70586c4dfaa0a92a5edfa51850cc4a7e334dc26b","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.20.0_1790439851501_0.1630055524148537","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"tewip-ai","version":"0.21.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.21.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"016cc9fab78ab3a912ffb21a598f88449f48bde4","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.21.0.tgz","fileCount":141,"integrity":"sha512-Cfx8rU3WnHeCxBkuKlgVGnB7EGpqc2x3iO89sPkX/cGYPq+PYfqRn0S60nvBwWiFSHVRw1lDPubAV9swf2JvGg==","signatures":[{"sig":"MEUCIAqB+sa8n4UeUAocLadB33EHhlj+s1HXLJ8+w7y/XlTKAiEAthYrZC3tIaAvnnJJpzneXdaU0iGkHkgqW31OuFRyI7c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDv2i4mzuQTkgCtqj627v8rcwU/1q5BKJlWXiooM4AtfAIgaX2DFz6SBPZMCdawVolMKTr88KNg9cIfRrd8j8q8w5M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":837208},"type":"module","engines":{"node":">=22.18"},"gitHead":"5759a0b167f7820b489baa279cd358a26fd0a01c","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.21.0_1790440333038_0.41621964219737073","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"tewip-ai","version":"0.22.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.22.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"b73e095ddf61a2682ce87cd8c6c327c0c8982b85","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.22.0.tgz","fileCount":143,"integrity":"sha512-93GaJi4eafwE/N1DlaqKiRI1NTOs5j0RRukiOCmZ1jb4jWbjJmLHXxjH+UjZUNYzvhU3DV44ZQ8TpiiGVdvejA==","signatures":[{"sig":"MEQCIHSYX5HYv9seQrR3WamcVvLia2kbDq/CmKyGeHETK48zAiBO8+69QV2FJ3xGMn4AiaLyaGmOWPb6qKk8LnXkVMMyfQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGh0ckjDZGxfe/m2vdlvWGYpyYbEsuvhV8Gz9+RgYPp0AiEAmG5Z4Zo2+vFi536QKgvogd/AnREfwF0+Calu6gU92Qc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":846551},"type":"module","engines":{"node":">=22.18"},"gitHead":"84c5507e126dd812572e792490582b7ade548aa2","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.22.0_1790441184273_0.4139415718644399","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"tewip-ai","version":"0.23.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.23.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"e3d9e96c32865f05b60638336cd94e8a0f5197e0","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.23.0.tgz","fileCount":145,"integrity":"sha512-uTHZVaOJP+lz58FEcwl7Ukj628xt6F+ruoHrAvcVTWMrlVBr7mGDjczH2yQoIiy27rBn3BOElx33PZQq7rhhXw==","signatures":[{"sig":"MEYCIQDEpf2R/qOxT/YRXb7xkp14H3gaRVv6kBCxCt1iT5k3hgIhAI16K7IvSZR0nGUbcaiM9EDpcuEUDJ9NhwWSre4Hl1oc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFeO/80/QjnYg4m2q1XT/6SIGMeP7OvtlkMfgbFOAWr2AiATNdnWFSOIh9kXHRxq8a3LRNgKAPagBKXO8X9XnQEEtQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":860229},"type":"module","engines":{"node":">=22.18"},"gitHead":"9734a082baa88eccf8ffcf5fdba645f589695a92","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.23.0_1790441776747_0.6272675500706641","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"tewip-ai","version":"0.24.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.24.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"8d696051fd9dd9ca20811f450901f52f5bef28d5","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.24.0.tgz","fileCount":146,"integrity":"sha512-ihVWEeH21DSalcukfkjE44TX12umr66OJt/Ird2sJfZsTtvGa3Yyru5x0V0b+FD+b6vgFdf0aAWvHinhQHm/TQ==","signatures":[{"sig":"MEQCICsTmH7EmnTEOeIc3kbWW7BL8YKU3hezYCvHeGR8p6KyAiAu5Du0zVNVMcVsSnvWLMVkJTwdyAWT8NwXW7SwdeekwQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQChudXoliOqAG1OLwD+PCuQlH3q43gXJZcDtyLkShVnyQIhAMGtLEiy/s7OkrlQE3fbJMmelgsF28AhoKiTDwq4oUUD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":872844},"type":"module","engines":{"node":">=22.18"},"gitHead":"ba6dae39ce30ff25d5d99cd44d8c0246960f1769","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.24.0_1790445082310_0.7242176040480992","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"tewip-ai","version":"0.25.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.25.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"ed7d1a890f0eac77895b1ca49055170902c3ed14","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.25.0.tgz","fileCount":147,"integrity":"sha512-jhbRwkrvXZ7lQsbnRbpknw+4M/L/f1bQP+z6M7KhCHLJiGeqnmVto1xc78Q+wrbEPb5nSQrX+YV77GNCRvoEiQ==","signatures":[{"sig":"MEUCICZlKx6MCPr/1lt2e1NxdxJw3ZQgL6L1J0yRaOk6tLc8AiEA2fdBO3HjdHfhu6FfDrM9hzKJIPrFIASvbKGo1JIbGkE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBzJhhJACIyfoRBWP88kU7DO3mGZ3NV8YWQ46LwK3OlQAiEAxxwlnT8SI2DU59Zq2siC61JGS17DZRAWs3LaameLGts=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":883468},"type":"module","engines":{"node":">=22.18"},"gitHead":"6cfd1a8815b8e8606de407e8f383cd867d54680a","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.25.0_1790452225692_0.984894215530226","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"name":"tewip-ai","version":"0.26.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.26.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"5c857f490c614e9ea3aeb7684204d46d931f4bfe","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.26.0.tgz","fileCount":152,"integrity":"sha512-tCQ5kl/jDQlBIbOUpYNXamKXxGyNrU0TGlpCbgXBCVRmaJlFz777OK77axsW8KHsjrlqyfAjFTVtBjjXS9U9Qg==","signatures":[{"sig":"MEUCIGayxvP8qFGvWN5m6PtW7ANX3NhfPm53FQTsMO3Ifo6zAiEA3ps2aE/0fp3uGZdWiOHNdQih5YSsngdc0gx+QsFblHw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCT9AUWz2mft24JIpdH6KPAy5atPJSIo6/Ing/oAHU4RgIgPIG7cDMRDgpTyDVEiTdUOO7/ZSBJFBpkQVtZ/c74dow=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":925948},"type":"module","engines":{"node":">=22.18"},"gitHead":"209733786af1a6ac84f9de9573a3d446eaf77811","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.26.0_1790526116367_0.9277301369256687","host":"s3://npm-registry-packages-npm-production"}},"0.27.0":{"name":"tewip-ai","version":"0.27.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.27.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"4a29a576fb9e02a042f41ade5f1f756cb872f22a","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.27.0.tgz","fileCount":157,"integrity":"sha512-ZWMNfiadbgcsqeuKbU5AFr5r9Nzz47TH6qFSgl5UWXEGk24m0V4ePm61Bcsm+qoOp4fYJ6YoCb3/XaxPTC2FnQ==","signatures":[{"sig":"MEQCIECsBGZFn6k/rHuJ07C08TmHoeYYFIDohcVIJS/oVbuuAiAal1nf5BLSe/Xg8IKYYT6hRdcOOe6Gk0N9jxtznVhHzQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICxswCuBw0yVrxgWYG90MZlFwg2PdNySPkF9o2ImQW69AiAY0C7cniXH21SVJGhk5VNAtzywRvxKAnRF7UmT7wR1Yw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":973159},"type":"module","engines":{"node":">=22.18"},"gitHead":"890bf7c4a9dadaa0717d70779aea912e77a85a67","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.27.0_1790531401755_0.24163659680260285","host":"s3://npm-registry-packages-npm-production"}},"0.28.0":{"name":"tewip-ai","version":"0.28.0","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","_id":"tewip-ai@0.28.0","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"homepage":"https://github.com/hmamut39/tewip#readme","bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"bin":{"tewip":"dist/cli/tewip.js"},"dist":{"shasum":"4cba1259efe5987c65be677c846ceb3ee647e872","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.28.0.tgz","fileCount":160,"integrity":"sha512-+j9jyEdoGQ/8rrg54IhWaqnWZYjTq746VpCEZSZQigpxR+7LnKqlQi5lQC3+Nr7O97ZX/0BvbinmIUw8/RWFkw==","signatures":[{"sig":"MEUCIGe+9EtA8uQ7jCBg0OonfzGhxnkHTkjH2xucBY6vy7XoAiEAk7w9sYzHA25ycjXkXkgDb71TfW45taaYKu67OOPDs0g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDIuv47Fm/esQuvE4q32An78FjFLfxzDsnvHWei2a1/CAIgaGoAiORPSd6vlPGFOZuG1VvTf5n3fQeZJNuL+KCfrio=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1000339},"type":"module","engines":{"node":">=22.18"},"gitHead":"bb2442da9052d84be30c41593f23dfca5551ea5d","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"tmp":"tmp/tewip-ai_0.28.0_1790533387375_0.7467469312194626","host":"s3://npm-registry-packages-npm-production"}},"0.29.0":{"_id":"tewip-ai@0.29.0","bin":{"tewip":"dist/cli/tewip.js"},"bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"dist":{"shasum":"54052f9206b2c01c93e8bac604d0768f4550915e","tarball":"https://registry.npmjs.org/tewip-ai/-/tewip-ai-0.29.0.tgz","fileCount":160,"integrity":"sha512-0hSDNEwCJVjC9KZ4u1wxfYvNGTHks7kWAWzw6QYHsUVqqvkdkMOkUSKFPtiU6iR+pkmN+JMIUMVHiRYVcvU29g==","signatures":[{"sig":"MEUCIQCHAhgr4LV+X3bLQMb8u4985lHraakhhtKtO4zZQS+9xAIgCk3grViPqOQQPOItEz7evp7XlTiVrdZ/bLQVfQpC40A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICy1cNx45Nex5csvaRKgP3AH50bicVGIbEZcQLIUlYndAiBdT6kSX6iGmq6jCCiS6AOq+4Bf9fVXG9Jxq1PdeEjkwQ=="}],"unpackedSize":1001826},"name":"tewip-ai","type":"module","author":{"name":"Hasan Mamut"},"engines":{"node":">=22.18"},"gitHead":"421e40b1f39bb3ff304262b826f6ea611fe2d9ae","license":"Apache-2.0","scripts":{"lab":"node scripts/lab.ts","mcp":"node mcp/server.ts","eval":"node eval/evaluate.ts eval/ground-truth.jsonl --data data/real/gutenberg","test":"playwright test","build":"tsc -p tsconfig.build.json","tewip":"node cli/tewip.ts","shadow":"node scripts/shadow.ts","triage":"node scripts/triage.ts","explain":"node scripts/explain.ts","harvest":"node eval/harvest/harvest.ts","history":"node scripts/history.ts","prepack":"npm run build","diagnose":"node scripts/diagnose.ts","eval:aug":"node eval/evaluate.ts eval/ground-truth.aug.jsonl --data data/real/gutenberg-aug","eval:aug2":"node eval/evaluate.ts eval/ground-truth.aug2.jsonl --data data/real/gutenberg-aug2","test:loop":"node scripts/test-loop.ts 5","typecheck":"tsc --noEmit","eval:fresh":"node eval/evaluate.ts eval/ground-truth.fresh.jsonl --data data/real/gutenberg-fresh","test:engine":"node --test engine/test/*.test.ts outlets/test/*.test.ts mcp/test/*.test.ts","eval:holdout":"node eval/evaluate.ts eval/ground-truth.holdout.jsonl --data data/real/gutenberg-holdout","eval:supabase":"node eval/evaluate.ts eval/ground-truth.supabase.jsonl --data data/real/supabase","eval:synthetic":"node eval/evaluate.ts eval/ground-truth.synthetic.jsonl"},"version":"0.29.0","_npmUser":{"name":"hasan1206","email":"hmamut39@gmail.com"},"homepage":"https://github.com/hmamut39/tewip#readme","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"_npmVersion":"11.17.0","description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","directories":{},"maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.6.5","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.5.1","@playwright/test":"^1.63.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tewip-ai_0.29.0_1790535906231_0.17713670016002414"}}},"time":{"created":"2026-09-22T22:20:47.836Z","modified":"2026-09-27T19:05:06.622Z","0.4.0":"2026-09-22T22:20:48.210Z","0.5.0":"2026-09-23T11:49:41.433Z","0.6.0":"2026-09-23T12:54:24.689Z","0.7.0":"2026-09-23T13:31:52.378Z","0.7.1":"2026-09-23T14:05:37.371Z","0.8.0":"2026-09-23T14:23:59.795Z","0.8.1":"2026-09-23T14:25:04.827Z","0.9.0":"2026-09-23T14:37:32.537Z","0.10.0":"2026-09-23T14:45:13.686Z","0.11.0":"2026-09-23T15:11:53.207Z","0.12.0":"2026-09-23T15:37:19.458Z","0.13.0":"2026-09-23T15:57:58.881Z","0.14.0":"2026-09-23T16:03:19.047Z","0.15.0":"2026-09-23T16:22:03.714Z","0.15.1":"2026-09-23T17:28:56.924Z","0.16.0":"2026-09-23T17:53:50.630Z","0.16.1":"2026-09-23T18:32:07.238Z","0.16.2":"2026-09-23T19:02:35.050Z","0.16.3":"2026-09-23T19:25:58.835Z","0.17.0":"2026-09-23T19:50:55.650Z","0.17.1":"2026-09-23T20:30:40.445Z","0.17.2":"2026-09-23T21:11:39.532Z","0.17.3":"2026-09-23T21:24:54.798Z","0.18.0":"2026-09-23T21:37:57.771Z","0.18.1":"2026-09-23T21:48:51.819Z","0.18.2":"2026-09-23T21:54:11.508Z","0.18.3":"2026-09-23T22:03:47.485Z","0.18.4":"2026-09-23T22:09:08.584Z","0.18.5":"2026-09-23T22:15:25.614Z","0.18.6":"2026-09-23T22:20:18.487Z","0.19.0":"2026-09-26T16:10:50.659Z","0.20.0":"2026-09-26T16:24:11.643Z","0.21.0":"2026-09-26T16:32:13.148Z","0.22.0":"2026-09-26T16:46:24.367Z","0.23.0":"2026-09-26T16:56:16.838Z","0.24.0":"2026-09-26T17:51:22.398Z","0.25.0":"2026-09-26T19:50:26.024Z","0.26.0":"2026-09-27T16:21:56.468Z","0.27.0":"2026-09-27T17:50:01.845Z","0.28.0":"2026-09-27T18:23:07.469Z","0.29.0":"2026-09-27T19:05:06.480Z"},"bugs":{"url":"https://github.com/hmamut39/tewip/issues"},"author":{"name":"Hasan Mamut"},"license":"Apache-2.0","homepage":"https://github.com/hmamut39/tewip#readme","keywords":["test-failures","flaky-tests","triage","root-cause","ci","github-action","playwright","pytest","jest","vitest","junit","mcp","ai-agent","test-automation","qa","sdet","devops"],"repository":{"url":"git+https://github.com/hmamut39/tewip.git","type":"git"},"description":"Tewip finds why each failing test failed - real bug, flaky test, environment, test data or changed selector - for any stack, from the command line, CI, or your editor.","maintainers":[{"name":"hasan1206","email":"hmamut39@gmail.com"}],"readme":"# Tewip\n\n**Tewip** (Uyghur *téwip*, تېۋىپ: healer, doctor) finds why each failing test failed: a real bug, a flaky test, the environment, test data, or a changed selector. Every answer comes with its confidence, its evidence and one next step, and names its source: a deterministic rule, the AI model, or a person's correction.\n\nIt works for every stack: Node.js (node:test, Jest, Vitest, Mocha), Python (pytest, unittest), Java and Kotlin (JUnit, TestNG), Go, .NET, Ruby, PHP and Rust, each checked against its real runner's report ([the full list](QUICKSTART.md#not-using-playwright-every-stack-works)), plus Playwright in depth with traces, selector drift and verified fixes. It also reads the failure wording of the browser and component-test tools on top of those runners (Selenium, WebdriverIO, Cypress, Testing Library for React, Vue and Angular, Vue Test Utils, jest-dom and Jasmine), checked against more than 500 real messages from public projects.\n\n| Where | How |\n|---|---|\n| **Terminal** | `npm install -g tewip-ai`, then `tewip explain report.xml`, `tewip ci owner/repo --pr 12`, `tewip mcp` |\n| **VS Code, Cursor, Windsurf, VSCodium** | the Tewip extension ([download](https://github.com/hmamut39/tewip/releases/tag/vscode-0.5.0)): registers Tewip with the editor's AI assistant and adds six commands - explain a report, why CI failed on this branch, the risk review of your change, which flaky tests to quarantine, the security check, and what your corrections add up to |\n| **JetBrains, Claude, other AI assistants** | add the MCP server `tewip mcp`: fifteen tools, including *has this happened here before?*, *is this requirement covered and passing?* and *what should be done next about this goal?* (see [editor setup](#use-it-from-your-editor-any-ide-that-speaks-mcp)) |\n| **Any model** | OpenAI, Claude, Gemini, Azure, or a model on your own machine with Ollama (no account, nothing leaves the computer): `TEWIP_PROVIDER` |\n| **GitHub CI** | the Tewip Action: a comment on every pull request, an optional merge gate, verified fix PRs ([QUICKSTART](QUICKSTART.md)) |\n\nFormerly *triage-agent*: the repository moved to `hmamut39/tewip`, and GitHub redirects the old address. See [ROADMAP.md](ROADMAP.md) for the plan.\n\n**Status: phases 1 to 14 are built; the two auto-fix phases (5 and 8) are the ones still in progress.** Tewip collects failures from any framework, diagnoses them with rules first and a model only for what rules cannot settle, and turns that into work for each role: a CI comment and merge gate, test plans and verified tests, a flake dossier, a PR-risk review, security scanning, tickets in Jira, Rally, GitHub Issues, Azure Boards or Linear, checks generated from a Figma design, specifications written for people, and - opt in, and only when proved - fixes to test or application code. It runs live in GitHub CI and answers questions from AI assistants through MCP. On fresh real Gutenberg CI failures, with the pipeline frozen before labelling, accuracy is 93.4%; across six real datasets it ranges from 86.1% to 99.7%, and the caveats are in [eval/README.md](eval/README.md).\n\n## What it costs\n\nMost failures never reach a model. On 3,556 real CI failures from six public projects, the\ndeterministic rules answered **75.1%** on their own - and on the labelled ones they answered\ncorrectly **1,979 times out of 2,012 (98.4%)**. A rule-answered failure costs nothing, explains\nitself, and gives the same answer every time.\n\nOnly the remaining quarter is sent to a model, so triaging **1,000 real failures costs about\n$1.12** at gpt-5.4-mini's published price. That is measured, not estimated: three real uncached\ncalls on held-out failures billed 3,624 prompt and 499 completion tokens each. A real week costs\nless, because a failure that repeats is answered from cache, and a failure someone has corrected\nnever goes to the model again.\n\nTewip prints what every command costs, caps its own spend, and works with no key at all - the rules\nrun on their own and everything they cannot settle is left as UNKNOWN rather than guessed.\n\n## Use it in your project\n\n**Giving it to your team (or another company): [TEAM-GUIDE.md](TEAM-GUIDE.md)** — what to install, what each role uses it for, and what it never does.\n\n**Putting it on a real repository: [QUICKSTART.md](QUICKSTART.md)** — ten minutes, copy-paste, and what to check on the first failing run.\n\n### 1. In GitHub CI (developers, SDETs, DevOps)\n\nTell Playwright to write a blob report in CI. It's a built-in reporter, so there's no triage-agent code in your config:\n\n```ts\n// playwright.config.ts\nreporter: process.env.CI ? [['list'], ['blob']] : 'list',\nuse: { trace: 'retain-on-failure' },\n```\n\nThen add one step after your tests:\n\n```yaml\npermissions:\n  contents: write        # only needed for autofix\n  pull-requests: write\n  issues: write\n  actions: read          # lets it read the failed job's log when no test report was written\n\nsteps:\n  # ... checkout, install, npx playwright test ...\n  - name: triage-agent\n    if: always()\n    uses: hmamut39/tewip@main\n    with:\n      openai-api-key: ${{ secrets.OPENAI_API_KEY }}   # optional: without it only the rules run\n      autofix: 'true'                                  # optional: verified locator-fix PRs\n```\n\nOn every run, the action:\n- **Developers:** posts one diagnosis comment on the pull request and keeps it updated. For each failure it says whether the change likely caused it, why, and what to do next.\n- **SDETs:** writes the triage board into the job summary.\n- **DevOps:** collects environment failures (server errors, connection resets, outages) in **one** GitHub issue, and each new run adds a single grouped comment to it.\n- **The tests in the pull request:** on a PR it reads the test files the change touched and says which\n  of them could never fail - an unfinished expectation, a value compared with itself, a test that\n  discards its own failure, one that never runs. It says nothing when they are all sound, and it says\n  it **even on a green run**, because \"all tests passed\" is the exact sentence that needs qualifying\n  when one of them cannot fail. Needs `fetch-depth: 0` on `actions/checkout` so the diff can be read;\n  without it the section is skipped rather than guessed at. Any such test also enters the attestation\n  as a refusal, so a release decision taken from the bundle cannot rest on a test that proves nothing.\n- **What the change would slip past (`prove: true`):** breaks the source files the pull request touched\n  in small deliberate ways, runs the tests that cover them, and reports every change none of them\n  noticed - \"these 2 changes to your code would have slipped past your tests\", with the lines. Off by\n  default because each change costs a real test run; `prove-budget` (default 300s) caps the whole\n  thing, and it says which files it did not reach rather than implying they were clean. Every file is\n  put back exactly as it was. Each unnoticed change also enters the attestation as a refusal: a line\n  nothing checks is not a line this bundle can claim was verified.\n- **Evidence, every run:** the Action writes an attestation into its artifact - the claims with\n  their evidence and which layer decided each, what Tewip **refused** to decide, and what it did\n  not check at all. Nothing enters it that Tewip did not verify itself, so a release decision can\n  be taken from it without opening CI.\n- **Fixes (`autofix: true`):** for drifted locators that the deterministic rule matched to a renamed element, it rewrites the locator, re-runs that test, and opens a separate pull request with the changes that passed. It never merges and never edits application code.\n- **Every role:** uploads all role views as the `tewip-report` artifact.\n- **When the job dies before any test runs** (an image that would not pull, a runner out of disk, a service container that never came up): it reads the failed job's log and names the cause, instead of leaving a red X with no explanation.\n- **History:** keeps the run history in the Actions cache, never in git.\n- **Corrections:** reply to the agent's comment with `/triage CATEGORY #n reason` (e.g. `/triage TIMING #2 flaky on CI`). It stores that with the history and, next time that test fails the same way, gives the person's answer instead of its own, naming them and their reason. A corrected failure also costs nothing: it never goes to the model again.\n\nFor **senior engineers, architects and leads**, add a scheduled workflow with `mode: report`, for example weekly. It builds the engineering-quality, architecture and risk-digest views from the stored CI history, reusing earlier diagnoses so it makes no repeat AI calls. The views are kept in one GitHub issue that each report updates:\n\n```yaml\non:\n  schedule: [{ cron: '0 6 * * 1' }]\n  workflow_dispatch:\npermissions: { contents: read, issues: write }\njobs:\n  report:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: hmamut39/tewip@main\n        with: { mode: report }\n```\n\nThe report reads the history cache of the branch it runs on, usually the default branch.\n\nThe repository needs \"Allow GitHub Actions to create and approve pull requests\" enabled for fix PRs. Pull requests opened by the workflow token don't trigger CI themselves; the agent verified each change by re-running the test before opening the PR. See [triage-agent-sandbox](https://github.com/hmamut39/triage-agent-sandbox) for a working example. If this repository is private, other repositories can only use the action when Settings → Actions → Access allows it.\n\n### The editor extension (VS Code, Cursor, Windsurf, VSCodium)\n\nDownload **[tewip-0.5.0.vsix](https://github.com/hmamut39/tewip/releases/tag/vscode-0.5.0)**, then in the\neditor press `Ctrl+Shift+P` and run **Extensions: Install from VSIX…**. It needs the command line:\n`npm install -g tewip-ai`.\n\nPress `Ctrl+Shift+P` and type \"Tewip\" for: *Explain a test report…*, *Why did CI fail on this\nbranch?*, *Risk review of this change*, *Which flaky tests to quarantine*, *Check secrets and\ndependencies*, and *What our corrections add up to*. The editor's AI assistant also picks Tewip up\nas an MCP server with nothing to configure.\n\nIt is not in the Visual Studio Marketplace: publishing there now requires an Azure subscription,\nwhich means a credit card for a free extension. The file above installs exactly the same thing.\n\n### 2. From any AI assistant, through MCP (the whole IT team)\n\n`mcp/server.ts` is a read-only [Model Context Protocol](https://modelcontextprotocol.io) server. Anyone on the team can ask their own assistant about test failures, in the editor or chat they already use:\n\n| Ask your assistant | Tool it uses |\n|---|---|\n| \"Why did CI fail on PR 12 in our-org/web?\" | `github_ci_report`: the latest CI report for that PR, plus any verified fix PR |\n| \"Explain the failing checkout test\" | `explain_failure`: root cause, confidence, evidence, history on this commit vs others, next action |\n| \"What should I fix first from the last run?\" | `triage_board` (SDET) · `pr_impact` (developer) |\n| \"Is the test environment broken?\" | `environment_report` (DevOps / SRE) |\n| \"Can we release?\" | `release_readiness` (business / UAT) |\n| \"Where is our test suite fragile?\" | `quality_report` (senior / principal) · `architecture_report` (architect) · `risk_digest` (lead) |\n| \"Write a test plan for the checkout feature in C:\\work\\shop\" | `test_plan`: risks and scenarios grounded in that project's tests, code and pages; saved in its `.tewip` folder |\n\nSetup, after `npm install`:\n\n- **Claude Code** in this repo: [.mcp.json](.mcp.json) is already here, so approve `tewip` when asked. From anywhere else, run `claude mcp add tewip -- tewip mcp` (installed), or `claude mcp add tewip -- node /path/to/tewip/mcp/server.ts` (from a checkout).\n- **Claude Desktop, Cursor, VS Code, and other MCP clients:** add a stdio server with command `tewip` and args `[\"mcp\"]`, or command `node` with args `[\"/path/to/tewip/mcp/server.ts\"]` from a checkout.\n\n`github_ci_report` uses the `gh` CLI login on your machine. The other tools read the datasets under `data/`, and the AI layer uses `OPENAI_API_KEY` from `.env`.\n\n## Use it from your editor (any IDE that speaks MCP)\n\n**VS Code, Cursor, Windsurf and VSCodium:** install the Tewip extension (`extensions/vscode`, packaged as `tewip-<version>.vsix`: *Extensions → … → Install from VSIX*). It registers Tewip as an MCP server by itself, so the assistant can use it with no configuration, and adds two commands: *Tewip: Explain a test report…* and *Tewip: Why did CI fail on this branch?*\n\n**Every other MCP client** (JetBrains IDEs 2025.2+, Claude Code, Claude Desktop, or an editor without the extension) takes one entry. With Tewip installed from its release file (`npm install -g tewip-<version>.tgz`), the command is simply `tewip mcp`; from a checkout, point at `cli/tewip.ts`:\n\nPoint the entry at this checkout with an absolute path (the server resolves its own data, so the editor's working directory does not matter). **VS Code** uses its own shape, with a `servers` key and a `type`; put it in the workspace's `.vscode/mcp.json`, or in your user-level configuration (command *MCP: Open User Configuration*) to have it in every window:\n\n```json\n{\n  \"servers\": {\n    \"tewip\": { \"type\": \"stdio\", \"command\": \"tewip\", \"args\": [\"mcp\"] }\n  }\n}\n```\n\n**Cursor, Claude Desktop, Windsurf and most other clients** use the `mcpServers` shape (Cursor: Settings → MCP):\n\n```json\n{\n  \"mcpServers\": {\n    \"tewip\": { \"command\": \"tewip\", \"args\": [\"mcp\"] }\n  }\n}\n```\n\n- **JetBrains** (IntelliJ, WebStorm, PyCharm 2025.2+): Settings → Tools → MCP Server.\n- **Inside this repository** nothing is needed for Claude Code: `.mcp.json` is already set up.\n\nThen ask, in plain language: *\"why did CI fail on my PR?\"*, *\"which tests are flaky in checkout?\"*, *\"is the main branch safe to release?\"*. You can also ask it to *\"write a test plan for the checkout feature in C:\\work\\shop\"*: the `test_plan` tool plans from that project's real tests, code and pages, and saves the plan in its `.tewip` folder. Every other tool is read-only, and `github_ci_report` reads the report the Action uploaded, so you can ask about a repository's CI **without cloning it or opening the Actions page** (it uses your `gh` login).\n\n## Plan and write tests (Phases 6 and 7, new)\n\nRun these inside your project. Both need `OPENAI_API_KEY`, and both print what they cost.\n\n```bash\ntewip plan \"Checkout: a signed-in shopper pays by card and gets a receipt\" --url http://localhost:3000/checkout\ntewip write                        # tests for the plan's \"to automate next\" scenarios\ntewip write --only CO-002,CO-004 --framework pytest\n```\n\n- **`tewip plan`** reads what is really there: the tests you already have (in any language), the change (`--diff main...HEAD`), the live pages (what a user sees on each page, via Playwright), and the failures Tewip has diagnosed in this project before. The plan lists risks and scenarios by priority. A claim that a scenario is \"already covered\" is checked against your real test names, and dropped if no such test exists. Saved to `.tewip/plans/` as Markdown to review and JSON for `write`.\n- **Does a plan catch real bugs?** Measured on 18 real pull requests that were later found to have\n  broken something: the repository is fetched at the pull request's own head, the plan written from\n  the diff a reviewer saw, and nothing about the bug is known to it. **In 8 of the 9 pairs that\n  could be judged, a scenario named the bug** - in `matrix-org/complement`, `NLnetLabs/domain`,\n  `Bioconductor/rhdf5`, `Try/OpenGothic` and others. One pull request was titled \"Resolve nightly\n  warnings\" and the plan still found the behaviour change hidden inside it. The caveats are real\n  and written out in [ROADMAP.md](ROADMAP.md): nine judged pairs is a small sample, Claude did the\n  judging rather than each project's engineers, and the one miss is the interesting case - when a\n  pull request's *intention* is wrong, a plan grounded in that intention agrees with it.\n- **`tewip write`** writes each scenario as a test in **your** framework and style: Playwright, Cypress, WebdriverIO, Angular, Jest, Vitest, pytest (with Selenium or Playwright), JUnit on Maven or Gradle (Selenium, Spring Boot), .NET or Go. It copies the style of an existing test and uses only elements seen on the real page. Front-end apps get component tests the way their own tests are written: React, Vue or Svelte with Testing Library under Jest or Vitest, and Angular through `ng test` (Karma and Jasmine, or Vitest). A project with both e2e and unit tests gets browser tests when the plan read pages, and unit or component tests when it did not. Then it runs the test. A draft is **kept only if** it passes every run (3 by default) **and** fails once its main check is broken on purpose, because a test that cannot fail is worse than no test. A failing draft is repaired from the real error, twice at most. If the test looks right and the app does something else, Tewip reports a **possible bug** instead of weakening the test until it passes. Kept tests are new files beside yours, for you to review and commit; nothing is committed, and no application code is touched.\n\n## Check the page against the design (Phase 11, new)\n\n```bash\ntewip design \"https://www.figma.com/design/KEY/Checkout?node-id=12-34\" --url http://localhost:3000/checkout\ntewip design frame.json --frame \"Sign in\"     # a saved frame, no Figma token needed\n```\n\nTewip reads the frame (Figma's REST API, read only, `TEWIP_FIGMA_TOKEN`) and the running page\n(its accessibility snapshot, which is what a screen reader and a test both see), and says where they\ndisagree: `the design says button \"Sign in\", the page says button \"Log in\"`. It checks the words the\ndesign specifies, the controls its layer names imply, and the regions its sections imply - never\npixels, colours or spacing, because a design tool and a browser do not measure those the same way.\nNo model is called, so it costs nothing and answers the same way every time.\n\nMeasured on four real design/page pairs (a public repository's Figma exports and the pages built\nfrom them): 38 checks, **0 differences reported on pages that match their design**, **11 of 11 real\ndrifts caught** (a renamed control, a dropped sentence, a word swapped inside a sentence, a region\nthat lost its markup) and **5 of 5 harmless changes ignored** (capitals, extra spaces, a button\nimplemented as a link, reordered sections). No designer has judged the output yet, so the roadmap's\nown metric is still open.\n\n## More runners: Robot Framework, JMeter, k6 (new)\n\nTewip now reads **Robot Framework's output.xml**, **JMeter's .jtl** and a **k6 summary** as well as\nJUnit XML, TRX, NUnit and Playwright's own reports. A load test does not fail test by test, so a\nJMeter report becomes one line per request (\"4 of 5 requests failed, an assertion failed\") and a k6\nrun becomes one record per crossed threshold, with the number that crossed it.\n\nAppium and Selenium need no importer: those suites report through Mocha, pytest or JUnit, which\nTewip already reads, and their own error messages (\"Could not find a connected device\", \"stale\nelement reference\") are already understood.\n\nEach reader was checked against real reports published in public repositories, which is how three\ndefects were found before release - a Robot timestamp that is not a date, k6's numbers living under\n`values`, and a JMeter line that read \"mostly 200\" when an assertion had failed.\n\n## Tell it when it is wrong (new)\n\n```bash\ntewip correct diagnosis \"checkout charges twice\" TEST_DATA \"the fixture has stale prices\"\ntewip correct flaky \"adds an item\" fix-now \"it is a real race, not flakiness\"\ntewip correct security \"src/config.ts:12\" noise \"that is a sample key in a fixture\"\ntewip correct --list\n```\n\nTewip answers with **your** decision from then on, and says it was yours: *\"TEST_DATA, confidence\n1.00, source: corrected by a person\"*. Corrections live in your project, so they belong to the team;\nthe newest one wins, so changing your mind is just saying so again.\n\n**A correction changes what Tewip says, never what it does on its own** — it will not change code,\nquarantine a test or file a ticket because you corrected it.\n\n## What your corrections add up to (new)\n\n```bash\ntewip learn                      # where Tewip is systematically wrong, from what you corrected\ntewip learn --labels labels.jsonl  # your corrections as labelled examples, to measure a change against\n```\n\nOne correction fixes one failure. Twenty of them say which rule to change. `tewip learn` groups\nthem - \"45x said REAL_BUG, you said TIMING; rule `locator-drift` decided 27 of them; from 11\ndifferent tests\" - and points at the rule to read, with three of the real failures underneath.\n\nIt will not pretend. Fewer than three corrections of the same shape is \"not yet a pattern\", not a\nfinding; when no single rule is behind a group it says a rule is *missing* rather than blaming one;\nand it tells you how many different tests a pattern came from, because one flaky test corrected six\ntimes is one piece of evidence, not six.\n\n## Build a feature, test first (new)\n\n```bash\ntewip build \"naturalsize should take a sep argument that goes between the number and the unit\"\ntewip build --issue PROJ-123    # build from the ticket's own description and acceptance criteria\ntewip build \"...\" --pr          # commit the proved work on its own branch, open a draft PR\ntewip build \"...\" --dry-run     # prove it, show the patch, leave nothing on disk\n```\n\nTewip writes the **test first** and runs it. **If that test passes, it stops and keeps nothing** —\na test that passes before the feature exists is testing nothing. Then it writes the smallest code\nthat makes the test pass, and keeps the work only if the new test passes *and* nothing that was\npassing has started to fail. Otherwise every file goes back byte for byte, including the test it\nwrote. Nothing is ever committed.\n\nTried on two real public projects: it added a trailing-slash rule to **unjs/ufo** (4 lines,\nTypeScript, $0.18) and a `sep` argument to **python-humanize** (2 lines, Python, $0.10), each with\nits own failing-then-passing test and the project's whole suite still green. Asked for something\nthat already worked, it stopped after one model call and kept nothing.\n\nIt also refuses a feature that does not belong here at all. Handed a real Apache ticket about a\nFlink HTTP sink, a URL library got an \"HTTP sink\" built into it - test passing, suite green, every\nproof rule held, because when Tewip writes *both* the test and the code it can always make a\nself-consistent pair pass. So before writing anything it now asks whether the words of the feature\nmean anything in this repository, and refuses for free when they do not.\n\nThe old promise was *\"it can't touch your code\"*. The new one is *\"it can't change your code without\nshowing you it works\"*.\n\n## Before anyone reads the diff (new)\n\n```bash\ntewip review --diff main...HEAD\n```\n\nWhich tests cover this change and **how** (they import the file, they import the package that\nexports it, or their words merely match); which of them have flaked before, so a red run is not\nblamed on your change; what has gone wrong in these areas before; what nothing tests at all; and the\ncommand to run the telling tests first. From your project's own history, so it costs nothing.\n\nMeasured on **16 real commits** from two public projects, where the developers changed source *and*\nits test: given only the source files, Tewip **named the right test in 16 of 16, ranked it first in\n12**.\n\nIt also shows **the checks a change renegotiates** — every test assertion the diff rewrites,\nwithdraws or renames, with the old text beside the new one. A test written earlier is behaviour\nsomeone agreed on, and this is the one thing in a review that the change's own description cannot\naccount for: everything else reads the change's account of itself. It never passes judgement — tests\nchange for good reasons — it asks which of them the author intended.\n\nAlongside it, **the decisions a change alters outside its tests**: a guard that refused something,\na value other code falls back on, a limit that decides behaviour under load, a version or runner\npinned on purpose. Same rule - only things that already existed, never additions - and the same\nquestion rather than a verdict.\n\nBoth came out of a measurement rather than an idea. Of 18 real pull requests later found to have\nbroken something, the one Tewip's test plan missed was one whose *intention* was wrong: it changed\na freshness rule, changed the tests to match, and was reverted the next day.\n\n**What these checks are not is a predictor**, and the measurement says so plainly. On 14 pull\nrequests known to have caused a regression they speak up on 4; on 30 ordinary merged pull requests\nfrom the same repositories, on 9 - 29% against 30%. A change that alters an agreement is not more\nlikely to be broken. What they do is put those alterations in front of a person: on the ordinary\nset they surfaced 23 of them, among which a `raise SystemExit` guard that was deleted, a semaphore\ndropped from 4 to 1, and a CI runner image moved. No model is called, so this costs nothing.\n\n## Which flaky tests to quarantine, and what they cost (new)\n\n```bash\ntewip flaky --days 30        # the dossier: quarantine, fix, or watch - with the evidence\ntewip flaky --apply          # writes the quarantine line into the test file\n```\n\nOther tools count retries. Tewip already decided *why* each failure happened, so it can say: this\ntest failed in 161 of 647 runs **across 109 different branches** - that is the test, not your\nchange - and quarantining it gives the team back 148 CI minutes a week. It refuses to hide a test\nthat mostly fails (that one is broken, not flaky) and **never** quarantines a test whose failures\nlooked like a real bug.\n\nMeasured on three real projects' CI history (Gutenberg twice, Supabase): 76 tests proposed for\nquarantine, **zero of them containing a single real-bug failure**, giving back roughly 34, 148 and\n1,178 CI minutes a week. It also tells you when a quarantined test has stopped failing and should\ncome back - the half nobody ever does.\n\n## Bugs filed back, and test cases where your team keeps them (Phase 10, completed)\n\n```bash\ntewip bugs report.xml --project SHOP             # shows what it would file; nothing is created\ntewip bugs report.xml --project SHOP --create    # files them\ntewip jira plan.json --export xray --out cases.csv    # or --export zephyr\n```\n\n`tewip bugs` files a ticket only for failures **it** diagnosed as a real bug, with the error, the\nevidence and the run link. A flaky test or a broken environment is deliberately not filed - that is\nthe point of diagnosing first. The same failure is never filed twice: the second sighting is a short\nnote on the ticket Tewip itself opened. A dry run needs no Jira account at all.\n\n`--export xray|zephyr` writes the plan's scenarios as the CSV those tools import, one row per step.\nNo account, no network; importing stays your step.\n\n## Security: which findings actually matter (Phase 9, new)\n\n```bash\ntewip secure                              # secrets + npm audit / pip-audit / osv-scanner, triaged\ntewip secure --url http://localhost:3000  # also check the running app\ntewip secure --zap-report zap.json        # and triage an OWASP ZAP baseline report\ntewip secure --gate                       # fails a build only on what needs a person now\n```\n\nScanners are good at finding things and bad at saying which of them matter. Tewip runs the ones your\nproject already has and sorts every finding into **act on this now**, **real but not reachable**\n(a dev dependency, a package nothing imports, a file git does not track), **noise** (a placeholder\nfrom a README), or **accepted** (a person already judged it, in a file only people write). Each\nverdict carries the evidence. No model is called, so it costs nothing, and **a credential is\nlocated, never printed**.\n\nWith `--url` it also checks the running app the way a browser would: security headers, cookie\nflags, and the files that must never be served (.env, .git). No payloads, no fuzzing, no login\nbypass - and **an address that is not your machine is refused** unless you say `--i-am-authorised`.\nFor the deep scan it prints the OWASP ZAP command and triages ZAP's report rather than pretending\nto be a scanner.\n\nMeasured on the gitleaks project's own labelled samples, for the credential kinds Tewip covers:\n**50 of 54 real credentials found**. The web check found **8 of 8 planted weaknesses** in two local\napps and reported **nothing** about the carefully served one; on four real public homepages its\nreport matched the headers those sites actually send, every time. Four defects that corpus exposed are fixed; the four still\nmissed are things that are not credentials (an unsigned token, a Stripe *test* key). It never claims\na project is secure - it prints what it checked and what it did not.\n\n## Epics, stories and acceptance criteria (Phase 14, new)\n\n```bash\ntewip spec \"Readers can search the library and open a result\"\ntewip spec \"...\" --project PROJ            # shows what it would file in Jira\ntewip spec \"...\" --project PROJ --create   # files the epic and its stories\n```\n\nAn epic, user stories and Given / When / Then acceptance criteria, written from your code, your\ntests and your failure history. Anything it says the system **already** does carries a quote from a\nfile it read, and Tewip checks that quote word by word; what it cannot quote becomes an open\nquestion instead of a confident sentence. It writes no estimates, dates or business cases, because\nit cannot check them.\n\nMeasured on three real projects: 15 stories, 49 acceptance criteria, and of 46 claims about existing\nbehaviour, **22 were kept with a checkable quote and 24 were turned into open questions**.\n\n## Any CI, your chat, and your own machine (Phase 13, new)\n\n```bash\ntewip report report.xml --gate      # GitLab CI, Jenkins, CircleCI, Azure, Bitbucket, Travis, Drone\ntewip watch --cmd \"npm test\"        # beside your editor: explains each failure as it happens\ntewip note --days 7                 # the weekly quality note for a lead - free, no model calls\n```\n\n`tewip report` reads which CI it is in from that platform's own variables, prints the triage board,\nwrites it to a file, appends it to the job summary, and with `--gate` fails the build **only** on\nfailures that are not known flaky or environment noise. On GitLab it posts the diagnosis as one\nmerge-request note and edits that same note next run instead of piling up. With\n`TEWIP_SLACK_WEBHOOK` or `TEWIP_TEAMS_WEBHOOK` it tells the team's chat - and says nothing at all\nwhen no failure needs a person, so nobody mutes it.\n\n## Fix the code, but only when the tests prove it (Phase 12, new, opt-in)\n\n```bash\ntewip fix --code report.xml          # shows the patch; your files are left as they were\ntewip fix --code report.xml --apply  # leaves the proved change in your working tree\n```\n\nTewip has refused to touch application code since day one. This is the one exception, and it only\nruns when you type `--code`. It takes a failure **it** diagnosed as a real bug (0.85 confidence or\nmore), finds the file the failure points at, asks for the smallest change, and then proves it: the\nfailing test must pass **and** the whole suite must still pass. It will not edit tests,\nconfiguration, CI files, lockfiles, migrations or anything with secrets in it, because a test going\ngreen after changing those proves nothing. If it cannot prove a change, it explains the bug instead\nand puts your file back byte for byte. It never commits and never merges.\n\nMeasured by replaying **16 real bug fixes** from two public repositories, in two languages: the\ncommit before each fix, with only that fix's tests, so the real bug really reproduces.\n\n| Project | Language | Bugs | Proved by the tests | Right file |\n|---|---|---|---|---|\n| unjs/ufo | TypeScript, Vitest | 8 | **8** | 8 of 8 |\n| python-humanize/humanize | Python, pytest | 8 | **8** | 8 of 8 |\n\nEvery change is small (1 to 16 lines, median 4) and most are what the developers themselves wrote.\n**No wrong fix was offered**: anything that could not be proved was thrown away and the file put\nback byte for byte.\n\n## One bundle a release manager can read (Phase 15)\n\n```bash\ntewip attest --out attestation.md\n```\n\nEverything Tewip knows about a build, in one file: which tests ran, what each failure was, which\nrule or which model decided it, **what it refused to decide**, and what it never looked at. The\nrefusals are the point - a tool that never says \"I could not tell\" has nothing worth attesting,\nbecause every line it writes might be a guess.\n\nThe bundle carries a digest, and an Ed25519 signature when you give it a key:\n\n```bash\nTEWIP_ATTEST_KEY=./private.pem tewip attest            # sign it\ntewip attest --verify attestation.json --key public.pem  # check it\n```\n\nA digest is not a signature and Tewip says so: without a key it tells you the bundle is undamaged,\nnot that nobody edited it. Editing a claim out of a signed bundle makes verification fail and exit\nnon-zero. Every CI run writes one of these automatically.\n\n## Is this incident covered by a test? (Phase 16)\n\n```bash\ntewip incident sentry-issue.json\n```\n\nReads a Sentry payload, an OpenTelemetry span or a plain stack trace, finds the test that should\nhave caught it, and answers with one of four verdicts: **reproduced**, **passed** (the test ran and\ndid not catch it, which is worse news), **failed differently**, or **never ran**. It does not say\n\"probably covered\".\n\n## What did we decide about this last time? (Phase 17)\n\n```bash\ntewip recall \"the login test that keeps flaking\"\n```\n\nEvery correction your team ever gave Tewip is kept. Ask, and it answers with your own decision from\nthen, and says it was yours - not its. It never acts on a correction by itself.\n\n## From the ticket to the run (Phase 18)\n\n```bash\ntewip trace --only \"SHOP-12\"\n```\n\nJoins the test plans Tewip wrote to the tests that cover them and the runs that attempted them. A\nscenario counts as covered only when a real test can be named, and passing only when a real run\nattempted it; everything else says what is missing. No model, no cost.\n\n## Is this work actually done? (Phase 24)\n\n```bash\ntewip done --diff main...HEAD            # one verdict\ntewip done --prove --strict              # also break the code, and fail the build unless ready\ntewip done --json done.json              # a sealed verdict that can be checked later\n```\n\nTewip can answer six questions about a change. A team reviewing an agent's pull request has to run six\ncommands and assemble the answer themselves - which in practice means they run none and merge on a\ngreen tick. `done` is the assembled answer:\n\n```\n# Is this work done? Not ready\n\n| Question                                   | Answer      |\n| Is anything failing?                       | not checked |\n| Is the changed code tested?                | yes         |\n| Can the tests in this change fail?         | no          |\n| Would the tests catch a bug in this code?  | no          |\n| Is what was asked for covered?             | not checked |\n```\n\nThat is a real run on a change where **all three tests passed**. One of them was `assert.ok(true)`, and\nthree deliberate changes to the new code went unnoticed by the suite. CI was green; the work was not\ndone.\n\nNothing is judged here. Every answer comes from a layer with its own measured accuracy — the triage\nrules, `vouch`, `prove`, `trace` — and this only puts them in a fixed, published order: what is broken,\nthen what cannot be believed, then what is missing. The same change always gets the same verdict.\n\n**\"Cannot say\" is a real answer, and it is never rounded up to ready.** A verdict needs the two questions\nnothing can substitute for — is anything failing, and does anything actually test this code — to have\nbeen answered. If Tewip has never seen a test result for the project, it says so and refuses to approve;\nthe first version of this answered \"Ready, with 3 not checked\", which is an approval assembled out of\nshrugs. Every verdict also ends with what it says nothing about, including the one thing no tool here\ncan know: whether the change does what was intended.\n\nWith `--json` the verdict is **sealed**: editing `not-ready` to `ready` in the file makes verification\nfail, so a verdict that travels into a ticket or a release note can be checked rather than trusted. It is\nalso an MCP tool, so an agent can ask whether its own work is done before saying that it is.\n\n## Would your tests catch a bug? (Phase 23)\n\n```bash\ntewip prove src/pricing.js              # or --diff main...HEAD for what a change touched\ntewip prove src/pricing.js --strict     # exits non-zero when something goes unnoticed\n```\n\nCoverage says a line ran. It does not say anybody checked it. `prove` settles that by **execution**:\nit breaks your code in small, deliberate ways - a boundary moved by one, a condition inverted, an\n`and` that became an `or`, a returned flag flipped, a pattern loosened - runs the tests that reach\nthat file, and reports every change **none of them noticed**.\n\n```\n4 change(s) were made to your code and the covering tests were run against each. 3 went unnoticed.\n\n- line 2: a boundary moved by one\n  - was:    if (total >= 100 && isMember) return 0.2;\n  - became: if (total > 100 && isMember) return 0.2;\n- line 9: a sign reversed\n  - was:    return total - total * off;\n  - became: return total + total * off;\n```\n\nBoth of those are real: the tests used 150 and 10 and never the boundary itself, and the test calling\n`finalPrice` asserted nothing at all. Neither gap is visible in a coverage report, because both lines\nwere covered.\n\nIt refuses more often than it reports, and the refusals are the reason the reports are worth reading:\n\n- **Your file is put back exactly as it was**, byte for byte, line endings included, in a `finally` -\n  and the restore is verified, not assumed. A restore that did not work is an error, not a shrug.\n- **Nothing that can hang is touched.** Loop headers are never changed: a flipped comparison in a\n  `while` does not fail a test, it runs forever.\n- **A red suite proves nothing.** Every covering test is run untouched first. Ones that do not pass are\n  set aside by name, and if none pass, it says so and stops - a test that was already failing would\n  otherwise appear to \"catch\" every change.\n- **It checks that your tests actually load the file.** If breaking the file outright does not fail a\n  single test, they are reading an installed copy or a build output, and it says that instead of\n  reporting a page of holes that do not exist. This caught a real case on the first Python project it\n  met, where `import humanize` resolved to a different checkout entirely.\n- **Strings and comments are never changed**, because changing a message is not a bug a test should be\n  expected to catch.\n\nIt follows imports, so a file reached *through* another module is still proved - in a layered codebase\nthat is most of them. It needs a unit test framework (jest, vitest, mocha, `node --test`, pytest, go\ntest, maven, gradle, dotnet), calls no model, and costs nothing but time. It is also an MCP tool, so a\ncoding agent can ask whether the tests it is relying on would have stopped its own mistake.\n\n## Could these tests ever fail? (Phase 22)\n\n```bash\ntewip vouch tests/            # or a file, or the whole project\ntewip vouch tests/ --strict   # exits non-zero, for a merge gate\n```\n\nMost tests in a pull request are now written by an agent, and the question that decides whether they\nare worth anything goes unasked: **could this test ever fail?** Coverage counts a test that checks\nnothing. CI goes green on it. A reviewer skims something plausible and approves it.\n\n`vouch` reads tests somebody else wrote and answers per test, quoting the line it rests on. It finds\ntests that leave an expectation unfinished (`expect(value);` with no matcher - it reads exactly like a\ncheck), tests that compare a value with itself, tests that catch and discard their own failure, tests\nthat never run, and tests that compare no value at all. No model, no cost.\n\nIt is also an MCP tool, so a coding agent can ask about the tests it just wrote before claiming a\nchange is covered.\n\n**Measured on 5,448 tests in 8 public projects across 5 languages** (express, axios, chalk, requests,\nclick, gorilla/mux, cobra, gson): 19 tests were called unable to fail, and **all 19 were correct** when\nread against the files - one unconditional skip in psf/requests, eighteen `@Ignore` methods in gson.\n\nTwo things it refuses to do, which is why the list is worth reading:\n\n- **It will not guess.** A test whose checking happens inside a helper it cannot follow is reported as\n  undecided, by name, never as worthless. A wrong accusation about somebody's test costs more than a\n  missed one.\n- **It will not overclaim.** A test with no assertion still fails when the code throws - in axios, a\n  test that compiles a TypeScript fixture and runs it asserts nothing *on purpose*. Those are reported\n  separately as \"compares no value\", not as broken, and they do not trip `--strict`.\n\n**Recall, measured by execution** (`eval/vouch-recall.ts`): mutate a source file, record which tests\ncatch which mutation, remove the last statement of the ones that provably caught something, and run it\nall again. A test that caught a mutation before and catches nothing now has provably lost its check -\na label that owes nothing to vouch's own patterns. On 17 such cases across seven source/test pairs in\ntwo projects, **vouch named 12 (70.6%)**, and the five it did not name still hold a real assertion, so\nit is right about those too. Nothing that still caught a mutation was wrongly accused.\n\n## A goal instead of a verb (Phases 19 and 21)\n\n```bash\ntewip pursue \"keep the checkout flow green\"\ntewip pursue \"keep the checkout flow green\" --act\n```\n\nGive Tewip a goal and it says what it would do next, and why, from what it can actually see. The\norder is fixed, published and testable - **not chosen by a model**: a real bug first, then the\nenvironment, then flakiness, then anything failing it cannot explain, then a test that cannot fail,\nthen a coverage gap, and only then is the goal worth attesting. Deciding the same state twice gives\nthe same answer.\n\nWith `--act` it carries the decision out, and this is where the refusals matter most:\n\n- It **never does the work itself.** Each action is an existing command that already proves what it\n  changes - `write` keeps a test only when it passes *and* fails when broken.\n- **Two actions are on the allowlist**: write a missing test, and attest a green goal. Everything\n  else is refused by name. It will not work around a real bug.\n- **One action, then stop.** There is no unattended loop.\n- Everything it did or refused goes to `.tewip/actions.jsonl`, with the run that justified it.\n- It **will not repeat itself**: the same attempt is refused until a new run gives it new evidence.\n\n## Where it has been tried\n\n| Project | How | Result |\n|---|---|---|\n| [triage-agent-sandbox](https://github.com/hmamut39/triage-agent-sandbox) (private practice repo) | Live GitHub Action on a release PR with 11 planted failures | Diagnosis comment, one environment issue, and a fix PR whose 5 locator changes pass when checked out. Traps left alone. Synthetic. |\n| WordPress Gutenberg (public) | Offline, from 5 windows of real CI blob reports, two of them harvested after the pipeline was frozen | 84–98% accuracy on 1,441 labelled real failures; the only project with enough drift cases to measure that category (see [eval/README.md](eval/README.md) for caveats) |\n| JupyterLab (public) | Offline, from its Galata UI suite | 90.2% on 41 labelled failures; the deterministic rules alone were right on 34 of 34 they decided |\n| LXD UI (public) | Offline, from its pull-request suite | 91.3% on 69 labelled failures; rules right on 63 of 63. All 6 misses are cross-branch flakes read as real bugs |\n| Supabase Studio (public) | Shadow run: real CI blob reports, nothing posted to the project | REAL_BUG 6/6, TEST_DATA 6/6; the TIMING majority shares its signal with the labels |\n| Penpot (public) | Shadow run over 21 runs that were still downloadable | Works on a third project; only 5 labelled cases, too few to score |\n| Nextcloud server (public) | Attempted | Harvests fine (45 failures) but only 1 case had the evidence to label in the window: too sparse to score |\n| Ghost (public) | Attempted | **Not usable from outside**: Ghost uploads blob reports only for failed runs and keeps them about a day, so 3 of 255 runs survived |\n\nShadow runs are how the agent is tried on public projects without touching them: `npm run harvest -- <source>`, then `node scripts/shadow.ts <source> [--publish your/private-repo]`.\n\n## How it compares (September 2026)\n\nOther tools cover parts of this job. This table is what each is known for from its own public material, and where triage-agent differs; it is not a benchmark of them.\n\n| Tool | What it does | Where triage-agent differs |\n|---|---|---|\n| [Playwright Test Agents](https://playwright.dev) — the Healer | Rewrites a broken selector and re-runs the test; its makers report about 75% success on selector failures | triage-agent first decides **whether** it is a changed selector at all (real bug, race, environment and test data are ruled out first), then fixes only what a deterministic rule matched and a re-run proved: 14 real fixes with none wrong. A healer that repairs every selector failure will also \"repair\" a removed feature |\n| [Trunk](https://docs.trunk.io/flaky-tests/detection), [BuildPulse](https://buildpulse.io/products/flaky-tests), [Datadog Test Optimization](https://www.getpanto.ai/blog/best-flaky-test-tools) | Detect flaky tests from pass/fail history and quarantine them so they stop blocking merges | Same core signal (a test that failed and passed on the same code), plus a cause for **every** failure, not only flaky ones, and a per-failure merge gate. Measured on 2,296 real failures (below) |\n| [ReportPortal](https://reportportal.io/docs/analysis/AutoAnalysisOfLaunches/) | Classifies failures as product bug, automation bug or system issue by matching earlier human classifications | Same idea of learning from people (`/triage` corrections), plus deterministic rules that need no training data, so it is useful from the first run |\n| [Develocity](https://develocity.ai/product/failure-analytics/) | Groups build and test failures by root cause across history (Gradle and Maven) | Any language through JUnit XML or TRX, and it acts on each failure: comment, grouped environment issue, verified fix, gate |\n\nWhat it does not have, and they do: dashboards and hosted history (it keeps history in the Actions cache), and years of production use.\n\n## Smart merge gate\n\nWith `gate: real-failures`, the triage step fails the build only when a failing test needs someone: a real bug, a changed selector, a test-data problem, or anything undecided. Failures that a deterministic rule or a person classified as flaky or environment do not block. AI-only verdicts still block, because the model is the less reliable half.\n\n```yaml\n      - name: Tests\n        continue-on-error: true      # let the gate decide the outcome\n        run: npx playwright test     # or pytest, jest, mvn test, go test ...\n      - name: triage-agent\n        if: always()\n        uses: hmamut39/tewip@main\n        with:\n          gate: real-failures\n```\n\nMeasured on 2,296 labelled real failures from five projects, the gate lets **1,823** failures through and **none of them is a real bug**, a changed selector or a test-data problem; **84%** of all flaky and environment failures (1,823 of 2,160) stop blocking merges. Read the zero with care: the first measurement let one real bug through (a new test on a feature branch hit a server error from new backend code), and the server-error rule was then changed to step back when a test has never passed. The zero is measured on the same data that exposed the gap, so it is optimistic; the weekly job keeps checking it on new data. The counts are also step outputs (`blocking`, `flaky`, `environment`) for later steps to use.\n\n## How it works\n\n- `reporters/triage-reporter.ts` is a custom Playwright reporter. It runs alongside `list`. For every attempt with status `failed` or `timedOut`, it captures the error, stack, duration, retry, trace, screenshot and `error-context.md` paths, run id and git SHA. It runs the rule engine on each failure and **appends** the records, each with its `diagnosis`, to `data/triage.jsonl`. It also appends one summary line per run to `data/runs.jsonl`, which records how many times each test ran.\n- `engine/` is the phase-2 rule engine. It is deterministic: the same failure and history always give the same answer. It classifies a failure into one of the five root causes (`REAL_BUG`, `LOCATOR_DRIFT`, `TIMING`, `ENV`, `TEST_DATA`) with a confidence and evidence. If no rule can decide, it returns `UNKNOWN` with confidence 0, along with what each rule saw, for phase 3.\n- `engine/llm/` + `engine/trace/` make up the phase-3 LLM layer. It only sees failures the rules left `UNKNOWN`. It reads `trace.zip` (the final DOM, failed requests, console errors, test steps) and `error-context.md` (the page snapshot and the failing code line, with comments stripped). It builds a short structured summary, not raw logs, and asks the model for a strict JSON answer that must be one of the five categories. The answer is checked again locally. If the call fails or the answer is invalid, the failure stays `UNKNOWN`. `engine/pipeline.ts` runs rules and then the LLM, and the reporter, CLI and eval all use it.\n- `eval/` holds the ground-truth labels and `evaluate.ts`, which prints the phase-3 accuracy metric. `eval/harvest/` imports real CI runs from public repos. See [eval/README.md](eval/README.md).\n- `engine/decide.ts` is the agent's DECIDE step. It turns each diagnosis into a next action following the autonomy table in ROADMAP.md: fix a locator or a fixed wait, re-run and notify, fix the test setup, file a bug, or escalate to a human. Low confidence (below 0.5) always escalates. Code fixes are only agent-eligible above 0.85. Nothing is executed yet: acting comes with Phase 5.\n- `outlets/` holds the Phase 4 views. Every view renders the same `TriageItem`: diagnosis, next action, confidence, data source and evidence. `npm run triage` writes them as markdown under `data/reports/<dataset>/` (gitignored).\n\n  | Role | View | Scope |\n  |---|---|---|\n  | Developer | `pr-comment.md`: which failures are likely caused by this change, and why | each failed run |\n  | SDET | `sdet-board.md`: every failure grouped by next action | each failed run |\n  | DevOps / SRE | `infra.md`: environment failures grouped by what broke, retry recovery, one grouped alert | each failed run |\n  | Business / UAT | `release.md`: READY / WAIT / NOT READY in plain words | each failed run |\n  | Senior / principal engineers | `quality.md`: flakiness hotspots, recurring patterns, test-design debt ranked by CI time lost | whole window |\n  | Architects | `architecture.md`: fragility by area, single commits that broke many suites, failing dependencies | whole window |\n  | Leads / managers | `digest.md`: areas whose failure rate grew between the first and second half of the window | whole window |\n- `scripts/history.ts` groups the records by test and prints failure rates. A test is flagged `SUSPECTED_FLAKY` when its failure rate is between 20% and 80% and its error messages vary.\n- `scripts/diagnose.ts` runs the engine over every collected failure and prints the phase-2 metric (coverage), labelled with the dataset it came from.\n- `tests/` contains 5 tests that fail on purpose, served offline from `fixtures/`. **They only exist to exercise the pipeline. Numbers computed on them are not product metrics.**\n\n`data/` is gitignored because the collected data stays local. Each run writes its artifacts to `test-results/<runId>/`, so attachment paths from older runs keep working.\n\n## Rules (engine/rules.ts)\n\nThe first matching rule, in this order, decides the category. If a lower-priority rule disagrees, the confidence drops by 0.1.\n\n| Rule | Category | Fires when |\n|---|---|---|\n| `env-mass-failure` | ENV | at least 3 tests, making up at least 30% of the run, fail with the **same** error shape. Many failures with different errors don't count. |\n| `env-network` | ENV | the error shows a connection error (`net::ERR_*`, `ECONNREFUSED`, ...), an HTTP 5xx, or an auth failure |\n| `test-data-collision` | TEST_DATA | the error shows the test's data collided with existing data (duplicate key, unique constraint, \"already exists\") |\n| `env-server-error` | ENV | the app's backend answered a 5xx during the test; declines for tests that provoke errors on purpose, and for errors seen only on this commit |\n| `locator-drift-strict` | LOCATOR_DRIFT | an action's locator now matches several elements, and exactly one of them carries the locator's name as a whole word (`name: 'Edit'` → \"Editor canvas\", \"Edit link\"). The fix is the locator Playwright printed for that element. |\n| `timing-intercepted` | TIMING | the element was ready, but the error says another element (a snackbar, menu or overlay) intercepts pointer events, so the click could not land. Also Selenium's `Other element would receive the click` and Cypress's `is being covered by another element` (0.65 until measured on labelled data) |\n| `timing-stale-element` | TIMING | Selenium's `StaleElementReferenceException` or Cypress's `the page updated while this command was executing`: the page replaced the element between finding and using it (0.65 until measured) |\n| `timing-retry-pass` | TIMING | another attempt of the same code in the same run passed |\n| `timing-known-flaky` | TIMING | a known flaky test: in an earlier run it failed with this same error and then passed on a retry. Steps back when a request failed during the test |\n| `locator-drift` | LOCATOR_DRIFT | the element was never found (Playwright, Selenium `NoSuchElementException`, WebdriverIO, Cypress `Expected to find element`), but the page snapshot has an element with a similar name (similarity ≥ 0.6). Declines when the test has no recorded passing run: nothing then shows the element ever matched. |\n| `timing-flaky` | TIMING | the failure rate is 20%-80% over at least 3 runs, and the error message varies |\n| `real-bug-assertion` | REAL_BUG | a value mismatch on a test whose history is stable: it was clean before and has failed the same way since |\n\nHistory is **point-in-time**: each failure is judged only with runs up to and including its own run, never later ones. A test's first-ever failure therefore has no history, and history-based rules decline it.\n\n## Usage\n\nRequires Node >= 22.18. Node runs the `.ts` scripts directly.\n\n```bash\nnpm install\nnpx playwright install chromium\n\nnpm test              # one run (records are diagnosed as they are saved)\nnpm run test:loop     # 5 runs in a row, to build up history\nnpm run history       # failure-rate table\nnpm run diagnose      # rule-engine classification + coverage metric (add -- --evidence for details)\nnpm run eval:synthetic   # rules + LLM vs the synthetic labels (pipeline check, not a product metric)\nnpm run eval             # rules + LLM vs your real labels in eval/ground-truth.jsonl\nnpm run lab           # drift lab: the full collect -> diagnose -> decide -> auto-fix -> verify loop, locally\nnpm run triage        # every role's view for data/ + the phase-4 metric\nnpm run triage -- --data data/real/gutenberg-holdout   # the same on real CI data\nnpm run test:engine   # unit tests for rules, LLM layer, decide step and views (no network)\n```\n\n## Auto-fix and the drift lab (Phase 5, in progress)\n\n`engine/autofix/` is the ACT + VERIFY loop for LOCATOR_DRIFT. It finds the failing locator in the spec, then tries up to 3 role-based replacements taken from the failure-time page. It re-runs that one test after each attempt, keeps a change only if the test passes, and otherwise restores the file. These safety rules are built into the code:\n\n- It only edits files inside a sandbox directory, never application code.\n- It refuses tests with no `expect()` after the broken call, because a pass there would prove nothing.\n- It acts only on drift diagnosed by a deterministic drift rule (`locator-drift` or `locator-drift-strict`) above 0.85. On real CI data the AI alone called real bugs \"drift\" at 0.88–0.96, so AI-only drift goes to a person.\n- Every decision is logged with its reason, and it never pushes or merges.\n\n`npm run lab` runs the whole loop against `lab/app`. Version v1 is what the tests were written for. Version v2 is a release with 6 renamed or re-shaped elements and 5 traps: removed features with look-alike elements, a wrong price, a disabled button, a server outage, and a test without assertions. The ground truth is in `lab/cases.json`. The current result is **6/7 drifted locators fixed and verified, 0/6 false fixes**. This is synthetic data and not a product metric. On real labelled Gutenberg failures the rules now reach **15 auto-fix-eligible drift cases with 0 wrong**, each suggesting exactly the locator the developers themselves wrote.\n\n## Learning from people (LEARN)\n\nThe agent's PR comment ends with one line telling people how to correct it. A reply like `/triage TEST_DATA #1 the fixture user has no saved card` is read on the next run, stored with the run history, and applied to every later failure of that test that fails the same way. The view then shows the category as **corrected by a person**, with their name and reason as the evidence, and keeps what the agent had said next to it, so a disagreement stays visible rather than being quietly overwritten.\n\nTwo limits are deliberate:\n- A correction settles the **category**, never a code change. Someone writing `LOCATOR_DRIFT` has not given the agent a replacement locator that a re-run has proved, so an SDET still writes that fix.\n- It applies to the same test failing **the same way**. A different failure of that test is a different question, and the agent answers it itself.\n\n## What a run costs\n\nEvery triage run, the CLI, the eval and the CI job summary end with one line: how many model calls were made, how long they took, how many came free from the cache, the tokens used, and the cost in dollars. Each call is priced by its own model from OpenAI's published prices (cached input at the cached rate); a team with its own price sets `TRIAGE_LLM_PRICE_IN/OUT`, and a model with no known price is reported as such, never guessed. A run is cheap because the deterministic rules answer most failures and only what they cannot settle reaches the model. Measured example (JupyterLab, 41 real failures): the rules decided 34 of them, 6 went to the model, and those 6 calls took 30 seconds and about 31,000 tokens in total.\n\n## Security\n\nThe agent reads text that a pull request's author controls (test names, error messages, traces) and it can change what blocks a merge, so it is built for untrusted input:\n\n- **Corrections come only from people with write access** (owner, member or collaborator). On a public repository a stranger's `/triage` comment is ignored, so nobody outside the team can wave a real failure past the merge gate.\n- **Only the agent's own comment defines what `#1` means.** A numbering map posted by anyone else is ignored, and the map's fields are encoded so no test name can break out of it.\n- **Text from a test run is made inert in comments:** `@mentions` do not notify anyone, links and images show as plain text, and HTML is escaped.\n- **The AI never has the last word on anything risky.** A crafted error message could try to talk the model into an answer, but AI-only verdicts never let a failure through the gate and never authorise a code change; fixes need a deterministic rule's match and a passing re-run.\n- **It never merges, never edits application code**, and keeps collected data in the Actions cache, not in the repository. The OpenAI key is optional and only ever read from a secret.\n\n## Known issues (found on real data)\n\n- **Drift and real bugs are hard to tell apart (improving).** Rules-5 reads Playwright's strict-mode errors: when a locator like `name: 'Edit'` starts matching several elements, the error already lists them, and the one named with the whole word is the element the test means. On the fresh set (Sep 1–3) drift is **16/20 = 80%** (**16/23 = 70%** on the labels before a labelling flaw was corrected, see [eval/README.md](eval/README.md)), real bugs called drift **1 of 29**, and **15 drift cases would now be auto-fixed, each suggestion identical to the developers' own fix**. On an unseen week (Aug 20–26, 473 labels) drift is **3/3** and the agent would still have made **0 automatic changes**. The remaining misses have no usable page data: the error names no locator at all.\n- **Playwright does not always write a page snapshot.** For some failures (timeouts inside frames) `error-context.md` holds only the error and the test source, so the similarity rule is blind. Rebuilding the page from the trace DOM does not help: on real data, real bugs score as similar as drift (0.80–0.96), so it gives the AI noise rather than signal (it lowered held-out accuracy from 86.1% to 81.3% when tried).\n- **Expected server errors (partly fixed).** Tests that deliberately provoke server errors used to be read as ENV. The model is now told when a test's name says it exercises error handling (prompt llm-4).\n- **Views can't tell pull-request branches from the main branch yet.** Records don't store the branch, so regressions inside unmerged PRs count as product bugs in the architecture view and the digest.\n- **Some recurring flakes are misread.** Flaky tests that also fail on other branches are misclassified (0/22 on the held-out set), and TEST_DATA and LOCATOR_DRIFT are not yet measured on real data.\n\nEnvironment variables (you can put them in `.env`, which is gitignored):\n\n- `OPENAI_API_KEY`: turns the LLM layer on. Without it, only the rules run.\n- `TRIAGE_LLM=off`: turns the LLM layer off even when a key is set.\n- `TRIAGE_LLM_MODEL` (default `gpt-5.4-mini`) and `TRIAGE_LLM_REASONING` (default `low`): choose the model and its reasoning effort.\n- `TRIAGE_LLM_CACHE=off`: skips the response cache in `data/llm-cache.jsonl`. With the cache on, an unchanged request is answered from the cache for free.\n- `TRIAGE_LLM_MAX_CALLS`: at most this many model calls per run. Further failures keep the rules' answer and say so, instead of running up an unbounded bill on a huge failed run.\n- `TRIAGE_LLM_PRICE_IN` / `TRIAGE_LLM_PRICE_OUT`: your own price per million input / output tokens, overriding the published prices built in for OpenAI's models. For a model without a built-in price, set them to see a cost; otherwise the run says the price is unknown.\n- `CI_RUN_ID`: used as the run id. If it is not set, the run id is based on a timestamp.\n- `GIT_SHA` or `GITHUB_SHA`: stored as the record's `gitSha`. If neither is set, `gitSha` is left empty.\n\n**Data leaving the machine:** with the LLM layer on, the summary of each UNKNOWN failure is sent to OpenAI. That summary includes the error text, the page snapshot, failed request URLs (without query strings) and console errors. Nothing is committed to git.\n","readmeFilename":"README.md"}