@faicad/faijs 0.22.2 → 0.29.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/LICENSE +202 -28
  2. package/dist/api/api-namespace.d.ts +5 -5
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +4 -4
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/assert.d.ts +2 -2
  7. package/dist/api/assert.js +8 -8
  8. package/dist/api/assert.js.map +1 -1
  9. package/dist/api/asset.d.ts +1 -1
  10. package/dist/api/asset.js +2 -2
  11. package/dist/api/asset.js.map +1 -1
  12. package/dist/api/boolean.d.ts +1 -1
  13. package/dist/api/boolean.d.ts.map +1 -1
  14. package/dist/api/boolean.js +128 -16
  15. package/dist/api/boolean.js.map +1 -1
  16. package/dist/api/cadquery-selectors/borrow-bridge.d.ts +14 -0
  17. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -0
  18. package/dist/api/cadquery-selectors/borrow-bridge.js +52 -0
  19. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -0
  20. package/dist/api/cadquery-selectors/edge.d.ts +40 -0
  21. package/dist/api/cadquery-selectors/edge.d.ts.map +1 -0
  22. package/dist/api/cadquery-selectors/edge.js +70 -0
  23. package/dist/api/cadquery-selectors/edge.js.map +1 -0
  24. package/dist/api/cadquery-selectors/entity.d.ts +121 -0
  25. package/dist/api/cadquery-selectors/entity.d.ts.map +1 -0
  26. package/dist/api/cadquery-selectors/entity.js +167 -0
  27. package/dist/api/cadquery-selectors/entity.js.map +1 -0
  28. package/dist/api/cadquery-selectors/face.d.ts +33 -0
  29. package/dist/api/cadquery-selectors/face.d.ts.map +1 -0
  30. package/dist/api/cadquery-selectors/face.js +353 -0
  31. package/dist/api/cadquery-selectors/face.js.map +1 -0
  32. package/dist/api/cadquery-selectors/grammar.d.ts +50 -0
  33. package/dist/api/cadquery-selectors/grammar.d.ts.map +1 -0
  34. package/dist/api/cadquery-selectors/grammar.js +345 -0
  35. package/dist/api/cadquery-selectors/grammar.js.map +1 -0
  36. package/dist/api/cadquery-selectors/index.d.ts +18 -0
  37. package/dist/api/cadquery-selectors/index.d.ts.map +1 -0
  38. package/dist/api/cadquery-selectors/index.js +17 -0
  39. package/dist/api/cadquery-selectors/index.js.map +1 -0
  40. package/dist/api/cadquery-selectors/predicates.d.ts +76 -0
  41. package/dist/api/cadquery-selectors/predicates.d.ts.map +1 -0
  42. package/dist/api/cadquery-selectors/predicates.js +85 -0
  43. package/dist/api/cadquery-selectors/predicates.js.map +1 -0
  44. package/dist/api/cadquery-selectors/resolve.d.ts +41 -0
  45. package/dist/api/cadquery-selectors/resolve.d.ts.map +1 -0
  46. package/dist/api/cadquery-selectors/resolve.js +243 -0
  47. package/dist/api/cadquery-selectors/resolve.js.map +1 -0
  48. package/dist/api/cadquery-selectors/types.d.ts +96 -0
  49. package/dist/api/cadquery-selectors/types.d.ts.map +1 -0
  50. package/dist/api/cadquery-selectors/types.js +11 -0
  51. package/dist/api/cadquery-selectors/types.js.map +1 -0
  52. package/dist/api/chamfer.d.ts +13 -5
  53. package/dist/api/chamfer.d.ts.map +1 -1
  54. package/dist/api/chamfer.js +63 -7
  55. package/dist/api/chamfer.js.map +1 -1
  56. package/dist/api/compound-geom.d.ts +1 -1
  57. package/dist/api/compound-geom.js +1 -1
  58. package/dist/api/compound-geom.js.map +1 -1
  59. package/dist/api/draft.d.ts +1 -1
  60. package/dist/api/draft.js +1 -1
  61. package/dist/api/draft.js.map +1 -1
  62. package/dist/api/edge-ref.d.ts +1 -1
  63. package/dist/api/edge-ref.d.ts.map +1 -1
  64. package/dist/api/edge-ref.js +11 -3
  65. package/dist/api/edge-ref.js.map +1 -1
  66. package/dist/api/engrave.d.ts +1 -1
  67. package/dist/api/engrave.js +7 -7
  68. package/dist/api/engrave.js.map +1 -1
  69. package/dist/api/extrude.d.ts +6 -1
  70. package/dist/api/extrude.d.ts.map +1 -1
  71. package/dist/api/extrude.js +59 -5
  72. package/dist/api/extrude.js.map +1 -1
  73. package/dist/api/face-ref.d.ts +1 -1
  74. package/dist/api/face-ref.js +1 -1
  75. package/dist/api/face-ref.js.map +1 -1
  76. package/dist/api/feature-repair.d.ts +1 -1
  77. package/dist/api/feature-repair.js +1 -1
  78. package/dist/api/feature-repair.js.map +1 -1
  79. package/dist/api/fillet-variable.d.ts +1 -1
  80. package/dist/api/fillet-variable.js +1 -1
  81. package/dist/api/fillet-variable.js.map +1 -1
  82. package/dist/api/fillet.d.ts +28 -8
  83. package/dist/api/fillet.d.ts.map +1 -1
  84. package/dist/api/fillet.js +64 -9
  85. package/dist/api/fillet.js.map +1 -1
  86. package/dist/api/geom.d.ts +1 -1
  87. package/dist/api/geom.js +1 -1
  88. package/dist/api/geom.js.map +1 -1
  89. package/dist/api/helix.d.ts +1 -1
  90. package/dist/api/helix.js +1 -1
  91. package/dist/api/helix.js.map +1 -1
  92. package/dist/api/import-brep.d.ts +20 -2
  93. package/dist/api/import-brep.d.ts.map +1 -1
  94. package/dist/api/import-brep.js +28 -3
  95. package/dist/api/import-brep.js.map +1 -1
  96. package/dist/api/import-step.d.ts +17 -2
  97. package/dist/api/import-step.d.ts.map +1 -1
  98. package/dist/api/import-step.js +23 -3
  99. package/dist/api/import-step.js.map +1 -1
  100. package/dist/api/index.d.ts +2 -1
  101. package/dist/api/index.d.ts.map +1 -1
  102. package/dist/api/index.js +5 -2
  103. package/dist/api/index.js.map +1 -1
  104. package/dist/api/internal/compat-op.js +1 -1
  105. package/dist/api/internal/compat-op.js.map +1 -1
  106. package/dist/api/internal/mesh-solid-op.d.ts +236 -0
  107. package/dist/api/internal/mesh-solid-op.d.ts.map +1 -0
  108. package/dist/api/internal/mesh-solid-op.js +352 -0
  109. package/dist/api/internal/mesh-solid-op.js.map +1 -0
  110. package/dist/api/internal/svg-asset-resolver.d.ts +1 -1
  111. package/dist/api/internal/svg-asset-resolver.js +1 -1
  112. package/dist/api/internal/svg-asset-resolver.js.map +1 -1
  113. package/dist/api/knurl.d.ts +1 -1
  114. package/dist/api/knurl.js +2 -2
  115. package/dist/api/knurl.js.map +1 -1
  116. package/dist/api/loft.d.ts +1 -1
  117. package/dist/api/loft.js +1 -1
  118. package/dist/api/loft.js.map +1 -1
  119. package/dist/api/measurement/index.d.ts +9 -5
  120. package/dist/api/measurement/index.d.ts.map +1 -1
  121. package/dist/api/measurement/index.js +47 -20
  122. package/dist/api/measurement/index.js.map +1 -1
  123. package/dist/api/pattern.d.ts +5 -3
  124. package/dist/api/pattern.d.ts.map +1 -1
  125. package/dist/api/pattern.js +32 -4
  126. package/dist/api/pattern.js.map +1 -1
  127. package/dist/api/place.d.ts +1 -1
  128. package/dist/api/place.js +1 -1
  129. package/dist/api/place.js.map +1 -1
  130. package/dist/api/primitives.d.ts +1 -1
  131. package/dist/api/primitives.js +2 -2
  132. package/dist/api/primitives.js.map +1 -1
  133. package/dist/api/profile.d.ts +39 -12
  134. package/dist/api/profile.d.ts.map +1 -1
  135. package/dist/api/profile.js +4 -4
  136. package/dist/api/profile.js.map +1 -1
  137. package/dist/api/reconcile.d.ts +1 -1
  138. package/dist/api/reconcile.js +1 -1
  139. package/dist/api/reconcile.js.map +1 -1
  140. package/dist/api/replicate.d.ts.map +1 -1
  141. package/dist/api/replicate.js +122 -1
  142. package/dist/api/replicate.js.map +1 -1
  143. package/dist/api/screw.d.ts +1 -1
  144. package/dist/api/screw.js +3 -3
  145. package/dist/api/screw.js.map +1 -1
  146. package/dist/api/sdf.d.ts +1 -1
  147. package/dist/api/sdf.js +2 -2
  148. package/dist/api/sdf.js.map +1 -1
  149. package/dist/api/section-by-plane.d.ts +1 -1
  150. package/dist/api/section-by-plane.d.ts.map +1 -1
  151. package/dist/api/section-by-plane.js +2 -1
  152. package/dist/api/section-by-plane.js.map +1 -1
  153. package/dist/api/shell.d.ts +11 -4
  154. package/dist/api/shell.d.ts.map +1 -1
  155. package/dist/api/shell.js +53 -7
  156. package/dist/api/shell.js.map +1 -1
  157. package/dist/api/sketch-on-face.d.ts +41 -0
  158. package/dist/api/sketch-on-face.d.ts.map +1 -1
  159. package/dist/api/sketch-on-face.js +100 -1
  160. package/dist/api/sketch-on-face.js.map +1 -1
  161. package/dist/api/sketch-on-plane.d.ts +7 -5
  162. package/dist/api/sketch-on-plane.d.ts.map +1 -1
  163. package/dist/api/sketch-on-plane.js +6 -7
  164. package/dist/api/sketch-on-plane.js.map +1 -1
  165. package/dist/api/split-by-plane.d.ts +1 -1
  166. package/dist/api/split-by-plane.d.ts.map +1 -1
  167. package/dist/api/split-by-plane.js +2 -1
  168. package/dist/api/split-by-plane.js.map +1 -1
  169. package/dist/api/split.d.ts +1 -1
  170. package/dist/api/split.js +2 -2
  171. package/dist/api/split.js.map +1 -1
  172. package/dist/api/sweep.d.ts +1 -1
  173. package/dist/api/sweep.js +1 -1
  174. package/dist/api/sweep.js.map +1 -1
  175. package/dist/api/thicken.d.ts +1 -1
  176. package/dist/api/thicken.js +1 -1
  177. package/dist/api/thicken.js.map +1 -1
  178. package/dist/api/topo-resolve.d.ts +74 -1
  179. package/dist/api/topo-resolve.d.ts.map +1 -1
  180. package/dist/api/topo-resolve.js +180 -2
  181. package/dist/api/topo-resolve.js.map +1 -1
  182. package/dist/api/transform.d.ts +5 -1
  183. package/dist/api/transform.d.ts.map +1 -1
  184. package/dist/api/transform.js +62 -11
  185. package/dist/api/transform.js.map +1 -1
  186. package/dist/api/wire.d.ts +1 -1
  187. package/dist/api/wire.js +1 -1
  188. package/dist/api/wire.js.map +1 -1
  189. package/dist/brep/brep-ops.d.ts +9 -7
  190. package/dist/brep/brep-ops.d.ts.map +1 -1
  191. package/dist/brep/brep-ops.js +23 -24
  192. package/dist/brep/brep-ops.js.map +1 -1
  193. package/dist/brep/brep-topology.d.ts +5 -4
  194. package/dist/brep/brep-topology.d.ts.map +1 -1
  195. package/dist/brep/brep-topology.js +6 -5
  196. package/dist/brep/brep-topology.js.map +1 -1
  197. package/dist/brep/effective-deflection.d.ts +35 -0
  198. package/dist/brep/effective-deflection.d.ts.map +1 -0
  199. package/dist/brep/effective-deflection.js +49 -0
  200. package/dist/brep/effective-deflection.js.map +1 -0
  201. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  202. package/dist/brep/engine/adapters/brep-mock.js +27 -0
  203. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  204. package/dist/brep/engine/adapters/brepkit.d.ts +18 -0
  205. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  206. package/dist/brep/engine/adapters/brepkit.js +46 -1
  207. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  208. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  209. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  210. package/dist/brep/engine/adapters/occt.js +3 -1
  211. package/dist/brep/engine/adapters/occt.js.map +1 -1
  212. package/dist/brep/engine/primitives.d.ts +29 -7
  213. package/dist/brep/engine/primitives.d.ts.map +1 -1
  214. package/dist/brep/engine/primitives.js.map +1 -1
  215. package/dist/brep/engine/registry.d.ts +24 -1
  216. package/dist/brep/engine/registry.d.ts.map +1 -1
  217. package/dist/brep/engine/registry.js +24 -0
  218. package/dist/brep/engine/registry.js.map +1 -1
  219. package/dist/brep/engine/types.d.ts +54 -3
  220. package/dist/brep/engine/types.d.ts.map +1 -1
  221. package/dist/brep/engine/types.js +10 -0
  222. package/dist/brep/engine/types.js.map +1 -1
  223. package/dist/brep/export/export-model.d.ts.map +1 -1
  224. package/dist/brep/export/export-model.js +6 -5
  225. package/dist/brep/export/export-model.js.map +1 -1
  226. package/dist/brep/face-evolution.d.ts +1 -1
  227. package/dist/brep/face-evolution.d.ts.map +1 -1
  228. package/dist/brep/face-evolution.js +20 -1
  229. package/dist/brep/face-evolution.js.map +1 -1
  230. package/dist/brep/handle-bridge.d.ts +1 -1
  231. package/dist/brep/handle-bridge.js +1 -1
  232. package/dist/brep/handle-bridge.js.map +1 -1
  233. package/dist/brep/mesh-solid.d.ts +218 -0
  234. package/dist/brep/mesh-solid.d.ts.map +1 -0
  235. package/dist/brep/mesh-solid.js +229 -0
  236. package/dist/brep/mesh-solid.js.map +1 -0
  237. package/dist/brep/text/fontRegistry.d.ts +32 -1
  238. package/dist/brep/text/fontRegistry.d.ts.map +1 -1
  239. package/dist/brep/text/fontRegistry.js +51 -1
  240. package/dist/brep/text/fontRegistry.js.map +1 -1
  241. package/dist/brep/text/text-to-solid.d.ts.map +1 -1
  242. package/dist/brep/text/text-to-solid.js +8 -3
  243. package/dist/brep/text/text-to-solid.js.map +1 -1
  244. package/dist/brepkit-kernel/brepkitKernel.d.ts +18 -2
  245. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  246. package/dist/brepkit-kernel/brepkitKernel.js +449 -123
  247. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  248. package/dist/brepkit-kernel/brepkitWasm.d.ts +8 -0
  249. package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
  250. package/dist/brepkit-kernel/brepkitWasm.js +10 -0
  251. package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
  252. package/dist/browser-host/browser-font-provider.d.ts +12 -0
  253. package/dist/browser-host/browser-font-provider.d.ts.map +1 -1
  254. package/dist/browser-host/browser-font-provider.js +25 -0
  255. package/dist/browser-host/browser-font-provider.js.map +1 -1
  256. package/dist/browser.d.ts +6 -3
  257. package/dist/browser.d.ts.map +1 -1
  258. package/dist/browser.js +10 -3
  259. package/dist/browser.js.map +1 -1
  260. package/dist/cad-runtime/backend-dispatch.d.ts +28 -3
  261. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  262. package/dist/cad-runtime/backend-dispatch.js +119 -4
  263. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  264. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  265. package/dist/cad-runtime/direct-executor.d.ts +15 -3
  266. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  267. package/dist/cad-runtime/direct-executor.js +33 -1
  268. package/dist/cad-runtime/direct-executor.js.map +1 -1
  269. package/dist/cad-runtime/ports.d.ts +3 -3
  270. package/dist/cad-runtime/ports.d.ts.map +1 -1
  271. package/dist/cad-runtime/ports.js.map +1 -1
  272. package/dist/cad-runtime/preview-exec.d.ts +4 -4
  273. package/dist/cad-runtime/preview-exec.js +2 -2
  274. package/dist/cad-runtime/preview-exec.js.map +1 -1
  275. package/dist/cad-runtime/runtime.d.ts +42 -7
  276. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  277. package/dist/cad-runtime/runtime.js +68 -5
  278. package/dist/cad-runtime/runtime.js.map +1 -1
  279. package/dist/define-op.d.ts +15 -1
  280. package/dist/define-op.d.ts.map +1 -1
  281. package/dist/define-op.js +10 -1
  282. package/dist/define-op.js.map +1 -1
  283. package/dist/env-agnostic.d.ts +2 -2
  284. package/dist/env-agnostic.d.ts.map +1 -1
  285. package/dist/env-agnostic.js +1 -1
  286. package/dist/env-agnostic.js.map +1 -1
  287. package/dist/geometry2d/adapt.d.ts +39 -4
  288. package/dist/geometry2d/adapt.d.ts.map +1 -1
  289. package/dist/geometry2d/adapt.js +14 -3
  290. package/dist/geometry2d/adapt.js.map +1 -1
  291. package/dist/geometry2d/blueprint.d.ts +2 -2
  292. package/dist/geometry2d/blueprint.js +2 -2
  293. package/dist/geometry2d/blueprint.js.map +1 -1
  294. package/dist/geometry2d/bridge/lift-on-plane.d.ts +18 -8
  295. package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -1
  296. package/dist/geometry2d/bridge/lift-on-plane.js +65 -12
  297. package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -1
  298. package/dist/geometry2d/bridge/plane.d.ts +17 -0
  299. package/dist/geometry2d/bridge/plane.d.ts.map +1 -1
  300. package/dist/geometry2d/bridge/plane.js +22 -0
  301. package/dist/geometry2d/bridge/plane.js.map +1 -1
  302. package/dist/geometry2d/curve2d.d.ts +25 -0
  303. package/dist/geometry2d/curve2d.d.ts.map +1 -1
  304. package/dist/geometry2d/curve2d.js +41 -5
  305. package/dist/geometry2d/curve2d.js.map +1 -1
  306. package/dist/index.d.ts +6 -2
  307. package/dist/index.d.ts.map +1 -1
  308. package/dist/index.js +10 -3
  309. package/dist/index.js.map +1 -1
  310. package/dist/io/bytes-node.d.ts +11 -0
  311. package/dist/io/bytes-node.d.ts.map +1 -0
  312. package/dist/io/bytes-node.js +28 -0
  313. package/dist/io/bytes-node.js.map +1 -0
  314. package/dist/io/bytes.d.ts +33 -0
  315. package/dist/io/bytes.d.ts.map +1 -0
  316. package/dist/io/bytes.js +41 -0
  317. package/dist/io/bytes.js.map +1 -0
  318. package/dist/io/fai-zip/container-read.d.ts +102 -0
  319. package/dist/io/fai-zip/container-read.d.ts.map +1 -0
  320. package/dist/io/fai-zip/container-read.js +305 -0
  321. package/dist/io/fai-zip/container-read.js.map +1 -0
  322. package/dist/io/fai-zip/container-write.d.ts +70 -0
  323. package/dist/io/fai-zip/container-write.d.ts.map +1 -0
  324. package/dist/io/fai-zip/container-write.js +186 -0
  325. package/dist/io/fai-zip/container-write.js.map +1 -0
  326. package/dist/io/fai-zip/container.d.ts +107 -0
  327. package/dist/io/fai-zip/container.d.ts.map +1 -0
  328. package/dist/io/fai-zip/container.js +89 -0
  329. package/dist/io/fai-zip/container.js.map +1 -0
  330. package/dist/io/fai-zip/index.d.ts +18 -0
  331. package/dist/io/fai-zip/index.d.ts.map +1 -0
  332. package/dist/io/fai-zip/index.js +4 -0
  333. package/dist/io/fai-zip/index.js.map +1 -0
  334. package/dist/io/index.d.ts +10 -0
  335. package/dist/io/index.d.ts.map +1 -0
  336. package/dist/io/index.js +13 -0
  337. package/dist/io/index.js.map +1 -0
  338. package/dist/io/zip.d.ts +68 -0
  339. package/dist/io/zip.d.ts.map +1 -0
  340. package/dist/io/zip.js +147 -0
  341. package/dist/io/zip.js.map +1 -0
  342. package/dist/lang/code-to-args.d.ts +1 -1
  343. package/dist/lang/code-to-args.js +1 -1
  344. package/dist/lang/code-to-args.js.map +1 -1
  345. package/dist/lang/statement-summary.d.ts +1 -1
  346. package/dist/lang/statement-summary.js +1 -1
  347. package/dist/lang/statement-summary.js.map +1 -1
  348. package/dist/lang/types.d.ts +1 -1
  349. package/dist/lang/types.js +1 -1
  350. package/dist/lang/types.js.map +1 -1
  351. package/dist/mesh/index.d.ts +2 -1
  352. package/dist/mesh/index.d.ts.map +1 -1
  353. package/dist/mesh/index.js +2 -1
  354. package/dist/mesh/index.js.map +1 -1
  355. package/dist/mesh/io.d.ts +7 -0
  356. package/dist/mesh/io.d.ts.map +1 -1
  357. package/dist/mesh/io.js +14 -17
  358. package/dist/mesh/io.js.map +1 -1
  359. package/dist/mesh/reconcile.d.ts +1 -1
  360. package/dist/mesh/reconcile.js +1 -1
  361. package/dist/mesh/reconcile.js.map +1 -1
  362. package/dist/mesh/rigid-transform.d.ts +3 -3
  363. package/dist/mesh/rigid-transform.js +3 -3
  364. package/dist/mesh/rigid-transform.js.map +1 -1
  365. package/dist/mesh/stl-unit.d.ts +24 -0
  366. package/dist/mesh/stl-unit.d.ts.map +1 -0
  367. package/dist/mesh/stl-unit.js +17 -0
  368. package/dist/mesh/stl-unit.js.map +1 -0
  369. package/dist/mesh/threemf-bambu.d.ts +142 -0
  370. package/dist/mesh/threemf-bambu.d.ts.map +1 -0
  371. package/dist/mesh/threemf-bambu.js +334 -0
  372. package/dist/mesh/threemf-bambu.js.map +1 -0
  373. package/dist/mesh/threemf-loader.d.ts +42 -7
  374. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  375. package/dist/mesh/threemf-loader.js +565 -100
  376. package/dist/mesh/threemf-loader.js.map +1 -1
  377. package/dist/mesh/threemf-view.d.ts +71 -0
  378. package/dist/mesh/threemf-view.d.ts.map +1 -0
  379. package/dist/mesh/threemf-view.js +100 -0
  380. package/dist/mesh/threemf-view.js.map +1 -0
  381. package/dist/node-host/cli.d.ts +44 -6
  382. package/dist/node-host/cli.d.ts.map +1 -1
  383. package/dist/node-host/cli.js +76 -26
  384. package/dist/node-host/cli.js.map +1 -1
  385. package/dist/node-host/font-family-index.d.ts +93 -0
  386. package/dist/node-host/font-family-index.d.ts.map +1 -0
  387. package/dist/node-host/font-family-index.js +273 -0
  388. package/dist/node-host/font-family-index.js.map +1 -0
  389. package/dist/node-host/fs-asset-resolver.d.ts +8 -3
  390. package/dist/node-host/fs-asset-resolver.d.ts.map +1 -1
  391. package/dist/node-host/fs-asset-resolver.js +13 -5
  392. package/dist/node-host/fs-asset-resolver.js.map +1 -1
  393. package/dist/node-host/index.d.ts +8 -0
  394. package/dist/node-host/index.d.ts.map +1 -1
  395. package/dist/node-host/index.js +1 -0
  396. package/dist/node-host/index.js.map +1 -1
  397. package/dist/node-host/node-font-provider.d.ts +28 -0
  398. package/dist/node-host/node-font-provider.d.ts.map +1 -1
  399. package/dist/node-host/node-font-provider.js +49 -0
  400. package/dist/node-host/node-font-provider.js.map +1 -1
  401. package/dist/node.d.ts +1 -0
  402. package/dist/node.d.ts.map +1 -1
  403. package/dist/node.js +1 -0
  404. package/dist/node.js.map +1 -1
  405. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  406. package/dist/occt-kernel/occt-primitives.js +35 -2
  407. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  408. package/dist/occt-kernel/occtKernel.d.ts +18 -13
  409. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  410. package/dist/occt-kernel/occtKernel.js +18 -31
  411. package/dist/occt-kernel/occtKernel.js.map +1 -1
  412. package/dist/occt-kernel/stepColorParser.d.ts +18 -0
  413. package/dist/occt-kernel/stepColorParser.d.ts.map +1 -1
  414. package/dist/occt-kernel/stepColorParser.js +38 -0
  415. package/dist/occt-kernel/stepColorParser.js.map +1 -1
  416. package/dist/occt-kernel/topologyExt.d.ts +1 -1
  417. package/dist/occt-kernel/topologyExt.d.ts.map +1 -1
  418. package/dist/occt-kernel/topologyExt.js +4 -5
  419. package/dist/occt-kernel/topologyExt.js.map +1 -1
  420. package/dist/primitives/text/cjk-font.d.ts +2 -15
  421. package/dist/primitives/text/cjk-font.d.ts.map +1 -1
  422. package/dist/primitives/text/cjk-font.js +13 -1
  423. package/dist/primitives/text/cjk-font.js.map +1 -1
  424. package/dist/runtime-state.d.ts +85 -9
  425. package/dist/runtime-state.d.ts.map +1 -1
  426. package/dist/runtime-state.js +72 -2
  427. package/dist/runtime-state.js.map +1 -1
  428. package/dist/sdk.d.ts +3 -3
  429. package/dist/sdk.d.ts.map +1 -1
  430. package/dist/sdk.js +5 -5
  431. package/dist/sdk.js.map +1 -1
  432. package/dist/shape.d.ts +97 -2
  433. package/dist/shape.d.ts.map +1 -1
  434. package/dist/shape.js +126 -1
  435. package/dist/shape.js.map +1 -1
  436. package/dist/topology/naming/lineage.d.ts +6 -0
  437. package/dist/topology/naming/lineage.d.ts.map +1 -1
  438. package/dist/topology/naming/lineage.js +8 -0
  439. package/dist/topology/naming/lineage.js.map +1 -1
  440. package/dist/topology/naming/resolve-edge.d.ts +20 -1
  441. package/dist/topology/naming/resolve-edge.d.ts.map +1 -1
  442. package/dist/topology/naming/resolve-edge.js +54 -20
  443. package/dist/topology/naming/resolve-edge.js.map +1 -1
  444. package/dist/weapp.d.ts +6 -2
  445. package/dist/weapp.d.ts.map +1 -1
  446. package/dist/weapp.js +7 -1
  447. package/dist/weapp.js.map +1 -1
  448. package/package.json +18 -2
