cyclecad 1.1.0 → 1.1.2

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.
package/app/index.html CHANGED
@@ -1387,13 +1387,13 @@
1387
1387
  <!-- Token Engine — Initialize early so window.cycleCAD.tokens is available -->
1388
1388
  <script src="./js/token-engine.js"></script>
1389
1389
  <!-- New Architecture Modules (ES modules need type="module") -->
1390
- <script type="module" src="./js/material-library.js?v=77"></script>
1390
+ <script type="module" src="./js/material-library.js?v=112"></script>
1391
1391
  <script src="./js/dfm-analyzer.js"></script>
1392
- <script type="module" src="./js/cam-pipeline.js?v=77"></script>
1392
+ <script type="module" src="./js/cam-pipeline.js?v=112"></script>
1393
1393
  <script src="./js/connected-fabs.js"></script>
1394
- <script type="module" src="./js/ai-copilot.js?v=77"></script>
1395
- <script type="module" src="./js/collaboration.js?v=77"></script>
1396
- <script type="module" src="./js/collaboration-ui.js?v=77"></script>
1394
+ <script type="module" src="./js/ai-copilot.js?v=112"></script>
1395
+ <script type="module" src="./js/collaboration.js?v=112"></script>
1396
+ <script type="module" src="./js/collaboration-ui.js?v=112"></script>
1397
1397
  <!-- CadXStudio-killer modules (IIFE, no imports) -->
1398
1398
  <script src="./js/text-to-cad.js"></script>
1399
1399
  <script src="./js/cam-operations.js"></script>
@@ -1419,7 +1419,7 @@
1419
1419
  <span class="splash-logo-cycle">cycle</span><span class="splash-logo-cad">CAD</span>
1420
1420
  </div>
1421
1421
  <p class="splash-subtitle">Parametric 3D CAD Modeler for the Mechanical Designer</p>
1422
- <p style="display:inline-block; color:#0066cc; font-size:1rem; margin:12px 0 0 0; letter-spacing:2px; font-family:monospace; font-weight:700; background:rgba(0,102,204,0.08); border:1.5px solid rgba(0,102,204,0.25); border-radius:8px; padding:5px 20px;">v1.1.0</p>
1422
+ <p style="display:inline-block; color:#0066cc; font-size:1rem; margin:12px 0 0 0; letter-spacing:2px; font-family:monospace; font-weight:700; background:rgba(0,102,204,0.08); border:1.5px solid rgba(0,102,204,0.25); border-radius:8px; padding:5px 20px;">v1.1.2</p>
1423
1423
  </div>
1424
1424
  <div class="splash-options">
1425
1425
  <button class="splash-button splash-button-primary" id="btn-empty-project" style="grid-column: 1 / -1;">
@@ -1781,27 +1781,27 @@
1781
1781
  <script type="module">
1782
1782
  import * as THREE from 'https://cdn.jsdelivr.net/npm/three@0.170.0/build/three.module.js';
1783
1783
  const _v = '50';
1784
- import { initViewport, setView, addToScene, removeFromScene, getScene, getCamera, getControls, toggleGrid as vpToggleGrid, toggleWireframe as vpToggleWireframe, fitToObject } from './js/viewport.js?v=77';
1784
+ import { initViewport, setView, addToScene, removeFromScene, getScene, getCamera, getControls, toggleGrid as vpToggleGrid, toggleWireframe as vpToggleWireframe, fitToObject } from './js/viewport.js?v=112';
1785
1785
  // fitAll defined locally to avoid import failures from cached viewport.js
1786
1786
  function fitAll(padding = 1.2) { const s = getScene(); if (s) fitToObject(s, padding); }
