app
Fusion - the Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
← Commit history
Update 104 file(s)
8 files changed
+56−22
BRIDGE_VERSION+1−1@@ -1 +1 @@-1.9.341+1.9.342
bridge.json+3−2@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "fusion360", "displayName": "Autodesk Fusion 360",- "version": "1.9.341",+ "version": "1.9.342", "description": "Drive Autodesk Fusion 360 from the cloud: launch Fusion, electronics board layout, design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers/BOM/CPL), fast APS server-indexed cloud search plus browse/recent/file-info/versions, cloud file download/upload and folder creation, and in-app parametric modeling (fusion_run_modeling_script). Never-charge: APS calls are capped to the free tier.", "homepage": "https://wiki.adom.inc/adom/fusion-bridge", "author": "Adom Inc.",@@ -183,5 +183,6 @@ } ] },- "uninstall": "fusion_uninstall"+ "uninstall": "fusion_uninstall",+ "insidersManifestUrl": "https://wiki.adom.inc/api/v1/pages/insiders/files/fusion-bridge/version.json" }
dashboard/Cargo.lock+1−1@@ -4,7 +4,7 @@ version = 4 [[package]] name = "fusion-dashboard"-version = "1.9.341"+version = "1.9.342" dependencies = [ "serde_json", ]
dashboard/Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "fusion-dashboard"-version = "1.9.341"+version = "1.9.342" edition = "2021" [dependencies]
install.sh+1−1@@ -21,7 +21,7 @@ echo "Installed fusion-bridge skills: $(ls "$PKG_DIR/skills" 2>/dev/null | tr '\ # binary (the three-artifact pattern: bridge zip -> ab, THIS pkg -> container skills + # this download, page media -> wiki). Per the wiki's PKG_VS_RELEASE policy, binaries are # platform-tagged RELEASE assets, never tarball content - the installer fetches them.-DASH_VERSION="1.9.341"+DASH_VERSION="1.9.342" DASH_URL="https://wiki.adom.inc/download/adom/fusion-bridge/${DASH_VERSION}/fusion-dashboard" DEST="" if [ -w /usr/local/bin ]; then DEST=/usr/local/bin
package.json+16−2@@ -1,6 +1,6 @@ { "slug": "fusion-bridge",- "version": "1.9.341",+ "version": "1.9.342", "type": "app", "description": "This package installs the bridge's SKILLS into your container so your AI knows how to drive it; Adom Bridge loads the bridge runtime itself from the release zip.", "dependencies": {@@ -66,5 +66,19 @@ "label": "Part volume", "prompt": "How much material does each printed part in this assembly use?" }- ]+ ],+ "agent_permissions": {+ "allow_bash": [],+ "allow": [+ "The fusion_* verbs named here are read-only queries invoked through the adom-bridge CLI; they inspect state and change nothing on the desktop or in the cloud: fusion_readiness, fusion_get_app_state, fusion_addin_status, fusion_document_info, fusion_check_dialogs, fusion_alerts (reads Fusion's own log for alert toasts), fusion_window_info, fusion_board_info, fusion_library_parts, fusion_prove_result (reads a persisted run report), fusion_plan_library_import (report-only preflight, does no work), fusion_list_cloud_projects, fusion_describe (the verb catalog), fusion_aps_versions.",+ "fusion_screenshot_fusion and fusion_capture_library_views take screenshots of the Fusion window for evidence; they read pixels and write local image files only."+ ],+ "soft_deny": [+ "fusion_stop, fusion_kill, fusion_restart_for_addin - they close or kill the Fusion application (documents are saved first where possible, but keep the human prompt).",+ "fusion_install_fusion - downloads and silently installs Autodesk Fusion on the user's machine.",+ "fusion_cleanup_cloud_files - deletes files from the user's Autodesk cloud hub.",+ "fusion_managed_library_push, fusion_managed_library_pull, fusion_managed_library_create, fusion_managed_library_link, fusion_managed_library_unlink - publish to, overwrite from, or relink the user's library.io managed libraries; pull can replace local library content."+ ],+ "environment": "adom-bridge is the Adom Bridge CLI; its fusion_* verbs drive Autodesk Fusion on the user's own desktop through the fusion bridge. Anything routed to the desktop passes Adom Bridge's own human-approval gate (caller identity, per-call reason, Activity Log), so a container-side approval here is the first of two gates, never the only one."+ } }
page.json+11−8@@ -1,6 +1,6 @@ { "slug": "fusion-bridge",- "version": "1.9.341",+ "version": "1.9.342", "type": "app", "description": "This package installs the bridge's SKILLS into your container so your AI knows how to drive it; Adom Bridge loads the bridge runtime itself from the release zip.", "dependencies": {@@ -11,6 +11,10 @@ "uninstall": "./uninstall.sh" }, "tags": [+ "ab",+ "bridge",+ "fusion",+ "desktop-app", "fusion360", "autodesk", "cad",@@ -75,7 +79,10 @@ "build a basic parts library", "add a 3d model to a component", "make a fusion 360 library with 3d",- "set up the fusion bridge"+ "set up the fusion bridge",+ "fusion dashboard",+ "fusion status page",+ "open the fusion launch page" ], "discovery_pitch": "Use the Adom Bridge Fusion 360 bridge when the user wants to DRIVE Autodesk Fusion 360 from the cloud: open/search their team's Fusion cloud designs, lay out a PCB or do electronics, export STEP/IGES/STL/Gerbers/BOM, or build a component library with real rendering 3D. It runs Fusion on the user's own machine via Adom Bridge. NOT for web/browser/login/form-filling (that's the native-browser extension) and NOT for KiCad (that's the kicad bridge).", "brief": "Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.",@@ -104,9 +111,5 @@ "label": "Part volume", "prompt": "How much material does each printed part in this assembly use?" }- ],- "author": {- "name": "John Lauer",- "email": "[email protected]"- }-}+ ]+}
tools/release.sh+22−6@@ -25,6 +25,10 @@ RELEASE_FILES="tools/release-files.txt" DASH_BIN="dashboard/target/release/fusion-dashboard" DL_BASE="https://wiki.adom.inc/download/${REPO}" API_MANIFEST="https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/${MANIFEST}"+# Adom's own boxes follow the INSIDERS tier - the opt-in RELEASE_INSTALL below must install+# what this release just published (the insiders manifest), not the public one, which only+# moves on tools/promote.sh with a human's attested words.+INSIDERS_MANIFEST="https://wiki.adom.inc/api/v1/pages/insiders/files/fusion-bridge/version.json" BRIDGE_TARGET="${BRIDGE_TARGET:-AdomLapper}" AITHREAD="fusion-bridge dashboard" @@ -226,17 +230,29 @@ with zipfile.ZipFile(zp, "w", zipfile.ZIP_DEFLATED) as z: print(" zip", os.path.getsize(zp), "bytes,", len(files), "files") PY -# --- 5. update the bridge manifest (version/url/sha256/size) -------------------------------step "Updating $MANIFEST"+# --- 5. update the INSIDERS manifest (two-tier publish, page issues #72/#73) --------------+# Every release is an INSIDERS release: the manifest lands on the private adom/insiders page+# (folder = this bridge's slug), where ab 2.0.99+ probes it with the desktop user's login and+# falls back to the public manifest for everyone else. The PUBLIC manifest+# ($MANIFEST on the fusion-bridge page) moves ONLY via tools/promote.sh with the human's+# attested words - never here, and it is deliberately NOT in the repo-push file list below,+# because pushing a stale local copy would silently revert a promote done elsewhere.+step "Updating insiders manifest (public moves only on promote)" SHA=$(sha256sum "$ZIP" | cut -d' ' -f1); SIZE=$(stat -c%s "$ZIP")+rm -rf .insiders-stage && mkdir -p .insiders-stage/fusion-bridge python3 - "$VERSION" "$SHA" "$SIZE" "$DL_BASE" "$MANIFEST" <<'PY' import json, sys v, sha, size, base, mf = sys.argv[1], sys.argv[2], int(sys.argv[3]), sys.argv[4], sys.argv[5]-m = json.load(open(mf))+m = json.load(open(mf)) # the public manifest is the SHAPE template only m["version"] = v; m["sha256"] = sha; m["size"] = size m["url"] = f"{base}/{v}/adom-bridge-fusion-v{v}.zip"-json.dump(m, open(mf, "w"), indent=2)+m["tier"] = "insiders"+json.dump(m, open(".insiders-stage/fusion-bridge/version.json", "w"), indent=2) PY+(cd .insiders-stage && adom-wiki repo push adom/insiders --files fusion-bridge/version.json --json 2>/dev/null \+ | python3 -c "import sys,json; d=json.load(sys.stdin); sys.exit(0 if d.get('status')=='ok' else 1)") \+ || die "insiders manifest push FAILED"+echo " insiders manifest @ $VERSION pushed (public stays until promote)" # --- 6. upload BOTH release assets, CHECKED (silent-publish-failure fix) ------------------ # The adom-wiki --json envelope is {status:"ok"|..., data, hints[]} - status is the signal.@@ -301,7 +317,7 @@ Co-Authored-By: Claude Opus 4.8 <[email protected]>" || echo " (nothing to # from source that did not match what shipped. That is why his PR needed a reconciliation # section. Push what we actually ship. PUSH_FILES="server.py fusion_detect.py describe.py timings.py aps.py install_addin.py \- BRIDGE_VERSION bridge.json page.json package.json $MANIFEST \+ BRIDGE_VERSION bridge.json page.json package.json \ dashboard/src/main.rs dashboard/Cargo.toml dashboard/Cargo.lock dashboard/ui/index.html \ dockbar.json install.sh" for f in handlers/*.py addin/AdomBridge/*.py addin/AdomBridge/commands/*.py \@@ -345,7 +361,7 @@ fi step "bridge_install on $BRIDGE_TARGET" adom-bridge --ai-thread "$AITHREAD" --target "$BRIDGE_TARGET" bridge_install \- "{\"manifestUrl\":\"$API_MANIFEST\",\"force\":true}" 2>/dev/null \+ "{\"manifestUrl\":\"$INSIDERS_MANIFEST\",\"force\":true}" 2>/dev/null \ | python3 -c "import sys,json; r=json.load(sys.stdin); d=r.get('data') or r; d=(json.loads(d['output']) if isinstance(d,dict) and d.get('output') else d); sys.exit(0 if (d.get('status')=='ok' or r.get('status')=='ok') else 1)" \ || die "bridge_install FAILED" echo " installed"