simplecadapi 2.0.2__tar.gz → 2.0.3__tar.gz

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 (294) hide show
  1. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/PKG-INFO +3 -3
  2. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/README.md +2 -2
  3. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/pyproject.toml +1 -1
  4. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/SKILL.md +3 -3
  5. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/PROJECT_OVERVIEW.md +2 -2
  6. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/PROJECT_README.md +2 -2
  7. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/RUNTIME_INSTALL.md +1 -1
  8. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/install.sh +2 -2
  9. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/repl_bootstrap.py +1 -1
  10. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/auto_tools/skill_pack.py +209 -28
  11. simplecadapi-2.0.3/test/test_skill_pack.py +141 -0
  12. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/uv.lock +1 -1
  13. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/.gitignore +0 -0
  14. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/.python-version +0 -0
  15. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/LICENSE +0 -0
  16. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/MANIFEST.in +0 -0
  17. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/README.md +0 -0
  18. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/add_part_rassembly.md +0 -0
  19. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/and_.md +0 -0
  20. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/bounds_rbbox.md +0 -0
  21. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/chamfer_rsolid.md +0 -0
  22. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/clear_constraints_rassembly.md +0 -0
  23. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/clone_assembly_rassembly.md +0 -0
  24. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/constrain_coincident_rassembly.md +0 -0
  25. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/constrain_concentric_rassembly.md +0 -0
  26. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/constrain_distance_rassembly.md +0 -0
  27. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/constrain_offset_rassembly.md +0 -0
  28. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/cut_rsolidlist.md +0 -0
  29. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/eval_rarray.md +0 -0
  30. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/eval_rscalar.md +0 -0
  31. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/export_step.md +0 -0
  32. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/export_stl.md +0 -0
  33. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/extrude_rsolid.md +0 -0
  34. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/fillet_rsolid.md +0 -0
  35. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/geo.md +0 -0
  36. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/helical_sweep_rsolid.md +0 -0
  37. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/intersect_rscalarfield.md +0 -0
  38. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/intersect_rsolidlist.md +0 -0
  39. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/linear_pattern_rsolidlist.md +0 -0
  40. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/loft_rsolid.md +0 -0
  41. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_angle_arc_redge.md +0 -0
  42. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_angle_arc_rwire.md +0 -0
  43. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_assembly_rassembly.md +0 -0
  44. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_box_rscalarfield.md +0 -0
  45. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_box_rsolid.md +0 -0
  46. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_capsule_rscalarfield.md +0 -0
  47. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_circle_redge.md +0 -0
  48. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_circle_rface.md +0 -0
  49. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_circle_rwire.md +0 -0
  50. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_cone_rsolid.md +0 -0
  51. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_cylinder_rsolid.md +0 -0
  52. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_ellipsoid_rscalarfield.md +0 -0
  53. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_face_from_wire_rface.md +0 -0
  54. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_field_surface_rsolid.md +0 -0
  55. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_helix_redge.md +0 -0
  56. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_helix_rwire.md +0 -0
  57. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_line_redge.md +0 -0
  58. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_n_hole_flange_rsolid.md +0 -0
  59. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
  60. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_point_rvertex.md +0 -0
  61. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_polyline_rwire.md +0 -0
  62. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_rectangle_rface.md +0 -0
  63. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_rectangle_rwire.md +0 -0
  64. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_segment_redge.md +0 -0
  65. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_segment_rwire.md +0 -0
  66. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_sphere_rscalarfield.md +0 -0
  67. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_sphere_rsolid.md +0 -0
  68. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_spline_redge.md +0 -0
  69. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_spline_rwire.md +0 -0
  70. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_threaded_rod_rsolid.md +0 -0
  71. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_three_point_arc_redge.md +0 -0
  72. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_three_point_arc_rwire.md +0 -0
  73. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_wire_from_edges_rwire.md +0 -0
  74. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/meta.md +0 -0
  75. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/mirror_shape.md +0 -0
  76. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/not_.md +0 -0
  77. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/or_.md +0 -0
  78. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/radial_pattern_rsolidlist.md +0 -0
  79. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/render_screenshot_rpath.md +0 -0
  80. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/revolve_rsolid.md +0 -0
  81. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/rotate_part_rassembly.md +0 -0
  82. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/rotate_rscalarfield.md +0 -0
  83. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/rotate_shape.md +0 -0
  84. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/scale_rscalarfield.md +0 -0
  85. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/select.md +0 -0
  86. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/select_edges_by_tag.md +0 -0
  87. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/select_faces_by_tag.md +0 -0
  88. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/set_tag.md +0 -0
  89. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/shell_rsolid.md +0 -0
  90. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/smooth_subtract_rscalarfield.md +0 -0
  91. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/smooth_union_rscalarfield.md +0 -0
  92. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/solve_assembly_rresult.md +0 -0
  93. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/stack.md +0 -0
  94. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/stack_rassembly.md +0 -0
  95. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/subtract_rscalarfield.md +0 -0
  96. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/sweep_rsolid.md +0 -0
  97. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/tag.md +0 -0
  98. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/translate_part_rassembly.md +0 -0
  99. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/translate_rscalarfield.md +0 -0
  100. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/translate_shape.md +0 -0
  101. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/union_rscalarfield.md +0 -0
  102. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/union_rsolidlist.md +0 -0
  103. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/value.md +0 -0
  104. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/README.md +0 -0
  105. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/compound.md +0 -0
  106. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/coordinate_system.md +0 -0
  107. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/declarative_constraints.md +0 -0
  108. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/edge.md +0 -0
  109. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/face.md +0 -0
  110. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/shell.md +0 -0
  111. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/simple_workplane.md +0 -0
  112. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/solid.md +0 -0
  113. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/tagged_mixin.md +0 -0
  114. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/vertex.md +0 -0
  115. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/wire.md +0 -0
  116. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/examples.py +0 -0
  117. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/refactor-plan/tagging.md +0 -0
  118. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/scripts/publish.sh +0 -0
  119. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/scripts/sync_ragflow_docs.py +0 -0
  120. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/cases/simplecad_self_evolve_cases/__init__.py +0 -0
  121. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/cases/simplecad_self_evolve_cases/evolve.py +0 -0
  122. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/EVOLVE_WORKFLOW.md +0 -0
  123. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/LICENSE.txt +0 -0
  124. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/README.md +0 -0
  125. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/add_part_rassembly.md +0 -0
  126. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/and_.md +0 -0
  127. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/bounds_rbbox.md +0 -0
  128. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/chamfer_rsolid.md +0 -0
  129. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/clear_constraints_rassembly.md +0 -0
  130. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/clone_assembly_rassembly.md +0 -0
  131. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/constrain_coincident_rassembly.md +0 -0
  132. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/constrain_concentric_rassembly.md +0 -0
  133. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/constrain_distance_rassembly.md +0 -0
  134. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/constrain_offset_rassembly.md +0 -0
  135. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/cut_rsolidlist.md +0 -0
  136. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/eval_rarray.md +0 -0
  137. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/eval_rscalar.md +0 -0
  138. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/export_step.md +0 -0
  139. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/export_stl.md +0 -0
  140. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/extrude_rsolid.md +0 -0
  141. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/fillet_rsolid.md +0 -0
  142. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/geo.md +0 -0
  143. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/helical_sweep_rsolid.md +0 -0
  144. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/intersect_rscalarfield.md +0 -0
  145. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/intersect_rsolidlist.md +0 -0
  146. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/linear_pattern_rsolidlist.md +0 -0
  147. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/loft_rsolid.md +0 -0
  148. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_angle_arc_redge.md +0 -0
  149. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_angle_arc_rwire.md +0 -0
  150. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_assembly_rassembly.md +0 -0
  151. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_box_rscalarfield.md +0 -0
  152. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_box_rsolid.md +0 -0
  153. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_capsule_rscalarfield.md +0 -0
  154. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_circle_redge.md +0 -0
  155. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_circle_rface.md +0 -0
  156. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_circle_rwire.md +0 -0
  157. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_cone_rsolid.md +0 -0
  158. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_cylinder_rsolid.md +0 -0
  159. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_ellipsoid_rscalarfield.md +0 -0
  160. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_face_from_wire_rface.md +0 -0
  161. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_field_surface_rsolid.md +0 -0
  162. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_helix_redge.md +0 -0
  163. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_helix_rwire.md +0 -0
  164. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_line_redge.md +0 -0
  165. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_n_hole_flange_rsolid.md +0 -0
  166. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
  167. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_point_rvertex.md +0 -0
  168. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_polyline_rwire.md +0 -0
  169. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_rectangle_rface.md +0 -0
  170. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_rectangle_rwire.md +0 -0
  171. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_segment_redge.md +0 -0
  172. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_segment_rwire.md +0 -0
  173. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_sphere_rscalarfield.md +0 -0
  174. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_sphere_rsolid.md +0 -0
  175. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_spline_redge.md +0 -0
  176. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_spline_rwire.md +0 -0
  177. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_threaded_rod_rsolid.md +0 -0
  178. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_three_point_arc_redge.md +0 -0
  179. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_three_point_arc_rwire.md +0 -0
  180. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_wire_from_edges_rwire.md +0 -0
  181. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/meta.md +0 -0
  182. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/mirror_shape.md +0 -0
  183. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/not_.md +0 -0
  184. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/or_.md +0 -0
  185. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/radial_pattern_rsolidlist.md +0 -0
  186. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/render_screenshot_rpath.md +0 -0
  187. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/revolve_rsolid.md +0 -0
  188. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/rotate_part_rassembly.md +0 -0
  189. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/rotate_rscalarfield.md +0 -0
  190. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/rotate_shape.md +0 -0
  191. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/scale_rscalarfield.md +0 -0
  192. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/select.md +0 -0
  193. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/select_edges_by_tag.md +0 -0
  194. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/select_faces_by_tag.md +0 -0
  195. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/set_tag.md +0 -0
  196. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/shell_rsolid.md +0 -0
  197. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/smooth_subtract_rscalarfield.md +0 -0
  198. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/smooth_union_rscalarfield.md +0 -0
  199. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/solve_assembly_rresult.md +0 -0
  200. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/stack.md +0 -0
  201. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/stack_rassembly.md +0 -0
  202. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/subtract_rscalarfield.md +0 -0
  203. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/sweep_rsolid.md +0 -0
  204. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/tag.md +0 -0
  205. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/translate_part_rassembly.md +0 -0
  206. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/translate_rscalarfield.md +0 -0
  207. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/translate_shape.md +0 -0
  208. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/union_rscalarfield.md +0 -0
  209. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/union_rsolidlist.md +0 -0
  210. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/value.md +0 -0
  211. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/README.md +0 -0
  212. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/compound.md +0 -0
  213. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/coordinate_system.md +0 -0
  214. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/declarative_constraints.md +0 -0
  215. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/edge.md +0 -0
  216. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/face.md +0 -0
  217. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/shell.md +0 -0
  218. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/simple_workplane.md +0 -0
  219. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/solid.md +0 -0
  220. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/tagged_mixin.md +0 -0
  221. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/vertex.md +0 -0
  222. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/wire.md +0 -0
  223. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/add_new_case.sh +0 -0
  224. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/evolve_case.py +0 -0
  225. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/jupyter_with_skill.sh +0 -0
  226. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/validate_skill.sh +0 -0
  227. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/with_skill.sh +0 -0
  228. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/README.md +0 -0
  229. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/chamfer_rsolid.md +0 -0
  230. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/cut_rsolidlist.md +0 -0
  231. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/export_step.md +0 -0
  232. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/export_stl.md +0 -0
  233. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/extrude_rsolid.md +0 -0
  234. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/fillet_rsolid.md +0 -0
  235. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/helical_sweep_rsolid.md +0 -0
  236. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/intersect_rsolidlist.md +0 -0
  237. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/linear_pattern_rsolidlist.md +0 -0
  238. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/loft_rsolid.md +0 -0
  239. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_angle_arc_redge.md +0 -0
  240. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_angle_arc_rwire.md +0 -0
  241. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_box_rsolid.md +0 -0
  242. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_circle_redge.md +0 -0
  243. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_circle_rface.md +0 -0
  244. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_circle_rwire.md +0 -0
  245. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_cone_rsolid.md +0 -0
  246. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_cylinder_rsolid.md +0 -0
  247. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_face_from_wire_rface.md +0 -0
  248. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_helix_redge.md +0 -0
  249. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_helix_rwire.md +0 -0
  250. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_line_redge.md +0 -0
  251. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_n_hole_flange_rsolid.md +0 -0
  252. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
  253. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_point_rvertex.md +0 -0
  254. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_polyline_rwire.md +0 -0
  255. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_rectangle_rface.md +0 -0
  256. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_rectangle_rwire.md +0 -0
  257. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_segment_redge.md +0 -0
  258. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_segment_rwire.md +0 -0
  259. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_sphere_rsolid.md +0 -0
  260. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_spline_redge.md +0 -0
  261. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_spline_rwire.md +0 -0
  262. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_threaded_rod_rsolid.md +0 -0
  263. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_three_point_arc_redge.md +0 -0
  264. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_three_point_arc_rwire.md +0 -0
  265. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_wire_from_edges_rwire.md +0 -0
  266. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/mirror_shape.md +0 -0
  267. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/radial_pattern_rsolidlist.md +0 -0
  268. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/revolve_rsolid.md +0 -0
  269. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/rotate_shape.md +0 -0
  270. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/select_edges_by_tag.md +0 -0
  271. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/select_faces_by_tag.md +0 -0
  272. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/set_tag.md +0 -0
  273. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/shell_rsolid.md +0 -0
  274. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/sweep_rsolid.md +0 -0
  275. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/translate_shape.md +0 -0
  276. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/union_rsolidlist.md +0 -0
  277. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/__init__.py +0 -0
  278. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/auto_tools/__init__.py +0 -0
  279. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/auto_tools/auto_docs_gen.py +0 -0
  280. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/auto_tools/evolution.py +0 -0
  281. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/auto_tools/make_export.py +0 -0
  282. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/constraints.py +0 -0
  283. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/core.py +0 -0
  284. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/evolve.py +0 -0
  285. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/field.py +0 -0
  286. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/operations.py +0 -0
  287. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/py.typed +0 -0
  288. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/ql.py +0 -0
  289. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/tagging.py +0 -0
  290. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/test/test_all_features.py +0 -0
  291. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/test/test_auto_docs_gen.py +0 -0
  292. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/test/test_field_surface.py +0 -0
  293. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/test/test_ql.py +0 -0
  294. {simplecadapi-2.0.2 → simplecadapi-2.0.3}/test/test_tagging_refactor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simplecadapi
