#!/usr/bin/env node import crypto from "node:crypto"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); const docs = path.join(root, "docs/p6"); const runtime = JSON.parse(fs.readFileSync(path.join(docs, "partdesign-runtime.json"), "utf8")); const fixture = { base: { type: "Part::Box", dimensions: [1, 1, 1] }, feature: { type: "PartDesign::AdditiveBox", dimensions: [2, 3, 4] } }; const result = runtime.result.action; if (result.run !== 1 || result.error !== "" || Math.abs(result.volume - 24) > 1e-9 || result.recomputeCount !== 1 || result.objectCount !== 2 || result.documentsAfter !== 0) throw new Error(JSON.stringify(result)); const report = { schema: "freecad-web-partdesign-kernel/v1", task_id: "FW-P6-PDN-C", status: "pass", source_revision: runtime.source_revision, input_sha256: crypto.createHash("sha256").update(JSON.stringify(fixture)).digest("hex"), fixture, result: { run: result.run, recomputeCount: result.recomputeCount, objectCount: result.objectCount, volume: result.volume, objectType: "PartDesign::AdditiveBox", baseType: "Part::Box", resourcesReleased: result.documentsAfter === 0 }, result_sha256: crypto.createHash("sha256").update(JSON.stringify(result)).digest("hex"), commands: ["node tools/run_p6_partdesign_runtime.mjs freecad-source/build-web/configure/bin"], artifacts: { runtime: "docs/p6/partdesign-runtime.json", wasm: runtime.artifacts.wasm }, boundaries: ["The native AdditiveBox feature is recomputed with a native Part::Box BaseFeature; the Body aggregate path remains a separate recovery boundary because GUI-free recompute currently raises map::at.", "No JavaScript geometry or static volume is used.", "Invalid input recovery, Facade, Chrome and persistence are later cards."], }; fs.writeFileSync(path.join(docs, "partdesign-kernel.json"), `${JSON.stringify(report, null, 2)}\n`); fs.writeFileSync(path.join(root, "docs/freecad-p6-partdesign-c-kernel.log"), `${JSON.stringify({ status: report.status, objectType: report.result.objectType, volume: report.result.volume, resourcesReleased: report.result.resourcesReleased })}\n`); console.log(JSON.stringify({ status: report.status, objectType: report.result.objectType, volume: report.result.volume }));