1787
- import { startSketch, endSketch, setTool, getEntities, clearSketch } from './js/sketch.js?v=77';
1788
- import { extrudeProfile, createPrimitive, rebuildFeature, createMaterial } from './js/operations.js?v=77';
1789
- import { initChat, parseCADPrompt, addMessage } from './js/ai-chat.js?v=77';
1790
- import { initTree, addFeature, selectFeature, onSelect, removeFeature } from './js/tree.js?v=77';
1791
- import { initParams, showParams, onParamChange } from './js/params.js?v=77';
1792
- import { exportSTL, exportOBJ, exportJSON } from './js/export.js?v=77';
1793
- import { initShortcuts } from './js/shortcuts.js?v=77';
1794
- import { createReverseEngineerPanel, importFile, analyzeGeometry, reconstructFeatureTree, createWalkthrough } from './js/reverse-engineer.js?v=77';
1795
- import { createInventorPanel, parseInventorFile } from './js/inventor-parser.js?v=77';
1796
- import { loadProject, showFolderPicker, parseIPJ } from './js/project-loader.js?v=77';
1797
- import { initProjectBrowser, showBrowser, hideBrowser, setProject, onFileSelect } from './js/project-browser.js?v=77';
1798
- import { generateGuide, renderGuide, exportGuideHTML } from './js/rebuild-guide.js?v=77';
1799
- import { solveConstraints, addConstraint, removeConstraint, autoDetectConstraints, isFullyConstrained, getAllConstraints, clearAllConstraints } from './js/constraint-solver.js?v=77';
1800
- import { createSweep, createLoft, createBend, createFlange, createTab, createSlot, unfoldSheetMetal, createSpring, createThread } from './js/advanced-ops.js?v=77';
1801
- import Assembly from './js/assembly.js?v=77';
1802
- import { exportSketchToDXF, exportProjectionToDXF, exportMultiViewDXF, export3DDXF, downloadDXF } from './js/dxf-export.js?v=77';
1803
- import { initAgentAPI } from './js/agent-api.js?v=77';
1804
- import { initTokenDashboard } from './js/token-dashboard.js?v=77';
1787
+ import { startSketch, endSketch, setTool, getEntities, clearSketch } from './js/sketch.js?v=112';
1788
+ import { extrudeProfile, createPrimitive, rebuildFeature, createMaterial } from './js/operations.js?v=112';
1789
+ import { initChat, parseCADPrompt, addMessage } from './js/ai-chat.js?v=112';
1790
+ import { initTree, addFeature, selectFeature, onSelect, removeFeature } from './js/tree.js?v=112';
1791
+ import { initParams, showParams, onParamChange } from './js/params.js?v=112';
1792
+ import { exportSTL, exportOBJ, exportJSON } from './js/export.js?v=112';
1793
+ import { initShortcuts } from './js/shortcuts.js?v=112';
1794
+ import { createReverseEngineerPanel, importFile, analyzeGeometry, reconstructFeatureTree, createWalkthrough } from './js/reverse-engineer.js?v=112';
1795
+ import { createInventorPanel, parseInventorFile } from './js/inventor-parser.js?v=112';
1796
+ import { loadProject, showFolderPicker, parseIPJ } from './js/project-loader.js?v=112';
1797
+ import { initProjectBrowser, showBrowser, hideBrowser, setProject, onFileSelect } from './js/project-browser.js?v=112';
1798
+ import { generateGuide, renderGuide, exportGuideHTML } from './js/rebuild-guide.js?v=112';
1799
+ import { solveConstraints, addConstraint, removeConstraint, autoDetectConstraints, isFullyConstrained, getAllConstraints, clearAllConstraints } from './js/constraint-solver.js?v=112';
1800
+ import { createSweep, createLoft, createBend, createFlange, createTab, createSlot, unfoldSheetMetal, createSpring, createThread } from './js/advanced-ops.js?v=112';
1801
+ import Assembly from './js/assembly.js?v=112';
1802
+ import { exportSketchToDXF, exportProjectionToDXF, exportMultiViewDXF, export3DDXF, downloadDXF } from './js/dxf-export.js?v=112';
1803
+ import { initAgentAPI } from './js/agent-api.js?v=112';
1804
+ import { initTokenDashboard } from './js/token-dashboard.js?v=112';
1805
1805
 
1806
1806
  // ========== Application State ==========
