#!/usr/bin/env node import { execFileSync } from "node:child_process"; const output = execFileSync("npm", ["pack", "--dry-run", "--json"], { encoding: "utf8" }); const result = JSON.parse(output)[0]; const files = result.files.map((entry) => entry.path); const forbiddenPrefixes = [ "examples/project-euler/config.toml", "examples/project-euler/data/", "examples/project-euler/runs/", "examples/minimal-sft/data/", "examples/minimal-sft/eval_results/", "examples/minimal-sft/logs/", "examples/minimal-sft/train_sft.py", "examples/minimal-sft/tinker.yaml", "examples/minimal-sft/eval.py", ]; for (const prefix of forbiddenPrefixes) { const leaked = files.filter((file) => file === prefix || file.startsWith(prefix)); if (leaked.length > 0) { console.error(`npm package leaks local Project Euler material under ${prefix}`); console.error(leaked.join("\n")); process.exit(1); } } for (const required of [ "examples/project-euler/README.md", "examples/project-euler/build_tool_bootstrap.py", "examples/project-euler/prepare.py", "examples/project-euler/evaluate.py", "examples/project-euler/compare_transfer.py", "examples/project-euler/evaluate_tool_rl.py", "examples/project-euler/evaluate_transfer.py", "examples/project-euler/evaluate_tinker.py", "examples/project-euler/pi_sandbox_tools.ts", "examples/project-euler/preflight_tool_rl.py", "examples/project-euler/replay_gate_v2.py", "examples/project-euler/replay_transfer_v2.py", "examples/project-euler/score.py", "examples/project-euler/src/euler_pi_rl.py", "examples/project-euler/src/euler_tool_rl.py", "examples/project-euler/src/euler_variants.py", "examples/project-euler/src/pi_docker_sandbox.py", "examples/project-euler/src/pi_rl_tasks.py", "examples/project-euler/src/transfer_tasks.py", "examples/project-euler/train_grpo.py", "examples/project-euler/train_pi_grpo.py", "examples/project-euler/train_tool_grpo.py", "examples/project-euler/train_tool_sft.py", "examples/project-euler/tinker_proxy_provider.ts", "examples/minimal-sft/README.md", "examples/minimal-sft/make_corpus.py", "extensions/tinker.ts", "lib/tinker-catalog.ts", "skills/tinker-research/SKILL.md", "skills/tinker-debug/SKILL.md", "docs/tinker/commands.md", ]) { if (!files.includes(required)) { console.error(`npm package is missing ${required}`); process.exit(1); } } console.log(`package test passed (${files.length} files, ${result.size} bytes)`);