AI-powered assistant workbench for FreeCAD — generate 3D models from natural language
Drift inferred · capture-to-capture
- HIGH code analysis flagged dynamic code execution ×3 in ghbalf/freecad-ai
tools
-
add_assembly_joint
Joint two parts (Fixed, Revolute, Cylindrical, Slider, Ball)
-
add_part_to_assembly
Add a part to an existing assembly
-
boolean_operation
Fuse, Cut, or Common between two objects
-
capture_viewport
Save a screenshot of the 3D viewport
-
chamfer_edges
Chamfer edges
-
create_assembly
Create an Assembly with grounded base part
-
create_body
Create a PartDesign Body for parametric modeling
-
create_enclosure_lid
Generate a snap-fit enclosure lid with correct dimensions
-
create_inner_ridge
Add a snap-fit ridge inside a rectangular hollow
-
create_primitive
Box, Cylinder, Sphere, Cone, Torus
-
create_sketch
Sketch with lines, circles, arcs, rectangles + constraints (supports plane offset)
-
create_snap_tabs
Add snap tabs on a lid lip (pairs with ridge)
-
create_spreadsheet
Create a Spreadsheet with named variables for parametric modeling
-
create_variable_set
Create a VarSet with named variables for parametric modeling
-
create_wedge
Create a wedge/ramp shape
-
describe_model
Comprehensive geometry summary: dimensions, wall thickness, hollow/solid detection
-
execute_code
Fallback: run arbitrary Python
-
export_model
Export to STL, STEP, or IGES
-
fillet_edges
Round edges
-
get_document_state
Inspect current objects and properties
-
linear_pattern
Repeat a feature in a line
-
list_documents
List all open documents with object counts and active indicator
-
list_edges
List all edges with names, labels, lengths (optional filter)
-
list_faces
List all faces with names, labels, normals, areas (optional filter)
-
loft_sketches
Loft between sketches for tapered/organic shapes
-
measure
Volume, area, bounding box, distance, edge listing
-
mirror_feature
Mirror a PartDesign feature across a plane
-
modify_property
Change any object property (supports relative: +10%, *1.5)
-
multi_transform
Chain linear pattern + polar pattern + mirror in one feature
-
pad_sketch
Extrude a sketch
-
pocket_sketch
Cut a pocket from a sketch (auto-detects correct direction)
-
polar_pattern
Repeat a feature in a circular pattern
-
redo
Redo previously undone operations
-
revolve_sketch
Revolve a sketch around an axis (vase, wheel, bottle)
-
scale_object
Scale an object uniformly or per-axis
-
section_object
Cross-section through a plane or another object
-
select_geometry
Interactive viewport picking for edges, faces, vertices
-
set_expression
Bind object properties to expressions (parametric relationships)
-
set_view
Set camera orientation (front, top, isometric, etc.)
-
shell_object
Hollow out a solid (PartDesign::Thickness)
-
sweep_sketch
Sweep a profile along a spine path (pipe, tube)
-
switch_document
Switch the active FreeCAD document by name or label
-
transform_object
Move and/or rotate an object
-
undo
Undo last N operations, or undo until a named transaction
-
undo_history
Show the undo/redo stack with named transactions
-
use_skill
Load a skill's instructions for complex tasks (enclosure, gear, etc.)
-
zoom_object
Zoom the viewport to a specific object
analyzed commit a7b182d · analyzer v17 · 23h ago
skills & prompt files 9
- skillghbalf-freecad-ai-a7b182d/skills/create-validation/SKILL.md
- skillghbalf-freecad-ai-a7b182d/skills/enclosure/SKILL.md
- skillghbalf-freecad-ai-a7b182d/skills/fastener-hole/SKILL.md
- skillghbalf-freecad-ai-a7b182d/skills/gear/SKILL.md
- skillghbalf-freecad-ai-a7b182d/skills/lattice/SKILL.md
- skillghbalf-freecad-ai-a7b182d/skills/optimize-skill/SKILL.md
- skillghbalf-freecad-ai-a7b182d/skills/sketch-from-image/SKILL.md
- skillghbalf-freecad-ai-a7b182d/skills/skill-creator/SKILL.md
- skillghbalf-freecad-ai-a7b182d/skills/thread-insert/SKILL.md
danger signals3
- dynamic code executioneval()/exec()ghbalf-freecad-ai-a7b182d/freecad_ai/core/executor.py:487
exec(code, namespace) - dynamic code execution__import__()ghbalf-freecad-ai-a7b182d/freecad_ai/core/executor.py:641
mod = __import__(mod_name) - dynamic code executioneval()/exec()ghbalf-freecad-ai-a7b182d/freecad_ai/ui/selection_panel.py:117
def exec(self):
filesystem 16
- fs ghbalf-freecad-ai-a7b182d/freecad_ai/config.py :17
the first one that has data as the source, ``shutil.move``s it to the new - fs ghbalf-freecad-ai-a7b182d/freecad_ai/core/conversation.py :395
with open(path, "w") as f: - fs ghbalf-freecad-ai-a7b182d/freecad_ai/core/executor.py :18
import shutil - fs ghbalf-freecad-ai-a7b182d/freecad_ai/extensions/agents_md.py :92
with open(path, "r", encoding="utf-8") as f: - fs ghbalf-freecad-ai-a7b182d/freecad_ai/extensions/skill_evaluator.py :47
with open(self._history_path, "r") as f: - fs ghbalf-freecad-ai-a7b182d/freecad_ai/extensions/skills.py :15
import shutil - fs ghbalf-freecad-ai-a7b182d/freecad_ai/extensions/user_tools.py :63
with open(path, "r") as f: - fs ghbalf-freecad-ai-a7b182d/freecad_ai/llm/client.py :102
buf.open(_QtCore.QBuffer.WriteOnly) - fs ghbalf-freecad-ai-a7b182d/freecad_ai/tools/freecad_tools.py :3599
with open(path, "r", encoding="utf-8") as f: - fs ghbalf-freecad-ai-a7b182d/freecad_ai/tools/optimize_tools.py :245
with open(skill.validation_path) as f: - fs ghbalf-freecad-ai-a7b182d/freecad_ai/ui/chat_widget.py :620
buf.open(QtCore.QIODevice.WriteOnly) - fs ghbalf-freecad-ai-a7b182d/freecad_ai/ui/optimize_dialog.py :257
with open(skill.validation_path) as f: - fs ghbalf-freecad-ai-a7b182d/freecad_ai/ui/settings_dialog.py :1592
import shutil - fs ghbalf-freecad-ai-a7b182d/freecad_ai/utils/viewport.py :42
with open(tmp_path, "rb") as f: - fs ghbalf-freecad-ai-a7b182d/skills/optimize-skill/handler.py :79
os.remove(history_path) - fs ghbalf-freecad-ai-a7b182d/translations/compile_ts.py :93
with open(qm_path, "wb") as f:
shell / exec 3
- shell ghbalf-freecad-ai-a7b182d/freecad_ai/core/executor.py :20
import subprocess - shell ghbalf-freecad-ai-a7b182d/freecad_ai/llm/client.py :20
import subprocess - shell ghbalf-freecad-ai-a7b182d/freecad_ai/mcp/transport.py :8
import subprocess
network 1
- net ghbalf-freecad-ai-a7b182d/freecad_ai/llm/client.py :22
import urllib.request