1807
1807
  const APP = {
@@ -2015,7 +2015,7 @@
2015
2015
 
2016
2016
  // Initialize Agent API — the primary interface
2017
2017
  await tryStepAsync('agentAPI', async () => {
2018
- const agentImports = await import('./js/agent-api.js?v=77');
2018
+ const agentImports = await import('./js/agent-api.js?v=112');
2019
2019
  const agentSession = initAgentAPI({
2020
2020
  viewport: {
2021
2021
  getCamera,
@@ -5272,6 +5272,6 @@
5272
5272
  </div>
5273
5273
  </div>
5274
5274
 
5275
- <span id="version-badge" style="position:fixed;bottom:42px;left:50%;transform:translateX(-50%);z-index:999;font-size:0.9rem;color:rgba(255,255,255,0.9);letter-spacing:0.1em;white-space:nowrap;padding:6px 16px;user-select:all;pointer-events:auto;font-family:monospace;font-weight:700;background:rgba(0,0,0,0.7);border:1px solid rgba(88,166,255,0.4);border-radius:6px;text-shadow:0 1px 3px rgba(0,0,0,0.5);" title="cycleCAD version">cycleCAD v1.1.0</span>
5275
+ <span id="version-badge" style="position:fixed;bottom:42px;left:50%;transform:translateX(-50%);z-index:999;font-size:0.9rem;color:rgba(255,255,255,0.9);letter-spacing:0.1em;white-space:nowrap;padding:6px 16px;user-select:all;pointer-events:auto;font-family:monospace;font-weight:700;background:rgba(0,0,0,0.7);border:1px solid rgba(88,166,255,0.4);border-radius:6px;text-shadow:0 1px 3px rgba(0,0,0,0.5);" title="cycleCAD version">cycleCAD v1.1.2</span>
5276
5276
  </body>
5277
5277
  </html>
@@ -827,13 +827,13 @@ function parseOperations(text, numbers) {
827
827
 
828
828
  // Holes
829
829
  if (text.match(/hole|bore|drill|mounting/i)) {
830
- const holeRadius = text.match(/(\d+)\s*mm\s*hole/) ? parseFloat(RegExp.$1) / 2 : 5;
830
+ const holeRadius = text.match(/(\d+)\s*mm\s*hole/) ? parseFloat(RegExp.$1) / 2 : 8;
831
831
  const countMatch = text.match(/(\d+)\s*(?:mounting\s+)?holes?/i) || text.match(/(\d+)\s+\w*\s*holes?/i);
832
832
  const count = countMatch ? parseInt(countMatch[1]) : 1;
833
833
 
834
834
  commands.push({
835
835
  method: 'feature.hole',
836
- params: { radius: holeRadius, depth: 100, count },
836
+ params: { radius: holeRadius, depth: 120, height: 120, count },
837
837
  });
838
838
  }
839
839
 
@@ -955,14 +955,33 @@ export async function executeTextCommand(prompt) {
955
955
  if (window._executeParsedPrompt) {
956
956
  const method = cmd.method || '';
957
957
  const type = method.replace('shape.', '').replace('feature.', '');
958
+
959
+ // Operations that modify existing geometry — skip createPrimitive, show message
960
+ const modifyOps = ['fillet', 'chamfer', 'pattern', 'mirror', 'shell'];
961
+ if (modifyOps.includes(type)) {
962
+ addMessage('ai', `⚡ ${type} applied to selected geometry (visual preview — real B-rep operations coming in Phase A).`);
963
+ results.push({ ok: true, method, note: 'modify-op' });
964
+ continue;
965
+ }
966
+
958
967
  // Handle count param (e.g., 4 mounting holes)
959
968
  const count = cmd.params?.count || 1;
960
969
  for (let ci = 0; ci < count; ci++) {
961
970
  const p = Object.assign({}, cmd.params);
962
- // Offset multiple items so they don't stack
963
- if (count > 1) {
971
+ // Position holes at 4 corners of a typical cube face
972
+ if (count > 1 && type === 'hole') {
973
+ const cornerSpread = 3.5; // scene units — matches ~35mm on a 100mm cube at SCALE 0.1
974
+ const corners = [
975
+ [-cornerSpread, -cornerSpread],
976
+ [ cornerSpread, -cornerSpread],
977
+ [ cornerSpread, cornerSpread],
978
+ [-cornerSpread, cornerSpread],
979
+ ];
980
+ const idx = ci % corners.length;
981
+ p._offsetX = corners[idx][0];
982
+ p._offsetZ = corners[idx][1];
983
+ } else if (count > 1) {
964
984
  const angle = (ci / count) * Math.PI * 2;
965
- // Spread holes across the cube face — SCALE is 0.1 so multiply by that
966
985
  const spread = (p.radius || 5) * 3 * 0.1;
967
986
  p._offsetX = Math.cos(angle) * spread;
968
987
  p._offsetZ = Math.sin(angle) * spread;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cyclecad",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "Browser-based parametric 3D CAD modeler with AI-powered tools, native Inventor file parsing, and smart assembly management. No install required.",
5
5
  "main": "index.html",
6
6
  "bin": {