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.
- stepscribe_cad-0.1.0/.claude-plugin/marketplace.json +17 -0
- stepscribe_cad-0.1.0/.gitattributes +5 -0
- stepscribe_cad-0.1.0/.github/skills/stepscribe/SKILL.md +70 -0
- stepscribe_cad-0.1.0/.github/skills/stepscribe/references/interview_guide.md +42 -0
- stepscribe_cad-0.1.0/.github/skills/stepscribe/references/pack_format.md +39 -0
- stepscribe_cad-0.1.0/.github/skills/stepscribe/references/review_checklist.md +65 -0
- stepscribe_cad-0.1.0/.github/skills/stepscribe/scripts/check_env.py +56 -0
- stepscribe_cad-0.1.0/.github/workflows/ci.yml +30 -0
- stepscribe_cad-0.1.0/.github/workflows/cla.yml +28 -0
- stepscribe_cad-0.1.0/.github/workflows/release.yml +67 -0
- stepscribe_cad-0.1.0/.gitignore +15 -0
- stepscribe_cad-0.1.0/CHANGELOG.md +15 -0
- stepscribe_cad-0.1.0/CLA.md +13 -0
- stepscribe_cad-0.1.0/COMMERCIAL.md +11 -0
- stepscribe_cad-0.1.0/CONTRIBUTING.md +24 -0
- stepscribe_cad-0.1.0/LICENSE +661 -0
- stepscribe_cad-0.1.0/PKG-INFO +208 -0
- stepscribe_cad-0.1.0/README.md +175 -0
- stepscribe_cad-0.1.0/TRADEMARKS.md +7 -0
- stepscribe_cad-0.1.0/docs/future_ml.md +45 -0
- stepscribe_cad-0.1.0/docs/plugin_testing.md +37 -0
- stepscribe_cad-0.1.0/docs/prelaunch_checklist.md +25 -0
- stepscribe_cad-0.1.0/examples/README.md +32 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/.claude-plugin/plugin.json +13 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/.mcp.json +8 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/LICENSE +661 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/agents/mechanical-reviewer.md +33 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/skills/export/SKILL.md +24 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/skills/interview/SKILL.md +22 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/skills/review/SKILL.md +19 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/skills/stepscribe/SKILL.md +70 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/skills/stepscribe/references/interview_guide.md +42 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/skills/stepscribe/references/pack_format.md +39 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/skills/stepscribe/references/review_checklist.md +65 -0
- stepscribe_cad-0.1.0/plugins/stepscribe/skills/stepscribe/scripts/check_env.py +56 -0
- stepscribe_cad-0.1.0/pyproject.toml +66 -0
- stepscribe_cad-0.1.0/schema/report.schema.json +3518 -0
- stepscribe_cad-0.1.0/scripts/batch_eval.py +85 -0
- stepscribe_cad-0.1.0/scripts/check_release.py +118 -0
- stepscribe_cad-0.1.0/scripts/eval_understanding.py +63 -0
- stepscribe_cad-0.1.0/scripts/introspect.py +26 -0
- stepscribe_cad-0.1.0/scripts/list_images.py +59 -0
- stepscribe_cad-0.1.0/scripts/sync_skills.py +91 -0
- stepscribe_cad-0.1.0/skills/stepscribe/SKILL.md +70 -0
- stepscribe_cad-0.1.0/skills/stepscribe/references/interview_guide.md +42 -0
- stepscribe_cad-0.1.0/skills/stepscribe/references/pack_format.md +39 -0
- stepscribe_cad-0.1.0/skills/stepscribe/references/review_checklist.md +65 -0
- stepscribe_cad-0.1.0/skills/stepscribe/scripts/check_env.py +56 -0
- stepscribe_cad-0.1.0/stepscribe/__init__.py +28 -0
- stepscribe_cad-0.1.0/stepscribe/analysis.py +247 -0
- stepscribe_cad-0.1.0/stepscribe/api.py +252 -0
- stepscribe_cad-0.1.0/stepscribe/assembly/__init__.py +99 -0
- stepscribe_cad-0.1.0/stepscribe/assembly/bom.py +28 -0
- stepscribe_cad-0.1.0/stepscribe/assembly/contacts.py +380 -0
- stepscribe_cad-0.1.0/stepscribe/assembly/interference.py +48 -0
- stepscribe_cad-0.1.0/stepscribe/assembly/joints.py +229 -0
- stepscribe_cad-0.1.0/stepscribe/assembly/relations.py +288 -0
- stepscribe_cad-0.1.0/stepscribe/assembly/spatial.py +170 -0
- stepscribe_cad-0.1.0/stepscribe/assembly/tree.py +176 -0
- stepscribe_cad-0.1.0/stepscribe/batch.py +233 -0
- stepscribe_cad-0.1.0/stepscribe/cli.py +713 -0
- stepscribe_cad-0.1.0/stepscribe/config.py +93 -0
- stepscribe_cad-0.1.0/stepscribe/describe/__init__.py +2 -0
- stepscribe_cad-0.1.0/stepscribe/describe/assembly_describer.py +152 -0
- stepscribe_cad-0.1.0/stepscribe/describe/budget.py +100 -0
- stepscribe_cad-0.1.0/stepscribe/describe/part_describer.py +237 -0
- stepscribe_cad-0.1.0/stepscribe/describe/phrases.py +45 -0
- stepscribe_cad-0.1.0/stepscribe/describe/reconstruct.py +394 -0
- stepscribe_cad-0.1.0/stepscribe/exporter.py +496 -0
- stepscribe_cad-0.1.0/stepscribe/exporter_text.py +457 -0
- stepscribe_cad-0.1.0/stepscribe/features/__init__.py +2 -0
- stepscribe_cad-0.1.0/stepscribe/features/bosses.py +99 -0
- stepscribe_cad-0.1.0/stepscribe/features/cutout_geometry.py +376 -0
- stepscribe_cad-0.1.0/stepscribe/features/cutouts.py +777 -0
- stepscribe_cad-0.1.0/stepscribe/features/fillets_chamfers.py +184 -0
- stepscribe_cad-0.1.0/stepscribe/features/hole_standards.py +135 -0
- stepscribe_cad-0.1.0/stepscribe/features/holes.py +542 -0
- stepscribe_cad-0.1.0/stepscribe/features/patterns.py +227 -0
- stepscribe_cad-0.1.0/stepscribe/features/shape_class.py +429 -0
- stepscribe_cad-0.1.0/stepscribe/features/slots_pockets.py +232 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/__init__.py +2 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/occ_utils.py +211 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/part_geom.py +57 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/pointdist.py +113 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/properties.py +106 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/raycast.py +60 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/section_report.py +120 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/sections.py +42 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/surfaces.py +80 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/thickness.py +69 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/topology.py +102 -0
- stepscribe_cad-0.1.0/stepscribe/geometry/validity.py +18 -0
- stepscribe_cad-0.1.0/stepscribe/headless.py +34 -0
- stepscribe_cad-0.1.0/stepscribe/io/__init__.py +2 -0
- stepscribe_cad-0.1.0/stepscribe/io/discovery.py +22 -0
- stepscribe_cad-0.1.0/stepscribe/io/report_writer.py +43 -0
- stepscribe_cad-0.1.0/stepscribe/io/step_reader.py +262 -0
- stepscribe_cad-0.1.0/stepscribe/jobs.py +156 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/bearings.yaml +45 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/belts.yaml +11 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/boards.yaml +17 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/extrusions.yaml +28 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/gears.yaml +14 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/lead_screws.yaml +10 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/motors.yaml +31 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/process_rules.yaml +101 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/roles.yaml +151 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/screws_iso_metric.yaml +27 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/screws_unified.yaml +15 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/shafts.yaml +16 -0
- stepscribe_cad-0.1.0/stepscribe/knowledge/weak_spot_rules.yaml +57 -0
- stepscribe_cad-0.1.0/stepscribe/llm/__init__.py +2 -0
- stepscribe_cad-0.1.0/stepscribe/llm/adapter.py +122 -0
- stepscribe_cad-0.1.0/stepscribe/llm/evaluate.py +121 -0
- stepscribe_cad-0.1.0/stepscribe/mcp/__init__.py +2 -0
- stepscribe_cad-0.1.0/stepscribe/mcp/server.py +153 -0
- stepscribe_cad-0.1.0/stepscribe/mcp/tools.py +558 -0
- stepscribe_cad-0.1.0/stepscribe/models/__init__.py +2 -0
- stepscribe_cad-0.1.0/stepscribe/models/schema.py +655 -0
- stepscribe_cad-0.1.0/stepscribe/pack/__init__.py +2 -0
- stepscribe_cad-0.1.0/stepscribe/pack/design_context.py +133 -0
- stepscribe_cad-0.1.0/stepscribe/pack/templates/00_READ_ME_FIRST.md.j2 +19 -0
- stepscribe_cad-0.1.0/stepscribe/pack/templates/01_overview.md.j2 +52 -0
- stepscribe_cad-0.1.0/stepscribe/pack/templates/02_assembly.md.j2 +65 -0
- stepscribe_cad-0.1.0/stepscribe/pack/templates/04_design_context.md.j2 +28 -0
- stepscribe_cad-0.1.0/stepscribe/pack/templates/context_header.md.j2 +14 -0
- stepscribe_cad-0.1.0/stepscribe/pack/templates/part.md.j2 +118 -0
- stepscribe_cad-0.1.0/stepscribe/pack/writer.py +280 -0
- stepscribe_cad-0.1.0/stepscribe/procutil.py +20 -0
- stepscribe_cad-0.1.0/stepscribe/progress.py +154 -0
- stepscribe_cad-0.1.0/stepscribe/render/__init__.py +466 -0
- stepscribe_cad-0.1.0/stepscribe/render/dimensions.py +151 -0
- stepscribe_cad-0.1.0/stepscribe/render/features.py +411 -0
- stepscribe_cad-0.1.0/stepscribe/render/kinematics_view.py +108 -0
- stepscribe_cad-0.1.0/stepscribe/render/overlay.py +183 -0
- stepscribe_cad-0.1.0/stepscribe/render/raster.py +221 -0
- stepscribe_cad-0.1.0/stepscribe/render/scene.py +162 -0
- stepscribe_cad-0.1.0/stepscribe/render/tessellate.py +87 -0
- stepscribe_cad-0.1.0/stepscribe/semantics/__init__.py +56 -0
- stepscribe_cad-0.1.0/stepscribe/semantics/bearings.py +93 -0
- stepscribe_cad-0.1.0/stepscribe/semantics/extrusions.py +91 -0
- stepscribe_cad-0.1.0/stepscribe/semantics/hardware.py +239 -0
- stepscribe_cad-0.1.0/stepscribe/semantics/matcher.py +43 -0
- stepscribe_cad-0.1.0/stepscribe/semantics/mounts.py +178 -0
- stepscribe_cad-0.1.0/stepscribe/semantics/shafts.py +135 -0
- stepscribe_cad-0.1.0/stepscribe/ui/__init__.py +2 -0
- stepscribe_cad-0.1.0/stepscribe/ui/index.html +460 -0
- stepscribe_cad-0.1.0/stepscribe/ui/interview_view.py +99 -0
- stepscribe_cad-0.1.0/stepscribe/ui/server.py +395 -0
- stepscribe_cad-0.1.0/stepscribe/ui/worker.py +304 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/__init__.py +318 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/aag.py +333 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/answers.py +250 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/describe.py +238 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/evaluate.py +168 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/function.py +781 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/interview.py +126 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/kinematics.py +1199 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/load_path.py +218 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/mechanisms.py +617 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/ml_roles.py +48 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/motion_check.py +181 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/process.py +434 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/questions.py +357 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/session.py +288 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/stability.py +251 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/structural.py +589 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/symmetry.py +215 -0
- stepscribe_cad-0.1.0/stepscribe/understanding/weak_spots.py +648 -0
- stepscribe_cad-0.1.0/tests/conftest.py +108 -0
- stepscribe_cad-0.1.0/tests/fixtures/assembly_fixtures.py +140 -0
- stepscribe_cad-0.1.0/tests/fixtures/cutout_fixtures.py +124 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/fixtures.json +31 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/roles/arm_with_belt.json +32 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/roles/direct_drive_joint.json +13 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/roles/four_bar_linkage.json +19 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/roles/leadscrew_axis.json +19 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/roles/linear_slide.json +16 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/roles/mini_mobile_manipulator.json +41 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/roles/mini_mobile_manipulator_generic.json +41 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/roles/two_link_arm.json +23 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/roles/two_link_arm_generic.json +23 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/roles/wheeled_base.json +14 -0
- stepscribe_cad-0.1.0/tests/fixtures/expected/roles/wheeled_base_generic.json +14 -0
- stepscribe_cad-0.1.0/tests/fixtures/generate_fixtures.py +259 -0
- stepscribe_cad-0.1.0/tests/fixtures/understanding/assembly_fixtures_u.py +202 -0
- stepscribe_cad-0.1.0/tests/fixtures/understanding/mechanism_fixtures.py +353 -0
- stepscribe_cad-0.1.0/tests/fixtures/understanding/part_fixtures.py +186 -0
- stepscribe_cad-0.1.0/tests/fixtures/understanding/risk_fixtures.py +100 -0
- stepscribe_cad-0.1.0/tests/golden/mini_mobile_manipulator.summary.txt +1 -0
- stepscribe_cad-0.1.0/tests/golden/plate_4xM3.PRT001.md +55 -0
- stepscribe_cad-0.1.0/tests/golden/plate_4xM3.report.json +890 -0
- stepscribe_cad-0.1.0/tests/golden/two_plates_assembly_FULL.md +357 -0
- stepscribe_cad-0.1.0/tests/real_labels/example.yaml +15 -0
- stepscribe_cad-0.1.0/tests/real_labels/small_robot_arm_tot1.yaml +6 -0
- stepscribe_cad-0.1.0/tests/real_labels/so_arm100.yaml +38 -0
- stepscribe_cad-0.1.0/tests/test_answers_cli.py +112 -0
- stepscribe_cad-0.1.0/tests/test_assembly.py +207 -0
- stepscribe_cad-0.1.0/tests/test_cutouts.py +168 -0
- stepscribe_cad-0.1.0/tests/test_export.py +216 -0
- stepscribe_cad-0.1.0/tests/test_fixtures_expected.py +118 -0
- stepscribe_cad-0.1.0/tests/test_holes.py +111 -0
- stepscribe_cad-0.1.0/tests/test_license.py +95 -0
- stepscribe_cad-0.1.0/tests/test_llm.py +128 -0
- stepscribe_cad-0.1.0/tests/test_mcp.py +188 -0
- stepscribe_cad-0.1.0/tests/test_no_clipping.py +42 -0
- stepscribe_cad-0.1.0/tests/test_pack.py +145 -0
- stepscribe_cad-0.1.0/tests/test_phase0.py +82 -0
- stepscribe_cad-0.1.0/tests/test_plugin.py +304 -0
- stepscribe_cad-0.1.0/tests/test_procutil.py +27 -0
- stepscribe_cad-0.1.0/tests/test_readme_release.py +99 -0
- stepscribe_cad-0.1.0/tests/test_render.py +190 -0
- stepscribe_cad-0.1.0/tests/test_semantics.py +107 -0
- stepscribe_cad-0.1.0/tests/test_ui.py +131 -0
- stepscribe_cad-0.1.0/tests/test_understanding_function.py +132 -0
- stepscribe_cad-0.1.0/tests/test_understanding_interview.py +222 -0
- stepscribe_cad-0.1.0/tests/test_understanding_kinematics.py +89 -0
- stepscribe_cad-0.1.0/tests/test_understanding_mechanisms.py +101 -0
- stepscribe_cad-0.1.0/tests/test_understanding_pack.py +175 -0
- stepscribe_cad-0.1.0/tests/test_understanding_risks.py +125 -0
- stepscribe_cad-0.1.0/tests/test_understanding_structure.py +79 -0
- 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,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
|
+
# 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).
|