3
- Version: 2.0.2
3
+ Version: 2.0.3
4
4
  Summary: A simplified CAD modeling Python API based on CADQuery
5
5
  Project-URL: Homepage, https://github.com/NiJingzhe/SimpleCADAPI
6
6
  Project-URL: Repository, https://github.com/NiJingzhe/SimpleCADAPI
@@ -385,7 +385,7 @@ SimpleCADAPI 是一个基于 CADQuery 的命令式 CAD 建模 Python 包,目
385
385
 
386
386
  ## 包安装(Python 包管理器)
387
387
 
388
- 当前包名:`simplecadapi`,版本:`2.0.2`(见 `pyproject.toml`)。
388
+ 当前包名:`simplecadapi`,版本:`2.0.3`(见 `pyproject.toml`)。
389
389
 
390
390
  ### 方式 A:用 pip 从包仓库安装
391
391
 
@@ -418,7 +418,7 @@ uv add simplecadapi
418
418
  仓库内已有示例构建产物(`dist/`):
419
419
 
420
420
  ```bash
421
- pip install dist/simplecadapi-2.0.2-py3-none-any.whl
421
+ pip install dist/simplecadapi-2.0.3-py3-none-any.whl
422
422
  ```
423
423
 
424
424
  如果你需要重新构建:
@@ -9,7 +9,7 @@ SimpleCADAPI 是一个基于 CADQuery 的命令式 CAD 建模 Python 包,目
9
9
 
10
10
  ## 包安装(Python 包管理器)
11
11
 
12
- 当前包名:`simplecadapi`,版本:`2.0.2`(见 `pyproject.toml`)。
12
+ 当前包名:`simplecadapi`,版本:`2.0.3`(见 `pyproject.toml`)。
13
13
 
14
14
  ### 方式 A:用 pip 从包仓库安装
15
15
 
@@ -42,7 +42,7 @@ uv add simplecadapi
42
42
  仓库内已有示例构建产物(`dist/`):
43
43
 
44
44
  ```bash
45
- pip install dist/simplecadapi-2.0.2-py3-none-any.whl
45
+ pip install dist/simplecadapi-2.0.3-py3-none-any.whl
46
46
  ```
47
47
 
48
48
  如果你需要重新构建:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "simplecadapi"
3
- version = "2.0.2"
3
+ version = "2.0.3"
4
4
  description = "A simplified CAD modeling Python API based on CADQuery"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -5,9 +5,9 @@ license: MIT
5
5
  compatibility: Requires Python 3.10+, active virtual environment, and network access for package installation.
6
6
  metadata:
7
7
  project: simplecadapi
