#!/usr/bin/env node import { existsSync, readFileSync } from "node:fs"; import { execFileSync } from "node:child_process"; const required = [ "package.json", "README.md", "CHANGELOG.md", "LICENSE", "extensions/machine.ts", "lib/storage.ts", "lib/cli.ts", "lib/examples.ts", "lib/fork.ts", "lib/report.ts", "lib/trajectory.ts", "lib/statusline.ts", "lib/tinker-catalog.ts", "lib/python.ts", "extensions/train.ts", "extensions/tinker.ts", "skills/tinker-research/SKILL.md", "skills/tinker-debug/SKILL.md", "docs/tinker/commands.md", "scripts/machine-cli.mjs", "scripts/tinker-agent-cli.mjs", "templates/train_sft.py", "templates/eval.py", "scripts/validate-dataset.py", "docs/commands.md", "examples/project-euler/README.md", "examples/project-euler/config.example.toml", "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_tinker.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", ]; let failed = false; for (const file of required) { if (!existsSync(file)) { console.error(`missing required file: ${file}`); failed = true; } } try { execFileSync(process.execPath, ["--check", "extensions/machine.ts"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "extensions/train.ts"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "lib/cli.ts"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "lib/examples.ts"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "lib/fork.ts"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "lib/report.ts"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "lib/trajectory.ts"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "lib/statusline.ts"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "lib/tinker-catalog.ts"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "extensions/tinker.ts"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "mods/tinker-provider.ts"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "scripts/tinker-agent-cli.mjs"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "scripts/machine-cli.mjs"], { stdio: "pipe" }); execFileSync(process.execPath, ["--check", "examples/project-euler/pi_sandbox_tools.ts"], { stdio: "pipe", }); execFileSync( "python3", [ "-m", "py_compile", "examples/project-euler/compare_transfer.py", "examples/project-euler/evaluate.py", "examples/project-euler/evaluate_transfer.py", "examples/project-euler/replay_gate_v2.py", "examples/project-euler/replay_transfer_v2.py", "examples/project-euler/score.py", "examples/project-euler/train_pi_grpo.py", "examples/project-euler/src/euler_pi_rl.py", "examples/project-euler/src/pi_docker_sandbox.py", "examples/project-euler/src/pi_rl_tasks.py", "examples/project-euler/src/transfer_tasks.py", ], { stdio: "pipe" }, ); } catch (error) { console.error("source syntax check failed"); console.error(error.stderr?.toString() || error.message); failed = true; } const pkg = JSON.parse(readFileSync("package.json", "utf8")); if (!pkg.pi?.extensions) { console.error("package.json: missing pi.extensions"); failed = true; } if (!pkg.pi?.skills) { console.error("package.json: missing pi.skills"); failed = true; } if (pkg.bin?.["machine-tinker-agent"] !== "./scripts/tinker-agent-cli.mjs") { console.error("package.json: missing machine-tinker-agent binary"); failed = true; } if (pkg.bin?.machine !== "./scripts/machine-cli.mjs") { console.error("package.json: missing machine binary"); failed = true; } if (!pkg.keywords?.includes("pi-package")) { console.error("package.json: missing pi-package keyword"); failed = true; } if (!pkg.engines?.node) { console.error("package.json: missing engines.node"); failed = true; } const source = readFileSync("extensions/machine.ts", "utf8"); for (const command of ['registerCommand("good"', 'registerCommand("bad"', 'registerCommand("tagged"', 'registerCommand("machine"']) { if (!source.includes(command)) { console.error(`extensions/machine.ts: missing ${command}`); failed = true; } } if (!source.includes('tag: "observed"')) { console.error("extensions/machine.ts: automatic traces must be observed, not good"); failed = true; } if (!source.includes('subcommand === "fork"')) { console.error("extensions/machine.ts: missing /machine fork"); failed = true; } if (!source.includes('subcommand === "correction"')) { console.error("extensions/machine.ts: missing /machine correction"); failed = true; } const lettaSource = readFileSync("mods/machine.ts", "utf8"); if (!lettaSource.includes('subcommand === "fork"')) { console.error("mods/machine.ts: missing /machine fork"); failed = true; } if (!lettaSource.includes('subcommand === "correction"')) { console.error("mods/machine.ts: missing /machine correction"); failed = true; } if (lettaSource.includes('tag: "good"') && !lettaSource.includes('tag: "observed"')) { console.error("mods/machine.ts: automatic traces must be observed, not good"); failed = true; } if (!source.includes("readMachineSettings(ctx.cwd).autoTrace")) { console.error("extensions/machine.ts: automatic capture must use the persisted opt-in setting"); failed = true; } const trainSource = readFileSync("extensions/train.ts", "utf8"); if (!trainSource.includes('registerCommand("train"')) { console.error("extensions/train.ts: missing registerCommand(\"train\")"); failed = true; } const tinkerSource = readFileSync("extensions/tinker.ts", "utf8"); if (!tinkerSource.includes('registerCommand("tinker"')) { console.error("extensions/tinker.ts: missing registerCommand(\"tinker\")"); failed = true; } const catalog = readFileSync("lib/tinker-catalog.ts", "utf8"); for (const id of ['"Qwen/Qwen3.8-27B"', '"Qwen/Qwen3.8-27B:peft:262144"', '"thinkingmachines/Inkling-Small:peft:262144"']) { if (!catalog.includes(id)) { console.error(`lib/tinker-catalog.ts: missing ${id}`); failed = true; } } if (failed) process.exit(1); console.log("smoke test passed");