shibosoftwaredev/f1c100s-linux-nema17-stepper-controller

A four-layer NEMA 17 motor-controller PCB combining an Allwinner F1C100S Linux computer, USB‑PD/buck power system, W5500 Ethernet, STM32 real-time motion control, DRV8825 stepper driver, protection/temperature/current telemetry, USB interfaces, and local LED/buzzer diagnostics.

Version
0.4.56
License
unset
Stars
0

scripts/prepare-review-publication.mjs

/** Freeze a clean publishing snapshot; do not upload working experiments. */
import fs from "node:fs"
import path from "node:path"
import crypto from "node:crypto"
import assert from "node:assert/strict"

const source=process.cwd()
const status=JSON.parse(fs.readFileSync("reports/review-fix-status.json","utf8"))
const hash=bytes=>crypto.createHash("sha256").update(bytes).digest("hex")
assert.equal(hash(fs.readFileSync("dist/index/circuit.json")),status.circuitSha256)
assert.equal(status.native.errors,0);assert.equal(status.drill.added,0)
assert.equal(status.catalog.findings,0);assert.equal(status.fabricationReady,false)
const base=path.resolve("../../publish-staging")
fs.mkdirSync(base,{recursive:true})
const destination=fs.mkdtempSync(path.join(base,"nema17-review-fixes-"))
const evidence=new Set([
  "review-fix-status.json","full-board-review.json","bom-validation.json",
  "jlcpcb-stock-audit.json","fix-regression.json","drill-clearance-regression.json",
  "additional-dfm-review.json","connectivity-audit.json","coil-all-copper-preflight.json",
  "coil-session-kelvin.json","module-test-regression.json","export-gate-test.json",
  "current-sensing-promotion.json","current-sense-status.json",
])
const skipped=new Set(["node_modules","fabrication","fabrication-history","__pycache__"])
const files=[]
function copy(directory){
  for(const entry of fs.readdirSync(path.join(source,directory),{withFileTypes:true})){
    if(entry.name.startsWith(".")||skipped.has(entry.name))continue
    const relative=path.join(directory,entry.name)
    if(relative==="firmware/stm32/build")continue
    if(directory==="reports"&&!evidence.has(entry.name))continue
    if(entry.isDirectory()){copy(relative);continue}
    assert.ok(entry.isFile(),`Do not publish an unexpected link: ${relative}`)
    const bytes=fs.readFileSync(path.join(source,relative))
    const target=path.join(destination,relative)
    fs.mkdirSync(path.dirname(target),{recursive:true});fs.copyFileSync(path.join(source,relative),target)
    files.push({file:relative,bytes:bytes.length,sha256:hash(bytes)})
  }
}
copy("")
for(const file of ["review-placement-fixes.json","routing/complete-routes.json","routing/expected-input.json",
  "imports/CA55_D050M226TE100.tsx","dist/index/circuit.json","README.md"])
  assert.ok(files.some(item=>item.file===file),`${file} is in the snapshot`)
const manifest={createdAt:new Date().toISOString(),source,destination,
  packageName:"shibosoftwaredev/f1c100s-linux-nema17-stepper-controller",
  fabricationReady:false,circuitSha256:status.circuitSha256,files:files.sort((a,b)=>a.file.localeCompare(b.file))}
fs.writeFileSync("reports/review-fix-publish-manifest.json",JSON.stringify(manifest,null,2)+"\n")
console.log(JSON.stringify({destination,fileCount:files.length,totalBytes:files.reduce((n,f)=>n+f.bytes,0),
  circuitSha256:status.circuitSha256,fabricationReady:false}))