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.
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/PKG-INFO +3 -3
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/README.md +2 -2
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/pyproject.toml +1 -1
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/SKILL.md +3 -3
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/PROJECT_OVERVIEW.md +2 -2
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/PROJECT_README.md +2 -2
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/RUNTIME_INSTALL.md +1 -1
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/install.sh +2 -2
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/repl_bootstrap.py +1 -1
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/auto_tools/skill_pack.py +209 -28
- simplecadapi-2.0.3/test/test_skill_pack.py +141 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/uv.lock +1 -1
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/.gitignore +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/.python-version +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/LICENSE +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/MANIFEST.in +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/README.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/add_part_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/and_.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/bounds_rbbox.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/chamfer_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/clear_constraints_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/clone_assembly_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/constrain_coincident_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/constrain_concentric_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/constrain_distance_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/constrain_offset_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/cut_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/eval_rarray.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/eval_rscalar.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/export_step.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/export_stl.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/extrude_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/fillet_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/geo.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/helical_sweep_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/intersect_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/intersect_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/linear_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/loft_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_angle_arc_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_angle_arc_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_assembly_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_box_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_box_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_capsule_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_circle_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_circle_rface.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_circle_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_cone_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_cylinder_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_ellipsoid_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_face_from_wire_rface.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_field_surface_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_helix_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_helix_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_line_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_n_hole_flange_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_point_rvertex.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_polyline_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_rectangle_rface.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_rectangle_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_segment_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_segment_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_sphere_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_sphere_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_spline_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_spline_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_threaded_rod_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_three_point_arc_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_three_point_arc_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/make_wire_from_edges_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/meta.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/mirror_shape.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/not_.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/or_.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/radial_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/render_screenshot_rpath.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/revolve_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/rotate_part_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/rotate_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/rotate_shape.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/scale_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/select.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/select_edges_by_tag.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/select_faces_by_tag.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/set_tag.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/shell_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/smooth_subtract_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/smooth_union_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/solve_assembly_rresult.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/stack.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/stack_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/subtract_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/sweep_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/tag.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/translate_part_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/translate_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/translate_shape.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/union_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/union_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/api/value.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/README.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/compound.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/coordinate_system.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/declarative_constraints.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/edge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/face.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/shell.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/simple_workplane.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/solid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/tagged_mixin.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/vertex.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/docs/core/wire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/examples.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/refactor-plan/tagging.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/scripts/publish.sh +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/scripts/sync_ragflow_docs.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/cases/simplecad_self_evolve_cases/__init__.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/cases/simplecad_self_evolve_cases/evolve.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/EVOLVE_WORKFLOW.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/LICENSE.txt +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/README.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/add_part_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/and_.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/bounds_rbbox.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/chamfer_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/clear_constraints_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/clone_assembly_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/constrain_coincident_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/constrain_concentric_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/constrain_distance_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/constrain_offset_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/cut_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/eval_rarray.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/eval_rscalar.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/export_step.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/export_stl.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/extrude_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/fillet_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/geo.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/helical_sweep_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/intersect_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/intersect_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/linear_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/loft_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_angle_arc_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_angle_arc_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_assembly_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_box_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_box_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_capsule_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_circle_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_circle_rface.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_circle_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_cone_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_cylinder_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_ellipsoid_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_face_from_wire_rface.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_field_surface_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_helix_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_helix_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_line_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_n_hole_flange_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_point_rvertex.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_polyline_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_rectangle_rface.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_rectangle_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_segment_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_segment_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_sphere_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_sphere_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_spline_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_spline_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_threaded_rod_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_three_point_arc_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_three_point_arc_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/make_wire_from_edges_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/meta.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/mirror_shape.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/not_.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/or_.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/radial_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/render_screenshot_rpath.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/revolve_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/rotate_part_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/rotate_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/rotate_shape.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/scale_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/select.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/select_edges_by_tag.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/select_faces_by_tag.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/set_tag.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/shell_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/smooth_subtract_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/smooth_union_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/solve_assembly_rresult.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/stack.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/stack_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/subtract_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/sweep_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/tag.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/translate_part_rassembly.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/translate_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/translate_shape.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/union_rscalarfield.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/union_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/api/value.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/README.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/compound.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/coordinate_system.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/declarative_constraints.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/edge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/face.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/shell.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/simple_workplane.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/solid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/tagged_mixin.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/vertex.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/docs/core/wire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/add_new_case.sh +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/evolve_case.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/jupyter_with_skill.sh +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/validate_skill.sh +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/scripts/with_skill.sh +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/README.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/chamfer_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/cut_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/export_step.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/export_stl.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/extrude_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/fillet_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/helical_sweep_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/intersect_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/linear_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/loft_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_angle_arc_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_angle_arc_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_box_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_circle_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_circle_rface.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_circle_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_cone_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_cylinder_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_face_from_wire_rface.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_helix_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_helix_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_line_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_n_hole_flange_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_point_rvertex.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_polyline_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_rectangle_rface.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_rectangle_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_segment_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_segment_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_sphere_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_spline_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_spline_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_threaded_rod_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_three_point_arc_redge.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_three_point_arc_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/make_wire_from_edges_rwire.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/mirror_shape.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/radial_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/revolve_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/rotate_shape.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/select_edges_by_tag.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/select_faces_by_tag.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/set_tag.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/shell_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/sweep_rsolid.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/translate_shape.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/docs/api/union_rsolidlist.md +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/__init__.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/auto_tools/__init__.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/auto_tools/auto_docs_gen.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/auto_tools/evolution.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/auto_tools/make_export.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/constraints.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/core.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/evolve.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/field.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/operations.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/py.typed +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/ql.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/src/simplecadapi/tagging.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/test/test_all_features.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/test/test_auto_docs_gen.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/test/test_field_surface.py +0 -0
- {simplecadapi-2.0.2 → simplecadapi-2.0.3}/test/test_ql.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
45
|
+
pip install dist/simplecadapi-2.0.3-py3-none-any.whl
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
如果你需要重新构建:
|
|
@@ -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.
|
|
8
|
+
version: 2.0.3
|
|
9
9
|
runtime-package: simplecadapi
|
|
10
|
-
runtime-spec: simplecadapi==2.0.
|
|
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.
|
|
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
|
{simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/PROJECT_README.md
RENAMED
|
@@ -9,7 +9,7 @@ SimpleCADAPI 是一个基于 CADQuery 的命令式 CAD 建模 Python 包,目
|
|
|
9
9
|
|
|
10
10
|
## 包安装(Python 包管理器)
|
|
11
11
|
|
|
12
|
-
当前包名:`simplecadapi`,版本:`2.0.
|
|
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.
|
|
45
|
+
pip install dist/simplecadapi-2.0.3-py3-none-any.whl
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
如果你需要重新构建:
|
{simplecadapi-2.0.2 → simplecadapi-2.0.3}/skills/simplecad-self-evolve/references/RUNTIME_INSTALL.md
RENAMED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
PYTHON_BIN=.venv/bin/python scripts/install.sh
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
This installs `simplecadapi==2.0.
|
|
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.
|
|
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.
|
|
88
|
+
echo "Runtime install completed for simplecadapi 2.0.3."
|
|
@@ -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(
|
|
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.
|
|
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.
|
|
191
|
-
self.
|
|
192
|
-
self.
|
|
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
|
-
|
|
202
|
-
|
|
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
|
-
|
|
238
|
-
self.
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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=
|
|
1375
|
-
help="Project root (default:
|
|
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=
|
|
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=
|
|
1431
|
-
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()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|