@@ -42,9 +42,9 @@ const CLI_SCOPED_PREFIX = '@faicad/';
42
42
  /** 已登记短名 → scoped 全名归一表(仅收录 `@faicad/` 范围内的库,防同名陌生人包)。 */
43
43
  const CLI_SHORT_NAMES = {
44
44
  'sheetmetal': '@faicad/sheetmetal',
45
- 'cq-compat': '@faicad/cq-compat',
46
- 'fai-cq-gears': '@faicad/fai-cq-gears',
47
- 'fai-cq-warehouse': '@faicad/fai-cq-warehouse',
45
+ 'faijs-cadquery': '@faicad/faijs-cadquery',
46
+ 'faijs-gears': '@faicad/faijs-gears',
47
+ 'faijs-fasteners': '@faicad/faijs-fasteners',
48
48
  };
49
49
  /**
50
50
  * 读库 package.json 的 `faijs.autoLift` 字段(D3-autoLift 外置,§9.4):
@@ -144,11 +144,19 @@ export function cliCheck(filePath, _opts) {
144
144
  // D11 (2026-09-28): unknown-op guard. check() is syntax+reference only — an
145
145
  // op the cad namespace doesn't have used to pass `check` clean and die at
146
146
  // runtime (e.g. `cad.sketch is not a function` when a host forgets to merge
147
- // the sketch/draw libraries). Compare the script's callees against the
147
+ // the sketch library). Compare the script's callees against the
148
148
  // symbol-table union view (platform + registered library entries) and fail
149
149
  // the check on any unknown callee.
150
150
  if (result.ok && result.script) {
151
151
  const known = new Set(symbolTableNames());
152
+ // Ops the host merges at run time are not in the static table; accept the
153
+ // names it declares as known so check agrees with the run that follows.
154
+ for (const ns of Object.values(_opts?.libs ?? {})) {
155
+ if (ns && typeof ns === 'object') {
156
+ for (const key of Object.keys(ns))
157
+ known.add(key);
158
+ }
159
+ }
152
160
  const unknown = [...new Set(result.script.callees)].filter((n) => !known.has(n));
153
161
  for (const name of unknown) {
154
162
  errors.push({
@@ -215,7 +223,7 @@ export async function cliRun(filePath, outPath, opts) {
215
223
  // exception — the census and batch driver treat a throw as a process crash,
216
224
  // while `{ ok: false, error }` keeps it a per-file, classifiable failure.
217
225
  try {
218
- return await exportExecutionResult(outPath, ext, execResult, terminals);
226
+ return await exportExecutionResult(outPath, ext, execResult, terminals, opts?.includeHidden ?? false);
219
227
  }
220
228
  catch (e) {
221
229
  return {
@@ -225,9 +233,38 @@ export async function cliRun(filePath, outPath, opts) {
225
233
  };
226
234
  }
227
235
  }
236
+ /**
237
+ * 选出「可导出」的终端:默认剔除 hidden。
238
+ *
239
+ * 隐藏终端 = 「保留但不产出」(`keep` / `keepHidden` 语义,R5)。导出层必须默认跳过,
240
+ * 否则布尔运算保留的源几何会对每个 hidden 终端各写一个 `out.step_<i>_<name>` 产物,
241
+ * 让一个逻辑形状看起来像 N 个(FCStd port 的 `solids 1vsN` 失配即由此而来)。
242
+ * 需要旧行为(连同隐藏源一起写出,多用于诊断)时显式传 `includeHidden=true`。
243
+ *
244
+ * @param terminals - 存活终端集合(含 `hidden` 标记)
245
+ * @param includeHidden - 是否连同隐藏终端一起导出,缺省 false
246
+ * @returns `exportable`(可导出终端)与 `hiddenCount`(被剔除的隐藏终端数)
247
+ */
248
+ export function selectExportableTerminals(terminals, includeHidden = false) {
249
+ const hiddenCount = terminals.reduce((n, t) => (t.hidden ? n + 1 : n), 0);
250
+ const exportable = includeHidden ? [...terminals] : terminals.filter((t) => !t.hidden);
251
+ return { exportable, hiddenCount };
252
+ }
228
253
  /** Export an executed result to `outPath` (shared body of cliRun's export path). */
