ShiboSoftwareDev/i-wan
This code defines a PCB and schematic for a microcontroller development board, incorporating various surface-mount components (resistors, capacitors, headers, connectors, crystals, and an IC), with detailed footprints, electrical nets, and routing instructions.
- Version
- 1.0.10
- License
- unset
- Stars
- 0
scripts/fix-kicad-export.mjs
import { readFileSync, writeFileSync } from "node:fs"
import { resolve } from "node:path"
const inputPath = resolve(process.argv[2])
const outputPath = resolve(process.argv[3] ?? process.argv[2])
let pcb = readFileSync(inputPath, "utf8")
// circuit-json-to-kicad currently emits the pre-KiCad-9 numeric layer IDs.
// KiCad 9+ uses a different fixed ID table, including even IDs for copper.
const kicad9LayerIds = {
"F.Cu": 0,
"In1.Cu": 2,
"In2.Cu": 4,
"B.Cu": 6,
"F.Mask": 1,
"B.Mask": 3,
"F.SilkS": 5,
"B.SilkS": 7,
"F.Adhes": 9,
"B.Adhes": 11,
"F.Paste": 13,
"B.Paste": 15,
"Dwgs.User": 17,
"Cmts.User": 19,
"Eco1.User": 21,
"Eco2.User": 23,
"Edge.Cuts": 25,
Margin: 27,
"B.CrtYd": 29,
"F.CrtYd": 31,
"B.Fab": 33,
"F.Fab": 35,
}
for (const [name, id] of Object.entries(kicad9LayerIds)) {
const escapedName = name.replaceAll(".", "\\.")
pcb = pcb.replace(
new RegExp(`^(\\s*)\\(\\d+ "${escapedName}" (signal|user)\\)
scripts/fix-kicad-export.mjs - ShiboSoftwareDev/i-wan - tscircuit
scripts/fix-kicad-export.mjs - ShiboSoftwareDev/i-wan - tscircuit
, \"m\"),\n `$1(${id} \"${name}\" $2)`,\n )\n}\n\npcb = pcb\n .replace(\"(generator circuit-json-to-kicad)\", '(generator \"circuit-json-to-kicad\")')\n .replace(\"(generator_version 0.0.1)\", '(generator_version \"0.0.1\")')\n\n// KiCad 10 requires layer-name atoms and the paper name to be quoted.\npcb = pcb.replace(/\\(paper\\s+A4\\s*\\)/g, '(paper \"A4\")')\npcb = pcb.replace(\n /\\((layer|layers) ([^)\\r\\n]+)\\)/g,\n (_match, keyword, names) =\u003e {\n const quotedNames = names\n .trim()\n .split(/\\s+/)\n .map((name) =\u003e (name.startsWith('\"') ? name : `\"${name}\"`))\n .join(\" \")\n return `(${keyword} ${quotedNames})`\n },\n)\n\n// KiCad vias name exactly their start and end copper layers. The converter\n// emits every traversed layer, which crashes KiCad's board loader.\npcb = pcb.replace(\n /\\(layers ((?:\"(?:F\\.Cu|In1\\.Cu|In2\\.Cu|B\\.Cu)\"\\s*){3,})\\)/g,\n (_match, layerList) =\u003e {\n const layers = layerList.match(/\"[^\"]+\"/g)\n return `(layers ${layers[0]} ${layers.at(-1)})`\n },\n)\n\n// KiCad's s-expression number lexer does not accept JavaScript exponent form.\npcb = pcb.replace(/[+-]?\\d+\\.\\d+[eE][+-]?\\d+/g, (number) =\u003e {\n const fixed = Number(number).toFixed(12).replace(/\\.?0+$/, \"\")\n return fixed === \"-0\" || fixed === \"\" ? \"0\" : fixed\n})\n\nwriteFileSync(outputPath, pcb)\nconsole.log(`Corrected tscircuit KiCad layer syntax in ${outputPath}`)\n","content_mimetype":"text/javascript","created_at":"2026-08-15T03:05:14.514Z"}; window.SSR_PACKAGE_RELEASES = [{"package_release_id":"9bfa1999-b425-4952-8249-5f83cff53514","package_id":"38c372ed-36a8-4b22-8581-6cbdc7d0dc4b","version":"1.0.10","github_commit_sha":null,"is_locked":false,"is_latest":true,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-08-15T03:03:23.805Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-bd04be262682d1cb405da00641720c28","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=9bfa1999-b425-4952-8249-5f83cff53514\u0026file_path=dist%2Fchecks%2Fcheck-shorts%2Frepros%2Finner1-as-top%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=9bfa1999-b425-4952-8249-5f83cff53514\u0026file_path=dist%2Fchecks%2Fcheck-shorts%2Frepros%2Finner1-as-top%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=9bfa1999-b425-4952-8249-5f83cff53514\u0026file_path=dist%2Fchecks%2Fcheck-shorts%2Frepros%2Finner1-as-top%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"8d96e7f6-e86a-4ca0-9d5b-1fa835d1d056","user_code_job_started_at":"2026-08-15T03:05:28.594Z","user_code_job_completed_at":"2026-08-15T03:10:31.277Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=52ce280f437bc3d9c8f4045f191130103086847f73f4247426e9630d030b1d4a","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"1eec1d1f-1e7b-4b3e-b240-f896bf951ea9","package_id":"38c372ed-36a8-4b22-8581-6cbdc7d0dc4b","version":"1.0.9","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":false,"is_pr_preview":false,"created_at":"2026-08-15T03:00:54.787Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-ccd47dadaa1d6281fe0606709601565b","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":null,"sch_preview_image_url":null,"cad_preview_image_url":null,"package_release_website_url":null,"display_status":"pending","latest_package_build_id":null,"user_code_job_started_at":null,"user_code_job_completed_at":null,"user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":null,"ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"447fc939-929d-4266-95b1-2bf932826a02","package_id":"38c372ed-36a8-4b22-8581-6cbdc7d0dc4b","version":"1.0.8","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-08-14T22:12:40.808Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-f045ccad23c81291215aa1051ff77056","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=447fc939-929d-4266-95b1-2bf932826a02\u0026file_path=dist%2Fchecks%2Fcheck-shorts%2Frepros%2Finner1-as-top%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=447fc939-929d-4266-95b1-2bf932826a02\u0026file_path=dist%2Fchecks%2Fcheck-shorts%2Frepros%2Finner1-as-top%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=447fc939-929d-4266-95b1-2bf932826a02\u0026file_path=dist%2Fchecks%2Fcheck-shorts%2Frepros%2Finner1-as-top%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"c5bf1566-f892-4a63-a2a4-ff19be7b03c9","user_code_job_started_at":"2026-08-14T22:14:51.474Z","user_code_job_completed_at":"2026-08-14T22:20:27.816Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=c66da0d9ae1834bda9963e1aed1604cb8d239625b2c404b574ca2b4540cf9931","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"cfa97935-f3a5-4658-a5f4-6d1f0a47d30f","package_id":"38c372ed-36a8-4b22-8581-6cbdc7d0dc4b","version":"1.0.7","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":false,"is_pr_preview":false,"created_at":"2026-08-14T22:11:51.003Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-f78b3ce9146d116b9262f96f28cf724a","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":null,"sch_preview_image_url":null,"cad_preview_image_url":null,"package_release_website_url":null,"display_status":"pending","latest_package_build_id":null,"user_code_job_started_at":null,"user_code_job_completed_at":null,"user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":null,"ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"d9e56383-830c-477c-a718-1b5696d3ef51","package_id":"38c372ed-36a8-4b22-8581-6cbdc7d0dc4b","version":"1.0.6","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":false,"is_pr_preview":false,"created_at":"2026-08-14T22:08:35.667Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-734fd0bc19eeb8482f6cadf911980b0d","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":null,"sch_preview_image_url":null,"cad_preview_image_url":null,"package_release_website_url":null,"display_status":"pending","latest_package_build_id":null,"user_code_job_started_at":null,"user_code_job_completed_at":null,"user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":null,"ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"68d2fe98-2e3e-4abd-a078-373c612957e1","package_id":"38c372ed-36a8-4b22-8581-6cbdc7d0dc4b","version":"1.0.5","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-08-14T21:07:26.625Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-be62d325f8f079cfe3fd0ce06e81a2b2","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=68d2fe98-2e3e-4abd-a078-373c612957e1\u0026file_path=dist%2Fchecks%2Fcheck-shorts%2Frepros%2Finner1-as-top%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=68d2fe98-2e3e-4abd-a078-373c612957e1\u0026file_path=dist%2Fchecks%2Fcheck-shorts%2Frepros%2Finner1-as-top%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=68d2fe98-2e3e-4abd-a078-373c612957e1\u0026file_path=dist%2Fchecks%2Fcheck-shorts%2Frepros%2Finner1-as-top%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"97b5befe-fc47-41f4-9ddc-838671f71aa1","user_code_job_started_at":"2026-08-14T21:09:43.410Z","user_code_job_completed_at":"2026-08-14T21:14:31.515Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=a9f954124fd415ac4fe61ac70d04b799fbe12e473e2983518a3470552d5ed95a","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"0650a597-029b-4832-9892-00369931f80d","package_id":"38c372ed-36a8-4b22-8581-6cbdc7d0dc4b","version":"1.0.4","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-08-14T17:12:51.675Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-f4a756d52742471ebcaac4f206ec69be","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=0650a597-029b-4832-9892-00369931f80d\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=0650a597-029b-4832-9892-00369931f80d\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=0650a597-029b-4832-9892-00369931f80d\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"7471e77c-ccae-4ba5-aefb-bda4bd21d953","user_code_job_started_at":"2026-08-14T17:14:26.936Z","user_code_job_completed_at":"2026-08-14T17:20:53.643Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=9730196186c5a84ca6c2f3e81d479c67f588ec73f5b79a5f5d730dce2bef306c","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"473398ee-5c50-4116-9b5f-a3931101ab18","package_id":"38c372ed-36a8-4b22-8581-6cbdc7d0dc4b","version":"1.0.3","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-08-13T09:53:30.580Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-b39c96500736aa506ee81d68229b8141","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=473398ee-5c50-4116-9b5f-a3931101ab18\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=473398ee-5c50-4116-9b5f-a3931101ab18\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=473398ee-5c50-4116-9b5f-a3931101ab18\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"ace30116-9357-452f-933a-73cc324ee49b","user_code_job_started_at":"2026-08-13T09:54:54.280Z","user_code_job_completed_at":"2026-08-13T09:59:28.125Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=5051825172860a1e0a5d326022397559bb703e6fc0b394f825d716bec16730c7","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"3fa737e0-b01b-4adb-8443-15ec2934d61f","package_id":"38c372ed-36a8-4b22-8581-6cbdc7d0dc4b","version":"1.0.2","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-08-13T09:09:23.852Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-56e1c68b1d1c1d6d78da2829d903d87f","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=3fa737e0-b01b-4adb-8443-15ec2934d61f\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=3fa737e0-b01b-4adb-8443-15ec2934d61f\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=3fa737e0-b01b-4adb-8443-15ec2934d61f\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"27b04b96-042b-4be5-9006-d70b8eef1415","user_code_job_started_at":"2026-08-13T09:10:58.667Z","user_code_job_completed_at":"2026-08-13T09:15:32.625Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=63f8d86b9f831e9f66f3651b4e4e38518b08426cf70316e3ebec8fc43fd1f3ac","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"a130e711-d4f4-4212-8780-bb607b991158","package_id":"38c372ed-36a8-4b22-8581-6cbdc7d0dc4b","version":"1.0.1","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-08-13T08:46:29.286Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-aeae3f7bdea36ab94120c394953b8aaf","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":null,"sch_preview_image_url":null,"cad_preview_image_url":null,"package_release_website_url":null,"display_status":"pending","latest_package_build_id":"9863a67b-1f6f-412e-9a54-72f24c7fe3a3","user_code_job_started_at":"2026-08-13T08:48:09.917Z","user_code_job_completed_at":"2026-08-13T09:18:11.448Z","user_code_job_error":{"message":"Build timed out after 30 minutes","error_code":"user_code_job_timeout"},"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=9fbf28ba05c1f62ffd745eee4476b63db14a9d0d8bead8a484b916393f80b211","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null}]; window.SSR_PACKAGE_BUILDS = []; window.SSR_PACKAGE_ROUTE = {"author":"ShiboSoftwareDev","packageName":"i-wan","packageNameWithScope":"ShiboSoftwareDev/i-wan","version":null,"isLegacyRoute":false,"kind":"file","filePath":"scripts/fix-kicad-export.mjs"};
, "m"),
`$1(${id} "${name}" $2)`,
)
}
pcb = pcb
.replace("(generator circuit-json-to-kicad)", '(generator "circuit-json-to-kicad")')
.replace("(generator_version 0.0.1)", '(generator_version "0.0.1")')
// KiCad 10 requires layer-name atoms and the paper name to be quoted.
pcb = pcb.replace(/\(paper\s+A4\s*\)/g, '(paper "A4")')
pcb = pcb.replace(
/\((layer|layers) ([^)\r\n]+)\)/g,
(_match, keyword, names) => {
const quotedNames = names
.trim()
.split(/\s+/)
.map((name) => (name.startsWith('"') ? name : `"${name}"`))
.join(" ")
return `(${keyword} ${quotedNames})`
},
)
// KiCad vias name exactly their start and end copper layers. The converter
// emits every traversed layer, which crashes KiCad's board loader.
pcb = pcb.replace(
/\(layers ((?:"(?:F\.Cu|In1\.Cu|In2\.Cu|B\.Cu)"\s*){3,})\)/g,
(_match, layerList) => {
const layers = layerList.match(/"[^"]+"/g)
return `(layers ${layers[0]} ${layers.at(-1)})`
},
)
// KiCad's s-expression number lexer does not accept JavaScript exponent form.
pcb = pcb.replace(/[+-]?\d+\.\d+[eE][+-]?\d+/g, (number) => {
const fixed = Number(number).toFixed(12).replace(/\.?0+$/, "")
return fixed === "-0" || fixed === "" ? "0" : fixed
})
writeFileSync(outputPath, pcb)
console.log(`Corrected tscircuit KiCad layer syntax in ${outputPath}`)