fritzkit 0.0.0-stage → 0.1.1

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 (319) hide show
  1. package/.claude-plugin/marketplace.json +12 -0
  2. package/.claude-plugin/plugin.json +13 -0
  3. package/CHANGELOG.md +8 -0
  4. package/LICENSE +21 -0
  5. package/README.md +429 -2
  6. package/dist/cli/commands/doctor.d.ts +4 -0
  7. package/dist/cli/commands/doctor.js +7 -0
  8. package/dist/cli/commands/doctor.js.map +1 -0
  9. package/dist/cli/commands/export.d.ts +17 -0
  10. package/dist/cli/commands/export.js +81 -0
  11. package/dist/cli/commands/export.js.map +1 -0
  12. package/dist/cli/commands/kicad.d.ts +10 -0
  13. package/dist/cli/commands/kicad.js +22 -0
  14. package/dist/cli/commands/kicad.js.map +1 -0
  15. package/dist/cli/commands/parts.d.ts +22 -0
  16. package/dist/cli/commands/parts.js +46 -0
  17. package/dist/cli/commands/parts.js.map +1 -0
  18. package/dist/cli/commands/prune.d.ts +14 -0
  19. package/dist/cli/commands/prune.js +67 -0
  20. package/dist/cli/commands/prune.js.map +1 -0
  21. package/dist/cli/commands/render.d.ts +24 -0
  22. package/dist/cli/commands/render.js +62 -0
  23. package/dist/cli/commands/render.js.map +1 -0
  24. package/dist/cli/commands/schema.d.ts +10 -0
  25. package/dist/cli/commands/schema.js +35 -0
  26. package/dist/cli/commands/schema.js.map +1 -0
  27. package/dist/cli/commands/ui.d.ts +14 -0
  28. package/dist/cli/commands/ui.js +67 -0
  29. package/dist/cli/commands/ui.js.map +1 -0
  30. package/dist/cli/commands/validate.d.ts +24 -0
  31. package/dist/cli/commands/validate.js +91 -0
  32. package/dist/cli/commands/validate.js.map +1 -0
  33. package/dist/cli/context.d.ts +81 -0
  34. package/dist/cli/context.js +139 -0
  35. package/dist/cli/context.js.map +1 -0
  36. package/dist/cli/main.d.ts +2 -0
  37. package/dist/cli/main.js +8 -0
  38. package/dist/cli/main.js.map +1 -0
  39. package/dist/cli/program.d.ts +21 -0
  40. package/dist/cli/program.js +158 -0
  41. package/dist/cli/program.js.map +1 -0
  42. package/dist/cli/raster.d.ts +4 -0
  43. package/dist/cli/raster.js +9 -0
  44. package/dist/cli/raster.js.map +1 -0
  45. package/dist/core/compile/breadboard-util.d.ts +12 -0
  46. package/dist/core/compile/breadboard-util.js +107 -0
  47. package/dist/core/compile/breadboard-util.js.map +1 -0
  48. package/dist/core/compile/breadboard.d.ts +60 -0
  49. package/dist/core/compile/breadboard.js +513 -0
  50. package/dist/core/compile/breadboard.js.map +1 -0
  51. package/dist/core/compile/fzp.d.ts +12 -0
  52. package/dist/core/compile/fzp.js +183 -0
  53. package/dist/core/compile/fzp.js.map +1 -0
  54. package/dist/core/compile/icon.d.ts +17 -0
  55. package/dist/core/compile/icon.js +27 -0
  56. package/dist/core/compile/icon.js.map +1 -0
  57. package/dist/core/compile/index.d.ts +4 -0
  58. package/dist/core/compile/index.js +62 -0
  59. package/dist/core/compile/index.js.map +1 -0
  60. package/dist/core/compile/pcb.d.ts +39 -0
  61. package/dist/core/compile/pcb.js +164 -0
  62. package/dist/core/compile/pcb.js.map +1 -0
  63. package/dist/core/compile/schematic.d.ts +69 -0
  64. package/dist/core/compile/schematic.js +240 -0
  65. package/dist/core/compile/schematic.js.map +1 -0
  66. package/dist/core/compile/style.d.ts +52 -0
  67. package/dist/core/compile/style.js +72 -0
  68. package/dist/core/compile/style.js.map +1 -0
  69. package/dist/core/compile/types.d.ts +50 -0
  70. package/dist/core/compile/types.js +15 -0
  71. package/dist/core/compile/types.js.map +1 -0
  72. package/dist/core/export/bin.d.ts +61 -0
  73. package/dist/core/export/bin.js +221 -0
  74. package/dist/core/export/bin.js.map +1 -0
  75. package/dist/core/export/fzpz.d.ts +37 -0
  76. package/dist/core/export/fzpz.js +121 -0
  77. package/dist/core/export/fzpz.js.map +1 -0
  78. package/dist/core/export/index.d.ts +5 -0
  79. package/dist/core/export/index.js +6 -0
  80. package/dist/core/export/index.js.map +1 -0
  81. package/dist/core/export/install.d.ts +77 -0
  82. package/dist/core/export/install.js +183 -0
  83. package/dist/core/export/install.js.map +1 -0
  84. package/dist/core/export/prune.d.ts +72 -0
  85. package/dist/core/export/prune.js +165 -0
  86. package/dist/core/export/prune.js.map +1 -0
  87. package/dist/core/fritzing.d.ts +22 -0
  88. package/dist/core/fritzing.js +77 -0
  89. package/dist/core/fritzing.js.map +1 -0
  90. package/dist/core/identity.d.ts +29 -0
  91. package/dist/core/identity.js +70 -0
  92. package/dist/core/identity.js.map +1 -0
  93. package/dist/core/image/bbox.d.ts +27 -0
  94. package/dist/core/image/bbox.js +24 -0
  95. package/dist/core/image/bbox.js.map +1 -0
  96. package/dist/core/image/index.d.ts +8 -0
  97. package/dist/core/image/index.js +9 -0
  98. package/dist/core/image/index.js.map +1 -0
  99. package/dist/core/image/key.d.ts +72 -0
  100. package/dist/core/image/key.js +317 -0
  101. package/dist/core/image/key.js.map +1 -0
  102. package/dist/core/image/prepare.d.ts +31 -0
  103. package/dist/core/image/prepare.js +98 -0
  104. package/dist/core/image/prepare.js.map +1 -0
  105. package/dist/core/image/remover.d.ts +17 -0
  106. package/dist/core/image/remover.js +51 -0
  107. package/dist/core/image/remover.js.map +1 -0
  108. package/dist/core/index.d.ts +16 -0
  109. package/dist/core/index.js +17 -0
  110. package/dist/core/index.js.map +1 -0
  111. package/dist/core/kicad/footprint.d.ts +104 -0
  112. package/dist/core/kicad/footprint.js +317 -0
  113. package/dist/core/kicad/footprint.js.map +1 -0
  114. package/dist/core/kicad/index.d.ts +25 -0
  115. package/dist/core/kicad/index.js +197 -0
  116. package/dist/core/kicad/index.js.map +1 -0
  117. package/dist/core/kicad/sexpr.d.ts +35 -0
  118. package/dist/core/kicad/sexpr.js +163 -0
  119. package/dist/core/kicad/sexpr.js.map +1 -0
  120. package/dist/core/resolve.d.ts +113 -0
  121. package/dist/core/resolve.js +301 -0
  122. package/dist/core/resolve.js.map +1 -0
  123. package/dist/core/schema/part.d.ts +995 -0
  124. package/dist/core/schema/part.js +278 -0
  125. package/dist/core/schema/part.js.map +1 -0
  126. package/dist/core/schema/part.schema.json +1122 -0
  127. package/dist/core/svg.d.ts +20 -0
  128. package/dist/core/svg.js +56 -0
  129. package/dist/core/svg.js.map +1 -0
  130. package/dist/core/units.d.ts +28 -0
  131. package/dist/core/units.js +42 -0
  132. package/dist/core/units.js.map +1 -0
  133. package/dist/core/validate/checker.d.ts +46 -0
  134. package/dist/core/validate/checker.js +142 -0
  135. package/dist/core/validate/checker.js.map +1 -0
  136. package/dist/core/validate/doctor.d.ts +25 -0
  137. package/dist/core/validate/doctor.js +156 -0
  138. package/dist/core/validate/doctor.js.map +1 -0
  139. package/dist/core/validate/explain.d.ts +10 -0
  140. package/dist/core/validate/explain.js +135 -0
  141. package/dist/core/validate/explain.js.map +1 -0
  142. package/dist/core/validate/index.d.ts +21 -0
  143. package/dist/core/validate/index.js +96 -0
  144. package/dist/core/validate/index.js.map +1 -0
  145. package/dist/core/validate/structural.d.ts +74 -0
  146. package/dist/core/validate/structural.js +664 -0
  147. package/dist/core/validate/structural.js.map +1 -0
  148. package/dist/core/workspace.d.ts +69 -0
  149. package/dist/core/workspace.js +213 -0
  150. package/dist/core/workspace.js.map +1 -0
  151. package/dist/mcp/jsonpatch.d.ts +30 -0
  152. package/dist/mcp/jsonpatch.js +145 -0
  153. package/dist/mcp/jsonpatch.js.map +1 -0
  154. package/dist/mcp/main.d.ts +2 -0
  155. package/dist/mcp/main.js +5 -0
  156. package/dist/mcp/main.js.map +1 -0
  157. package/dist/mcp/server.d.ts +28 -0
  158. package/dist/mcp/server.js +310 -0
  159. package/dist/mcp/server.js.map +1 -0
  160. package/dist/server/api.d.ts +72 -0
  161. package/dist/server/api.js +507 -0
  162. package/dist/server/api.js.map +1 -0
  163. package/dist/server/events.d.ts +28 -0
  164. package/dist/server/events.js +134 -0
  165. package/dist/server/events.js.map +1 -0
  166. package/dist/server/http.d.ts +36 -0
  167. package/dist/server/http.js +127 -0
  168. package/dist/server/http.js.map +1 -0
  169. package/dist/server/index.d.ts +65 -0
  170. package/dist/server/index.js +193 -0
  171. package/dist/server/index.js.map +1 -0
  172. package/dist/ui/assets/index-DLU8opyI.js +63 -0
  173. package/dist/ui/assets/index-GhUA-T3b.css +1 -0
  174. package/dist/ui/index.html +14 -0
  175. package/package.json +89 -4
  176. package/skills/fritzkit/SKILL.md +690 -0
  177. package/skills/fritzkit/reference/examples.md +275 -0
  178. package/skills/fritzkit/reference/part-json.md +333 -0
  179. package/skills/fritzkit/scripts/measure.py +197 -0
  180. package/tools/fzp-checker/.python-version +1 -0
  181. package/tools/fzp-checker/README.md +45 -0
  182. package/tools/fzp-checker/check_fzp.py +48 -0
  183. package/tools/fzp-checker/pyproject.toml +26 -0
  184. package/tools/fzp-checker/uv.lock +266 -0
  185. package/tools/fzp-checker/vendor/LICENSE.txt +8 -0
  186. package/tools/fzp-checker/vendor/UPSTREAM.md +25 -0
  187. package/tools/fzp-checker/vendor/fzp_checker.py +14 -0
  188. package/tools/fzp-checker/vendor/scripts/checks/__init__.py +26 -0
  189. package/tools/fzp-checker/vendor/scripts/checks/check_missing_leg_ids.py +44 -0
  190. package/tools/fzp-checker/vendor/scripts/checks/checkascii.py +27 -0
  191. package/tools/fzp-checker/vendor/scripts/checks/checkcase.py +156 -0
  192. package/tools/fzp-checker/vendor/scripts/checks/checkcopies.py +104 -0
  193. package/tools/fzp-checker/vendor/scripts/checks/connector_numbering.py +79 -0
  194. package/tools/fzp-checker/vendor/scripts/checks/connectors_misnumbered.py +228 -0
  195. package/tools/fzp-checker/vendor/scripts/checks/explain_errors.md +95 -0
  196. package/tools/fzp-checker/vendor/scripts/checks/fzp_checker_runner.py +717 -0
  197. package/tools/fzp-checker/vendor/scripts/checks/fzp_checkers.py +1069 -0
  198. package/tools/fzp-checker/vendor/scripts/checks/fzp_svg_checkers.py +62 -0
  199. package/tools/fzp-checker/vendor/scripts/checks/fzp_utils.py +222 -0
  200. package/tools/fzp-checker/vendor/scripts/checks/inspector_fc51.png +0 -0
  201. package/tools/fzp-checker/vendor/scripts/checks/invisibleconnectors.py +118 -0
  202. package/tools/fzp-checker/vendor/scripts/checks/nolayeridcheck.txt +758 -0
  203. package/tools/fzp-checker/vendor/scripts/checks/requirements.txt +3 -0
  204. package/tools/fzp-checker/vendor/scripts/checks/svg_checkers.py +953 -0
  205. package/tools/fzp-checker/vendor/scripts/checks/svg_utils.py +96 -0
  206. package/tools/fzp-checker/vendor/scripts/checks/test_checkers.py +839 -0
  207. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/author_missing.fzp.test +3 -0
  208. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/author_present.fzp.test +4 -0
  209. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/buses_missing_id.fzp.test +8 -0
  210. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/buses_missing_node_members.fzp.test +7 -0
  211. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/buses_present_valid.fzp.test +8 -0
  212. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/connector_layers_missing_attributes.fzp.test +16 -0
  213. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/connector_layers_present_valid.fzp.test +14 -0
  214. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/connector_numbering_invalid.fzp.test +70 -0
  215. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/connector_numbering_valid.fzp.test +70 -0
  216. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/connector_refs_valid.fzp.test +53 -0
  217. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_invalid_mixed.fzp.test +11 -0
  218. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_invalid_silkscreen_nested.fzp.test +11 -0
  219. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_invalid_style_attr.fzp.test +11 -0
  220. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_invalid_white_stroke.fzp.test +11 -0
  221. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_invalid_wrong_color.fzp.test +11 -0
  222. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_inherited.fzp.test +11 -0
  223. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_legacy.fzp.test +12 -0
  224. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_nested_copper.fzp.test +12 -0
  225. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_none.fzp.test +11 -0
  226. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_standard.fzp.test +12 -0
  227. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_uppercase.fzp.test +11 -0
  228. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/css_connector.fzp.test +100 -0
  229. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/description_missing.fzp.test +3 -0
  230. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/description_present.fzp.test +4 -0
  231. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/duplicate_ids.fzp.test +27 -0
  232. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/family_property_missing.fzp.test +6 -0
  233. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/family_property_present_valid.fzp.test +6 -0
  234. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/font_size.fzp.test +46 -0
  235. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/fritzing_version_invalid_format.fzp.test +4 -0
  236. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/fritzing_version_missing.fzp.test +4 -0
  237. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/fritzing_version_present_valid.fzp.test +4 -0
  238. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/gorn_absent.fzp.test +15 -0
  239. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/gorn_present.fzp.test +15 -0
  240. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/hybrid_connectors.fzp.test +232 -0
  241. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/invalid_xml.fzp.test +12 -0
  242. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/layer_ids_match.fzp.test +29 -0
  243. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/layer_ids_mismatch.fzp.test +30 -0
  244. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/layer_nesting_invalid.fzp.test +11 -0
  245. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/layer_nesting_valid.fzp.test +11 -0
  246. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/matrix_transform.fzp.test +8 -0
  247. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/missing_connector_refs.fzp.test +63 -0
  248. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/missing_leg_ids.fzp.test +34 -0
  249. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_missing.fzp.test +4 -0
  250. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_non_alnum.fzp.test +4 -0
  251. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_present.fzp.test +4 -0
  252. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_special_chars_absent.fzp.test +4 -0
  253. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_special_chars_present.fzp.test +4 -0
  254. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_too_short.fzp.test +4 -0
  255. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/no_layer_invalid.fzp.test +19 -0
  256. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/no_layer_namedview.fzp.test +19 -0
  257. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/no_layer_valid.fzp.test +19 -0
  258. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/pcb_only.fzp.test +48 -0
  259. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/property_fields_missing_name.fzp.test +6 -0
  260. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/property_fields_missing_value.fzp.test +6 -0
  261. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/property_fields_present.fzp.test +6 -0
  262. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/required_tags_missing.fzp.test +3 -0
  263. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/required_tags_present.fzp.test +11 -0
  264. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/stroke_test.fzp.test +60 -0
  265. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/template_svgs.fzp.test +35 -0
  266. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/title_missing.fzp.test +3 -0
  267. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/title_present.fzp.test +4 -0
  268. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/unique_ids.fzp.test +27 -0
  269. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/unique_property_names_duplicates.fzp.test +7 -0
  270. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/unique_property_names_unique.fzp.test +7 -0
  271. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/valid_xml.fzp.test +249 -0
  272. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/version_invalid_format.fzp.test +4 -0
  273. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/version_missing.fzp.test +3 -0
  274. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/version_present_valid.fzp.test +4 -0
  275. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/views_missing.fzp.test +3 -0
  276. package/tools/fzp-checker/vendor/scripts/checks/test_data/core/views_present.fzp.test +8 -0
  277. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/connector_refs_valid_breadboard.svg +7 -0
  278. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/duplicate_ids_breadboard.svg +13 -0
  279. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/gorn_absent_breadboard.svg +7 -0
  280. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/gorn_present_breadboard.svg +7 -0
  281. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/hybrid_connectors_breadboard.svg +102 -0
  282. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/layer_nesting_invalid.svg +13 -0
  283. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/layer_nesting_valid.svg +13 -0
  284. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/matrix_transform.svg +11 -0
  285. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/missing_connector_refs_breadboard.svg +8 -0
  286. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/missing_leg_ids_breadboard.svg +9 -0
  287. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/test_layer_ids_match_breadboard.svg +9 -0
  288. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/test_layer_ids_mismatch_breadboard.svg +9 -0
  289. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/unique_ids_breadboard.svg +13 -0
  290. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/icon/hybrid_connectors_icon.svg +78 -0
  291. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/icon/no_layer_invalid.svg +4 -0
  292. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/icon/no_layer_namedview.svg +9 -0
  293. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/icon/no_layer_valid.svg +7 -0
  294. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/icon/plain_pcb.svg +10 -0
  295. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/connector_refs_valid_pcb.svg +10 -0
  296. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_invalid_mixed.svg +8 -0
  297. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_invalid_silkscreen_nested.svg +10 -0
  298. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_invalid_style_attr.svg +6 -0
  299. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_invalid_white_stroke.svg +6 -0
  300. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_invalid_wrong_color.svg +6 -0
  301. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_inherited.svg +7 -0
  302. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_legacy.svg +10 -0
  303. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_nested_copper.svg +9 -0
  304. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_none.svg +7 -0
  305. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_standard.svg +10 -0
  306. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_uppercase.svg +7 -0
  307. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/css_connector.svg +25 -0
  308. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/font_size.svg +54 -0
  309. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/hybrid_connectors_pcb.svg +35 -0
  310. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/missing_connector_refs_pcb.svg +14 -0
  311. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/pcb-arduino-shield.svg +25 -0
  312. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/stroke_test.svg +12 -0
  313. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/test_layer_ids_match_pcb.svg +12 -0
  314. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/test_layer_ids_mismatch_pcb.svg +12 -0
  315. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/schematic/connector_refs_valid_schematic.svg +7 -0
  316. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/schematic/hybrid_connectors_schematic.svg +59 -0
  317. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/schematic/missing_connector_refs_schematic.svg +8 -0
  318. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/schematic/test_layer_ids_match_schematic.svg +6 -0
  319. package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/schematic/test_layer_ids_mismatch_schematic.svg +6 -0