229
- async function exportExecutionResult(outPath, ext, execResult, terminals) {
230
- if (terminals.length === 0) {
254
+ async function exportExecutionResult(outPath, ext, execResult, terminals, includeHidden = false) {
255
+ const { exportable, hiddenCount } = selectExportableTerminals(terminals, includeHidden);
256
+ // 装配导出(writeAssemblyStep 的兜底路径)同样不得带出隐藏终端;includeHidden 时传 undefined。
257
+ const hiddenTerminals = includeHidden
258
+ ? undefined
259
+ : new Set(terminals.filter((t) => t.hidden).map((t) => String(t.id)));
260
+ // 有终端但全部隐藏 → 明确报错(不静默回退到「最后一个 output」,那等于把隐藏源漏出去)。
261
+ if (!includeHidden && exportable.length === 0 && hiddenCount > 0) {
262
+ return {
263
+ ok: false,
264
+ error: `All ${hiddenCount} live terminal(s) are hidden — nothing to export (pass includeHidden to export them)`,
265
+ };
266
+ }
267
+ if (exportable.length === 0) {
231
268
  // No terminals — use last output
232
269
  const outputNames = [...execResult.outputs.keys()];
233
270
  if (outputNames.length === 0) {
@@ -242,15 +279,15 @@ async function exportExecutionResult(outPath, ext, execResult, terminals) {
242
279
  return writeOutput(outPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined);
243
280
  }
244
281
  // Single terminal
245
- if (terminals.length === 1) {
246
- const terminal = terminals[0];
282
+ if (exportable.length === 1) {
283
+ const terminal = exportable[0];
247
284
  const shape = execResult.outputs.get(terminal.id);
248
285
  if (!shape) {
249
286
  return { ok: false, error: `No output for terminal "${terminal.id}"` };
250
287
  }
251
288
  // Assembly (compound with behavior) → expand members with colors
252
289
  if (!('positions' in shape) || !('indices' in shape)) {
253
- const asmResult = writeAssemblyStep(outPath, ext, shape, execResult);
290
+ const asmResult = writeAssemblyStep(outPath, ext, shape, execResult, hiddenTerminals);
254
291
  if (asmResult)
255
292
  return asmResult;
256
293
  }
@@ -259,21 +296,21 @@ async function exportExecutionResult(outPath, ext, execResult, terminals) {
259
296
  }
260
297
  // Multiple terminals — write each to a separate file
261
298
  // First, check if any terminal is a compound (assembly) — export it as a single STEP
262
- for (let i = 0; i < terminals.length; i++) {
263
- const terminal = terminals[i];
299
+ for (let i = 0; i < exportable.length; i++) {
300
+ const terminal = exportable[i];
264
301
  const shape = execResult.outputs.get(terminal.id);
265
302
  if (!shape)
266
303
  continue;
267
304
  if (!('positions' in shape) || !('indices' in shape)) {
268
305
  // Compound terminal — try assembly STEP export
269
- const asmResult = writeAssemblyStep(outPath, ext, shape, execResult);
306
+ const asmResult = writeAssemblyStep(outPath, ext, shape, execResult, hiddenTerminals);
270
307
  if (asmResult)
271
308
  return asmResult;
272
309
  }
273
310
  }
274
311
  // Then export non-compound terminals
275
- for (let i = 0; i < terminals.length; i++) {
276
- const terminal = terminals[i];
312
+ for (let i = 0; i < exportable.length; i++) {
313
+ const terminal = exportable[i];
277
314
  const shape = execResult.outputs.get(terminal.id);
278
315
  if (!shape)
279
316
  continue;
@@ -306,6 +343,7 @@ function parseViewArg(v) {
306
343
  /**
307
344
  * 选出待投影的 shape 列表(`--part` 指定,或按终端自动选择,与 `run` 一致):
308
345
  * 只保留带 mesh 的 shape(compound/assembly 无 mesh,无法投影,跳过)。
346
+ * 隐藏终端(keep/keepHidden 保留的源几何)默认不投影——与 `run` 同口径。
309
347
  */
310
348
  function selectViewShapes(execResult, part) {
311
349
  const outputs = execResult.outputs;
@@ -316,8 +354,11 @@ function selectViewShapes(execResult, part) {
316
354
  return [{ name: part, shape }];
317
355
  return [];
318
356
  }
319
- const terminals = execResult.terminals ?? [];
320
- const ids = terminals.length > 0 ? terminals.map((t) => t.id) : [...outputs.keys()];
357
+ // 隐藏终端默认不投影。全部终端皆隐藏 → 空集(**不**回退到「所有 outputs」,
358
+ // 否则会把全部中间量也画出来,与 run 的「全隐藏即无可导出」语义相悖)。
359
+ const allTerminals = execResult.terminals ?? [];
360
+ const { exportable: terminals } = selectExportableTerminals(allTerminals);
361
+ const ids = allTerminals.length > 0 ? terminals.map((t) => t.id) : [...outputs.keys()];
321
362
  const out = [];
322
363
  for (const id of ids) {
323
364
  const shape = outputs.get(id) ?? outputs.get(asPartName(String(id)));
@@ -405,10 +446,10 @@ export async function cliView(filePath, outPath, opts) {
405
446
  /**
406
447
  * 写出输出文件。
407
448
  *
408
- * 按零件类型分别处理 STEP 导出:
409
- * - 有 BREP solid → 精确 STEP(exportStepFromSolid,ADVANCED_FACE)
410
- * - 无 BREP solid → 三角化 STEP(exportStep/meshesToStep,faceted)
411
- * - STL:无论是否 BREP,都取 mesh Shape 导出
449
+ * 按零件类型分别处理导出:
450
+ * - STL:取网格载荷(BREP 零件先经内核三角化),无重建。
451
+ * - STEP:有 BREP solid → 精确 STEP(ADVANCED_FACE);无 BREP solid → 该零件的
452
+ * 三角网格经重建管线导出(exportModelSync 内的 mesh 条目通路)。
412
453
  *
413
454
  * keep-syntax §5.1:outputs 现含 compound(group/assembly 产物,无 mesh);
414
455
  * compound 无法导出,给出明确错误(此前"不在 outputs 中"是静默失败)。
@@ -453,7 +494,7 @@ function writeOutput(outPath, ext, shape, brepSolid) {
453
494
  * Returns null if the compound has no assembly behavior (falls through to
454
495
  * regular writeOutput), or a CliRunResult on success/failure.
455
496
  */
456
- function writeAssemblyStep(outPath, ext, compound, execResult) {
497
+ function writeAssemblyStep(outPath, ext, compound, execResult, hiddenTerminals) {
457
498
  if (ext !== 'step' && ext !== 'stp')
458
499
  return null;
459
500
  const slot = ensureSlot(compound);
@@ -509,6 +550,10 @@ function writeAssemblyStep(outPath, ext, compound, execResult) {
509
550
  // Fallback: export all brepSolids (covers compounds where memberNames wasn't propagated)
510
551
  if (entries.length === 0 && execResult.brepSolids) {
511
552
  for (const [key, solidEntry] of execResult.brepSolids) {
553
+ // 隐藏终端(keep/keepHidden 保留的源几何)不得借这条兜底路径落盘——
554
+ // 与主导出路径同一判据(includeHidden 时 hiddenTerminals 传 undefined,不过滤)。
555
+ if (hiddenTerminals?.has(String(key)))
556
+ continue;
512
557
  if (!kernel)
513
558
  kernel = solidEntry.kernel;
514
559
  entries.push({
@@ -546,6 +591,7 @@ export function parseArgs(argv) {
546
591
  let view;
547
592
  let sheet;
548
593
  let part;
594
+ let includeHidden;
549
595
  for (let i = 1; i < args.length; i++) {
550
596
  const arg = args[i];
551
597
  if (arg === '--out' || arg === '-o') {
@@ -575,21 +621,24 @@ export function parseArgs(argv) {
575
621
  else if (arg === '--part') {
576
622
  part = args[++i];
577
623
  }
624
+ else if (arg === '--include-hidden') {
625
+ includeHidden = true;
626
+ }
578
627
  else if (!file && !arg.startsWith('-')) {
579
628
  file = arg;
580
629
  }
581
630
  }
582
- return { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part };
631
+ return { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part, includeHidden };
583
632
  }
584
633
  /**
585
634
  * CLI main entry point (called by scripts/faijs-cli.ts).
586
635
  *
587
636
  * @param argv - the raw process argument list
588
- * @param libs - host-injected library namespace (includes cad — faijs-cli.ts passes createInternalStdlib; core does not assemble it by default)
637
+ * @param libs - host-injected library namespace (includes cad — faijs-cli.ts passes createApiNamespace; core does not assemble it by default)
589
638
  * @returns the process exit code (0 on success, non-zero on failure)
590
639
  */
591
640
  export async function cliMain(argv, libs) {
592
- const { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part } = parseArgs(argv);
641
+ const { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part, includeHidden } = parseArgs(argv);
593
642
  if (!command) {
594
643
  process.stderr.write('Usage: faijs-cli <check|run|view> <file.fai.js> [options]\n');
595
644
  process.stderr.write(' check <file> DryRun validation\n');
@@ -599,6 +648,7 @@ export async function cliMain(argv, libs) {
599
648
  process.stderr.write(' --assets <dir> Asset directory\n');
600
649
  process.stderr.write(' --fonts <dir> Extra fonts directory\n');
601
650
  process.stderr.write(' --project-root <dir> Project root for relative .fai.js imports\n');
651
+ process.stderr.write(' --include-hidden (run) also export hidden terminals (keep/keepHidden sources; default off)\n');
602
652
  process.stderr.write(' --part <name> (view) shape variable to project (default: terminals)\n');
603
653
  process.stderr.write(' --view <dir> (view) single view: front|back|top|bottom|left|right|iso|"x,y,z" (default front)\n');
604
654
  process.stderr.write(' --sheet <a,b,c> (view) multi-view sheet: front,top,right,iso (mutually exclusive with --view)\n');
@@ -634,7 +684,7 @@ export async function cliMain(argv, libs) {
634
684
  return 1;
635
685
  }
636
686
  const outPath = resolve(out);
637
- const result = await cliRun(filePath, outPath, { mode, assetsDir, fontsDir, projectRoot, libs });
687
+ const result = await cliRun(filePath, outPath, { mode, assetsDir, fontsDir, projectRoot, libs, includeHidden });
638
688
  if (result.ok) {
639
689
  process.stdout.write(`✓ ${filePath} → ${outPath} (${result.outputFormat})\n`);
640
690
  if (result.infos && result.infos.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/node-host/cli.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * faijs-cli — CLI 逻辑(可导入、可测试)。第三方调用入口:packages/core/scripts/faijs-cli.ts。\n * (仓库自用 doc/ci/开发脚本在根 scripts/ 与 packages/core/scripts/gen-*,见 scripts/README.md。)\n *\n *\n * 命令:\n * check <file.fai.js> — dryRun:parse + schema + 引用预检\n * run <file.fai.js> --out <file> — 执行并导出 STL/STEP\n * view <file.fai.js> --out <x.svg> — 执行并投影输出视图 SVG(三视图/等轴测)\n *\n * 选项:\n * --mode <auto|brep|mesh> — 执行模式(默认 auto;view 需要 BREP 路径)\n * --assets <dir> — 资产目录\n * --fonts <dir> — 额外字体目录\n * --part <name> — (view) 指定投影的 shape 变量名;缺省按终端自动选择\n * --view <front|back|top|bottom|left|right|iso|\"x,y,z\">\n * — (view) 单视图方向(默认 front)\n * --sheet <front,top,right,iso> — (view) 多视图图纸(projectSheet;与 --view 互斥)\n */\n\nimport { readFileSync, writeFileSync, existsSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { resolve, extname, dirname, join } from 'node:path'\nimport { createRuntime } from '../cad-runtime/runtime'\nimport type { CadRuntime } from '../cad-runtime/runtime'\nimport type { StdlibNamespace } from '../runtime-state'\nimport type { ExecutionMode, HostPorts, LibLoader } from '../cad-runtime/ports'\nimport { createNodePorts } from './index'\nimport { createFsProjectLoader, findProjectRoot, projectKeyOf } from './fs-project-loader'\nimport { exportModelSync } from '../brep/export/export-model'\nimport { exportStepFromSolids, type StepExportEntry } from '../brep/export/step'\nimport { solidToShape } from '../brep/brep-ops'\nimport { registerOcctBrepEngine } from '../brep/engine/adapters/occt'\nimport type { Shape } from '../mesh/types'\nimport type { CompoundShape } from '../shape'\nimport { ensureSlot } from '../shape'\nimport { brepOf } from '../shape'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { asPartName } from '../identity'\nimport { symbolTableNames } from '../lang/symbol-table'\nimport { projectView, projectSheet } from '../api/view'\nimport type { ViewSpec } from '../api/view/view-camera'\n\n// ── P 四(4.4):Node CLI 自动装载(D3-Node,§9.4)──\n// 脚本 import 的第三方库按 specifier 动态解析,host 不再写死任何包清单:\n// - scoped 包名(`@faicad/...`)直接动态 import;\n// - 短名(如 `sheetmetal`)先归一为 scoped 全名再装载(避免误装同名陌生人包)。\n// 包未安装 → 动态 import 抛 ERR_MODULE_NOT_FOUND,由 runtime 报明确装载失败信息。\n/** scoped 包名前缀:CLI 允许动态装载的库范围。 */\nconst CLI_SCOPED_PREFIX = '@faicad/'\n/** 已登记短名 → scoped 全名归一表(仅收录 `@faicad/` 范围内的库,防同名陌生人包)。 */\nconst CLI_SHORT_NAMES: Record<string, string> = {\n 'sheetmetal': '@faicad/sheetmetal',\n 'cq-compat': '@faicad/cq-compat',\n 'fai-cq-gears': '@faicad/fai-cq-gears',\n 'fai-cq-warehouse': '@faicad/fai-cq-warehouse',\n}\n\n/**\n * 读库 package.json 的 `faijs.autoLift` 字段(D3-autoLift 外置,§9.4):\n * 逐库 autoLift 约定从 host 写死改为由各库自身 package.json 声明,loader 此处读取。\n * 未声明 → 返回 undefined(回落到 runtime 的推断式 `!hasDualOp(ns)`);\n * 声明为布尔 → 直接采用(如 cq-compat 声明 false,因其函数以 faijs Shape 为受众,\n * 被 compat 边界整体提升会破坏内部借面逻辑)。\n */\nconst requireNode = createRequire(import.meta.url)\nfunction readLibAutoLift(pkg: string): boolean | undefined {\n try {\n const pjPath = requireNode.resolve(`${pkg}/package.json`)\n const pj = JSON.parse(readFileSync(pjPath, 'utf8')) as { faijs?: { autoLift?: boolean } }\n const v = pj.faijs?.autoLift\n return typeof v === 'boolean' ? v : undefined\n } catch {\n return undefined\n }\n}\n\n/** specifier → scoped 全名归一:scoped 名原样,已登记短名映射,其余原样交 import 解析。 */\nfunction normalizeCliSpecifier(name: string): string {\n return CLI_SHORT_NAMES[name] ?? name\n}\n\nconst cliPortsLibLoader: LibLoader = {\n loadLib: async (name) => {\n const pkg = normalizeCliSpecifier(name)\n if (!pkg.startsWith(CLI_SCOPED_PREFIX)) {\n throw new Error(`package \"${name}\" is not a scoped @faicad/ library`)\n }\n return (await import(pkg)) as StdlibNamespace\n },\n listLibs: () => [...Object.keys(CLI_SHORT_NAMES), '@faicad/'],\n loadSource: async (name) => {\n const pkg = normalizeCliSpecifier(name)\n if (!pkg.startsWith(CLI_SCOPED_PREFIX)) return undefined\n try {\n const req = createRequire(import.meta.url)\n const pkgJsonPath = req.resolve(`${pkg}/package.json`)\n const pkgDir = dirname(pkgJsonPath)\n for (const p of [join(pkgDir, 'src', 'index.ts'), join(pkgDir, 'dist', 'index.js'), join(pkgDir, 'src', 'index.js')]) {\n if (existsSync(p)) return readFileSync(p, 'utf-8')\n }\n return undefined\n } catch {\n return undefined\n }\n },\n // 默认不提升(与历史 CLI 行为一致);各库用 package.json \"faijs.autoLift\" 逐库覆盖。\n options: {\n autoLift: false,\n autoLiftFor: (name) => {\n const pkg = normalizeCliSpecifier(name)\n return pkg.startsWith(CLI_SCOPED_PREFIX) ? readLibAutoLift(pkg) : undefined\n },\n },\n}\n\n/** 注入 libLoader 到 node ports(CLI 宿主白名单装载)。 */\nfunction withCliLibLoader(ports: HostPorts): HostPorts {\n return { ...ports, libLoader: cliPortsLibLoader }\n}\n\n/**\n * 注入 projectLoader 到 node ports(多文件 §4.5)。\n *\n * 项目根缺省由 `findProjectRoot` 从入口文件向上找最近的 `package.json`;\n * 宿主可用 `--project-root` 覆盖。未提供根(不应发生)时不注入,单文件行为不变。\n */\nfunction withCliProjectLoader(ports: HostPorts, root: string | undefined): HostPorts {\n if (!root) return ports\n return { ...ports, projectLoader: createFsProjectLoader(root) }\n}\n\n/** Options accepted by the `check` command. */\nexport interface CliCheckOptions {\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n}\n\n/** Options accepted by the `run` command. */\nexport interface CliRunOptions {\n /** Execution mode ('auto' | 'brep' | 'mesh'). */\n mode?: ExecutionMode\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n /** Default font path used by the node ports. */\n defaultFontPath?: string\n /** Host-injected library namespace (includes cad — the CLI entry faijs-cli.ts passes createInternalStdlib; core does not assemble it by default). */\n libs?: Record<string, StdlibNamespace>\n /**\n * 项目根(多文件 §4.5):相对 import 的解析基准,moduleKey = 相对它的路径。\n * 缺省由入口文件向上找最近的 package.json。\n */\n projectRoot?: string\n}\n\n/** Result of the `check` (dry-run validation) command. */\nexport interface CliCheckResult {\n /** Whether the validation passed. */\n ok: boolean\n /** Validation errors found, one per stage. */\n errors: Array<{ stage: string; message: string; line?: number; stmtId?: string }>\n /** Non-fatal warnings reported during validation. */\n warnings: string[]\n /** Script-level summary when the script parsed successfully. */\n script?: { statements: number; callees: string[] }\n}\n\n/** Result of the `run` (execute and export) command. */\nexport interface CliRunResult {\n /** Whether execution and export succeeded. */\n ok: boolean\n /** The written output file path. */\n outputFile?: string\n /** The written output format ('stl' | 'step'). */\n outputFormat?: string\n /** A human-readable error message when the command failed. */\n error?: string\n /** Informational messages collected during execution. */\n infos?: string[]\n}\n\n/** Options accepted by the `view` command. */\nexport interface CliViewOptions {\n /** Execution mode ('auto' | 'brep' | 'mesh'). view 需要 BREP 路径(mesh-only 无投影)。 */\n mode?: ExecutionMode\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n /** Default font path used by the node ports. */\n defaultFontPath?: string\n /** Host-injected library namespace (includes cad). */\n libs?: Record<string, StdlibNamespace>\n /** Project root for relative .fai.js imports. */\n projectRoot?: string\n /** Shape variable name to project; default resolves terminals like `run`. */\n part?: string\n /** Single view direction (default 'front'); mutually exclusive with sheet. */\n view?: ViewSpec\n /** Multi-view sheet list (projectSheet); mutually exclusive with view. */\n sheet?: ViewSpec[]\n}\n\n/** Result of the `view` (execute and project SVG) command. */\nexport interface CliViewResult {\n /** Whether execution and projection succeeded. */\n ok: boolean\n /** The written SVG file path(s). */\n outputFiles?: string[]\n /** A human-readable error message when the command failed. */\n error?: string\n /** Informational messages collected during execution. */\n infos?: string[]\n}\n\n/**\n * Execute the `check` command: dry-run validate a .fai.js file.\n *\n * @param filePath - path to the .fai.js file to validate\n * @param _opts - optional CLI check options (assets and fonts directories)\n * @returns the check result with any validation errors\n */\nexport function cliCheck(filePath: string, _opts?: CliCheckOptions): CliCheckResult {\n const code = readFileSync(filePath, 'utf-8')\n const ports = withCliLibLoader(createNodePorts({\n assetsDir: _opts?.assetsDir,\n fontsDir: _opts?.fontsDir,\n }))\n const runtime = createRuntime(ports)\n const result = runtime.check(code)\n const errors = result.errors.map((e) => ({\n stage: e.stage,\n message: e.message,\n line: e.line,\n stmtId: e.stmtId,\n }))\n // D11 (2026-09-28): unknown-op guard. check() is syntax+reference only — an\n // op the cad namespace doesn't have used to pass `check` clean and die at\n // runtime (e.g. `cad.sketch is not a function` when a host forgets to merge\n // the sketch/draw libraries). Compare the script's callees against the\n // symbol-table union view (platform + registered library entries) and fail\n // the check on any unknown callee.\n if (result.ok && result.script) {\n const known = new Set(symbolTableNames())\n const unknown = [...new Set(result.script.callees)].filter((n) => !known.has(n))\n for (const name of unknown) {\n errors.push({\n stage: 'symbol',\n message: `unknown op: cad.${name} is not in the cad namespace (host library not merged or op name misspelled)`,\n line: undefined,\n stmtId: undefined,\n })\n }\n }\n return {\n ok: result.ok && errors.length === 0,\n errors,\n warnings: result.warnings,\n script: result.script,\n }\n}\n\n/**\n * Execute the `run` command: execute a .fai.js file and export STL/STEP.\n *\n * @param filePath - path to the .fai.js file to execute\n * @param outPath - output file path for the exported result (extension determines format)\n * @param opts - optional run options (mode, assets/fonts directories, injected libs)\n * @returns the run result describing success or failure\n */\nexport async function cliRun(\n filePath: string,\n outPath: string,\n opts?: CliRunOptions,\n): Promise<CliRunResult> {\n const code = readFileSync(filePath, 'utf-8')\n // 多文件(§4.5):项目根缺省向上找 package.json;入口自身也有 key(相对根的路径),\n // 否则入口在子目录时它的 `./parts/x.fai.js` 会以根为基准解析而错位。\n const projectRoot = opts?.projectRoot ? resolve(opts.projectRoot) : findProjectRoot(filePath)\n const entryKey = projectKeyOf(projectRoot, filePath)\n\n // Initialize OCCT and bind the vendored brepjs kernel registry (D10) so that\n // cq-compat parts (which project ops through compatFn) run end-to-end under\n // the CLI. registerOcctBrepEngine is idempotent and itself boots initOcctWasm.\n await registerOcctBrepEngine()\n\n // Create runtime with node ports\n const ports = withCliProjectLoader(\n withCliLibLoader(createNodePorts({\n assetsDir: opts?.assetsDir,\n fontsDir: opts?.fontsDir,\n defaultFontPath: opts?.defaultFontPath,\n })),\n projectRoot,\n )\n const runtime = createRuntime(ports, opts?.mode ?? 'auto', opts?.libs)\n // Part 1.4:cad 经 registerLib 声明 packageName(脚本可 `import * as cad from\n // '@faicad/faijs'`,check ①.5 据此校验 specifier——不 declare 则 import 被拒)。\n if (opts?.libs?.cad) {\n runtime.registerLib('cad', opts.libs.cad, {\n default: true,\n packageName: '@faicad/faijs',\n })\n }\n\n // Execute(T5 后:direct 路径,源码文本直通执行)\n const execResult = await runtime.execute(code, { entryKey })\n\n if (execResult.failedAt) {\n return {\n ok: false,\n error: `Execution failed at statement ${execResult.failedAt.index} (callee: ${execResult.failedAt.callee}): ${execResult.failedAt.message}`,\n infos: execResult.infos,\n }\n }\n\n // Determine output format from extension\n const ext = extname(outPath).toLowerCase().slice(1)\n const terminals = execResult.terminals ?? []\n\n // E1 (H12): export-side failures must surface as a structured result, not an\n // exception — the census and batch driver treat a throw as a process crash,\n // while `{ ok: false, error }` keeps it a per-file, classifiable failure.\n try {\n return await exportExecutionResult(outPath, ext, execResult, terminals)\n } catch (e) {\n return {\n ok: false,\n error: `Export failed: ${String((e as Error)?.message ?? e)}`,\n infos: execResult.infos,\n }\n }\n}\n\n/** Export an executed result to `outPath` (shared body of cliRun's export path). */\nasync function exportExecutionResult(\n outPath: string,\n ext: string,\n execResult: Awaited<ReturnType<CadRuntime['execute']>>,\n terminals: NonNullable<Awaited<ReturnType<CadRuntime['execute']>>['terminals']>,\n): Promise<{ ok: boolean; error?: string; outputFile?: string; outputFormat?: string; infos?: string[] }> {\n if (terminals.length === 0) {\n // No terminals — use last output\n const outputNames = [...execResult.outputs.keys()]\n if (outputNames.length === 0) {\n return { ok: false, error: 'No statements to export' }\n }\n const lastPartName = outputNames[outputNames.length - 1]\n const shape = execResult.outputs.get(asPartName(lastPartName))\n if (!shape) {\n return { ok: false, error: `No output for part \"${lastPartName}\"` }\n }\n const solidEntry = execResult.brepSolids?.get(asPartName(lastPartName))\n return writeOutput(outPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n }\n\n // Single terminal\n if (terminals.length === 1) {\n const terminal = terminals[0]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) {\n return { ok: false, error: `No output for terminal \"${terminal.id}\"` }\n }\n // Assembly (compound with behavior) → expand members with colors\n if (!('positions' in shape) || !('indices' in shape)) {\n const asmResult = writeAssemblyStep(outPath, ext, shape as CompoundShape, execResult)\n if (asmResult) return asmResult\n }\n const solidEntry = execResult.brepSolids?.get(terminal.id)\n return writeOutput(outPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n }\n\n // Multiple terminals — write each to a separate file\n // First, check if any terminal is a compound (assembly) — export it as a single STEP\n for (let i = 0; i < terminals.length; i++) {\n const terminal = terminals[i]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) continue\n if (!('positions' in shape) || !('indices' in shape)) {\n // Compound terminal — try assembly STEP export\n const asmResult = writeAssemblyStep(outPath, ext, shape as CompoundShape, execResult)\n if (asmResult) return asmResult\n }\n }\n // Then export non-compound terminals\n for (let i = 0; i < terminals.length; i++) {\n const terminal = terminals[i]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) continue\n if (!('positions' in shape) || !('indices' in shape)) continue // skip compounds\n\n const name = terminal.meta?.name ?? terminal.id\n const sep = outPath.endsWith('/') || outPath.endsWith('\\\\') ? '' : '_'\n const terminalOutPath = `${outPath}${sep}${i}_${name}.${ext}`\n const solidEntry = execResult.brepSolids?.get(terminal.id)\n const result = writeOutput(terminalOutPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n if (!result.ok) return result\n }\n\n return { ok: true, outputFormat: ext }\n}\n\n/**\n * 解析 `--view` 参数:三数字逗号串 → 方向对象(\"1,-1,1\" → { dir: [1,-1,1] }),\n * 否则按视图名字符串处理(未知名由 viewCamera 抛错)。\n */\nfunction parseViewArg(v: string): ViewSpec {\n const parts = v.split(',').map((s) => s.trim())\n if (parts.length === 3) {\n const nums = parts.map(Number)\n if (nums.every((n) => Number.isFinite(n))) return { dir: nums as [number, number, number] }\n }\n // 视图名字符串('front'|'iso'|…):类型上 CLI 接受任意名称,未知名由 viewCamera 抛错。\n return v as ViewSpec\n}\n\n/**\n * 选出待投影的 shape 列表(`--part` 指定,或按终端自动选择,与 `run` 一致):\n * 只保留带 mesh 的 shape(compound/assembly 无 mesh,无法投影,跳过)。\n */\nfunction selectViewShapes(\n execResult: {\n outputs: Map<unknown, Shape | CompoundShape>\n terminals?: Array<{ id: unknown; meta?: { name?: string } }>\n },\n part?: string,\n): Array<{ name: string; shape: Shape }> {\n const outputs = execResult.outputs\n const viewable = (s: Shape | CompoundShape | undefined): s is Shape =>\n !!s && 'positions' in s && 'indices' in s\n\n if (part) {\n const shape = outputs.get(asPartName(part)) ?? outputs.get(part)\n if (viewable(shape)) return [{ name: part, shape }]\n return []\n }\n\n const terminals = execResult.terminals ?? []\n const ids: unknown[] = terminals.length > 0 ? terminals.map((t) => t.id) : [...outputs.keys()]\n const out: Array<{ name: string; shape: Shape }> = []\n for (const id of ids) {\n const shape = outputs.get(id) ?? outputs.get(asPartName(String(id)))\n if (viewable(shape)) {\n const metaName = terminals.find((t) => t.id === id)?.meta?.name\n out.push({ name: metaName ?? String(id), shape })\n }\n }\n return out\n}\n\n/**\n * Execute the `view` command: execute a .fai.js file and write view SVG(s).\n *\n * 投影在宿主侧进行:脚本只需建模(shape 变量或终端),CLI 调 projectView(--view,\n * 缺省 front)或 projectSheet(--sheet)把 SVG 字符串写盘。view 需要 BREP 路径——\n * mesh-only 的 shape 无 brep 槽,projectView 抛 E_BREP_ONLY_INPUT(提示 --mode brep/auto)。\n *\n * @param filePath - path to the .fai.js file to execute\n * @param outPath - output SVG path (multiple shapes get `<out>_<i>_<name>.svg` suffixes)\n * @param opts - optional view options (mode, part, view/sheet, assets/fonts dirs, libs)\n * @returns the view result describing success or failure\n */\nexport async function cliView(\n filePath: string,\n outPath: string,\n opts?: CliViewOptions,\n): Promise<CliViewResult> {\n const code = readFileSync(filePath, 'utf-8')\n const projectRoot = opts?.projectRoot ? resolve(opts.projectRoot) : findProjectRoot(filePath)\n const entryKey = projectKeyOf(projectRoot, filePath)\n\n // Initialize OCCT(投影 HLR 依赖 brep 内核)。registerOcctBrepEngine is\n // idempotent and itself boots initOcctWasm, and also binds the vendored\n // brepjs kernel registry (D10) — same boot path as cliRun above.\n await registerOcctBrepEngine()\n\n const ports = withCliProjectLoader(\n withCliLibLoader(createNodePorts({\n assetsDir: opts?.assetsDir,\n fontsDir: opts?.fontsDir,\n defaultFontPath: opts?.defaultFontPath,\n })),\n projectRoot,\n )\n const runtime = createRuntime(ports, opts?.mode ?? 'auto', opts?.libs)\n if (opts?.libs?.cad) {\n runtime.registerLib('cad', opts.libs.cad, {\n default: true,\n packageName: '@faicad/faijs',\n })\n }\n\n const execResult = await runtime.execute(code, { entryKey })\n\n if (execResult.failedAt) {\n return {\n ok: false,\n error: `Execution failed at statement ${execResult.failedAt.index} (callee: ${execResult.failedAt.callee}): ${execResult.failedAt.message}`,\n infos: execResult.infos,\n }\n }\n\n const shapes = selectViewShapes(execResult, opts?.part)\n if (shapes.length === 0) {\n return {\n ok: false,\n error: opts?.part\n ? `No output for part \"${opts.part}\"`\n : 'No viewable (mesh-bearing) shapes to project',\n infos: execResult.infos,\n }\n }\n\n const outFiles: string[] = []\n const single = shapes.length === 1\n for (let i = 0; i < shapes.length; i++) {\n const { name, shape } = shapes[i]\n const target = single\n ? outPath\n : `${outPath}${outPath.endsWith('/') || outPath.endsWith('\\\\') ? '' : '_'}${i}_${name}.svg`\n try {\n const svg = opts?.sheet\n ? projectSheet(shape, opts.sheet)\n : projectView(shape, opts?.view ?? 'front')\n writeFileSync(target, svg, 'utf-8')\n outFiles.push(target)\n } catch (e) {\n return {\n ok: false,\n error: `Projection failed for \"${name}\": ${(e as Error).message}`,\n infos: execResult.infos,\n }\n }\n }\n return { ok: true, outputFiles: outFiles, infos: execResult.infos }\n}\n\n/**\n * 写出输出文件。\n *\n * 按零件类型分别处理 STEP 导出:\n * - 有 BREP solid → 精确 STEP(exportStepFromSolid,ADVANCED_FACE)\n * - 无 BREP solid → 三角化 STEP(exportStep/meshesToStep,faceted)\n * - STL:无论是否 BREP,都取 mesh Shape 导出\n *\n * keep-syntax §5.1:outputs 现含 compound(group/assembly 产物,无 mesh);\n * compound 无法导出,给出明确错误(此前\"不在 outputs 中\"是静默失败)。\n */\nfunction writeOutput(\n outPath: string,\n ext: string,\n shape: Shape | CompoundShape,\n brepSolid?: { solid: BrepHandle; kernel: BrepEngineApi },\n): CliRunResult {\n if (!('positions' in shape) || !('indices' in shape)) {\n return {\n ok: false,\n error: `Output \"${outPath}\" is a compound (group/assembly) with no exportable mesh; export a member shape instead`,\n }\n }\n // 统一导出入口(R11):坐标换算与单位声明由 exportModel 同源产出。\n // CLI 无单位选项 → 缺省 mm(与既有行为一致)。\n const fmt = ext === 'stp' ? 'step' : ext\n if (fmt !== 'stl' && fmt !== 'step') {\n return { ok: false, error: `Unsupported output format: .${ext} (supported: .stl, .step)` }\n }\n // STL 只吃 mesh(export-model §10.6:solid 条目由调用方先三角化)。auto 模式下\n // 形状可能是 BREP solid → 导出 STL 前必须先用内核三角化,否则「no mesh entries」。\n // STEP 则直接走 solid 条目保留 ADVANCED_FACE 拓扑。\n let entry: { solid?: BrepHandle; mesh?: { positions: Float32Array; indices: Uint32Array } }\n if (brepSolid) {\n if (fmt === 'stl') {\n const tri = solidToShape(brepSolid.kernel, brepSolid.solid)\n entry = { mesh: { positions: tri.positions, indices: tri.indices } }\n } else {\n entry = { solid: brepSolid.solid }\n }\n } else {\n entry = { mesh: { positions: shape.positions, indices: shape.indices } }\n }\n const buffer = exportModelSync([entry], fmt)\n writeFileSync(outPath, Buffer.from(buffer))\n return { ok: true, outputFile: outPath, outputFormat: fmt }\n}\n\n/**\n * Export an assembly (compound with AssemblyBehavior) as a multi-entity STEP\n * file, preserving member names and colors (from behavior.memberColors).\n *\n * Returns null if the compound has no assembly behavior (falls through to\n * regular writeOutput), or a CliRunResult on success/failure.\n */\nfunction writeAssemblyStep(\n outPath: string,\n ext: string,\n compound: CompoundShape,\n execResult: {\n outputs: Map<unknown, Shape | CompoundShape>\n brepSolids?: Map<unknown, { solid: BrepHandle; kernel: BrepEngineApi }>\n },\n): CliRunResult | null {\n if (ext !== 'step' && ext !== 'stp') return null\n const slot = ensureSlot(compound)\n const behavior = slot.behavior as\n | { memberNames?: string[]; memberColors?: Record<string, [number, number, number]> }\n | undefined\n\n // Find a kernel and collect all exportable solids\n let kernel: BrepEngineApi | null = null\n const entries: StepExportEntry[] = []\n\n // Preferred path: use behavior.memberNames to match colors.\n // Member name lookup tries (1) the explicit member name, then (2) the kept\n // script-variable name of the compound's i-th child — cq-compat's\n // buildAssembly passes CadQuery-style part names (\"axk\") while the shapes\n // are registered under their .fai.js variable names (\"shape_axk\").\n if (behavior?.memberNames && behavior.memberNames.length > 0) {\n // Member Shape list (same order as memberNames) — when a member name\n // misses in brepSolids (e.g. cq libs register short names like 'axk' while\n // the statement variable is 'shape_axk'), resolve the member shape by index\n // and extract its BREP solid, keeping the member name and color.\n const children = (compound as { children?: Shape[] }).children ?? []\n for (let i = 0; i < behavior.memberNames.length; i++) {\n const memberName = behavior.memberNames[i]\n // Preferred: read the member's LIVE identity slot (brepOf) — assembly\n // transforms are baked into slot.solid by the executor's\n // applyPendingAssemblyTransforms AFTER this statement, so the brepSolids\n // snapshot (registered at member creation) may hold the PRE-transform\n // handle. GOTCHA: don't reorder — brepSolids entries are stale for\n // transformed members.\n const child = children[i]\n const liveSolid = child ? (brepOf(child) as BrepHandle | undefined) : undefined\n if (liveSolid) {\n if (!kernel) kernel = execResult.brepSolids?.values().next().value?.kernel ?? null\n if (kernel) {\n entries.push({\n solid: liveSolid,\n name: memberName,\n color: behavior.memberColors?.[memberName],\n })\n continue\n }\n }\n const solidEntry = execResult.brepSolids?.get(asPartName(memberName))\n if (solidEntry) {\n if (!kernel) kernel = solidEntry.kernel\n entries.push({\n solid: solidEntry.solid,\n name: memberName,\n color: behavior.memberColors?.[memberName],\n })\n }\n }\n }\n\n // Fallback: export all brepSolids (covers compounds where memberNames wasn't propagated)\n if (entries.length === 0 && execResult.brepSolids) {\n for (const [key, solidEntry] of execResult.brepSolids) {\n if (!kernel) kernel = solidEntry.kernel\n entries.push({\n solid: solidEntry.solid,\n name: typeof key === 'string' ? key : `part_${entries.length}`,\n })\n }\n }\n\n if (!kernel || entries.length === 0) {\n return null // Let writeOutput handle the error\n }\n\n const buffer = exportStepFromSolids(kernel, entries)\n writeFileSync(outPath, Buffer.from(buffer))\n return { ok: true, outputFile: outPath, outputFormat: 'step' }\n}\n\n/**\n * Parse command-line arguments.\n *\n * @param argv - the raw process argument list (index 0 = node, 1 = script)\n * @returns the parsed command, file, and option values (command is null when unusable)\n */\nexport function parseArgs(argv: string[]): {\n command: 'check' | 'run' | 'view' | null\n file?: string\n out?: string\n mode?: ExecutionMode\n assetsDir?: string\n fontsDir?: string\n projectRoot?: string\n view?: string\n sheet?: string\n part?: string\n} {\n const args = argv.slice(2) // skip node + script\n if (args.length === 0) return { command: null }\n\n const command = args[0] as 'check' | 'run' | 'view' | null\n if (command !== 'check' && command !== 'run' && command !== 'view') return { command: null }\n\n let file: string | undefined\n let out: string | undefined\n let mode: ExecutionMode | undefined\n let assetsDir: string | undefined\n let fontsDir: string | undefined\n let projectRoot: string | undefined\n let view: string | undefined\n let sheet: string | undefined\n let part: string | undefined\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i]\n if (arg === '--out' || arg === '-o') {\n out = args[++i]\n } else if (arg === '--mode' || arg === '-m') {\n const m = args[++i] as ExecutionMode\n if (m === 'auto' || m === 'brep' || m === 'mesh') {\n mode = m\n }\n } else if (arg === '--assets') {\n assetsDir = args[++i]\n } else if (arg === '--fonts') {\n fontsDir = args[++i]\n } else if (arg === '--project-root') {\n projectRoot = args[++i]\n } else if (arg === '--view') {\n view = args[++i]\n } else if (arg === '--sheet') {\n sheet = args[++i]\n } else if (arg === '--part') {\n part = args[++i]\n } else if (!file && !arg.startsWith('-')) {\n file = arg\n }\n }\n\n return { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part }\n}\n\n/**\n * CLI main entry point (called by scripts/faijs-cli.ts).\n *\n * @param argv - the raw process argument list\n * @param libs - host-injected library namespace (includes cad — faijs-cli.ts passes createInternalStdlib; core does not assemble it by default)\n * @returns the process exit code (0 on success, non-zero on failure)\n */\nexport async function cliMain(argv: string[], libs?: Record<string, StdlibNamespace>): Promise<number> {\n const { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part } = parseArgs(argv)\n\n if (!command) {\n process.stderr.write('Usage: faijs-cli <check|run|view> <file.fai.js> [options]\\n')\n process.stderr.write(' check <file> DryRun validation\\n')\n process.stderr.write(' run <file> --out <file> Execute and export STL/STEP\\n')\n process.stderr.write(' view <file> --out <svg> Execute and project view SVG (三视图/等轴测)\\n')\n process.stderr.write(' --mode <auto|brep|mesh> Execution mode (view 需要 BREP 路径)\\n')\n process.stderr.write(' --assets <dir> Asset directory\\n')\n process.stderr.write(' --fonts <dir> Extra fonts directory\\n')\n process.stderr.write(' --project-root <dir> Project root for relative .fai.js imports\\n')\n process.stderr.write(' --part <name> (view) shape variable to project (default: terminals)\\n')\n process.stderr.write(' --view <dir> (view) single view: front|back|top|bottom|left|right|iso|\"x,y,z\" (default front)\\n')\n process.stderr.write(' --sheet <a,b,c> (view) multi-view sheet: front,top,right,iso (mutually exclusive with --view)\\n')\n return 1\n }\n\n if (!file) {\n process.stderr.write(`Error: missing file argument for \"${command}\"\\n`)\n return 1\n }\n\n const filePath = resolve(file)\n\n if (command === 'check') {\n const result = cliCheck(filePath, { assetsDir, fontsDir })\n if (result.ok) {\n process.stdout.write(`✓ ${filePath}: OK\\n`)\n if (result.script) {\n process.stdout.write(` statements: ${result.script.statements}\\n`)\n process.stdout.write(` callees: ${result.script.callees.join(', ')}\\n`)\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.errors.length} error(s)\\n`)\n for (const err of result.errors) {\n const loc = err.line ? ` (line ${err.line})` : err.stmtId ? ` (stmt: ${err.stmtId})` : ''\n process.stderr.write(` [${err.stage}] ${err.message}${loc}\\n`)\n }\n return 1\n }\n }\n\n if (command === 'run') {\n if (!out) {\n process.stderr.write('Error: --out is required for \"run\" command\\n')\n return 1\n }\n\n const outPath = resolve(out)\n const result = await cliRun(filePath, outPath, { mode, assetsDir, fontsDir, projectRoot, libs })\n\n if (result.ok) {\n process.stdout.write(`✓ ${filePath} → ${outPath} (${result.outputFormat})\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.error}\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 1\n }\n }\n\n if (command === 'view') {\n if (!out) {\n process.stderr.write('Error: --out is required for \"view\" command\\n')\n return 1\n }\n if (view && sheet) {\n process.stderr.write('Error: --view and --sheet are mutually exclusive\\n')\n return 1\n }\n\n const outPath = resolve(out)\n const viewSpec = view ? parseViewArg(view) : undefined\n const sheetSpec = sheet\n ? (sheet\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean) as ViewSpec[])\n : undefined\n const result = await cliView(filePath, outPath, {\n mode,\n assetsDir,\n fontsDir,\n projectRoot,\n libs,\n part,\n view: viewSpec,\n sheet: sheetSpec,\n })\n\n if (result.ok) {\n for (const f of result.outputFiles ?? []) {\n process.stdout.write(`✓ ${filePath} → ${f} (svg)\\n`)\n }\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.error}\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 1\n }\n }\n\n return 1\n}\n"]}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/node-host/cli.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * faijs-cli — CLI 逻辑(可导入、可测试)。第三方调用入口:packages/core/scripts/faijs-cli.ts。\n * (仓库自用 doc/ci/开发脚本在根 scripts/ 与 packages/core/scripts/gen-*,见 scripts/README.md。)\n *\n *\n * 命令:\n * check <file.fai.js> — dryRun:parse + schema + 引用预检\n * run <file.fai.js> --out <file> — 执行并导出 STL/STEP\n * view <file.fai.js> --out <x.svg> — 执行并投影输出视图 SVG(三视图/等轴测)\n *\n * 选项:\n * --mode <auto|brep|mesh> — 执行模式(默认 auto;view 需要 BREP 路径)\n * --assets <dir> — 资产目录\n * --fonts <dir> — 额外字体目录\n * --part <name> — (view) 指定投影的 shape 变量名;缺省按终端自动选择\n * --view <front|back|top|bottom|left|right|iso|\"x,y,z\">\n * — (view) 单视图方向(默认 front)\n * --sheet <front,top,right,iso> — (view) 多视图图纸(projectSheet;与 --view 互斥)\n */\n\nimport { readFileSync, writeFileSync, existsSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { resolve, extname, dirname, join } from 'node:path'\nimport { createRuntime } from '../cad-runtime/runtime'\nimport type { CadRuntime } from '../cad-runtime/runtime'\nimport type { LibNamespace } from '../runtime-state'\nimport type { ExecutionMode, HostPorts, LibLoader } from '../cad-runtime/ports'\nimport { createNodePorts } from './index'\nimport { createFsProjectLoader, findProjectRoot, projectKeyOf } from './fs-project-loader'\nimport { exportModelSync } from '../brep/export/export-model'\nimport { exportStepFromSolids, type StepExportEntry } from '../brep/export/step'\nimport { solidToShape } from '../brep/brep-ops'\nimport { registerOcctBrepEngine } from '../brep/engine/adapters/occt'\nimport type { Shape } from '../mesh/types'\nimport type { CompoundShape } from '../shape'\nimport { ensureSlot } from '../shape'\nimport { brepOf } from '../shape'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { asPartName } from '../identity'\nimport { symbolTableNames } from '../lang/symbol-table'\nimport { projectView, projectSheet } from '../api/view'\nimport type { ViewSpec } from '../api/view/view-camera'\n\n// ── P 四(4.4):Node CLI 自动装载(D3-Node,§9.4)──\n// 脚本 import 的第三方库按 specifier 动态解析,host 不再写死任何包清单:\n// - scoped 包名(`@faicad/...`)直接动态 import;\n// - 短名(如 `sheetmetal`)先归一为 scoped 全名再装载(避免误装同名陌生人包)。\n// 包未安装 → 动态 import 抛 ERR_MODULE_NOT_FOUND,由 runtime 报明确装载失败信息。\n/** scoped 包名前缀:CLI 允许动态装载的库范围。 */\nconst CLI_SCOPED_PREFIX = '@faicad/'\n/** 已登记短名 → scoped 全名归一表(仅收录 `@faicad/` 范围内的库,防同名陌生人包)。 */\nconst CLI_SHORT_NAMES: Record<string, string> = {\n 'sheetmetal': '@faicad/sheetmetal',\n 'faijs-cadquery': '@faicad/faijs-cadquery',\n 'faijs-gears': '@faicad/faijs-gears',\n 'faijs-fasteners': '@faicad/faijs-fasteners',\n}\n\n/**\n * 读库 package.json 的 `faijs.autoLift` 字段(D3-autoLift 外置,§9.4):\n * 逐库 autoLift 约定从 host 写死改为由各库自身 package.json 声明,loader 此处读取。\n * 未声明 → 返回 undefined(回落到 runtime 的推断式 `!hasDualOp(ns)`);\n * 声明为布尔 → 直接采用(如 cq-compat 声明 false,因其函数以 faijs Shape 为受众,\n * 被 compat 边界整体提升会破坏内部借面逻辑)。\n */\nconst requireNode = createRequire(import.meta.url)\nfunction readLibAutoLift(pkg: string): boolean | undefined {\n try {\n const pjPath = requireNode.resolve(`${pkg}/package.json`)\n const pj = JSON.parse(readFileSync(pjPath, 'utf8')) as { faijs?: { autoLift?: boolean } }\n const v = pj.faijs?.autoLift\n return typeof v === 'boolean' ? v : undefined\n } catch {\n return undefined\n }\n}\n\n/** specifier → scoped 全名归一:scoped 名原样,已登记短名映射,其余原样交 import 解析。 */\nfunction normalizeCliSpecifier(name: string): string {\n return CLI_SHORT_NAMES[name] ?? name\n}\n\nconst cliPortsLibLoader: LibLoader = {\n loadLib: async (name) => {\n const pkg = normalizeCliSpecifier(name)\n if (!pkg.startsWith(CLI_SCOPED_PREFIX)) {\n throw new Error(`package \"${name}\" is not a scoped @faicad/ library`)\n }\n return (await import(pkg)) as LibNamespace\n },\n listLibs: () => [...Object.keys(CLI_SHORT_NAMES), '@faicad/'],\n loadSource: async (name) => {\n const pkg = normalizeCliSpecifier(name)\n if (!pkg.startsWith(CLI_SCOPED_PREFIX)) return undefined\n try {\n const req = createRequire(import.meta.url)\n const pkgJsonPath = req.resolve(`${pkg}/package.json`)\n const pkgDir = dirname(pkgJsonPath)\n for (const p of [join(pkgDir, 'src', 'index.ts'), join(pkgDir, 'dist', 'index.js'), join(pkgDir, 'src', 'index.js')]) {\n if (existsSync(p)) return readFileSync(p, 'utf-8')\n }\n return undefined\n } catch {\n return undefined\n }\n },\n // 默认不提升(与历史 CLI 行为一致);各库用 package.json \"faijs.autoLift\" 逐库覆盖。\n options: {\n autoLift: false,\n autoLiftFor: (name) => {\n const pkg = normalizeCliSpecifier(name)\n return pkg.startsWith(CLI_SCOPED_PREFIX) ? readLibAutoLift(pkg) : undefined\n },\n },\n}\n\n/** 注入 libLoader 到 node ports(CLI 宿主白名单装载)。 */\nfunction withCliLibLoader(ports: HostPorts): HostPorts {\n return { ...ports, libLoader: cliPortsLibLoader }\n}\n\n/**\n * 注入 projectLoader 到 node ports(多文件 §4.5)。\n *\n * 项目根缺省由 `findProjectRoot` 从入口文件向上找最近的 `package.json`;\n * 宿主可用 `--project-root` 覆盖。未提供根(不应发生)时不注入,单文件行为不变。\n */\nfunction withCliProjectLoader(ports: HostPorts, root: string | undefined): HostPorts {\n if (!root) return ports\n return { ...ports, projectLoader: createFsProjectLoader(root) }\n}\n\n/** Options accepted by the `check` command. */\nexport interface CliCheckOptions {\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n /**\n * Extra cad-namespace entries the host merges at run time (`cad.sketch`\n * from @faicad/faijs-sketch).\n *\n * I-group (2026-10-03): the unknown-op guard compares the script's callees\n * against `symbolTableNames()`, which knows only the STATIC table. A host\n * that merges those libraries and passes them to {@link cliRun} therefore\n * got `unknown op: cad.sketch is not in the cad namespace` from every check\n * of a perfectly runnable script — `rebased-sweep.ts` reported it for every\n * product in a corpus sweep. Check and run must see the same namespace, so\n * the caller states its merged entries here.\n */\n libs?: Record<string, unknown>\n}\n\n/** Options accepted by the `run` command. */\nexport interface CliRunOptions {\n /** Execution mode ('auto' | 'brep' | 'mesh'). */\n mode?: ExecutionMode\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n /** Default font path used by the node ports. */\n defaultFontPath?: string\n /** Host-injected library namespace (includes cad — the CLI entry faijs-cli.ts passes createApiNamespace; core does not assemble it by default). */\n libs?: Record<string, LibNamespace>\n /**\n * 项目根(多文件 §4.5):相对 import 的解析基准,moduleKey = 相对它的路径。\n * 缺省由入口文件向上找最近的 package.json。\n */\n projectRoot?: string\n /**\n * 连带导出隐藏终端(默认 false)。keep / keepHidden 保留的源几何默认不产出\n * (隐藏的语义即\"保留但不出现在产物里\");置 true 恢复旧行为,把 hidden 终端\n * 也一并写盘(多为诊断用途)。\n */\n includeHidden?: boolean\n}\n\n/** Result of the `check` (dry-run validation) command. */\nexport interface CliCheckResult {\n /** Whether the validation passed. */\n ok: boolean\n /** Validation errors found, one per stage. */\n errors: Array<{ stage: string; message: string; line?: number; stmtId?: string }>\n /** Non-fatal warnings reported during validation. */\n warnings: string[]\n /** Script-level summary when the script parsed successfully. */\n script?: { statements: number; callees: string[] }\n}\n\n/** Result of the `run` (execute and export) command. */\nexport interface CliRunResult {\n /** Whether execution and export succeeded. */\n ok: boolean\n /** The written output file path. */\n outputFile?: string\n /** The written output format ('stl' | 'step'). */\n outputFormat?: string\n /** A human-readable error message when the command failed. */\n error?: string\n /** Informational messages collected during execution. */\n infos?: string[]\n}\n\n/** Options accepted by the `view` command. */\nexport interface CliViewOptions {\n /** Execution mode ('auto' | 'brep' | 'mesh'). view 需要 BREP 路径(mesh-only 无投影)。 */\n mode?: ExecutionMode\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n /** Default font path used by the node ports. */\n defaultFontPath?: string\n /** Host-injected library namespace (includes cad). */\n libs?: Record<string, LibNamespace>\n /** Project root for relative .fai.js imports. */\n projectRoot?: string\n /** Shape variable name to project; default resolves terminals like `run`. */\n part?: string\n /** Single view direction (default 'front'); mutually exclusive with sheet. */\n view?: ViewSpec\n /** Multi-view sheet list (projectSheet); mutually exclusive with view. */\n sheet?: ViewSpec[]\n}\n\n/** Result of the `view` (execute and project SVG) command. */\nexport interface CliViewResult {\n /** Whether execution and projection succeeded. */\n ok: boolean\n /** The written SVG file path(s). */\n outputFiles?: string[]\n /** A human-readable error message when the command failed. */\n error?: string\n /** Informational messages collected during execution. */\n infos?: string[]\n}\n\n/**\n * Execute the `check` command: dry-run validate a .fai.js file.\n *\n * @param filePath - path to the .fai.js file to validate\n * @param _opts - optional CLI check options (assets and fonts directories)\n * @returns the check result with any validation errors\n */\nexport function cliCheck(filePath: string, _opts?: CliCheckOptions): CliCheckResult {\n const code = readFileSync(filePath, 'utf-8')\n const ports = withCliLibLoader(createNodePorts({\n assetsDir: _opts?.assetsDir,\n fontsDir: _opts?.fontsDir,\n }))\n const runtime = createRuntime(ports)\n const result = runtime.check(code)\n const errors = result.errors.map((e) => ({\n stage: e.stage,\n message: e.message,\n line: e.line,\n stmtId: e.stmtId,\n }))\n // D11 (2026-09-28): unknown-op guard. check() is syntax+reference only — an\n // op the cad namespace doesn't have used to pass `check` clean and die at\n // runtime (e.g. `cad.sketch is not a function` when a host forgets to merge\n // the sketch library). Compare the script's callees against the\n // symbol-table union view (platform + registered library entries) and fail\n // the check on any unknown callee.\n if (result.ok && result.script) {\n const known = new Set(symbolTableNames())\n // Ops the host merges at run time are not in the static table; accept the\n // names it declares as known so check agrees with the run that follows.\n for (const ns of Object.values(_opts?.libs ?? {})) {\n if (ns && typeof ns === 'object') {\n for (const key of Object.keys(ns as Record<string, unknown>)) known.add(key)\n }\n }\n const unknown = [...new Set(result.script.callees)].filter((n) => !known.has(n))\n for (const name of unknown) {\n errors.push({\n stage: 'symbol',\n message: `unknown op: cad.${name} is not in the cad namespace (host library not merged or op name misspelled)`,\n line: undefined,\n stmtId: undefined,\n })\n }\n }\n return {\n ok: result.ok && errors.length === 0,\n errors,\n warnings: result.warnings,\n script: result.script,\n }\n}\n\n/**\n * Execute the `run` command: execute a .fai.js file and export STL/STEP.\n *\n * @param filePath - path to the .fai.js file to execute\n * @param outPath - output file path for the exported result (extension determines format)\n * @param opts - optional run options (mode, assets/fonts directories, injected libs)\n * @returns the run result describing success or failure\n */\nexport async function cliRun(\n filePath: string,\n outPath: string,\n opts?: CliRunOptions,\n): Promise<CliRunResult> {\n const code = readFileSync(filePath, 'utf-8')\n // 多文件(§4.5):项目根缺省向上找 package.json;入口自身也有 key(相对根的路径),\n // 否则入口在子目录时它的 `./parts/x.fai.js` 会以根为基准解析而错位。\n const projectRoot = opts?.projectRoot ? resolve(opts.projectRoot) : findProjectRoot(filePath)\n const entryKey = projectKeyOf(projectRoot, filePath)\n\n // Initialize OCCT and bind the vendored brepjs kernel registry (D10) so that\n // cq-compat parts (which project ops through compatFn) run end-to-end under\n // the CLI. registerOcctBrepEngine is idempotent and itself boots initOcctWasm.\n await registerOcctBrepEngine()\n\n // Create runtime with node ports\n const ports = withCliProjectLoader(\n withCliLibLoader(createNodePorts({\n assetsDir: opts?.assetsDir,\n fontsDir: opts?.fontsDir,\n defaultFontPath: opts?.defaultFontPath,\n })),\n projectRoot,\n )\n const runtime = createRuntime(ports, opts?.mode ?? 'auto', opts?.libs)\n // Part 1.4:cad 经 registerLib 声明 packageName(脚本可 `import * as cad from\n // '@faicad/faijs'`,check ①.5 据此校验 specifier——不 declare 则 import 被拒)。\n if (opts?.libs?.cad) {\n runtime.registerLib('cad', opts.libs.cad, {\n default: true,\n packageName: '@faicad/faijs',\n })\n }\n\n // Execute(T5 后:direct 路径,源码文本直通执行)\n const execResult = await runtime.execute(code, { entryKey })\n\n if (execResult.failedAt) {\n return {\n ok: false,\n error: `Execution failed at statement ${execResult.failedAt.index} (callee: ${execResult.failedAt.callee}): ${execResult.failedAt.message}`,\n infos: execResult.infos,\n }\n }\n\n // Determine output format from extension\n const ext = extname(outPath).toLowerCase().slice(1)\n const terminals = execResult.terminals ?? []\n\n // E1 (H12): export-side failures must surface as a structured result, not an\n // exception — the census and batch driver treat a throw as a process crash,\n // while `{ ok: false, error }` keeps it a per-file, classifiable failure.\n try {\n return await exportExecutionResult(outPath, ext, execResult, terminals, opts?.includeHidden ?? false)\n } catch (e) {\n return {\n ok: false,\n error: `Export failed: ${String((e as Error)?.message ?? e)}`,\n infos: execResult.infos,\n }\n }\n}\n\n/**\n * 选出「可导出」的终端:默认剔除 hidden。\n *\n * 隐藏终端 = 「保留但不产出」(`keep` / `keepHidden` 语义,R5)。导出层必须默认跳过,\n * 否则布尔运算保留的源几何会对每个 hidden 终端各写一个 `out.step_<i>_<name>` 产物,\n * 让一个逻辑形状看起来像 N 个(FCStd port 的 `solids 1vsN` 失配即由此而来)。\n * 需要旧行为(连同隐藏源一起写出,多用于诊断)时显式传 `includeHidden=true`。\n *\n * @param terminals - 存活终端集合(含 `hidden` 标记)\n * @param includeHidden - 是否连同隐藏终端一起导出,缺省 false\n * @returns `exportable`(可导出终端)与 `hiddenCount`(被剔除的隐藏终端数)\n */\nexport function selectExportableTerminals<T extends { hidden?: boolean }>(\n terminals: readonly T[],\n includeHidden = false,\n): { exportable: T[]; hiddenCount: number } {\n const hiddenCount = terminals.reduce((n, t) => (t.hidden ? n + 1 : n), 0)\n const exportable = includeHidden ? [...terminals] : terminals.filter((t) => !t.hidden)\n return { exportable, hiddenCount }\n}\n\n/** Export an executed result to `outPath` (shared body of cliRun's export path). */\nasync function exportExecutionResult(\n outPath: string,\n ext: string,\n execResult: Awaited<ReturnType<CadRuntime['execute']>>,\n terminals: NonNullable<Awaited<ReturnType<CadRuntime['execute']>>['terminals']>,\n includeHidden = false,\n): Promise<{ ok: boolean; error?: string; outputFile?: string; outputFormat?: string; infos?: string[] }> {\n const { exportable, hiddenCount } = selectExportableTerminals(terminals, includeHidden)\n // 装配导出(writeAssemblyStep 的兜底路径)同样不得带出隐藏终端;includeHidden 时传 undefined。\n const hiddenTerminals = includeHidden\n ? undefined\n : new Set(terminals.filter((t) => t.hidden).map((t) => String(t.id)))\n // 有终端但全部隐藏 → 明确报错(不静默回退到「最后一个 output」,那等于把隐藏源漏出去)。\n if (!includeHidden && exportable.length === 0 && hiddenCount > 0) {\n return {\n ok: false,\n error: `All ${hiddenCount} live terminal(s) are hidden — nothing to export (pass includeHidden to export them)`,\n }\n }\n\n if (exportable.length === 0) {\n // No terminals — use last output\n const outputNames = [...execResult.outputs.keys()]\n if (outputNames.length === 0) {\n return { ok: false, error: 'No statements to export' }\n }\n const lastPartName = outputNames[outputNames.length - 1]\n const shape = execResult.outputs.get(asPartName(lastPartName))\n if (!shape) {\n return { ok: false, error: `No output for part \"${lastPartName}\"` }\n }\n const solidEntry = execResult.brepSolids?.get(asPartName(lastPartName))\n return writeOutput(outPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n }\n\n // Single terminal\n if (exportable.length === 1) {\n const terminal = exportable[0]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) {\n return { ok: false, error: `No output for terminal \"${terminal.id}\"` }\n }\n // Assembly (compound with behavior) → expand members with colors\n if (!('positions' in shape) || !('indices' in shape)) {\n const asmResult = writeAssemblyStep(outPath, ext, shape as CompoundShape, execResult, hiddenTerminals)\n if (asmResult) return asmResult\n }\n const solidEntry = execResult.brepSolids?.get(terminal.id)\n return writeOutput(outPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n }\n\n // Multiple terminals — write each to a separate file\n // First, check if any terminal is a compound (assembly) — export it as a single STEP\n for (let i = 0; i < exportable.length; i++) {\n const terminal = exportable[i]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) continue\n if (!('positions' in shape) || !('indices' in shape)) {\n // Compound terminal — try assembly STEP export\n const asmResult = writeAssemblyStep(outPath, ext, shape as CompoundShape, execResult, hiddenTerminals)\n if (asmResult) return asmResult\n }\n }\n // Then export non-compound terminals\n for (let i = 0; i < exportable.length; i++) {\n const terminal = exportable[i]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) continue\n if (!('positions' in shape) || !('indices' in shape)) continue // skip compounds\n\n const name = terminal.meta?.name ?? terminal.id\n const sep = outPath.endsWith('/') || outPath.endsWith('\\\\') ? '' : '_'\n const terminalOutPath = `${outPath}${sep}${i}_${name}.${ext}`\n const solidEntry = execResult.brepSolids?.get(terminal.id)\n const result = writeOutput(terminalOutPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n if (!result.ok) return result\n }\n\n return { ok: true, outputFormat: ext }\n}\n\n/**\n * 解析 `--view` 参数:三数字逗号串 → 方向对象(\"1,-1,1\" → { dir: [1,-1,1] }),\n * 否则按视图名字符串处理(未知名由 viewCamera 抛错)。\n */\nfunction parseViewArg(v: string): ViewSpec {\n const parts = v.split(',').map((s) => s.trim())\n if (parts.length === 3) {\n const nums = parts.map(Number)\n if (nums.every((n) => Number.isFinite(n))) return { dir: nums as [number, number, number] }\n }\n // 视图名字符串('front'|'iso'|…):类型上 CLI 接受任意名称,未知名由 viewCamera 抛错。\n return v as ViewSpec\n}\n\n/**\n * 选出待投影的 shape 列表(`--part` 指定,或按终端自动选择,与 `run` 一致):\n * 只保留带 mesh 的 shape(compound/assembly 无 mesh,无法投影,跳过)。\n * 隐藏终端(keep/keepHidden 保留的源几何)默认不投影——与 `run` 同口径。\n */\nfunction selectViewShapes(\n execResult: {\n outputs: Map<unknown, Shape | CompoundShape>\n terminals?: Array<{ id: unknown; hidden?: boolean; meta?: { name?: string } }>\n },\n part?: string,\n): Array<{ name: string; shape: Shape }> {\n const outputs = execResult.outputs\n const viewable = (s: Shape | CompoundShape | undefined): s is Shape =>\n !!s && 'positions' in s && 'indices' in s\n\n if (part) {\n const shape = outputs.get(asPartName(part)) ?? outputs.get(part)\n if (viewable(shape)) return [{ name: part, shape }]\n return []\n }\n\n // 隐藏终端默认不投影。全部终端皆隐藏 → 空集(**不**回退到「所有 outputs」,\n // 否则会把全部中间量也画出来,与 run 的「全隐藏即无可导出」语义相悖)。\n const allTerminals = execResult.terminals ?? []\n const { exportable: terminals } = selectExportableTerminals(allTerminals)\n const ids: unknown[] = allTerminals.length > 0 ? terminals.map((t) => t.id) : [...outputs.keys()]\n const out: Array<{ name: string; shape: Shape }> = []\n for (const id of ids) {\n const shape = outputs.get(id) ?? outputs.get(asPartName(String(id)))\n if (viewable(shape)) {\n const metaName = terminals.find((t) => t.id === id)?.meta?.name\n out.push({ name: metaName ?? String(id), shape })\n }\n }\n return out\n}\n\n/**\n * Execute the `view` command: execute a .fai.js file and write view SVG(s).\n *\n * 投影在宿主侧进行:脚本只需建模(shape 变量或终端),CLI 调 projectView(--view,\n * 缺省 front)或 projectSheet(--sheet)把 SVG 字符串写盘。view 需要 BREP 路径——\n * mesh-only 的 shape 无 brep 槽,projectView 抛 E_BREP_ONLY_INPUT(提示 --mode brep/auto)。\n *\n * @param filePath - path to the .fai.js file to execute\n * @param outPath - output SVG path (multiple shapes get `<out>_<i>_<name>.svg` suffixes)\n * @param opts - optional view options (mode, part, view/sheet, assets/fonts dirs, libs)\n * @returns the view result describing success or failure\n */\nexport async function cliView(\n filePath: string,\n outPath: string,\n opts?: CliViewOptions,\n): Promise<CliViewResult> {\n const code = readFileSync(filePath, 'utf-8')\n const projectRoot = opts?.projectRoot ? resolve(opts.projectRoot) : findProjectRoot(filePath)\n const entryKey = projectKeyOf(projectRoot, filePath)\n\n // Initialize OCCT(投影 HLR 依赖 brep 内核)。registerOcctBrepEngine is\n // idempotent and itself boots initOcctWasm, and also binds the vendored\n // brepjs kernel registry (D10) — same boot path as cliRun above.\n await registerOcctBrepEngine()\n\n const ports = withCliProjectLoader(\n withCliLibLoader(createNodePorts({\n assetsDir: opts?.assetsDir,\n fontsDir: opts?.fontsDir,\n defaultFontPath: opts?.defaultFontPath,\n })),\n projectRoot,\n )\n const runtime = createRuntime(ports, opts?.mode ?? 'auto', opts?.libs)\n if (opts?.libs?.cad) {\n runtime.registerLib('cad', opts.libs.cad, {\n default: true,\n packageName: '@faicad/faijs',\n })\n }\n\n const execResult = await runtime.execute(code, { entryKey })\n\n if (execResult.failedAt) {\n return {\n ok: false,\n error: `Execution failed at statement ${execResult.failedAt.index} (callee: ${execResult.failedAt.callee}): ${execResult.failedAt.message}`,\n infos: execResult.infos,\n }\n }\n\n const shapes = selectViewShapes(execResult, opts?.part)\n if (shapes.length === 0) {\n return {\n ok: false,\n error: opts?.part\n ? `No output for part \"${opts.part}\"`\n : 'No viewable (mesh-bearing) shapes to project',\n infos: execResult.infos,\n }\n }\n\n const outFiles: string[] = []\n const single = shapes.length === 1\n for (let i = 0; i < shapes.length; i++) {\n const { name, shape } = shapes[i]\n const target = single\n ? outPath\n : `${outPath}${outPath.endsWith('/') || outPath.endsWith('\\\\') ? '' : '_'}${i}_${name}.svg`\n try {\n const svg = opts?.sheet\n ? projectSheet(shape, opts.sheet)\n : projectView(shape, opts?.view ?? 'front')\n writeFileSync(target, svg, 'utf-8')\n outFiles.push(target)\n } catch (e) {\n return {\n ok: false,\n error: `Projection failed for \"${name}\": ${(e as Error).message}`,\n infos: execResult.infos,\n }\n }\n }\n return { ok: true, outputFiles: outFiles, infos: execResult.infos }\n}\n\n/**\n * 写出输出文件。\n *\n * 按零件类型分别处理导出:\n * - STL:取网格载荷(BREP 零件先经内核三角化),无重建。\n * - STEP:有 BREP solid → 精确 STEP(ADVANCED_FACE);无 BREP solid → 该零件的\n * 三角网格经重建管线导出(exportModelSync 内的 mesh 条目通路)。\n *\n * keep-syntax §5.1:outputs 现含 compound(group/assembly 产物,无 mesh);\n * compound 无法导出,给出明确错误(此前\"不在 outputs 中\"是静默失败)。\n */\nfunction writeOutput(\n outPath: string,\n ext: string,\n shape: Shape | CompoundShape,\n brepSolid?: { solid: BrepHandle; kernel: BrepEngineApi },\n): CliRunResult {\n if (!('positions' in shape) || !('indices' in shape)) {\n return {\n ok: false,\n error: `Output \"${outPath}\" is a compound (group/assembly) with no exportable mesh; export a member shape instead`,\n }\n }\n // 统一导出入口(R11):坐标换算与单位声明由 exportModel 同源产出。\n // CLI 无单位选项 → 缺省 mm(与既有行为一致)。\n const fmt = ext === 'stp' ? 'step' : ext\n if (fmt !== 'stl' && fmt !== 'step') {\n return { ok: false, error: `Unsupported output format: .${ext} (supported: .stl, .step)` }\n }\n // STL 只吃 mesh(export-model §10.6:solid 条目由调用方先三角化)。auto 模式下\n // 形状可能是 BREP solid → 导出 STL 前必须先用内核三角化,否则「no mesh entries」。\n // STEP 则直接走 solid 条目保留 ADVANCED_FACE 拓扑。\n let entry: { solid?: BrepHandle; mesh?: { positions: Float32Array; indices: Uint32Array } }\n if (brepSolid) {\n if (fmt === 'stl') {\n const tri = solidToShape(brepSolid.kernel, brepSolid.solid)\n entry = { mesh: { positions: tri.positions, indices: tri.indices } }\n } else {\n entry = { solid: brepSolid.solid }\n }\n } else {\n entry = { mesh: { positions: shape.positions, indices: shape.indices } }\n }\n const buffer = exportModelSync([entry], fmt)\n writeFileSync(outPath, Buffer.from(buffer))\n return { ok: true, outputFile: outPath, outputFormat: fmt }\n}\n\n/**\n * Export an assembly (compound with AssemblyBehavior) as a multi-entity STEP\n * file, preserving member names and colors (from behavior.memberColors).\n *\n * Returns null if the compound has no assembly behavior (falls through to\n * regular writeOutput), or a CliRunResult on success/failure.\n */\nfunction writeAssemblyStep(\n outPath: string,\n ext: string,\n compound: CompoundShape,\n execResult: {\n outputs: Map<unknown, Shape | CompoundShape>\n brepSolids?: Map<unknown, { solid: BrepHandle; kernel: BrepEngineApi }>\n },\n hiddenTerminals?: ReadonlySet<string>,\n): CliRunResult | null {\n if (ext !== 'step' && ext !== 'stp') return null\n const slot = ensureSlot(compound)\n const behavior = slot.behavior as\n | { memberNames?: string[]; memberColors?: Record<string, [number, number, number]> }\n | undefined\n\n // Find a kernel and collect all exportable solids\n let kernel: BrepEngineApi | null = null\n const entries: StepExportEntry[] = []\n\n // Preferred path: use behavior.memberNames to match colors.\n // Member name lookup tries (1) the explicit member name, then (2) the kept\n // script-variable name of the compound's i-th child — cq-compat's\n // buildAssembly passes CadQuery-style part names (\"axk\") while the shapes\n // are registered under their .fai.js variable names (\"shape_axk\").\n if (behavior?.memberNames && behavior.memberNames.length > 0) {\n // Member Shape list (same order as memberNames) — when a member name\n // misses in brepSolids (e.g. cq libs register short names like 'axk' while\n // the statement variable is 'shape_axk'), resolve the member shape by index\n // and extract its BREP solid, keeping the member name and color.\n const children = (compound as { children?: Shape[] }).children ?? []\n for (let i = 0; i < behavior.memberNames.length; i++) {\n const memberName = behavior.memberNames[i]\n // Preferred: read the member's LIVE identity slot (brepOf) — assembly\n // transforms are baked into slot.solid by the executor's\n // applyPendingAssemblyTransforms AFTER this statement, so the brepSolids\n // snapshot (registered at member creation) may hold the PRE-transform\n // handle. GOTCHA: don't reorder — brepSolids entries are stale for\n // transformed members.\n const child = children[i]\n const liveSolid = child ? (brepOf(child) as BrepHandle | undefined) : undefined\n if (liveSolid) {\n if (!kernel) kernel = execResult.brepSolids?.values().next().value?.kernel ?? null\n if (kernel) {\n entries.push({\n solid: liveSolid,\n name: memberName,\n color: behavior.memberColors?.[memberName],\n })\n continue\n }\n }\n const solidEntry = execResult.brepSolids?.get(asPartName(memberName))\n if (solidEntry) {\n if (!kernel) kernel = solidEntry.kernel\n entries.push({\n solid: solidEntry.solid,\n name: memberName,\n color: behavior.memberColors?.[memberName],\n })\n }\n }\n }\n\n // Fallback: export all brepSolids (covers compounds where memberNames wasn't propagated)\n if (entries.length === 0 && execResult.brepSolids) {\n for (const [key, solidEntry] of execResult.brepSolids) {\n // 隐藏终端(keep/keepHidden 保留的源几何)不得借这条兜底路径落盘——\n // 与主导出路径同一判据(includeHidden 时 hiddenTerminals 传 undefined,不过滤)。\n if (hiddenTerminals?.has(String(key))) continue\n if (!kernel) kernel = solidEntry.kernel\n entries.push({\n solid: solidEntry.solid,\n name: typeof key === 'string' ? key : `part_${entries.length}`,\n })\n }\n }\n\n if (!kernel || entries.length === 0) {\n return null // Let writeOutput handle the error\n }\n\n const buffer = exportStepFromSolids(kernel, entries)\n writeFileSync(outPath, Buffer.from(buffer))\n return { ok: true, outputFile: outPath, outputFormat: 'step' }\n}\n\n/**\n * Parse command-line arguments.\n *\n * @param argv - the raw process argument list (index 0 = node, 1 = script)\n * @returns the parsed command, file, and option values (command is null when unusable)\n */\nexport function parseArgs(argv: string[]): {\n command: 'check' | 'run' | 'view' | null\n file?: string\n out?: string\n mode?: ExecutionMode\n assetsDir?: string\n fontsDir?: string\n projectRoot?: string\n view?: string\n sheet?: string\n part?: string\n includeHidden?: boolean\n} {\n const args = argv.slice(2) // skip node + script\n if (args.length === 0) return { command: null }\n\n const command = args[0] as 'check' | 'run' | 'view' | null\n if (command !== 'check' && command !== 'run' && command !== 'view') return { command: null }\n\n let file: string | undefined\n let out: string | undefined\n let mode: ExecutionMode | undefined\n let assetsDir: string | undefined\n let fontsDir: string | undefined\n let projectRoot: string | undefined\n let view: string | undefined\n let sheet: string | undefined\n let part: string | undefined\n let includeHidden: boolean | undefined\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i]\n if (arg === '--out' || arg === '-o') {\n out = args[++i]\n } else if (arg === '--mode' || arg === '-m') {\n const m = args[++i] as ExecutionMode\n if (m === 'auto' || m === 'brep' || m === 'mesh') {\n mode = m\n }\n } else if (arg === '--assets') {\n assetsDir = args[++i]\n } else if (arg === '--fonts') {\n fontsDir = args[++i]\n } else if (arg === '--project-root') {\n projectRoot = args[++i]\n } else if (arg === '--view') {\n view = args[++i]\n } else if (arg === '--sheet') {\n sheet = args[++i]\n } else if (arg === '--part') {\n part = args[++i]\n } else if (arg === '--include-hidden') {\n includeHidden = true\n } else if (!file && !arg.startsWith('-')) {\n file = arg\n }\n }\n\n return { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part, includeHidden }\n}\n\n/**\n * CLI main entry point (called by scripts/faijs-cli.ts).\n *\n * @param argv - the raw process argument list\n * @param libs - host-injected library namespace (includes cad — faijs-cli.ts passes createApiNamespace; core does not assemble it by default)\n * @returns the process exit code (0 on success, non-zero on failure)\n */\nexport async function cliMain(argv: string[], libs?: Record<string, LibNamespace>): Promise<number> {\n const { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part, includeHidden } = parseArgs(argv)\n\n if (!command) {\n process.stderr.write('Usage: faijs-cli <check|run|view> <file.fai.js> [options]\\n')\n process.stderr.write(' check <file> DryRun validation\\n')\n process.stderr.write(' run <file> --out <file> Execute and export STL/STEP\\n')\n process.stderr.write(' view <file> --out <svg> Execute and project view SVG (三视图/等轴测)\\n')\n process.stderr.write(' --mode <auto|brep|mesh> Execution mode (view 需要 BREP 路径)\\n')\n process.stderr.write(' --assets <dir> Asset directory\\n')\n process.stderr.write(' --fonts <dir> Extra fonts directory\\n')\n process.stderr.write(' --project-root <dir> Project root for relative .fai.js imports\\n')\n process.stderr.write(' --include-hidden (run) also export hidden terminals (keep/keepHidden sources; default off)\\n')\n process.stderr.write(' --part <name> (view) shape variable to project (default: terminals)\\n')\n process.stderr.write(' --view <dir> (view) single view: front|back|top|bottom|left|right|iso|\"x,y,z\" (default front)\\n')\n process.stderr.write(' --sheet <a,b,c> (view) multi-view sheet: front,top,right,iso (mutually exclusive with --view)\\n')\n return 1\n }\n\n if (!file) {\n process.stderr.write(`Error: missing file argument for \"${command}\"\\n`)\n return 1\n }\n\n const filePath = resolve(file)\n\n if (command === 'check') {\n const result = cliCheck(filePath, { assetsDir, fontsDir })\n if (result.ok) {\n process.stdout.write(`✓ ${filePath}: OK\\n`)\n if (result.script) {\n process.stdout.write(` statements: ${result.script.statements}\\n`)\n process.stdout.write(` callees: ${result.script.callees.join(', ')}\\n`)\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.errors.length} error(s)\\n`)\n for (const err of result.errors) {\n const loc = err.line ? ` (line ${err.line})` : err.stmtId ? ` (stmt: ${err.stmtId})` : ''\n process.stderr.write(` [${err.stage}] ${err.message}${loc}\\n`)\n }\n return 1\n }\n }\n\n if (command === 'run') {\n if (!out) {\n process.stderr.write('Error: --out is required for \"run\" command\\n')\n return 1\n }\n\n const outPath = resolve(out)\n const result = await cliRun(filePath, outPath, { mode, assetsDir, fontsDir, projectRoot, libs, includeHidden })\n\n if (result.ok) {\n process.stdout.write(`✓ ${filePath} → ${outPath} (${result.outputFormat})\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.error}\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 1\n }\n }\n\n if (command === 'view') {\n if (!out) {\n process.stderr.write('Error: --out is required for \"view\" command\\n')\n return 1\n }\n if (view && sheet) {\n process.stderr.write('Error: --view and --sheet are mutually exclusive\\n')\n return 1\n }\n\n const outPath = resolve(out)\n const viewSpec = view ? parseViewArg(view) : undefined\n const sheetSpec = sheet\n ? (sheet\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean) as ViewSpec[])\n : undefined\n const result = await cliView(filePath, outPath, {\n mode,\n assetsDir,\n fontsDir,\n projectRoot,\n libs,\n part,\n view: viewSpec,\n sheet: sheetSpec,\n })\n\n if (result.ok) {\n for (const f of result.outputFiles ?? []) {\n process.stdout.write(`✓ ${filePath} → ${f} (svg)\\n`)\n }\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.error}\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 1\n }\n }\n\n return 1\n}\n"]}