8
- version: 2.0.2
8
+ version: 2.0.3
9
9
  runtime-package: simplecadapi
10
- runtime-spec: simplecadapi==2.0.2
10
+ runtime-spec: simplecadapi==2.0.3
11
11
  cases-module: simplecad_self_evolve_cases
12
12
  ---
13
13
 
@@ -29,7 +29,7 @@ metadata:
29
29
  ## Install behavior
30
30
  - Preferred: run `scripts/install.sh` once when skill is installed/activated.
31
31
  - Runtime wrappers auto-install on demand if `simplecadapi` is missing.
32
- - Package installed by default: `simplecadapi==2.0.2`
32
+ - Package installed by default: `simplecadapi==2.0.3`
33
33
  - Wrappers install only into a virtual environment interpreter (set `PYTHON_BIN` when needed).
34
34
 
35
35
  ## Interpreter selection
@@ -1,8 +1,8 @@
1
1
  # Project Overview
2
2
 
3
3
  - Project: `simplecadapi`
4
- - Version: `2.0.2`
5
- - Runtime package: `simplecadapi==2.0.2`
4
+ - Version: `2.0.3`
5
+ - Runtime package: `simplecadapi==2.0.3`
6
6
  - Skill cases module: `simplecad_self_evolve_cases`
7
7
 
8
8
  ## What this skill bundles
@@ -9,7 +9,7 @@ SimpleCADAPI 是一个基于 CADQuery 的命令式 CAD 建模 Python 包,目
9
9
 
10
10
  ## 包安装(Python 包管理器)
11
11
 
12
- 当前包名:`simplecadapi`,版本:`2.0.2`(见 `pyproject.toml`)。
12
+ 当前包名:`simplecadapi`,版本:`2.0.3`(见 `pyproject.toml`)。
13
13
 
14
14
  ### 方式 A:用 pip 从包仓库安装
15
15
 
@@ -42,7 +42,7 @@ uv add simplecadapi
42
42
  仓库内已有示例构建产物(`dist/`):
43
43
 
44
44
  ```bash
45
- pip install dist/simplecadapi-2.0.2-py3-none-any.whl
45
+ pip install dist/simplecadapi-2.0.3-py3-none-any.whl
46
46
  ```
47
47
 
48
48
  如果你需要重新构建:
@@ -6,7 +6,7 @@
6
6
  PYTHON_BIN=.venv/bin/python scripts/install.sh