@@ -0,0 +1,104 @@
1
+ import getopt
2
+ import sys
3
+ import os
4
+
5
+ def usage():
6
+ print("""
7
+ usage:
8
+ checkcopies.py -d <directory>
9
+
10
+ <directory> is a folder containing svg files.
11
+ looks for files that have the same content but different names
12
+
13
+ Part of CI tests
14
+ """)
15
+
16
+
17
+ def run_fast_scandir(scan_dir, ext): # scan_dir: str, ext: list
18
+ subfolders, files = [], []
19
+
20
+ for f in os.scandir(scan_dir):
21
+ if f.is_dir():
22
+ subfolders.append(f.path)
23
+ if f.is_file():
24
+ if os.path.splitext(f.name)[1].lower() in ext:
25
+ files.append(f.path)
26
+
27
+ for d in list(subfolders):
28
+ sf, f = run_fast_scandir(d, ext)
29
+ subfolders.extend(sf)
30
+ files.extend(f)
31
+ return subfolders, files
32
+
33
+
34
+ def main():
35
+ try:
36
+ opts, args = getopt.getopt(sys.argv[1:], "hd:", ["help", "directory"])
37
+ except getopt.GetoptError as err:
38
+ # print help information and exit:
39
+ print(str(err)) # will print something like "option -a not recognized"
40
+ usage()
41
+ return
42
+
43
+ outputDir = None
44
+ gotnot = 0
45
+
46
+ for o, a in opts:
47
+ # print o
48
+ # print a
49
+ if o in ("-d", "--directory"):
50
+ outputDir = a
51
+ elif o in ("-h", "--help"):
52
+ usage()
53
+ return
54
+ else:
55
+ assert False, "unhandled option"
56
+
57
+ if not outputDir:
58
+ print("missing -d {directory} parameter")
59
+ usage()
60
+ return
61
+
62
+ subfolders, files = run_fast_scandir(outputDir, [".svg"])
63
+ print("Checking %d files for duplicates" % len(files))
64
+ files.sort(key=lambda f: os.stat(f).st_size, reverse=True)
65
+ matches = []
66
+ for i in range(0, len(files)-1):
67
+ f1 = files[i]
68
+ s = os.stat(f1).st_size
69
+ # print("Check candidate %s , %d" % (files[i], s))
70
+ j = i + 1
71
+ while s == os.stat(files[j]).st_size:
72
+ f2 = files[j]
73
+ # print(" other %s , %d" % (files[j], s))
74
+ j += 1
75
+ txt1 = None
76
+ try:
77
+ infile = open(f1, "r")
78
+ txt1 = infile.read()
79
+ infile.close()
80
+ except IOError:
81
+ print("failure", f1)
82
+ if txt1 is None:
83
+ continue
84
+
85
+ txt2 = None
86
+ try:
87
+ infile = open(f2, "r")
88
+ txt2 = infile.read()
89
+ infile.close()
90
+ except IOError:
91
+ print("failure", f2)
92
+ continue
93
+ if txt2 is None:
94
+ continue
95
+
96
+ if txt1 == txt2:
97
+ matches.append(
98
+ "<map package='{0}' to='{1}' />".format(f1, f2))
99
+
100
+ print("%d duplicate pairs found" % len(matches))
101
+
102
+
103
+ if __name__ == "__main__":
104
+ main()
@@ -0,0 +1,79 @@
1
+ from .fzp_checkers import FZPChecker
2
+ import re
3
+
4
+ class FZPConnectorNumberingChecker(FZPChecker):
5
+ def check(self):
6
+ pattern = r'(\d+)'
7
+ numberFinder = re.compile(pattern, re.IGNORECASE)
8
+
9
+ connectors = self.fzp_doc.xpath("//connector")
10
+
11
+ # Check if any connector has an integer name
12
+ gotInt = False
13
+ for connector in connectors:
14
+ try:
15
+ int(connector.get("name"))
16
+ gotInt = True
17
+ break
18
+ except (ValueError, TypeError):
19
+ continue
20
+
21
+ if not gotInt:
22
+ return self.get_result()
23
+
24
+ # Check if id or name starts from zero
25
+ idZero = False
26
+ for connector in connectors:
27
+ try:
28
+ connector_id = connector.get("id")
29
+ match = numberFinder.search(connector_id)
30
+ if match and match.group(1) == '0':
31
+ idZero = True
32
+ break
33
+ except:
34
+ continue
35
+
36
+ nameZero = False
37
+ for connector in connectors:
38
+ if connector.get("name") == "0":
39
+ nameZero = True
40
+ break
41
+
42
+ # Check for mismatches
43
+ for connector in connectors:
44
+ idInt = 0
45
+ nameInt = 0
46
+ try:
47
+ connector_id = connector.get("id")
48
+ match = numberFinder.search(connector_id)
49
+ if match is None:
50
+ continue
51
+
52
+ idInt = int(match.group(1))
53
+ nameInt = int(connector.get("name"))
54
+
55
+ except (ValueError, TypeError):
56
+ continue
57
+
58
+ mismatch = False
59
+ if nameZero and idZero:
60
+ mismatch = (idInt != nameInt)
61
+ elif nameZero:
62
+ mismatch = (idInt != nameInt + 1)
63
+ elif idZero:
64
+ mismatch = (idInt + 1 != nameInt)
65
+ else:
66
+ mismatch = (idInt != nameInt)
67
+
68
+ if mismatch:
69
+ self.add_warning(f"Connector mismatch: id={connector_id}, name={connector.get('name')}")
70
+
71
+ return self.get_result()
72
+
73
+ @staticmethod
74
+ def get_name():
75
+ return "connector_numbering"
76
+
77
+ @staticmethod
78
+ def get_description():
79
+ return "Check that connectors with integer names are correctly mapped to connector numbers"
@@ -0,0 +1,228 @@
1
+ import getopt
2
+ import sys
3
+ import os
4
+ import os.path
5
+ import re
6
+ import xml.dom.minidom
7
+ import xml.dom
8
+
9
+ # Part of CI tests
10
+
11
+ def usage():
12
+ print("""
13
+ usage:
14
+ connectors_misnumbered.py -d [fzp folder]
15
+ checks that connectors with integer names are correctly mapped to connector numbers
16
+ """)
17
+
18
+
19
+ def skip(filename):
20
+ skip_files = [
21
+ "./core/AlphaNumericDisplay-v13.fzp",
22
+ "./core/Arduino_Esplora.fzp",
23
+ "./core/arduinoXbeere.fzp",
24
+ "./core/ArduPilotMega_v15.fzp",
25
+ "./core/Bean_revE.fzp",
26
+ "./core/CAR_RELE_NVF4-2.fzp",
27
+ "./core/din-5_midi_connector.fzp",
28
+ "./core/electromechanical-battery-2-aaa.fzp",
29
+ "./core/electromechanical-battery-2-aa.fzp",
30
+ "./core/ESP8266-Thing-Dev.fzp",
31
+ "./core/grove_beginner_kit.fzp",
32
+ "./core/HiFive1.fzp",
33
+ "./core/jlpcb-089.fzp",
34
+ "./obsolete/kameleon.fzp",
35
+ "./core/LilyPad-XBee-v15.fzp",
36
+ "./core/ludusProtoShieldWireless.fzp",
37
+ "./core/monacor_ltr_110_linetransformer.fzp",
38
+ "./core/MyoWare_Proto_Shield.fzp",
39
+ "./core/pinoccio-proto.fzp",
40
+ "./core/Power Screwshield 1.0a.fzp",
41
+ "./core/ProtoShield-Mini-v12.fzp",
42
+ "./core/RN41-v14.fzp",
43
+ "./core/Rotoshield-1.0a.fzp",
44
+ "./core/SMD_BC847.fzp",
45
+ "./core/SMD_BC857.fzp",
46
+ "./core/Sony_Spresense_ext_board_1.fzp",
47
+ "./core/SonySpresenseExtension_CXD5602PWBEXT1.fzp",
48
+ "./core/sparkfun-connectors-db25-hp.fzp",
49
+ "./core/sparkfun-connectors-db25-vp.fzp",
50
+ "./core/sparkfun-connectors-db9-female.fzp",
51
+ "./core/sparkfun-connectors-db9-male.fzp",
52
+ "./core/sparkfun-connectors-din7-.fzp",
53
+ "./core/sparkfun-connectors-f25-hp.fzp",
54
+ "./core/sparkfun-connectors-f25-vp.fzp",
55
+ "./core/sparkfun-connectors-ftdi_basic-pth.fzp",
56
+ "./core/sparkfun-connectors-m02-4ucon-15767.fzp",
57
+ "./core/sparkfun-connectors-m02--jst-2mm-smt.fzp",
58
+ "./core/sparkfun-connectors-m02-rocker.fzp",
59
+ "./core/sparkfun-connectors-m03-.fzp",
60
+ "./core/sparkfun-connectors-m03-smd.fzp",
61
+ "./core/sparkfun-connectors-m04-smd2.fzp",
62
+ "./core/sparkfun-connectors-m05-smd2.fzp",
63
+ "./core/sparkfun-connectors-m05-smd.fzp",
64
+ "./core/sparkfun-connectors-m06-em406.fzp",
65
+ "./core/sparkfun-connectors-m06-smdf.fzp",
66
+ "./core/sparkfun-connectors-m06-smd-straight-combo.fzp",
67
+ "./core/sparkfun-connectors-m08-smd-combo.fzp",
68
+ "./core/sparkfun-displays-7-segment-4digit-for_pogobed_only.fzp",
69
+ "./core/sparkfun-displays-7-segment-4digit-pth.fzp",
70
+ "./core/sparkfun-electromechanical-ayz0202-.fzp",
71
+ "./core/sparkfun-electromechanical-relay-2-g5q.fzp",
72
+ "./core/sparkfun-electromechanical-switch-dpdt-eg2211.fzp",
73
+ "./core/sparkfun-electromechanical-switch-dpdt-es.fzp",
74
+ "./core/sparkfun-electromechanical-switch-dpdt-gpi.fzp",
75
+ "./core/sparkfun-electromechanical-switch-dpdt-pth.fzp",
76
+ "./core/sparkfun-electromechanical-switch-momentary-2-12mm.fzp",
77
+ "./core/sparkfun-electromechanical-switch-momentary-2-.fzp",
78
+ "./core/sparkfun-electromechanical-switch-momentary-2-pth.fzp",
79
+ "./core/sparkfun-electromechanical-switch-momentary-2-smd-2.fzp",
80
+ "./core/sparkfun-electromechanical-switch-momentary-2-smd.fzp",
81
+ "./core/sparkfun-electromechanical-switch-sp3t-.fzp",
82
+ "./core/sparkfun-freqctrl-crystal-5x3.fzp",
83
+ "./core/sparkfun-freqctrl-crystal-epsonmc146.fzp",
84
+ "./core/sparkfun-freqctrl-resonator_nocap-.fzp",
85
+ "./core/sparkfun-led-led_ring-.fzp",
86
+ "./core/SparkFun Load Sensor Combinator.fzp",
87
+ "./core/sparkfun-passives-cap_adj-smd.fzp",
88
+ "./core/sparkfun-passives-fuse-x20mm.fzp",
89
+ "./core/sparkfun-passives-inductor-sru5028.fzp",
90
+ "./core/sparkfun-poweric-transformer-smd.fzp",
91
+ "./core/sparkfun-rf-mirf-.fzp",
92
+ "./core/sx1509-breakout.fzp",
93
+ "./core/Wireless_SD_v3.fzp",
94
+ "./obsolete/sparkfun-electromechanical-battery-2-aaa.fzp",
95
+ "./obsolete/sparkfun-electromechanical-battery-2-aa.fzp",
96
+ ]
97
+ for i, item in enumerate(skip_files):
98
+ skip_files[i] = os.path.normpath(item)
99
+ return os.path.normpath(filename) in skip_files
100
+
101
+ def main():
102
+ try:
103
+ opts, args = getopt.getopt(sys.argv[1:], "hd:", ["help", "directory"])
104
+ except getopt.GetoptError as err:
105
+ # print help information and exit:
106
+ print(str(err)) # will print something like "option -a not recognized"
107
+ usage()
108
+ return -1
109
+
110
+ dir = None
111
+
112
+ for o, a in opts:
113
+ # print o
114
+ # print a
115
+ if o in ("-d", "--directory"):
116
+ dir = a
117
+ elif o in ("-h", "--help"):
118
+ usage()
119
+ return 0
120
+ else:
121
+ assert False, "unhandled option"
122
+
123
+ if(not(dir)):
124
+ usage()
125
+ return -1
126
+
127
+ pattern = r'(\d+)'
128
+ numberFinder = re.compile(pattern, re.IGNORECASE)
129
+
130
+ ret = 0
131
+ count = 0
132
+ for root, dirs, files in os.walk(dir, topdown=False):
133
+ for filename in files:
134
+ if not filename.endswith(".fzp"):
135
+ continue
136
+
137
+ fzpFilename = os.path.join(root, filename)
138
+ if skip(fzpFilename):
139
+ continue
140
+
141
+ count += 1
142
+
143
+ try:
144
+ dom = xml.dom.minidom.parse(fzpFilename)
145
+ except xml.parsers.expat.ExpatError as err:
146
+ print(str(err), fzpFilename)
147
+ continue
148
+
149
+ fzp = dom.documentElement
150
+ connectors = fzp.getElementsByTagName("connector")
151
+ gotInt = False
152
+ for connector in connectors:
153
+ try:
154
+ intname = int(connector.getAttribute("name"))
155
+ gotInt = True
156
+ except:
157
+ continue
158
+
159
+ if not gotInt:
160
+ continue
161
+
162
+ idZero = False
163
+ for connector in connectors:
164
+ try:
165
+ id = connector.getAttribute("id")
166
+ match = numberFinder.search(id)
167
+ if match == None:
168
+ continue
169
+
170
+ if match.group(1) == '0':
171
+ idZero = True
172
+ break
173
+ except:
174
+ continue
175
+
176
+ nameZero = False
177
+ for connector in connectors:
178
+ if connector.getAttribute("name") == "0":
179
+ nameZero = True
180
+ break
181
+
182
+ mismatches = []
183
+ for connector in connectors:
184
+ idInt = 0
185
+ nameInt = 0
186
+ try:
187
+ id = connector.getAttribute("id")
188
+ match = numberFinder.search(id)
189
+ if match == None:
190
+ continue
191
+
192
+ idInt = int(match.group(1))
193
+ nameInt = int(connector.getAttribute("name"))
194
+
195
+ except:
196
+ continue
197
+
198
+ mismatch = False
199
+ if nameZero and idZero:
200
+ mismatch = (idInt != nameInt)
201
+ elif nameZero:
202
+ mismatch = (idInt != nameInt + 1)
203
+ elif idZero:
204
+ mismatch = (idInt + 1 != nameInt)
205
+ else:
206
+ mismatch = (idInt != nameInt)
207
+ if mismatch:
208
+ mismatches.append(connector)
209
+
210
+ if len(mismatches) > 0:
211
+ ret = -1
212
+ print(fzpFilename, nameZero, idZero)
213
+ for connector in mismatches:
214
+ strings = connector.toxml().split("\n")
215
+ print(strings[0])
216
+ print()
217
+
218
+ if count == 0:
219
+ print("No files checked in ", dir)
220
+ ret = -2
221
+ else:
222
+ print("%s files checked" % count)
223
+
224
+ return ret
225
+
226
+
227
+ if __name__ == "__main__":
228
+ sys.exit(main())
@@ -0,0 +1,95 @@
1
+ ## Common errors the CI reports on parts and their fixes
2
+
3
+ ### Missing viewBox attribute
4
+ This error will appear if the SVG has no viewBox attribute. If there is no viewBox, Fritzing will apply some heuristic to
5
+ guess the DPI and therefore the physical size of the graphic. This can easily go wrong.
6
+ *Fix*
7
+ Add all three, viewBox, width, and height attributes. Specify the width and height in mm or inch.
8
+
9
+ ### Invisible connector
10
+ This error appears if a connector does not have renderable objects in the SVG. This often works, because Fritzing
11
+ modifies connector graphics by setting a color and a stroke. This is error prone: Sometimes, adding a stroke
12
+ is not enough, and some tools and SVG parsers remove non-visible elements. And since the element is not rendered by
13
+ regular SVG editors, there is also a risk to overlook misplaced connectors.
14
+ *Fix*
15
+ It depends. Often there is another visible element that represents the connector and should be used instead.
16
+ Sometimes this is a true error in the SVG, e.g. from mixed up connector IDs. Or, if you want to omit a connector entirely in a view,
17
+ you can mark it as 'hybrid' connector in the FZP file.
18
+
19
+ ### Duplicate id attribute
20
+ IDs in SVGs must be unique; some programs can not deal with duplicates. This often happens in the PCB view, when
21
+ the same ID is used for connectors in different layers. In these cases Fritzing usually is able to refer the correct
22
+ element via the layer id. However, this is very easy to mess up, since it is also confusing during editing the part.
23
+ There is no verification that Fritzing does this as intended in each and every place.
24
+ *Fix*
25
+ Carefully check how the duplicate was introduced, maybe it is just numbered wrong. Or de-duplicate, by attaching
26
+ underscore and number. For the PCB view, you can also nest the copper0 group within the copper1 group, and use the
27
+ same connector for both to have it in both layers.
28
+
29
+ ### Invisible or missing terminal
30
+ This is one of the most common errors in Fritzing parts. If this error shows, Fritzing will use the center of the connector as
31
+ terminal.
32
+ *Fix*
33
+ Fritzing 1.0.3 will automatically set the terminal, unless a terminal explicitly specified in the FZP. Therefore,
34
+ the fix is almost always, to remove the terminal definition from the FZP and the SVG. If you still want to manually set
35
+ the exact terminal point, please make sure the terminal is visible. Avoid zero width and zero height.
36
+
37
+ ### Unknown style attribute
38
+ SVG elements can have XML attributes, as well as CSS styles. Only a very small subset of CSS styles is supported by
39
+ Fritzing. If in doubt, it is usually better to use XML attributes.
40
+
41
+ Fritzing has some workarounds for the following styles:
42
+ ```
43
+ fixStyleAttribute(element, style, "stroke-width");
44
+ fixStyleAttribute(element, style, "stroke");
45
+ fixStyleAttribute(element, style, "fill");
46
+ fixStyleAttribute(element, style, "fill-opacity");
47
+ fixStyleAttribute(element, style, "stroke-opacity");
48
+ fixStyleAttribute(element, style, "font-size");
49
+ fixStyleAttribute(element, style, "stroke-dasharray");
50
+ ```
51
+ These are automatically transformed into XML attributes.
52
+ Remaining styles are passed on to Qt renderer, which officially does not support them.
53
+
54
+
55
+ ### Style conflict
56
+
57
+ In some cases, CSS styles and XML attributes may be conflicting. The rendered result is hard to predict,
58
+ since XML does not specify a strict ordering for attributes. Please resolve the conflict manually, by
59
+ only using a XML attribute.
60
+
61
+ ### Property has an empty value
62
+ You can check the inspector how the properties are applied.
63
+
64
+ Example:
65
+ ```
66
+ Error: Property 'part number' has an empty value.
67
+ Error: Property 'layer' has an empty value.
68
+ Error: Property 'hole size' has an empty value.
69
+ Error: Property 'mn' has an empty value.
70
+ Error: Property 'mpn' has an empty value.
71
+ ```
72
+ Custom parts currently can't configure the hole size. So you might as well remove it.
73
+ Without a value, listing properties in the part will often have no effect.
74
+ If you provide a default value, it should actually show as a default in the inspector.
75
+
76
+ ![inspector_fc51.png](inspector_fc51.png)
77
+
78
+
79
+ ### Layer ID 'icon' from iconView not found in SVG file
80
+ This usually happens if you use the breadboard image as icon.
81
+ This is often not the best solution, because the breadboard image
82
+ is difficult to recognize at icon size.
83
+ It is better to have a separate icon file,
84
+ showing some characteristic region of interest,
85
+ like a cropped version of the breadboard image.
86
+
87
+ ### Process completed with exit code 255
88
+ This is just the CI telling us that some error has happened before.
89
+
90
+ ## Error not listed here, or still unclear?
91
+
92
+ If you think that an error is a false alert, or unsure what the error means or how to fix it, please open an issue at
93
+ github.com/fritzing/fritzing-parts . If possible provide a link to your CI run, the pull request, and the part file,
94
+ along with a copy of the error message, and a description of what you already tried.
95
+