stepscribe-cad 0.1.0__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 (222) hide show
  1. stepscribe_cad-0.1.0/.claude-plugin/marketplace.json +17 -0
  2. stepscribe_cad-0.1.0/.gitattributes +5 -0
  3. stepscribe_cad-0.1.0/.github/skills/stepscribe/SKILL.md +70 -0
  4. stepscribe_cad-0.1.0/.github/skills/stepscribe/references/interview_guide.md +42 -0
  5. stepscribe_cad-0.1.0/.github/skills/stepscribe/references/pack_format.md +39 -0
  6. stepscribe_cad-0.1.0/.github/skills/stepscribe/references/review_checklist.md +65 -0
  7. stepscribe_cad-0.1.0/.github/skills/stepscribe/scripts/check_env.py +56 -0
  8. stepscribe_cad-0.1.0/.github/workflows/ci.yml +30 -0
  9. stepscribe_cad-0.1.0/.github/workflows/cla.yml +28 -0
  10. stepscribe_cad-0.1.0/.github/workflows/release.yml +67 -0
  11. stepscribe_cad-0.1.0/.gitignore +15 -0
  12. stepscribe_cad-0.1.0/CHANGELOG.md +15 -0
  13. stepscribe_cad-0.1.0/CLA.md +13 -0
  14. stepscribe_cad-0.1.0/COMMERCIAL.md +11 -0
  15. stepscribe_cad-0.1.0/CONTRIBUTING.md +24 -0
  16. stepscribe_cad-0.1.0/LICENSE +661 -0
  17. stepscribe_cad-0.1.0/PKG-INFO +208 -0
  18. stepscribe_cad-0.1.0/README.md +175 -0
  19. stepscribe_cad-0.1.0/TRADEMARKS.md +7 -0
  20. stepscribe_cad-0.1.0/docs/future_ml.md +45 -0
  21. stepscribe_cad-0.1.0/docs/plugin_testing.md +37 -0
  22. stepscribe_cad-0.1.0/docs/prelaunch_checklist.md +25 -0
  23. stepscribe_cad-0.1.0/examples/README.md +32 -0
  24. stepscribe_cad-0.1.0/plugins/stepscribe/.claude-plugin/plugin.json +13 -0
  25. stepscribe_cad-0.1.0/plugins/stepscribe/.mcp.json +8 -0
  26. stepscribe_cad-0.1.0/plugins/stepscribe/LICENSE +661 -0
  27. stepscribe_cad-0.1.0/plugins/stepscribe/agents/mechanical-reviewer.md +33 -0
  28. stepscribe_cad-0.1.0/plugins/stepscribe/skills/export/SKILL.md +24 -0
  29. stepscribe_cad-0.1.0/plugins/stepscribe/skills/interview/SKILL.md +22 -0
  30. stepscribe_cad-0.1.0/plugins/stepscribe/skills/review/SKILL.md +19 -0
  31. stepscribe_cad-0.1.0/plugins/stepscribe/skills/stepscribe/SKILL.md +70 -0
  32. stepscribe_cad-0.1.0/plugins/stepscribe/skills/stepscribe/references/interview_guide.md +42 -0
  33. stepscribe_cad-0.1.0/plugins/stepscribe/skills/stepscribe/references/pack_format.md +39 -0
  34. stepscribe_cad-0.1.0/plugins/stepscribe/skills/stepscribe/references/review_checklist.md +65 -0
  35. stepscribe_cad-0.1.0/plugins/stepscribe/skills/stepscribe/scripts/check_env.py +56 -0
  36. stepscribe_cad-0.1.0/pyproject.toml +66 -0
  37. stepscribe_cad-0.1.0/schema/report.schema.json +3518 -0
  38. stepscribe_cad-0.1.0/scripts/batch_eval.py +85 -0
  39. stepscribe_cad-0.1.0/scripts/check_release.py +118 -0
  40. stepscribe_cad-0.1.0/scripts/eval_understanding.py +63 -0
  41. stepscribe_cad-0.1.0/scripts/introspect.py +26 -0
  42. stepscribe_cad-0.1.0/scripts/list_images.py +59 -0
  43. stepscribe_cad-0.1.0/scripts/sync_skills.py +91 -0
  44. stepscribe_cad-0.1.0/skills/stepscribe/SKILL.md +70 -0
  45. stepscribe_cad-0.1.0/skills/stepscribe/references/interview_guide.md +42 -0
  46. stepscribe_cad-0.1.0/skills/stepscribe/references/pack_format.md +39 -0
  47. stepscribe_cad-0.1.0/skills/stepscribe/references/review_checklist.md +65 -0
  48. stepscribe_cad-0.1.0/skills/stepscribe/scripts/check_env.py +56 -0
  49. stepscribe_cad-0.1.0/stepscribe/__init__.py +28 -0
  50. stepscribe_cad-0.1.0/stepscribe/analysis.py +247 -0
  51. stepscribe_cad-0.1.0/stepscribe/api.py +252 -0
  52. stepscribe_cad-0.1.0/stepscribe/assembly/__init__.py +99 -0
  53. stepscribe_cad-0.1.0/stepscribe/assembly/bom.py +28 -0
  54. stepscribe_cad-0.1.0/stepscribe/assembly/contacts.py +380 -0
  55. stepscribe_cad-0.1.0/stepscribe/assembly/interference.py +48 -0
  56. stepscribe_cad-0.1.0/stepscribe/assembly/joints.py +229 -0
  57. stepscribe_cad-0.1.0/stepscribe/assembly/relations.py +288 -0
  58. stepscribe_cad-0.1.0/stepscribe/assembly/spatial.py +170 -0
  59. stepscribe_cad-0.1.0/stepscribe/assembly/tree.py +176 -0
  60. stepscribe_cad-0.1.0/stepscribe/batch.py +233 -0
  61. stepscribe_cad-0.1.0/stepscribe/cli.py +713 -0
  62. stepscribe_cad-0.1.0/stepscribe/config.py +93 -0
  63. stepscribe_cad-0.1.0/stepscribe/describe/__init__.py +2 -0
  64. stepscribe_cad-0.1.0/stepscribe/describe/assembly_describer.py +152 -0
  65. stepscribe_cad-0.1.0/stepscribe/describe/budget.py +100 -0
  66. stepscribe_cad-0.1.0/stepscribe/describe/part_describer.py +237 -0
  67. stepscribe_cad-0.1.0/stepscribe/describe/phrases.py +45 -0
  68. stepscribe_cad-0.1.0/stepscribe/describe/reconstruct.py +394 -0
  69. stepscribe_cad-0.1.0/stepscribe/exporter.py +496 -0
  70. stepscribe_cad-0.1.0/stepscribe/exporter_text.py +457 -0
  71. stepscribe_cad-0.1.0/stepscribe/features/__init__.py +2 -0
  72. stepscribe_cad-0.1.0/stepscribe/features/bosses.py +99 -0
  73. stepscribe_cad-0.1.0/stepscribe/features/cutout_geometry.py +376 -0
  74. stepscribe_cad-0.1.0/stepscribe/features/cutouts.py +777 -0
  75. stepscribe_cad-0.1.0/stepscribe/features/fillets_chamfers.py +184 -0
  76. stepscribe_cad-0.1.0/stepscribe/features/hole_standards.py +135 -0
  77. stepscribe_cad-0.1.0/stepscribe/features/holes.py +542 -0
  78. stepscribe_cad-0.1.0/stepscribe/features/patterns.py +227 -0
  79. stepscribe_cad-0.1.0/stepscribe/features/shape_class.py +429 -0
  80. stepscribe_cad-0.1.0/stepscribe/features/slots_pockets.py +232 -0
  81. stepscribe_cad-0.1.0/stepscribe/geometry/__init__.py +2 -0
  82. stepscribe_cad-0.1.0/stepscribe/geometry/occ_utils.py +211 -0
  83. stepscribe_cad-0.1.0/stepscribe/geometry/part_geom.py +57 -0
  84. stepscribe_cad-0.1.0/stepscribe/geometry/pointdist.py +113 -0
  85. stepscribe_cad-0.1.0/stepscribe/geometry/properties.py +106 -0
  86. stepscribe_cad-0.1.0/stepscribe/geometry/raycast.py +60 -0
  87. stepscribe_cad-0.1.0/stepscribe/geometry/section_report.py +120 -0
  88. stepscribe_cad-0.1.0/stepscribe/geometry/sections.py +42 -0
  89. stepscribe_cad-0.1.0/stepscribe/geometry/surfaces.py +80 -0
  90. stepscribe_cad-0.1.0/stepscribe/geometry/thickness.py +69 -0
  91. stepscribe_cad-0.1.0/stepscribe/geometry/topology.py +102 -0
  92. stepscribe_cad-0.1.0/stepscribe/geometry/validity.py +18 -0
  93. stepscribe_cad-0.1.0/stepscribe/headless.py +34 -0
  94. stepscribe_cad-0.1.0/stepscribe/io/__init__.py +2 -0
  95. stepscribe_cad-0.1.0/stepscribe/io/discovery.py +22 -0
  96. stepscribe_cad-0.1.0/stepscribe/io/report_writer.py +43 -0
  97. stepscribe_cad-0.1.0/stepscribe/io/step_reader.py +262 -0
  98. stepscribe_cad-0.1.0/stepscribe/jobs.py +156 -0
  99. stepscribe_cad-0.1.0/stepscribe/knowledge/bearings.yaml +45 -0
  100. stepscribe_cad-0.1.0/stepscribe/knowledge/belts.yaml +11 -0
  101. stepscribe_cad-0.1.0/stepscribe/knowledge/boards.yaml +17 -0
  102. stepscribe_cad-0.1.0/stepscribe/knowledge/extrusions.yaml +28 -0
  103. stepscribe_cad-0.1.0/stepscribe/knowledge/gears.yaml +14 -0
  104. stepscribe_cad-0.1.0/stepscribe/knowledge/lead_screws.yaml +10 -0
  105. stepscribe_cad-0.1.0/stepscribe/knowledge/motors.yaml +31 -0
  106. stepscribe_cad-0.1.0/stepscribe/knowledge/process_rules.yaml +101 -0
  107. stepscribe_cad-0.1.0/stepscribe/knowledge/roles.yaml +151 -0
  108. stepscribe_cad-0.1.0/stepscribe/knowledge/screws_iso_metric.yaml +27 -0
  109. stepscribe_cad-0.1.0/stepscribe/knowledge/screws_unified.yaml +15 -0
  110. stepscribe_cad-0.1.0/stepscribe/knowledge/shafts.yaml +16 -0
  111. stepscribe_cad-0.1.0/stepscribe/knowledge/weak_spot_rules.yaml +57 -0
  112. stepscribe_cad-0.1.0/stepscribe/llm/__init__.py +2 -0
  113. stepscribe_cad-0.1.0/stepscribe/llm/adapter.py +122 -0
  114. stepscribe_cad-0.1.0/stepscribe/llm/evaluate.py +121 -0
  115. stepscribe_cad-0.1.0/stepscribe/mcp/__init__.py +2 -0
  116. stepscribe_cad-0.1.0/stepscribe/mcp/server.py +153 -0
  117. stepscribe_cad-0.1.0/stepscribe/mcp/tools.py +558 -0
  118. stepscribe_cad-0.1.0/stepscribe/models/__init__.py +2 -0
  119. stepscribe_cad-0.1.0/stepscribe/models/schema.py +655 -0
  120. stepscribe_cad-0.1.0/stepscribe/pack/__init__.py +2 -0
  121. stepscribe_cad-0.1.0/stepscribe/pack/design_context.py +133 -0
  122. stepscribe_cad-0.1.0/stepscribe/pack/templates/00_READ_ME_FIRST.md.j2 +19 -0
  123. stepscribe_cad-0.1.0/stepscribe/pack/templates/01_overview.md.j2 +52 -0
  124. stepscribe_cad-0.1.0/stepscribe/pack/templates/02_assembly.md.j2 +65 -0
  125. stepscribe_cad-0.1.0/stepscribe/pack/templates/04_design_context.md.j2 +28 -0
  126. stepscribe_cad-0.1.0/stepscribe/pack/templates/context_header.md.j2 +14 -0
  127. stepscribe_cad-0.1.0/stepscribe/pack/templates/part.md.j2 +118 -0
  128. stepscribe_cad-0.1.0/stepscribe/pack/writer.py +280 -0
  129. stepscribe_cad-0.1.0/stepscribe/procutil.py +20 -0
  130. stepscribe_cad-0.1.0/stepscribe/progress.py +154 -0
  131. stepscribe_cad-0.1.0/stepscribe/render/__init__.py +466 -0
  132. stepscribe_cad-0.1.0/stepscribe/render/dimensions.py +151 -0
  133. stepscribe_cad-0.1.0/stepscribe/render/features.py +411 -0
  134. stepscribe_cad-0.1.0/stepscribe/render/kinematics_view.py +108 -0
  135. stepscribe_cad-0.1.0/stepscribe/render/overlay.py +183 -0
  136. stepscribe_cad-0.1.0/stepscribe/render/raster.py +221 -0
  137. stepscribe_cad-0.1.0/stepscribe/render/scene.py +162 -0
  138. stepscribe_cad-0.1.0/stepscribe/render/tessellate.py +87 -0
  139. stepscribe_cad-0.1.0/stepscribe/semantics/__init__.py +56 -0
  140. stepscribe_cad-0.1.0/stepscribe/semantics/bearings.py +93 -0
  141. stepscribe_cad-0.1.0/stepscribe/semantics/extrusions.py +91 -0
  142. stepscribe_cad-0.1.0/stepscribe/semantics/hardware.py +239 -0
  143. stepscribe_cad-0.1.0/stepscribe/semantics/matcher.py +43 -0
  144. stepscribe_cad-0.1.0/stepscribe/semantics/mounts.py +178 -0
  145. stepscribe_cad-0.1.0/stepscribe/semantics/shafts.py +135 -0
  146. stepscribe_cad-0.1.0/stepscribe/ui/__init__.py +2 -0
  147. stepscribe_cad-0.1.0/stepscribe/ui/index.html +460 -0
  148. stepscribe_cad-0.1.0/stepscribe/ui/interview_view.py +99 -0
  149. stepscribe_cad-0.1.0/stepscribe/ui/server.py +395 -0
  150. stepscribe_cad-0.1.0/stepscribe/ui/worker.py +304 -0
  151. stepscribe_cad-0.1.0/stepscribe/understanding/__init__.py +318 -0
  152. stepscribe_cad-0.1.0/stepscribe/understanding/aag.py +333 -0
  153. stepscribe_cad-0.1.0/stepscribe/understanding/answers.py +250 -0
  154. stepscribe_cad-0.1.0/stepscribe/understanding/describe.py +238 -0
  155. stepscribe_cad-0.1.0/stepscribe/understanding/evaluate.py +168 -0
  156. stepscribe_cad-0.1.0/stepscribe/understanding/function.py +781 -0
  157. stepscribe_cad-0.1.0/stepscribe/understanding/interview.py +126 -0
  158. stepscribe_cad-0.1.0/stepscribe/understanding/kinematics.py +1199 -0
  159. stepscribe_cad-0.1.0/stepscribe/understanding/load_path.py +218 -0
  160. stepscribe_cad-0.1.0/stepscribe/understanding/mechanisms.py +617 -0
  161. stepscribe_cad-0.1.0/stepscribe/understanding/ml_roles.py +48 -0
  162. stepscribe_cad-0.1.0/stepscribe/understanding/motion_check.py +181 -0
  163. stepscribe_cad-0.1.0/stepscribe/understanding/process.py +434 -0
  164. stepscribe_cad-0.1.0/stepscribe/understanding/questions.py +357 -0
  165. stepscribe_cad-0.1.0/stepscribe/understanding/session.py +288 -0
  166. stepscribe_cad-0.1.0/stepscribe/understanding/stability.py +251 -0
  167. stepscribe_cad-0.1.0/stepscribe/understanding/structural.py +589 -0
  168. stepscribe_cad-0.1.0/stepscribe/understanding/symmetry.py +215 -0
  169. stepscribe_cad-0.1.0/stepscribe/understanding/weak_spots.py +648 -0
  170. stepscribe_cad-0.1.0/tests/conftest.py +108 -0
  171. stepscribe_cad-0.1.0/tests/fixtures/assembly_fixtures.py +140 -0
  172. stepscribe_cad-0.1.0/tests/fixtures/cutout_fixtures.py +124 -0
  173. stepscribe_cad-0.1.0/tests/fixtures/expected/fixtures.json +31 -0
  174. stepscribe_cad-0.1.0/tests/fixtures/expected/roles/arm_with_belt.json +32 -0
  175. stepscribe_cad-0.1.0/tests/fixtures/expected/roles/direct_drive_joint.json +13 -0
  176. stepscribe_cad-0.1.0/tests/fixtures/expected/roles/four_bar_linkage.json +19 -0
  177. stepscribe_cad-0.1.0/tests/fixtures/expected/roles/leadscrew_axis.json +19 -0
  178. stepscribe_cad-0.1.0/tests/fixtures/expected/roles/linear_slide.json +16 -0
  179. stepscribe_cad-0.1.0/tests/fixtures/expected/roles/mini_mobile_manipulator.json +41 -0
  180. stepscribe_cad-0.1.0/tests/fixtures/expected/roles/mini_mobile_manipulator_generic.json +41 -0
  181. stepscribe_cad-0.1.0/tests/fixtures/expected/roles/two_link_arm.json +23 -0
  182. stepscribe_cad-0.1.0/tests/fixtures/expected/roles/two_link_arm_generic.json +23 -0
  183. stepscribe_cad-0.1.0/tests/fixtures/expected/roles/wheeled_base.json +14 -0
  184. stepscribe_cad-0.1.0/tests/fixtures/expected/roles/wheeled_base_generic.json +14 -0
  185. stepscribe_cad-0.1.0/tests/fixtures/generate_fixtures.py +259 -0
  186. stepscribe_cad-0.1.0/tests/fixtures/understanding/assembly_fixtures_u.py +202 -0
  187. stepscribe_cad-0.1.0/tests/fixtures/understanding/mechanism_fixtures.py +353 -0
  188. stepscribe_cad-0.1.0/tests/fixtures/understanding/part_fixtures.py +186 -0
  189. stepscribe_cad-0.1.0/tests/fixtures/understanding/risk_fixtures.py +100 -0
  190. stepscribe_cad-0.1.0/tests/golden/mini_mobile_manipulator.summary.txt +1 -0
  191. stepscribe_cad-0.1.0/tests/golden/plate_4xM3.PRT001.md +55 -0
  192. stepscribe_cad-0.1.0/tests/golden/plate_4xM3.report.json +890 -0
  193. stepscribe_cad-0.1.0/tests/golden/two_plates_assembly_FULL.md +357 -0
  194. stepscribe_cad-0.1.0/tests/real_labels/example.yaml +15 -0
  195. stepscribe_cad-0.1.0/tests/real_labels/small_robot_arm_tot1.yaml +6 -0
  196. stepscribe_cad-0.1.0/tests/real_labels/so_arm100.yaml +38 -0
  197. stepscribe_cad-0.1.0/tests/test_answers_cli.py +112 -0
  198. stepscribe_cad-0.1.0/tests/test_assembly.py +207 -0
  199. stepscribe_cad-0.1.0/tests/test_cutouts.py +168 -0
  200. stepscribe_cad-0.1.0/tests/test_export.py +216 -0
  201. stepscribe_cad-0.1.0/tests/test_fixtures_expected.py +118 -0
  202. stepscribe_cad-0.1.0/tests/test_holes.py +111 -0
  203. stepscribe_cad-0.1.0/tests/test_license.py +95 -0
  204. stepscribe_cad-0.1.0/tests/test_llm.py +128 -0
  205. stepscribe_cad-0.1.0/tests/test_mcp.py +188 -0
  206. stepscribe_cad-0.1.0/tests/test_no_clipping.py +42 -0
  207. stepscribe_cad-0.1.0/tests/test_pack.py +145 -0
  208. stepscribe_cad-0.1.0/tests/test_phase0.py +82 -0
  209. stepscribe_cad-0.1.0/tests/test_plugin.py +304 -0
  210. stepscribe_cad-0.1.0/tests/test_procutil.py +27 -0
  211. stepscribe_cad-0.1.0/tests/test_readme_release.py +99 -0
  212. stepscribe_cad-0.1.0/tests/test_render.py +190 -0
  213. stepscribe_cad-0.1.0/tests/test_semantics.py +107 -0
  214. stepscribe_cad-0.1.0/tests/test_ui.py +131 -0
  215. stepscribe_cad-0.1.0/tests/test_understanding_function.py +132 -0
  216. stepscribe_cad-0.1.0/tests/test_understanding_interview.py +222 -0
  217. stepscribe_cad-0.1.0/tests/test_understanding_kinematics.py +89 -0
  218. stepscribe_cad-0.1.0/tests/test_understanding_mechanisms.py +101 -0
  219. stepscribe_cad-0.1.0/tests/test_understanding_pack.py +175 -0
  220. stepscribe_cad-0.1.0/tests/test_understanding_risks.py +125 -0
  221. stepscribe_cad-0.1.0/tests/test_understanding_structure.py +79 -0
  222. stepscribe_cad-0.1.0/tests/test_understanding_symmetry_process.py +114 -0
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "stepscribe",
3
+ "description": "Plugins for understanding STEP CAD files of mechanical designs and robots.",
4
+ "owner": {
5
+ "name": "idris sadiq"
6
+ },
7
+ "plugins": [
8
+ {
9
+ "name": "stepscribe",
10
+ "source": "./plugins/stepscribe",
11
+ "description": "Analyse STEP files offline: measured facts, how the design moves, weak spots, and portable Markdown exports.",
12
+ "version": "0.1.0",
13
+ "license": "AGPL-3.0-only",
14
+ "keywords": ["cad", "step", "robotics", "mechanical", "design-review"]
15
+ }
16
+ ]
17
+ }
@@ -0,0 +1,5 @@
1
+ * text=auto eol=lf
2
+ *.png binary
3
+ *.step binary
4
+ *.stp binary
5
+ *.zip binary
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: stepscribe
3
+ description: Analyze STEP CAD files (.step/.stp) of mechanical designs and robots - dimensions, holes, fasteners, assembly structure, how the design moves, weak spots - and hand over portable Markdown. Use when the user shares or mentions a STEP file, asks what a CAD model is or how it works, wants a design review, or wants a text description of a 3D model.
4
+ license: AGPL-3.0-only
5
+ compatibility: Needs Python 3.11+ with the stepscribe package (pip install stepscribe, or "stepscribe[mcp]" for the MCP server). Works offline.
6
+ ---
7
+
8
+ # stepscribe: understand a STEP file
9
+
10
+ stepscribe reads a STEP file and writes measured facts (sizes, holes, fasteners, contacts) plus rule-based
11
+ inferences ("Likely: ..." with a confidence). It uses no AI model and no network. You add the judgement.
12
+
13
+ **Never invent a number.** Every dimension, count or position you state comes from stepscribe output or a
14
+ tool call. If a number is missing, measure it with a tool or say it is unknown.
15
+
16
+ ## 1. Check the environment
17
+
18
+ Run `python scripts/check_env.py` (in this skill's folder). It prints the stepscribe version and whether
19
+ the MCP server dependencies are present. It never installs anything.
20
+
21
+ If stepscribe is missing, **ask the user before installing** (`pip install stepscribe`, or
22
+ `pip install "stepscribe[mcp]"` for the MCP server). If installing is not possible here, say so plainly and
23
+ suggest running `stepscribe export robot.step` on their own machine and uploading the exported files
24
+ (`robot_FULL.md`, or the `chat_bundle/` folder for small chats) instead.
25
+
26
+ ## 2. Prefer the MCP tools, otherwise the CLI
27
+
28
+ MCP tools: `start_analysis`, `get_job_status`, `export_pack`, `get_overview`, `get_part`, `list_holes`,
29
+ `list_cutouts`, `get_relations`, `measure_distance`, `section`, `render_view`, `find_parts`,
30
+ `get_questions`, `submit_answer`, `get_shopping_list`, `diff`.
31
+
32
+ CLI equivalents: `stepscribe export FILE`, `stepscribe questions FILE --json`, `stepscribe answer FILE --id ID
33
+ --value V` (also `--skip`, `--not-sure`, `--undo`), `stepscribe kinematics FILE`, `stepscribe weak-spots FILE`.
34
+
35
+ ## 3. Expect long runs
36
+
37
+ Real assemblies take minutes. Call `start_analysis` (it returns at once with an ETA and whether the result is
38
+ cached), tell the user the ETA ("about 3 minutes"), then poll `get_job_status` every 20 to 30 seconds and give
39
+ a short progress line each time. Do not claim results before the job is done.
40
+
41
+ ## 4. Export, then read
42
+
43
+ Call `export_pack` with the job id. Read `MANIFEST.md`, then `<name>_SMALL.md` (or COMPACT or FULL if your
44
+ context allows). If you can see images, look at the assembly iso and exploded views. The layout of the files
45
+ is in `references/pack_format.md`.
46
+
47
+ ## 5. Give a short summary
48
+
49
+ Two to five sentences with IDs: what it is, overall size, number of parts, how it moves (joints and what
50
+ drives them), and the top risks. Separate measured facts, designer-confirmed facts and "Likely:" inferences.
51
+
52
+ ## 6. Offer the interview
53
+
54
+ Say: "I have N questions that would sharpen the analysis. Want to go through them? You can skip any." Then
55
+ follow `references/interview_guide.md`: one question per message, numbered options with the tool's guess
56
+ marked, and skip / not sure / back / done understood from the reply. Submit each answer with `submit_answer`
57
+ (or `stepscribe answer`). Export again at the end.
58
+
59
+ Everything stays in this chat: ask questions as messages, show images inline as image content (or describe
60
+ them and give the file path), and hand results over as files and text.
61
+
62
+ ## 7. Review when asked
63
+
64
+ Follow `references/review_checklist.md`. Prioritise by severity. Challenge inferences that look wrong. State
65
+ your assumptions (material, process, loads) when the design context does not give them.
66
+
67
+ ## 8. Always finish with the portable files
68
+
69
+ In one or two lines say where `<name>_FULL.md`, `<name>_SMALL.md`, the folder and the zip are, and that they
70
+ can be pasted or uploaded into any other AI tool or document. If you can send files, send FULL.md and the zip.
@@ -0,0 +1,42 @@
1
+ # Running the designer interview in the chat
2
+
3
+ The tool asks what geometry cannot tell: material, how parts are made, purpose, payload, what drives a joint.
4
+ Each answer changes the analysis (mass, weak spots, tipping, roles), usually in well under a second.
5
+
6
+ ## Offer first
7
+
8
+ "I have N questions that would sharpen the analysis (material, how it is made, what drives each joint). Want to
9
+ go through them? You can skip any."
10
+
11
+ If the user says no, move on. Do not ask again unless they bring it up.
12
+
13
+ ## One question per message
14
+
15
+ Use `get_questions` (or `stepscribe questions FILE --json`). Take the first question and write:
16
+
17
+ 1. The question, in plain words.
18
+ 2. Why it matters (the `why` field), in one short sentence.
19
+ 3. Options as a numbered list. Mark the tool's guess: `2. 3D printed (FDM) (my guess)`. For a number or free text,
20
+ say what unit or format you want.
21
+ 4. If the client shows images, include the highlight image for the parts the question is about.
22
+ 5. A reminder in small words: *reply with a number or text; "skip", "not sure", "back" or "done" also work.*
23
+
24
+ ## Reading the reply
25
+
26
+ - A number picks that option; text is the answer for free-text questions; "a, c" answers a multi-choice question.
27
+ - "skip": submit with status `skipped` (the guess stays, unconfirmed).
28
+ - "not sure": submit with status `not_sure` (the guess stays, marked as a soft fact).
29
+ - "back": undo the last answer (`stepscribe answer FILE --undo`) and re-ask that question.
30
+ - "done": stop asking.
31
+
32
+ Submit with `submit_answer` (MCP) or `stepscribe answer FILE --id ID --value V [--note ...]`. Question IDs
33
+ can change after an answer, so take the next ID from the reply or from a fresh question list.
34
+
35
+ ## After each answer
36
+
37
+ Read the "what changed" line back in one short sentence ("Mass is now 109 g; tipping angle 3.5 degrees").
38
+ If an answer conflicts with the geometry the tool says so; tell the user plainly and keep their answer.
39
+
40
+ ## At the end
41
+
42
+ Run `export_pack` again so the files include the answers, then say where they are.
@@ -0,0 +1,39 @@
1
+ # Reading a stepscribe export
2
+
3
+ ## Files
4
+
5
+ | File | Use it for |
6
+ |---|---|
7
+ | `MANIFEST.md` | Which file to use where, with sizes and token estimates. Read it first. |
8
+ | `<name>_SMALL.md` | Summary, kinematics, top weak spots, open questions, BOM, one paragraph per part. Fits small chats. |
9
+ | `<name>_COMPACT.md` | The important parts in full detail, the rest as short paragraphs. |
10
+ | `<name>_FULL.md` | Everything: all layers, every part in full, image descriptions, appendix. |
11
+ | `chat_bundle/` | SMALL plus a few images, sized for free-tier upload. |
12
+ | `pack/` | The multi-file pack (`00_READ_ME_FIRST.md`, `01_overview.md`, `02_assembly.md`, `03_parts/`, `05_understanding.md`). |
13
+ | `data/report.json` | Every number, machine readable. `report.schema.json` describes it. |
14
+ | `images/` | Labelled renders. The IDs in the labels are the IDs in the text. |
15
+
16
+ ## IDs
17
+
18
+ PRT part, INS placed part (one copy of a part in the assembly), H hole, P hole pattern, CP cut-out pattern, C contact,
19
+ J fastener joint, R relation, S slot, PK pocket, B boss, FL fillet, CH chamfer, L rigid link, KJ kinematic
20
+ joint, M mechanism, LP load path, W weak spot, Q question. Face IDs look like F0001.
21
+
22
+ ## Fact or guess
23
+
24
+ - No prefix: measured from the geometry.
25
+ - `Likely:` an inference. The number is a confidence from 0 to 1 and the reason follows.
26
+ - `Confirmed by designer:` the designer answered a question. Treat as fact, but if a "conflict" note says it
27
+ disagrees with the geometry, mention the conflict.
28
+ - `Designer unsure:` a soft answer. Treat as a guess.
29
+
30
+ ## Units and frames
31
+
32
+ Millimetres, degrees, grams. The text states the up and front axes. A hole direction points into the material
33
+ from the entry face. Part files use the part's own frame; assembly placements give each placed part's position
34
+ and rotation in world coordinates.
35
+
36
+ ## What stepscribe cannot know
37
+
38
+ Threads, material (unless given), tolerances, loads and purpose, unless the designer supplied them. Say so
39
+ when a conclusion depends on one of these.
@@ -0,0 +1,65 @@
1
+ # Design review checklist (for you, the AI, while reviewing)
2
+
3
+ Work from the stepscribe output and tool measurements only. For each finding cite IDs and numbers, and say
4
+ whether it rests on measured facts, designer-confirmed facts or "Likely:" inferences. If a needed number is
5
+ missing, call a tool (`measure_distance`, `section`, `get_part`, `list_holes`) or say it is unknown.
6
+
7
+ ## Order of work
8
+
9
+ 1. Read MANIFEST, then SMALL or COMPACT or FULL. Look at the assembly images if you can see images.
10
+ 2. Go through the sections below. Note only what the data supports.
11
+ 3. Check the weak-spot table (W IDs) first: each has a number, a threshold and a suggestion. Decide which are
12
+ real problems and which are design advice (a "high" row is a rule-of-thumb breach, not a failure).
13
+ 4. Write the review: Summary, Critical issues, Important, Minor, Questions for the designer, What is done well.
14
+
15
+ ## Fasteners and joints
16
+
17
+ - Do screw lengths fit the grip (stack thickness)? Short-screw rows (W) and the shopping list tell you.
18
+ - Is a load-carrying joint held by a single fastener? Are there fasteners at all where parts only rest?
19
+ - Are holes consistent in size across a joint (clearance vs tapped)? Mixed sizes in one stack are suspicious.
20
+ - Is there room for a tool and a head (look at the spatial facts and the images)?
21
+
22
+ ## Edge distances and walls
23
+
24
+ - Hole-to-edge distance against the guideline in the finding (it names the process it assumed). Check the
25
+ assumption: if the process is wrong, the finding changes.
26
+ - Thinnest wall against the process minimum. A sampled wall is an estimate; confirm with `section` before
27
+ calling it critical.
28
+ - Cut-out webs between openings, and sharp internal corners on printed or bent parts.
29
+
30
+ ## Fits and clearances
31
+
32
+ - Cylindrical fits: clearance, line-to-line or interference. Is that right for a pivot, a press fit, a bearing seat?
33
+ - Overlaps (interference rows): small volumes can be modelling tolerance or a screw inside its hole; large ones
34
+ are real collisions. Report the volume.
35
+ - Bearing and shaft seats: do the diameters and widths match a standard size the tool names?
36
+
37
+ ## Kinematics
38
+
39
+ - Does the joint list match the intended motion? Check axes, parents and children, and `Driven by`.
40
+ - Is there a motor or servo for every joint that should be driven? What does the design say about limits?
41
+ - Degrees of freedom, closed loops, floating parts (not connected to the ground link).
42
+
43
+ ## Stability and loads
44
+
45
+ - Centre of mass against the support polygon; the tipping angle and the arm-extended case.
46
+ - Load paths: what is the weakest connection on the way to the ground?
47
+ - Cantilevers and unsupported spans next to heavy parts (motors, batteries).
48
+
49
+ ## Manufacturability
50
+
51
+ - Is the inferred process plausible for each part? Is it consistent with the features (wall thickness, sharp
52
+ corners, thread-like holes, draft)?
53
+ - Can each part be made as modelled (tool access, minimum radii, overhangs for printing)?
54
+
55
+ ## Assembly order
56
+
57
+ - Can the parts go together in some order? Look for parts trapped by others, and fasteners that need access
58
+ that a later part blocks.
59
+
60
+ ## Style of the review
61
+
62
+ - Prioritise by severity. Prefer few well-supported findings over a long list.
63
+ - Challenge inferences that look wrong; say why with a number.
64
+ - State your assumptions (material, process, loads) when the design context does not give them.
65
+ - End with the questions whose answers would change your conclusions.
@@ -0,0 +1,56 @@
1
+ """Print what is available for stepscribe: package version, OpenCASCADE, MCP. Never installs anything."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import importlib.metadata
6
+ import importlib.util
7
+ import sys
8
+
9
+
10
+ def _has(module: str) -> bool:
11
+ try:
12
+ return importlib.util.find_spec(module) is not None
13
+ except (ImportError, ValueError):
14
+ return False
15
+
16
+
17
+ def _version(dist: str) -> str | None:
18
+ try:
19
+ return importlib.metadata.version(dist)
20
+ except importlib.metadata.PackageNotFoundError:
21
+ return None
22
+
23
+
24
+ def check() -> dict[str, object]:
25
+ """Facts about the environment, as a dict."""
26
+ version = _version("stepscribe-cad") or _version("stepscribe")
27
+ return {
28
+ "python": ".".join(str(n) for n in sys.version_info[:3]),
29
+ "python_ok": sys.version_info >= (3, 11),
30
+ "stepscribe": version,
31
+ "stepscribe_importable": _has("stepscribe"),
32
+ "opencascade": _has("OCP"),
33
+ "mcp_server": _has("mcp"),
34
+ }
35
+
36
+
37
+ def main() -> int:
38
+ info = check()
39
+ print(
40
+ f"Python {info['python']}"
41
+ + ("" if info["python_ok"] else " (stepscribe needs 3.11 or newer)")
42
+ )
43
+ if info["stepscribe_importable"]:
44
+ print(f"stepscribe: installed ({info['stepscribe'] or 'version unknown'})")
45
+ else:
46
+ print("stepscribe: NOT installed. Ask the user before running: pip install stepscribe")
47
+ print("OpenCASCADE (OCP): " + ("available" if info["opencascade"] else "missing"))
48
+ print(
49
+ "MCP server dependencies: "
50
+ + ("available" if info["mcp_server"] else 'missing (pip install "stepscribe[mcp]")')
51
+ )
52
+ return 0 if info["stepscribe_importable"] and info["opencascade"] else 1
53
+
54
+
55
+ if __name__ == "__main__":
56
+ sys.exit(main())
@@ -0,0 +1,30 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, "build/**"]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ strategy:
11
+ fail-fast: false
12
+ matrix:
13
+ os: [ubuntu-latest, windows-latest, macos-latest]
14
+ python: ["3.11", "3.12"]
15
+ runs-on: ${{ matrix.os }}
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: ${{ matrix.python }}
21
+ - name: Virtual display for the image renderer (Linux)
22
+ if: runner.os == 'Linux'
23
+ run: sudo apt-get update && sudo apt-get install -y xvfb libgl1-mesa-dri libglx-mesa0
24
+ - run: python -m pip install -e ".[dev,mcp,llm]"
25
+ - run: ruff check .
26
+ - run: ruff format --check .
27
+ - run: mypy stepscribe
28
+ - run: python scripts/sync_skills.py --check
29
+ - run: python scripts/check_release.py
30
+ - run: ${{ runner.os == 'Linux' && 'xvfb-run -a ' || '' }}pytest -q -p no:cacheprovider
@@ -0,0 +1,28 @@
1
+ name: CLA Assistant
2
+
3
+ on:
4
+ issue_comment:
5
+ types: [created]
6
+ pull_request_target:
7
+ types: [opened, closed, synchronize]
8
+
9
+ permissions:
10
+ actions: write
11
+ contents: write
12
+ pull-requests: write
13
+ statuses: write
14
+
15
+ jobs:
16
+ cla:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - name: CLA Assistant
20
+ if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target'
21
+ uses: contributor-assistant/github-action@v2.6.1
22
+ env:
23
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
24
+ with:
25
+ path-to-signatures: signatures/cla.json
26
+ path-to-document: https://github.com/idris900323/stepscribe/blob/main/CLA.md
27
+ branch: cla-signatures
28
+ allowlist: idris900323,bot*
@@ -0,0 +1,67 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+ - uses: actions/setup-python@v5
13
+ with:
14
+ python-version: "3.12"
15
+ - run: sudo apt-get update && sudo apt-get install -y xvfb libgl1-mesa-dri libglx-mesa0
16
+ - run: python -m pip install -e ".[dev,mcp,llm]"
17
+ - run: ruff check .
18
+ - run: mypy stepscribe
19
+ - run: python scripts/sync_skills.py --check
20
+ - run: python scripts/check_release.py --tag "${GITHUB_REF_NAME}"
21
+ - run: xvfb-run -a pytest -q -p no:cacheprovider
22
+
23
+ build:
24
+ needs: test
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: actions/setup-python@v5
29
+ with:
30
+ python-version: "3.12"
31
+ - run: python -m pip install build
32
+ - run: python -m build
33
+ - run: python scripts/sync_skills.py
34
+ - run: python scripts/check_release.py --tag "${GITHUB_REF_NAME}" --dist dist
35
+ - uses: actions/upload-artifact@v4
36
+ with:
37
+ name: dist
38
+ path: dist/
39
+
40
+ publish-pypi:
41
+ needs: build
42
+ runs-on: ubuntu-latest
43
+ environment: pypi
44
+ permissions:
45
+ id-token: write
46
+ steps:
47
+ - uses: actions/download-artifact@v4
48
+ with:
49
+ name: dist
50
+ path: dist/
51
+ - name: Keep only the wheel and sdist for PyPI
52
+ run: rm -f dist/stepscribe-skill.zip
53
+ - uses: pypa/gh-action-pypi-publish@release/v1
54
+
55
+ github-release:
56
+ needs: build
57
+ runs-on: ubuntu-latest
58
+ permissions:
59
+ contents: write
60
+ steps:
61
+ - uses: actions/download-artifact@v4
62
+ with:
63
+ name: dist
64
+ path: dist/
65
+ - uses: softprops/action-gh-release@v2
66
+ with:
67
+ files: dist/*
@@ -0,0 +1,15 @@
1
+ robot_steps/
2
+ .venv/
3
+ __pycache__/
4
+ *.egg-info/
5
+ .mypy_cache/
6
+ .ruff_cache/
7
+ .pytest_cache/
8
+ .coverage
9
+ dist/
10
+ tests/fixtures/step/
11
+ out/
12
+
13
+ # launch-video output
14
+ brag-output/
15
+ brag-output-*/
@@ -0,0 +1,15 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 (unreleased)
4
+
5
+ First release.
6
+
7
+ - **Measuring:** STEP reader (names, colours, tree, units), exact properties, holes (counterbores, countersinks, blind and through, edge distances), patterns, fillets, chamfers, bosses, slots, pockets, cut-outs (through, recess, stepped, notch), wall thickness, shape classes, standard parts (screws, bearings, motors, extrusions, boards).
8
+ - **Assembly:** instances and transforms, bill of materials, planar and cylindrical contacts, fastener joints and shopping list, relations as sentences, optional interference check.
9
+ - **Understanding layer:** ribs, gussets, symmetry, manufacturing process, links, joints (servo horns included), degrees of freedom, gears, belts, lead screws, load paths, weak spots, stability, part roles, designer questions and answers.
10
+ - **Output:** context pack folder, labelled images with dimensions and joint arrows, `report.json` with a JSON Schema.
11
+ - **Portable export** (`stepscribe export`): FULL, COMPACT and SMALL Markdown, a chat bundle, a manifest and a zip; reused from disk when nothing changed.
12
+ - **AI integrations:** MCP server with background jobs and image content, an Agent Skill, a Claude Code plugin and marketplace with a reviewer agent, a non-interactive `answer` command. None of them start the local web page.
13
+ - **Local web page** (`stepscribe ui`) with progress and ETA, an image viewer and the designer interview.
14
+ - **Speed:** exact contact detection pruned by face boxes, parallel part analysis, fixes for quadratic loops on parts with hundreds of holes.
15
+ - **License:** AGPL-3.0-only with dual licensing, CLA and trademark notice.
@@ -0,0 +1,13 @@
1
+ # Individual Contributor License Agreement
2
+
3
+ > **Draft: to be reviewed by a lawyer before accepting outside contributions.**
4
+
5
+ Thank you for contributing to stepscribe. This agreement is between you ("You") and idris sadiq ("the Maintainer"). It is adapted from the Apache Individual Contributor License Agreement. By commenting "I have read the CLA Document and I hereby sign the CLA" on a pull request, You accept these terms for all Contributions You submit to the project.
6
+
7
+ "Contribution" means any code, documentation or other work that You intentionally submit to the project.
8
+
9
+ 1. **Copyright license.** You grant the Maintainer and recipients of software distributed by the Maintainer a perpetual, worldwide, non-exclusive, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense and distribute Your Contributions and derivative works, **under the GNU AGPL-3.0 or under any other license terms the Maintainer chooses, including commercial and closed-source licenses.**
10
+ 2. **Patent license.** You grant a perpetual, worldwide, non-exclusive, royalty-free, irrevocable patent license to make, use, sell, offer to sell, import and transfer the Contribution, for those patent claims You can license that are necessarily infringed by the Contribution alone or combined with the project. If You start patent litigation claiming that the project or a Contribution infringes a patent, the patent licenses You granted end on the date it is filed.
11
+ 3. **Your rights.** You keep the copyright in Your Contributions. You confirm that You are legally entitled to grant these licenses, that each Contribution is Your original work, and that if Your employer has rights to Your work, Your employer has allowed the Contribution.
12
+ 4. **Third-party material.** If You include work that is not Yours, You will say so and name its source and license in the pull request.
13
+ 5. **No warranty or obligation.** Contributions are provided "as is". You are not required to provide support. The Maintainer is not required to accept any Contribution.
@@ -0,0 +1,11 @@
1
+ # Commercial use
2
+
3
+ stepscribe is free and open source under the [GNU AGPL-3.0](LICENSE). Anyone may use, modify and share it under those terms. That includes the obligation to publish the source code of your version when you distribute it or offer it as a network service.
4
+
5
+ If you want to embed stepscribe in a closed-source product, or run it as a closed hosted service, you can get a **commercial license** from the maintainer, which replaces the AGPL obligations for your use.
6
+
7
+ Contact: `idris.connected@gmail.com`
8
+
9
+ The analysis output stepscribe produces for your files belongs to you under either license.
10
+
11
+ This is not legal advice; have the commercial terms reviewed before selling licenses.
@@ -0,0 +1,24 @@
1
+ # Contributing to stepscribe
2
+
3
+ ## License and CLA
4
+
5
+ stepscribe is licensed under the [GNU AGPL-3.0](LICENSE) and is also offered under a commercial license (see [COMMERCIAL.md](COMMERCIAL.md)). To make that possible, every contributor signs the [CLA](CLA.md), which lets the maintainer relicense contributions. When you open your first pull request, a bot asks you to sign by commenting on the PR. You only sign once.
6
+
7
+ Every Python file under `stepscribe/` starts with the SPDX line `# SPDX-License-Identifier: AGPL-3.0-only` and a copyright line. Keep them on new files.
8
+
9
+ ## Development
10
+
11
+ ```
12
+ python -m venv .venv
13
+ .venv\Scripts\activate # Windows; on Linux/macOS: source .venv/bin/activate
14
+ pip install -e ".[dev,mcp]"
15
+ pytest
16
+ ruff check .
17
+ mypy
18
+ ```
19
+
20
+ The agent skill lives in `skills/stepscribe/`. After changing it run `python scripts/sync_skills.py` to update the copies in `plugins/` and `.github/skills/` and the skill zip (CI fails if they differ). `python scripts/check_release.py` checks that the package, plugin and marketplace share one version.
21
+
22
+ Rules the code follows: no network or LLM calls in the core, deterministic output, every number sourced from the STEP file, tests for new behaviour, full typing (mypy strict). Third-party STEP files stay out of the repository (`robot_steps/` is gitignored).
23
+
24
+ Files use LF line endings (`.gitattributes` enforces this).