7
7
  ```
8
8
 
9
- This installs `simplecadapi==2.0.2` to the active Python environment.
9
+ This installs `simplecadapi==2.0.3` to the active Python environment.
10
10
  If `PYTHON_BIN` is not set, wrappers default to `python3` (fallback `python`).
11
11
  Installation is intentionally blocked for non-venv/system interpreters.
12
12
 
@@ -32,7 +32,7 @@ export SIMPLECAD_RUNTIME_PACKAGE="simplecadapi"
32
32
  export SIMPLECAD_CASES_ROOT="${SKILL_ROOT}/cases"
33
33
  export SIMPLECAD_CASES_MODULE="simplecad_self_evolve_cases"
34
34
 
35
- PACKAGE_SPEC="simplecadapi==2.0.2"
35
+ PACKAGE_SPEC="simplecadapi==2.0.3"
36
36
  JUPYTER_DEPS=("jupyterlab>=4.5.5" "ipykernel>=6.29.5")
37
37
  INSTALL_JUPYTER=0
38
38
  INSTALL_ARGS=()
@@ -85,4 +85,4 @@ print("simplecadapi import OK")
85
85
  print(getattr(scad, "__description__", ""))
86
86
  PY
87
87
 
88
- echo "Runtime install completed for simplecadapi 2.0.2."
88
+ echo "Runtime install completed for simplecadapi 2.0.3."
@@ -10,7 +10,7 @@ import sys
10
10
  from pathlib import Path
11
11
 
12
12
 
13
- PACKAGE_SPEC = "simplecadapi==2.0.2"
13
+ PACKAGE_SPEC = "simplecadapi==2.0.3"
14
14
  CASES_MODULE = "simplecad_self_evolve_cases"
15
15
 
16
16
 
@@ -16,16 +16,16 @@ import sys
16
16
  import tarfile
17
17
  import textwrap
18
18
  from dataclasses import dataclass
19
+ from email import message_from_string
19
20
  from pathlib import Path
21
+ from typing import Sequence, cast
20
22
 
21
23
  try:
22
- import tomllib # Python 3.11+
24
+ import tomllib # Python 3.11+ # type: ignore[import-not-found]
23
25
  except ModuleNotFoundError: # pragma: no cover
24
26
  tomllib = None # type: ignore[assignment]
25
27
 
26
-
27
- PROJECT_ROOT = Path(__file__).resolve().parents[3]
28
- DEFAULT_OUTPUT_ROOT = PROJECT_ROOT / "skills"
28
+ DEFAULT_PACKAGE_NAME = "simplecadapi"
29
29
  DEFAULT_SKILL_NAME = "simplecad-self-evolve"
30
30
  DEFAULT_LICENSE = "MIT"
31
31
  DEFAULT_JUPYTER_DEPS: tuple[str, ...] = (
@@ -40,6 +40,111 @@ LICENSE_PATH = Path("LICENSE")
40
40
  SKILL_NAME_PATTERN = re.compile(r"^(?!-)(?!.*--)[a-z0-9]+(?:-[a-z0-9]+)*$")
41
41
 
42
42
 
43
+ def _package_root_from(module_file: Path | str | None = None) -> Path:
44
+ target = Path(module_file) if module_file is not None else Path(__file__)
45
+ return target.resolve().parents[1]
46
+
47
+
48
+ def _is_source_checkout_root(project_root: Path) -> bool:
49
+ return (project_root / "pyproject.toml").exists() and (
50
+ project_root / "src" / DEFAULT_PACKAGE_NAME
51
+ ).exists()
52
+
53
+
54
+ def _source_checkout_root(package_root: Path) -> Path | None:
55
+ src_dir = package_root.parent
56
+ project_root = src_dir.parent
57
+
58
+ if src_dir.name != "src":
59
+ return None
60
+ if not _is_source_checkout_root(project_root):
61
+ return None
62
+ return project_root
63
+
64
+
65
+ def _default_project_root(module_file: Path | str | None = None) -> Path:
66
+ package_root = _package_root_from(module_file)
67
+ return _source_checkout_root(package_root) or package_root.parent
68
+
69
+
70
+ def _default_output_root(project_root: Path, cwd: Path | None = None) -> Path:
71
+ if _is_source_checkout_root(project_root):
72
+ return (project_root / "skills").resolve()
73
+ return ((cwd if cwd is not None else Path.cwd()) / "skills").resolve()
74
+
75
+
76
+ def _first_existing_path(candidates: Sequence[Path]) -> Path | None:
77
+ for path in candidates:
78
+ if path.exists():
79
+ return path
80
+ return None
81
+
82
+
83
+ def _docs_root_for(project_root: Path) -> Path:
84
+ docs_root = _first_existing_path(
85
+ (
86
+ project_root / DOCS_PATH,
87
+ project_root / "src" / DOCS_PATH,
88
+ )
89
+ )
90
+ return docs_root or (project_root / DOCS_PATH)
91
+
92
+
93
+ def _readme_path_for(project_root: Path) -> Path | None:
94
+ return _first_existing_path(
95
+ (
96
+ project_root / README_PATH,
97
+ project_root / "src" / README_PATH,
98
+ )
99
+ )
100
+
101
+
102
+ def _normalize_dist_name(name: str) -> str:
103
+ return re.sub(r"[-_.]+", "_", name).lower()
104
+
105
+
106
+ def _dist_info_dir(project_root: Path, package_name: str) -> Path | None:
107
+ candidates: list[Path] = []
108
+ patterns = (
109
+ f"{package_name}-*.dist-info",
110
+ f"{package_name.replace('-', '_')}-*.dist-info",
111
+ f"{_normalize_dist_name(package_name)}-*.dist-info",
112
+ )
113
+
114
+ for pattern in patterns:
115
+ for path in sorted(project_root.glob(pattern)):
116
+ if path not in candidates:
117
+ candidates.append(path)
118
+
119
+ return candidates[0] if candidates else None
120
+
121
+
122
+ def _license_path_for(project_root: Path, package_name: str) -> Path | None:
123
+ dist_info_dir = _dist_info_dir(project_root, package_name)
124
+ candidates = [project_root / LICENSE_PATH]
125
+ if dist_info_dir is not None:
126
+ candidates.extend(
127
+ [
128
+ dist_info_dir / "licenses" / LICENSE_PATH.name,
129
+ dist_info_dir / LICENSE_PATH.name,
130
+ ]
131
+ )
132
+ return _first_existing_path(tuple(candidates))
133
+
134
+
135
+ def _auto_docs_script_path_for(project_root: Path) -> Path | None:
136
+ return _first_existing_path(
137
+ (
138
+ project_root
139
+ / "src"
140
+ / DEFAULT_PACKAGE_NAME
141
+ / "auto_tools"
142
+ / "auto_docs_gen.py",
143
+ project_root / DEFAULT_PACKAGE_NAME / "auto_tools" / "auto_docs_gen.py",
144
+ )
145
+ )
146
+
147
+
43
148
  @dataclass(frozen=True)
44
149
  class ProjectMetadata:
45
150
  """Project metadata used for skill rendering."""
@@ -47,6 +152,7 @@ class ProjectMetadata:
47
152
  name: str
48
153
  version: str
49
154
  description: str
155
+ readme_text: str | None = None
50
156
 
51
157
 
52
158
  @dataclass(frozen=True)
@@ -57,10 +163,12 @@ class BuildResult:
57
163
  archive_path: Path | None
58
164
 
59
165
 
60
- def _load_project_metadata(project_root: Path) -> ProjectMetadata:
166
+ def _load_project_metadata(
167
+ project_root: Path,
168
+ default_name: str = DEFAULT_PACKAGE_NAME,
169
+ ) -> ProjectMetadata:
61
170
  pyproject_path = project_root / "pyproject.toml"
62
171
 
63
- default_name = project_root.name.lower()
64
172
  default_version = "0.0.0"
65
173
  default_desc = "SimpleCAD skill runtime installer and docs"
66
174
 
@@ -75,6 +183,7 @@ def _load_project_metadata(project_root: Path) -> ProjectMetadata:
75
183
  name=str(project.get("name") or default_name),
76
184
  version=str(project.get("version") or default_version),
77
185
  description=str(project.get("description") or default_desc),
186
+ readme_text=None,
78
187
  )
79
188
  except Exception:
80
189
  pass
@@ -104,6 +213,32 @@ def _load_project_metadata(project_root: Path) -> ProjectMetadata:
104
213
  if description_match
105
214
  else default_desc
106
215
  ),
216
+ readme_text=None,
217
+ )
218
+
219
+
220
+ def _load_installed_metadata(
221
+ project_root: Path,
222
+ package_name: str = DEFAULT_PACKAGE_NAME,
223
+ ) -> ProjectMetadata | None:
224
+ dist_info_dir = _dist_info_dir(project_root, package_name)
225
+ if dist_info_dir is None:
226
+ return None
227
+
228
+ metadata_path = dist_info_dir / "METADATA"
229
+ if not metadata_path.exists():
230
+ return None
231
+
232
+ message = message_from_string(metadata_path.read_text(encoding="utf-8"))
233
+ payload = cast(str, message.get_payload())
234
+ readme_text = payload.strip() or None
235
+ return ProjectMetadata(
236
+ name=message.get("Name", package_name),
237
+ version=message.get("Version", "0.0.0"),
238
+ description=message.get(
239
+ "Summary", "SimpleCAD skill runtime installer and docs"
240
+ ),
241
+ readme_text=readme_text,
107
242
  )
108
243
 
109
244
 
@@ -152,10 +287,26 @@ class SkillPackager:
152
287
  self.cases_module = self._cases_module_name()
153
288
  self.cases_module_dir = self.cases_root / self.cases_module
154
289
 
155
- self.metadata = _load_project_metadata(self.project_root)
290
+ self.source_checkout = _is_source_checkout_root(self.project_root)
291
+ default_package_name = package_name or DEFAULT_PACKAGE_NAME
292
+ self.metadata = _load_project_metadata(
293
+ self.project_root,
294
+ default_name=default_package_name,
295
+ )
296
+ if self.metadata.version == "0.0.0":
297
+ installed_metadata = _load_installed_metadata(
298
+ self.project_root,
299
+ package_name=default_package_name,
300
+ )
301
+ if installed_metadata is not None:
302
+ self.metadata = installed_metadata
303
+
156
304
  self.package_name = package_name or self.metadata.name
157
305
  self.package_version = package_version or self.metadata.version
158
306
  self.jupyter_deps = jupyter_deps
307
+ self.source_docs = _docs_root_for(self.project_root)
308
+ self.source_readme = _readme_path_for(self.project_root)
309
+ self.source_license = _license_path_for(self.project_root, self.package_name)
159
310
 
160
311
  def log(self, message: str) -> None:
161
312
  if not self.quiet:
@@ -187,19 +338,33 @@ class SkillPackager:
187
338
  )
188
339
 
189
340
  required = (
190
- self.project_root / DOCS_PATH,
191
- self.project_root / DOCS_PATH / "api",
192
- self.project_root / DOCS_PATH / "core",
193
- self.project_root / README_PATH,
194
- self.project_root / LICENSE_PATH,
341
+ self.source_docs,
342
+ self.source_docs / "api",
343
+ self.source_docs / "core",
195
344
  )
196
345
  for path in required:
197
346
  if not path.exists():
198
347
  raise FileNotFoundError(f"Missing required path: {path}")
199
348
 
349
+ if self.source_readme is None and not self.metadata.readme_text:
350
+ raise FileNotFoundError(
351
+ "Missing required project README content in both project files and dist-info metadata"
352
+ )
353
+
354
+ if self.source_license is None:
355
+ raise FileNotFoundError(
356
+ "Missing required license file in both project files and dist-info metadata"
357
+ )
358
+
200
359
  def _refresh_api_docs(self) -> None:
201
- script_path = self.project_root / "src/simplecadapi/auto_tools/auto_docs_gen.py"
202
- if not script_path.exists():
360
+ if not self.source_checkout:
361
+ self.log(
362
+ "Using packaged docs from installed simplecadapi; skipped --refresh-docs outside source checkout."
363
+ )
364
+ return
365
+
366
+ script_path = _auto_docs_script_path_for(self.project_root)
367
+ if script_path is None:
203
368
  raise FileNotFoundError(f"Cannot refresh docs, missing: {script_path}")
204
369
 
205
370
  self.log("Refreshing API docs before packaging...")
@@ -225,21 +390,27 @@ class SkillPackager:
225
390
 
226
391
  def _copy_reference_docs(self) -> None:
227
392
  self.log("Copying reference docs...")
228
- source_docs = self.project_root / DOCS_PATH
229
393
  target_docs = self.docs_dir
230
394
  shutil.copytree(
231
- source_docs,
395
+ self.source_docs,
232
396
  target_docs,
233
397
  dirs_exist_ok=True,
234
398
  ignore=_ignore_common_noise,
235
399
  )
236
400
 
237
- shutil.copy2(
238
- self.project_root / README_PATH, self.references_dir / "PROJECT_README.md"
239
- )
240
- shutil.copy2(
241
- self.project_root / LICENSE_PATH, self.references_dir / "LICENSE.txt"
242
- )
401
+ if self.source_readme is not None:
402
+ shutil.copy2(self.source_readme, self.references_dir / "PROJECT_README.md")
403
+ else:
404
+ (self.references_dir / "PROJECT_README.md").write_text(
405
+ self.metadata.readme_text or "",
406
+ encoding="utf-8",
407
+ )
408
+
409
+ if self.source_license is None:
410
+ raise FileNotFoundError(
411
+ "Missing required license file in both project files and dist-info metadata"
412
+ )
413
+ shutil.copy2(self.source_license, self.references_dir / "LICENSE.txt")
243
414
 
244
415
  def _write_skill_markdown(self) -> None:
245
416
  self.log("Generating SKILL.md...")
@@ -1371,14 +1542,14 @@ def _parse_args() -> argparse.Namespace:
1371
1542
  parser.add_argument(
1372
1543
  "--project-root",
1373
1544
  type=Path,
1374
- default=PROJECT_ROOT,
1375
- help="Project root (default: repository root)",
1545
+ default=None,
1546
+ help="Project root (default: source checkout root, or installed environment root)",
1376
1547
  )
1377
1548
  parser.add_argument(
1378
1549
  "--output-root",
1379
1550
  type=Path,
1380
- default=DEFAULT_OUTPUT_ROOT,
1381
- help="Output directory for generated skill bundle (default: ./skills)",
1551
+ default=None,
1552
+ help="Output directory for generated skill bundle (default: repo skills/ in source checkout, otherwise ./skills)",
1382
1553
  )
1383
1554
  parser.add_argument(
1384
1555
  "--skill-name",
@@ -1425,10 +1596,20 @@ def _parse_args() -> argparse.Namespace:
1425
1596
 
1426
1597
  def main() -> None:
1427
1598
  args = _parse_args()
1599
+ project_root = (
1600
+ args.project_root.resolve()
1601
+ if args.project_root is not None
1602
+ else _default_project_root()
1603
+ )
1604
+ output_root = (
1605
+ args.output_root.resolve()
1606
+ if args.output_root is not None
1607
+ else _default_output_root(project_root)
1608
+ )
1428
1609
 
1429
1610
  packager = SkillPackager(
1430
- project_root=args.project_root,
1431
- output_root=args.output_root,
1611
+ project_root=project_root,
1612
+ output_root=output_root,
1432
1613
  skill_name=args.skill_name,
1433
1614
  license_name=args.license_name,
1434
1615
  package_name=args.package_name,
@@ -0,0 +1,141 @@
1
+ import importlib.util
2
+ import sys
3
+ import tempfile
4
+ import unittest
5
+ from pathlib import Path
6
+
7
+
8
+ MODULE_PATH = (
9
+ Path(__file__).resolve().parents[1] / "src/simplecadapi/auto_tools/skill_pack.py"
10
+ )
11
+ MODULE_SPEC = importlib.util.spec_from_file_location(
12
+ "simplecadapi_skill_pack",
13
+ MODULE_PATH,
14
+ )
15
+ if MODULE_SPEC is None or MODULE_SPEC.loader is None:
16
+ raise RuntimeError(f"Unable to load module spec for {MODULE_PATH}")
17
+
18
+ skill_pack = importlib.util.module_from_spec(MODULE_SPEC)
19
+ sys.modules[MODULE_SPEC.name] = skill_pack
20
+ MODULE_SPEC.loader.exec_module(skill_pack)
21
+
22
+
23
+ class TestSkillPackPathResolution(unittest.TestCase):
24
+ def test_default_project_root_from_source_checkout(self):
25
+ with tempfile.TemporaryDirectory() as tmp_dir:
26
+ project_root = Path(tmp_dir)
27
+ (project_root / "pyproject.toml").write_text(
28
+ "[project]\nname = 'simplecadapi'\n",
29
+ encoding="utf-8",
30
+ )
31
+ package_root = project_root / "src/simplecadapi"
32
+ module_file = package_root / "auto_tools/skill_pack.py"
33
+ module_file.parent.mkdir(parents=True, exist_ok=True)
34
+ module_file.write_text("", encoding="utf-8")
35
+
36
+ resolved = skill_pack._default_project_root(module_file)
37
+
38
+ self.assertEqual(resolved, project_root.resolve())
39
+
40
+ def test_default_project_root_from_site_packages_install(self):
41
+ with tempfile.TemporaryDirectory() as tmp_dir:
42
+ site_packages = Path(tmp_dir) / ".venv/lib/python3.12/site-packages"
43
+ module_file = site_packages / "simplecadapi/auto_tools/skill_pack.py"
44
+ module_file.parent.mkdir(parents=True, exist_ok=True)
45
+ module_file.write_text("", encoding="utf-8")
46
+
47
+ resolved = skill_pack._default_project_root(module_file)
48
+
49
+ self.assertEqual(resolved, site_packages.resolve())
50
+
51
+ def test_default_output_root_from_source_checkout(self):
52
+ with tempfile.TemporaryDirectory() as tmp_dir:
53
+ project_root = Path(tmp_dir)
54
+ (project_root / "pyproject.toml").write_text(
55
+ "[project]\nname = 'simplecadapi'\n",
56
+ encoding="utf-8",
57
+ )
58
+ (project_root / "src/simplecadapi").mkdir(parents=True, exist_ok=True)
59
+
60
+ resolved = skill_pack._default_output_root(project_root)
61
+
62
+ self.assertEqual(resolved, (project_root / "skills").resolve())
63
+
64
+ def test_default_output_root_from_site_packages_install(self):
65
+ with tempfile.TemporaryDirectory() as tmp_dir:
66
+ tmp_path = Path(tmp_dir)
67
+ site_packages = tmp_path / ".venv/lib/python3.12/site-packages"
68
+ site_packages.mkdir(parents=True, exist_ok=True)
69
+ workspace_root = tmp_path / "workspace"
70
+ workspace_root.mkdir()
71
+
72
+ resolved = skill_pack._default_output_root(
73
+ site_packages,
74
+ cwd=workspace_root,
75
+ )
76
+
77
+ self.assertEqual(resolved, (workspace_root / "skills").resolve())
78
+
79
+ def test_build_from_site_packages_layout_uses_metadata_readme(self):
80
+ with tempfile.TemporaryDirectory() as tmp_dir:
81
+ tmp_path = Path(tmp_dir)
82
+ site_packages = tmp_path / ".venv/lib/python3.12/site-packages"
83
+ docs_api = site_packages / "docs/api"
84
+ docs_core = site_packages / "docs/core"
85
+ docs_api.mkdir(parents=True, exist_ok=True)
86
+ docs_core.mkdir(parents=True, exist_ok=True)
87
+ (docs_api / "README.md").write_text("# API Docs\n", encoding="utf-8")
88
+ (docs_core / "README.md").write_text("# Core Docs\n", encoding="utf-8")
89
+
90
+ dist_info = site_packages / "simplecadapi-2.0.2.dist-info"
91
+ (dist_info / "licenses").mkdir(parents=True, exist_ok=True)
92
+ (dist_info / "METADATA").write_text(
93
+ "Metadata-Version: 2.1\n"
94
+ "Name: simplecadapi\n"
95
+ "Version: 2.0.2\n"
96
+ "Summary: Demo package\n"
97
+ "\n"
98
+ "# Demo README\n"
99
+ "\n"
100
+ "Installed package readme body.\n",
101
+ encoding="utf-8",
102
+ )
103
+ (dist_info / "licenses/LICENSE").write_text(
104
+ "MIT License\n",
105
+ encoding="utf-8",
106
+ )
107
+
108
+ output_root = tmp_path / "workspace/skills"
109
+ packager = skill_pack.SkillPackager(
110
+ project_root=site_packages,
111
+ output_root=output_root,
112
+ skill_name="simplecad-self-evolve",
113
+ license_name="MIT",
114
+ package_name="simplecadapi",
115
+ package_version="2.0.2",
116
+ refresh_docs=True,
117
+ quiet=True,
118
+ )
119
+
120
+ result = packager.build()
121
+
122
+ self.assertTrue((result.skill_root / "SKILL.md").exists())
123
+ self.assertTrue(
124
+ (result.skill_root / "references/docs/api/README.md").exists()
125
+ )
126
+ self.assertEqual(
127
+ (result.skill_root / "references/PROJECT_README.md").read_text(
128
+ encoding="utf-8"
129
+ ),
130
+ "# Demo README\n\nInstalled package readme body.",
131
+ )
132
+ self.assertEqual(
133
+ (result.skill_root / "references/LICENSE.txt").read_text(
134
+ encoding="utf-8"
135
+ ),
136
+ "MIT License\n",
137
+ )
138
+
139
+
140
+ if __name__ == "__main__":
141
+ unittest.main()
@@ -3546,7 +3546,7 @@ wheels = [
3546
3546
 
3547
3547
  [[package]]
3548
3548
  name = "simplecadapi"
3549
- version = "2.0.2"
3549
+ version = "2.0.3"
3550
3550
  source = { editable = "." }
3551
3551
  dependencies = [
3552
3552
  { name = "cadquery" },
File without changes
File without changes
File without changes