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 74 file(s)
9 files changed
+125−18
BRIDGE_VERSION+1−1@@ -1 +1 @@-1.9.240+1.9.241
adom-bridge-fusion-manifest.json+4−4@@ -1,10 +1,10 @@ { "manifest_version": 1, "name": "fusion360",- "version": "1.9.240",- "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.240/adom-bridge-fusion-v1.9.240.zip",- "sha256": "aaec55a3c9829398d08dd78d13026ac0908c1a284e5bec77f60b46441275dde4",- "size": 539349,+ "version": "1.9.241",+ "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.241/adom-bridge-fusion-v1.9.241.zip",+ "sha256": "621a31601afae9206e64f09cddd6aeabaded0903125f0e68376ce461c994cb0e",+ "size": 539350, "verbPrefixes": [ "fusion_" ],
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "fusion360", "displayName": "Autodesk Fusion 360",- "version": "1.9.240",+ "version": "1.9.241", "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.",
dashboard/Cargo.lock+1−1@@ -4,7 +4,7 @@ version = 4 [[package]] name = "fusion-dashboard"-version = "1.9.240"+version = "1.9.241" dependencies = [ "serde_json", ]
dashboard/Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "fusion-dashboard"-version = "1.9.240"+version = "1.9.241" 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.240"+DASH_VERSION="1.9.241" 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+1−1@@ -1,6 +1,6 @@ { "slug": "fusion-bridge",- "version": "1.9.240",+ "version": "1.9.241", "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": {
page.json+11−8@@ -1,6 +1,6 @@ { "slug": "fusion-bridge",- "version": "1.9.240",+ "version": "1.9.241", "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]"- }-}+ ]+}
skills/fusion-ralph-test-via-wiki/SKILL.mdadded+104@@ -0,0 +1,104 @@+---+name: fusion-ralph-test-via-wiki+description: >+ How the fusion bridge tests ITSELF the way a real user drives it: open a wiki component+ page in a browser you own, press Connect and Create Fusion Library, and watch every+ fusion_* verb the page sends while a live feed shows what Fusion is actually doing. The+ end-to-end ralph loop, plus the traps that cost an afternoon (synthetic clicks the widget+ ignores, a hidden pre-connect status node, two racing chains, a restart nobody could see).+ Read before claiming any bridge change works, and after any change to the import lane.+ Trigger words - ralph test fusion, test the wiki export, quick connect, create fusion+ library button, watch the wiki drive fusion, webcontrol.js, wc-connect, fusion_live_feed,+ end to end test, did the import actually work.+discovery_triggers:+ - "ralph test fusion"+ - "test the wiki fusion export"+ - "fusion_live_feed"+ - "watch fusion during import"+---++# Ralph-testing the bridge through the wiki (the way users actually use it)++**Why this exists.** On 2026-08-28 the bridge passed every stubbed test and every direct-verb+test, then a real press of the wiki's Create Fusion Library button restarted Fusion under the+user after he had pressed "I'll handle it", showed him "launching Fusion" over a Fusion that+was plainly open, and left four Untitled tabs behind - and no screenshot ever showed him any+of it. *"verified by driving the verb"* and *"verified by watching the feature"* are+different tests. Only the second proves anything to a user. This is the second.++## The loop++```+1. fusion_live_feed {action:start, channel:fusion-live} <- SEE Fusion before touching it+2. pup_open_window {sessionId, url: wiki.adom.inc/<owner>/<part>} (your own window)+3. tap the page's fetch (below) so every verb it sends is recorded+4. toggle the lane to Fusion; press Connect; confirm wc-status says "Connected"+5. press Create Fusion Library+6. watch THREE witnesses: the page's verb log, fusion_prove_result, and the live feed+7. read the terminal state, the partMetadata, and the proof frames+8. fusion_close_all_documents {closeUntitled:true, force:true}; pup_close_window+```++Step 1 is not optional. The whole failure above was invisible because nothing looked.++## Tap the page so you can see what it sends++The page drives the bridge through `POST /command`. Record every call:++```js+window.__wcnet=[];const of=window.fetch;window.fetch=async function(u,o){+ const t=Date.now();let body="";try{body=(o&&o.body)?String(o.body).slice(0,260):""}catch{}+ let r;try{r=await of.apply(this,arguments);window.__wcnet.push({t,u:String(u),m:(o&&o.method)||"GET",body,st:r.status});return r}+ catch(e){window.__wcnet.push({t,u:String(u),m:(o&&o.method)||"GET",body,err:String(e)});throw e}}+```++Then `JSON.stringify(window.__wcnet.filter(x=>/\/command/.test(x.u)).map(x=>JSON.parse(x.body).verb))`+gives you the verb sequence. Yesterday's real sequence for one press:+`fusion_create_library` -> `fusion_prove_result` (polled). That is the contract the wiki+actually uses; anything the bridge changes in it must be checked here.++## The traps (each cost real time)++**`pup_click` does not reach the widget.** The Connect and Create buttons use delegated+handlers; pup's synthetic click never fired them, so "pressed" changed nothing. Dispatch a+real DOM event instead:+`[...document.querySelectorAll("button")].find(b=>b.innerText.trim()==="Create Fusion Library").click()`++**The visible status text lies.** `.wc-status` has a hidden pre-connect node ("Press a button+to connect...") that is still in the DOM after connecting. Read the VISIBLE one, or read+`.wc-dot.is-up` and `localStorage.adomWebControlConnected`. The page was connected for ten+minutes while the text said it was not.++**The lane toggle is per-page state.** `localStorage.adomWebControlEda` is `kicad` or+`fusion`; Connect routes to whichever is set. Set it before pressing anything:+`[...document.querySelectorAll(".wc-eda-btn")].find(b=>b.innerText.trim()==="Fusion").click()`++**Two presses = two chains.** Before 1.9.239 a second Create started a second import that+raced the first for one Fusion. Now it attaches to the running `runId`. If you see two runIds+in the poll log, you are on an old bridge.++**"launching Fusion" over an open Fusion.** Before 1.9.239 the chain named its first stage+"launching" whether it launched or merely restarted a Fusion whose add-in had gone silent.+The stage now says which; `stageReason` is `fusion_not_running` or `addin_not_answering`.++**A bridge install re-syncs the add-in under a running Fusion.** That is what silenced the+add-in in the first place. After `bridge_install`, expect `ready:false` until Fusion is+restarted - and the user owns that restart if they said so.++## Reading the three kinds of frame++`fusion_live_feed` publishes to shotlog as `[main #n]` (the window each tick - the video)+and `[popup #n.m]` (each owned dialog/panel over it, tied to its tick - Fusion draws these as+separate windows a main capture omits). The chain's evidence frames are `kind:proof` with a+step label. A Browser panel, the main frame, and a proof shot are three different things; a+viewer must never have to guess. The wiki may not render the feed; the bridge owns it anyway.++## Dev checklist before saying "it works"++- [ ] Ran the loop above on a real box, not a stub, and read the frames.+- [ ] The verb sequence the page sent matches the documented lane.+- [ ] `fusion_prove_result` reached `done` with `verdict: proven` and `partsProven == partsTotal`.+- [ ] `partMetadata` reported the part-number state (it never blocks, it must still show).+- [ ] No Untitled documents left behind (`fusion_get_app_state` shows `[]`).+- [ ] Nothing restarted Fusion without the user's consent (ledger has no unexplained restart).+- [ ] Closed your own pup window; never touched the user's.