const assert = require("node:assert/strict"); const { execFileSync } = require("node:child_process"); const { readFileSync } = require("node:fs"); const path = require("node:path"); // OpenSpec CLI is installed globally (no npm pin: its transitive braces advisory has no 3.x fix). // This check fails fast with an actionable message instead of silently using another version. const root = path.resolve(__dirname, ".."); const expectedCli = readFileSync(path.join(root, "openspec/.cli-version"), "utf8").trim(); const expectedNode = readFileSync(path.join(root, ".nvmrc"), "utf8").trim(); const store = "wealth-ledger-specs"; const run = (command, args) => execFileSync(command, args, { cwd: root, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }).trim(); assert.equal( process.version.replace(/^v/, ""), expectedNode, `Node ${process.version} differs from .nvmrc ${expectedNode}. Run: nvm use --silent`, ); let cliVersion; try { cliVersion = run("openspec", ["--version"]); } catch { assert.fail(`openspec CLI not found. Install it globally: npm install -g @fission-ai/openspec@${expectedCli}`); } assert.equal( cliVersion, expectedCli, `openspec ${cliVersion} differs from openspec/.cli-version ${expectedCli}. Reinstall: npm install -g @fission-ai/openspec@${expectedCli}`, ); // Store presence is checked by the CLI itself: an unknown store must fail, not fall back silently. try { run("openspec", ["validate", "--specs", "--store", store]); } catch (error) { assert.fail(`openspec store '${store}' is not usable: ${error.stderr || error.stdout || error.message}`); } console.log(`openspec ${cliVersion} on Node ${expectedNode}: toolchain matches`);