← Commit history

Fusion bridge 1.12.1 reference: 77 of 182 standard verbs (was 56): set_track_width, remove_items, set_outline, board_shape, board_outline, set_layer_visibility, select_net, run_erc, autoroute and 10 app aliases; coverage regenerated

Colby Knox ·0cc91c597d ·14d ago ·parent 08025f9
4 files changed +379−91
README.md+4−4
@@ -42,12 +42,12 @@ verb by verb: [docs/coverage.md](docs/coverage.md). <!-- coverage:start (tools/generate.py writes this) --> | Tier | Verbs | Altium | KiCad | Fusion 360 | |---|---|---|---|---|-| **core** | 60 | 60 | 38 | 20 |-| **native** | 34 | 34 | 23 | 14 |+| **core** | 60 | 60 | 37 | 26 |+| **native** | 34 | 34 | 23 | 16 | | **checks** | 32 | 32 | 7 | 2 |-| **app** | 56 | 56 | 24 | 20 |+| **app** | 56 | 56 | 24 | 33 | | **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 182 | 182 | 92 | 56 |+| standard (all but platform) | 182 | 182 | 91 | 77 | <!-- coverage:end -->  The **checks** tier is where the other bridges are furthest behind, and it is the cheapest to close: those verbs are
docs/coverage.md+41−41
@@ -1,17 +1,17 @@ # Coverage: every standard verb on each bridge -Reference: Altium bridge 0.2.75. Compared: KiCad bridge 1.0.62, Fusion 360 bridge 1.12.0.+Reference: Altium bridge 0.2.75. Compared: KiCad bridge 1.0.61, Fusion 360 bridge 1.12.1. `exact` is the same job under the same or an equivalent name; `partial` does part of it or does it differently; blank is missing. Generated by `tools/generate.py` from `verbs/coverage.json`; do not edit by hand.  | Tier | Verbs | Altium | KiCad | Fusion 360 | |---|---|---|---|---|-| **core** | 60 | 60 | 38 | 20 |-| **native** | 34 | 34 | 23 | 14 |+| **core** | 60 | 60 | 37 | 26 |+| **native** | 34 | 34 | 23 | 16 | | **checks** | 32 | 32 | 7 | 2 |-| **app** | 56 | 56 | 24 | 20 |+| **app** | 56 | 56 | 24 | 33 | | **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 182 | 182 | 92 | 56 |+| standard (all but platform) | 182 | 182 | 91 | 77 |  ## core @@ -22,19 +22,19 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `add_body` | Put a 3D body on a footprint of a PcbLib: a STEP model, or an extruded box when no step is given. It REPLACES the footprint's existing 3D bodies (a... |  |  | | `add_models` | Attach one or more PCBLIB footprint models, parameters, comment and description to a SchLib component (Altium's several-footprints-per-symbol mechanism). |  |  | | `add_symbol_art` | Draw the chip-outline artwork (the chip-thumbnailer polylines adom-symbol baked into the KiCad symbol) into a SchLib component, fitted to its body... |  |  |-| `apply_silkscreen` | Land a silkscreen plan in one undo step: designators and comments moved, sized and turned (or hidden), free overlay texts and lines added (bottom texts... | `kicad_silk_fields_batch / kicad_silk_text_batch / kicad_silk_graphics_batch` |  |-| `board_outline` | Draw the board shape as tracks and arcs on a mechanical layer: the outline a fab house reads from the Gerbers. A board built by script has its shape but... | `kicad_board_outline` |  |-| `board_shape` | Redefine the CURRENT board's outline as a wMm x hMm rectangle at (x0Mm, y0Mm) by rewriting the board outline's segments. | `kicad_board_outline` |  |+| `apply_silkscreen` | Land a silkscreen plan in one undo step: designators and comments moved, sized and turned (or hidden), free overlay texts and lines added (bottom texts... | `kicad_silk_fields_batch / kicad_silk_text_batch / kicad_silk_graphics_batch` | `fusion_apply_silkscreen` |+| `board_outline` | Draw the board shape as tracks and arcs on a mechanical layer: the outline a fab house reads from the Gerbers. A board built by script has its shape but... | `kicad_board_outline` | `fusion_board_outline` |+| `board_shape` | Redefine the CURRENT board's outline as a wMm x hMm rectangle at (x0Mm, y0Mm) by rewriting the board outline's segments. | `kicad_board_outline` | `fusion_board_shape` | | `board_summary` | One-screen summary of the current board, shaped from one read_board round trip: component counts by side, nets, copper layers actually in use, rule counts. | `kicad_board_summary` | `fusion_board_summary` | | `clone_symbol` | Copy a symbol inside the current SchLib under a new name, all display modes included. |  |  | | `component_data` | Placement data for one board component, or for all of them: footprint pattern, comment, layer/side, position, rotation, size, pad count and the nets on its... | `kicad_component_data` | `fusion_component_data` | | `component_pins` | Every pad of one board component with its net, position, layer, size and hole. | `kicad_component_pins` | `fusion_component_pins` | | `copper_layers` | Every copper layer Altium can address on the current board (top, mid 1-30, planes 1-16, bottom) with names and visibility. | `kicad_copper_layers` | `fusion_copper_layers` | | `copy_footprint` | Duplicate a footprint inside the current PcbLib under a new name (every primitive replicated). |  |  |-| `create_footprint` | Create one footprint from a pad list in a PcbLib (the library is created and saved if the path does not exist) and return a proof frame. | `kicad_create_footprint` |  |-| `create_symbol` | Create one rectangular symbol from a pin list in a SchLib (the library is created and saved if the path does not exist) and return a proof frame. | `kicad_create_symbol` |  |+| `create_footprint` | Create one footprint from a pad list in a PcbLib (the library is created and saved if the path does not exist) and return a proof frame. | `kicad_fp_create` |  |+| `create_symbol` | Create one rectangular symbol from a pin list in a SchLib (the library is created and saved if the path does not exist) and return a proof frame. | `kicad_sym_create` |  | | `doc_params` | Read or set a sheet's document parameters: the title block (Title, DocumentNumber, Revision, DrawnBy, Author, CompanyName, ...). |  |  |-| `find_symbol` | Find symbols (or footprints with kind:'footprint') by part of their name across libraries: the given ones, or every installed .SchLib/.PcbLib. | `kicad_find_symbol` |  |+| `find_symbol` | Find symbols (or footprints with kind:'footprint') by part of their name across libraries: the given ones, or every installed .SchLib/.PcbLib. |  |  | | `footprint_primitives` | Geometry dump of one PLACED component: its tracks, arcs, pads (with solder and paste mask expansion in um) and texts in mils with layer ids; other primitive... | `kicad_fp_info` (partial) |  | | `layer_stack` | The CURRENT board's stack-up: copper layers in order with copper thickness and the dielectric under each (height, constant, material), and the total... | `kicad_layer_stack` | `fusion_layer_stack` | | `layers` | The current board's layer set with ids, names, kind and whether each is displayed. |  | `fusion_layers` |@@ -53,10 +53,10 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `read_board` | ONE round trip: components, nets, layers, copper, rules, occupancy, outline. | `kicad_board_summary` (partial) | `fusion_board_info / fusion_get_design_info` (partial) | | `read_rules` | Every design rule on the current board, flat, disabled ones included: name, kind ordinal, enabled, priority, both scope expressions, comment, and Altium's... | `kicad_list_design_rules` | `fusion_read_rules` | | `read_schematic` | Components on the CURRENT schematic sheet (designator, library reference, comment, position, parameters) in one agent round trip. | `kicad_sch_components` (partial) | `fusion_schematic` (partial) |-| `read_symbol` | Read a SchLib component back: description, display-mode count, the pins of mode 0 (designator, name, electrical type), every parameter with its hidden flag,... | `kicad_read_symbol` |  |+| `read_symbol` | Read a SchLib component back: description, display-mode count, the pins of mode 0 (designator, name, electrical type), every parameter with its hidden flag,... | `kicad_sym_info` |  | | `remove_footprint` | Delete one footprint from the current PcbLib. |  |  |-| `remove_items` | Delete specific free tracks and vias, given exactly as altium_routing_state returned them. One undo step. | `kicad_remove_route` (partial) |  |-| `remove_symbol` | Delete one component from the current SchLib. | `kicad_remove_symbol` |  |+| `remove_items` | Delete specific free tracks and vias, given exactly as altium_routing_state returned them. One undo step. | `kicad_remove_route` (partial) | `fusion_remove_items` |+| `remove_symbol` | Delete one component from the current SchLib. | `kicad_sym_delete` |  | | `rename_footprint` | Rename a footprint in the current PcbLib. |  |  | | `rename_symbol` | Rename a component (LibReference) in the current SchLib. |  |  | | `ripup_nets` | Delete every free track, arc and via on each named net. One undo step. |  | `fusion_ripup_nets` |@@ -66,13 +66,13 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `sch_connect` | Connect pins of placed parts: a wire stub from each pin's outer end plus a net label (kind label), a power port (kind power: GND-like nets get a ground... | `kicad_sch_wire / kicad_sch_label` (partial) |  | | `sch_edit` | Change placed parts on a sheet: move (to x,y mil), moveBy (dx,dy), rotate (degrees), rename (designator), re-comment (comment), delete. One undo step. | `kicad_sch_set_property / kicad_sch_move / kicad_sch_delete` (partial) |  | | `sch_place_part` | Place a component from a .SchLib onto an EXISTING sheet at a position, with its library parameters (MPN, Manufacturer, distributor numbers) and its... | `kicad_sch_place_symbol` |  |-| `sch_sheet_symbol` | Make a design hierarchical: a sheet symbol on the parent sheet for a child sheet, its entries joined to the parent's nets, and matching ports on the child.... | `kicad_sch_sheet_symbol` |  |+| `sch_sheet_symbol` | Make a design hierarchical: a sheet symbol on the parent sheet for a child sheet, its entries joined to the parent's nets, and matching ports on the child.... | `kicad_sch_sheet` (partial) |  | | `sch_swap_part` | Replace a placed part with another library part (a different value, package or symbol) at the same place, designator and rotation, keeping its connections:... | `kicad_sch_replace_symbol` (partial) |  | | `schematic_data` | Components on a schematic sheet (filePath, else the CURRENT sheet) with their pins (number, name, electrical type), position and orientation. designator... | `kicad_sch_components` (partial) |  | | `set_models` | Replace every footprint model on a SchLib component with ONE PCBLIB model (set_params footprint and add_models APPEND, which is how a symbol ends up with two). |  |  |-| `set_outline` | Reshape the current board's outline (a rectangle with rounded corners, or a polygon). One undo step. | `kicad_board_outline` |  |+| `set_outline` | Reshape the current board's outline (a rectangle with rounded corners, or a polygon). One undo step. | `kicad_board_outline` | `fusion_set_outline` | | `set_params` | Set parameters on a SchLib component, optionally its comment, and optionally link a footprint by name. |  |  |-| `set_track_width` | Set the width of the EXISTING tracks and arcs on nets or a net class (rules only steer new routing). Widen power nets after routing, or thin a net that... | `kicad_modify_track` (partial) |  |+| `set_track_width` | Set the width of the EXISTING tracks and arcs on nets or a net class (rules only steer new routing). Widen power nets after routing, or thin a net that... | `kicad_modify_track` (partial) | `fusion_set_track_width` | | `set_visibility` | Show or hide one named parameter on a SchLib component. |  |  | | `sheet_params` | Write parameters onto PLACED parts on the schematic sheets (the BOM write-back): MPN, Manufacturer, Mouser/DigiKey/LCSC numbers, anything. A missing... |  |  | | `silk_state` | The silkscreen as it stands: every part's body box, its designator and comment (text, location, size, rotation, shown, Altium's measured box), and the free... |  | `fusion_silk_state` |@@ -86,10 +86,10 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve  | Verb | What it does | KiCad | Fusion 360 | |---|---|---|---|-| `add_rule` | Add one SCOPED design rule that set_design_rules' board-wide values cannot express: a net's or class's clearance or width, a length limit, a matched-length... | `kicad_add_rule` |  |-| `annotate` | Number every '?' designator (R?, C?, U?) across the project's sheets: the lowest free number per prefix, top-left first on each sheet. dryRun shows the plan. | `kicad_annotate` |  |+| `add_rule` | Add one SCOPED design rule that set_design_rules' board-wide values cannot express: a net's or class's clearance or width, a length limit, a matched-length... | `kicad_custom_rules` |  |+| `annotate` | Number every '?' designator (R?, C?, U?) across the project's sheets: the lowest free number per prefix, top-left first on each sheet. dryRun shows the plan. | `kicad_sch_annotate` |  | | `apply_pours` | Add solid polygon pours from outlines and pour them, each with its own connect style (solid joints or thermal spokes), plus pour keepouts (polygon cutouts);... | `kicad_add_zone / kicad_apply_zone_plan` | `fusion_apply_pours` |-| `autoroute` | Altium's own autorouter (Situs) on the current board: picks a strategy, keeps existing routing locked by default, routes, and answers the unconnected count... | `kicad_autoroute` |  |+| `autoroute` | Altium's own autorouter (Situs) on the current board: picks a strategy, keeps existing routing locked by default, routes, and answers the unconnected count... | `kicad_autoroute` | `fusion_autoroute` | | `build_symbol_modes` | Build ONE SchLib component with N display modes (Normal + Alternate 1..N-1) from a symbol_modes spec file on this machine, and return a proof frame. |  |  | | `cleanup_libs` | Remove the factory-default stray every fresh library carries: Component_1 from the current SchLib and an empty (no pads) PCBComponent_1 from the current PcbLib. |  |  | | `compile` | Compile a project and return Altium's Messages panel (ERC + connectivity) with counts by class. With no path it compiles Altium's bundled example project. |  |  |@@ -97,29 +97,29 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `diff_pairs` | Differential pairs on the current board: list them, define one from two nets (replacing a pair of that name), or remove one. Altium's differential-pair... |  |  | | `export_bom` | Bill of materials export: altium_run_outjob with the assembly OutJob and the 'Folder Structure' medium as defaults. | `kicad_export_bom_csv` (partial) | `fusion_export_bom` | | `export_gerber` | Gerber/drill export: altium_run_outjob with the fabrication OutJob and the 'Folder Structure' medium as defaults. | `kicad_export_gerber` | `fusion_export_gerber` |-| `export_manufacturing` | A project's manufacturing set in one call: Gerbers, NC drill, pick and place (CSV, mm) and the BOM, from an OutJob the bridge writes beside the project... | `kicad_export_manufacturing` | `fusion_export_gerbers / fusion_export_cpl / fusion_export_bom` (partial) |+| `export_manufacturing` | A project's manufacturing set in one call: Gerbers, NC drill, pick and place (CSV, mm) and the BOM, from an OutJob the bridge writes beside the project... | `kicad_export_gerber / kicad_export_pos` (partial) | `fusion_export_gerbers / fusion_export_cpl / fusion_export_bom` (partial) | | `export_pdf` | Every sheet of a project as one PDF, plus on request the board's composite print, Altium's assembly drawings (top and bottom, designators on the parts) and... | `kicad_export_pdf` |  | | `export_step` | Headless STEP export of a board. Default lane 'outjob': Altium's own ExportSTEP output run from a throwaway project in %TEMP% that points at the board - no... | `kicad_export_step` | `fusion_export_step` | | `install_library` | Register a library file in Altium's Installed Libraries (IntegratedLibraryManager.InstallLibrary) so its parts appear in the Components panel. | `kicad_install_library` |  | | `install_library_bundle` | One-click install of a wiki library bundle (zip of .SchLib/.PcbLib): unpack, register, open the library, prove it with a frame. | `kicad_install_library_bundle` | `fusion_install_library_bundle` | | `list_installed_libraries` | Every library in Altium's Installed Libraries list (read-only). |  |  |-| `net_classes` | Net classes on the current board: list them with their nets, or make one (replacing a class of that name) with an optional width and clearance rule scoped... | `kicad_net_classes` | `fusion_net_classes` |+| `net_classes` | Net classes on the current board: list them with their nets, or make one (replacing a class of that name) with an optional width and clearance rule scoped... | `kicad_netclasses` | `fusion_net_classes` | | `netlist` | The compiled netlist of a project: every net with its pins (Designator.Pin) across every sheet, the hierarchy resolved; or one net; or compare with the nets... | `kicad_netlist` | `fusion_netlist` | | `panelize` | Step and repeat a board into a manufacturing panel: a new .PcbDoc holding Altium's own embedded board array of the board (rows x cols), with rails, the... |  |  | | `pcb_report` | Numbers instead of pixels: for a PcbLib, every footprint's pads, pad bounding box, primitive census and 3D bodies; for a board, outline, components with... | `kicad_errors` (partial) |  | | `pour_state` | Every polygon pour with the copper it actually poured: filled area per pour and per layer, and the pours that poured nothing. | `kicad_pour_state` | `fusion_pour_state` | | `remove_pours` | Delete polygon pours by net (and layer), or all of them, and the pour keepouts (cutouts) apply_pours made. Tracks and vias are untouched. | `kicad_remove_zone` | `fusion_remove_pours` | | `replicate_layout` | Copy one channel's placement to matching channels: each target keeps its anchor part where it is and every other part takes the source's offset and rotation... |  |  |-| `repour` | Repour every polygon on the board (Altium's Repour All) and answer the copper after. Runs outside the script engine so scoped rules apply. | `kicad_repour` | `fusion_repour` |+| `repour` | Repour every polygon on the board (Altium's Repour All) and answer the copper after. Runs outside the script engine so scoped rules apply. | `kicad_refill_zones` | `fusion_repour` | | `routing_drc` | Design-rule violations on the current board WITH locations, plus the unrouted (ratsnest) count, as one clean/not-clean answer. | `kicad_routing_validate` (partial) | `fusion_routing_drc` | | `run_drc` | Run the design rule check on a board and read the violation markers back. PCB:DesignRuleCheck opens a MODAL; the bridge clicks 'Run Design Rule Check'... | `kicad_run_drc` | `fusion_run_drc` |-| `run_erc` | Electrical rules check. Same handler as altium_compile: in Altium, compiling the project IS the ERC. | `kicad_run_erc` |  |+| `run_erc` | Electrical rules check. Same handler as altium_compile: in Altium, compiling the project IS the ERC. | `kicad_run_erc` | `fusion_run_erc` | | `set_design_rules` | Write a fab's design rules into the current board: clearance, track width, routing via style, hole size, annular ring, hole-to-hole and board-edge clearance... | `kicad_set_design_rules` | `fusion_set_design_rules` | | `silkscreen_prep` | Clean the silkscreen off the copper with Altium's own Tools > Silkscreen Preparation: silk clipped clear of every mask opening (pad) by the board's silk... |  |  | | `symbol_mode` | Show one display mode (0 = Normal, 1.. = alternates) of the CURRENT SchLib component in the editor and capture a frame. Drives the editor's own mode toggle,... |  |  | | `teardrops` | Add (or remove) teardrops with Altium's own Tools > Teardrops: on vias and through-hole pads, SMD pads, track width changes and T-junctions, for the whole... |  |  | | `uninstall_library` | Remove libraries from Altium's Installed Libraries: the inverse of install_library / install_library_bundle. Library files are never touched. | `kicad_uninstall_library` |  |-| `update_pcb` | Design > Update PCB Document from the schematic (the engineering change order): parts added, removed or renamed, nets and footprints updated on the board.... | `kicad_update_pcb` |  |+| `update_pcb` | Design > Update PCB Document from the schematic (the engineering change order): parts added, removed or renamed, nets and footprints updated on the board.... | `kicad_update_pcb_from_schematic` (partial) |  |  ## checks @@ -139,7 +139,7 @@ Engineering computed from the board model, not by the tool: one shared engine, s | `copper_balance` | How much of each copper layer is copper (tracks, pads, vias and what Altium actually poured, inside the outline; a plane counts full), and how far apart... |  |  | | `cross_check` | Compare one schematic sheet's designators with a board's. Altium holds ONE current document, so the verb activates the board, reads it, then activates the... | `kicad_analyze_connections` (partial) |  | | `current_capacity` | Will this trace carry the current? For each power net and its current: the narrowest track on every layer it is routed on against the width IPC-2221 needs... |  |  |-| `fab_check` | Before ordering: the board's fab-relevant minimums measured from the live board (narrowest track, smallest via drill, diameter and annular ring, smallest... | `kicad_fab_check` |  |+| `fab_check` | Before ordering: the board's fab-relevant minimums measured from the live board (narrowest track, smallest via drill, diameter and annular ring, smallest... | `kicad_validate_for_fab` |  | | `find_space` | Free spots on the board for a part near another (clear of every other part on that side, of that side's tracks and vias, and inside the outline), nearest... |  |  | | `footprint_from_land_pattern` | Build a complete footprint from the land pattern a datasheet prints: pads numbered the standard way (chip, dual SOIC/TSSOP/DFN, SOT, quad QFP/QFN, BGA), an... |  |  | | `height_check` | Will it fit the enclosure? Each part's height from its 3D bodies (top and bottom side), the parts over a height limit board-wide or under a lid feature in a... |  |  |@@ -153,7 +153,7 @@ Engineering computed from the board model, not by the tool: one shared engine, s | `read_sheet_file` | Read a schematic sheet straight from its .SchDoc file, without Altium (it need not be installed or running): every part with its designator, library... |  | `fusion_read_sheet_file` | | `return_path` | Where signal tracks lose their reference: for every signal net, the length of track on each layer that runs over no pour or plane copper on either... |  |  | | `review_board` | Design-review checks (14) over one board read; schematic checks with includeSchematic. | `kicad_lint_board` (partial) |  |-| `route_pair` | Route a differential pair as a pair: one centreline from the source pads' midpoint through waypoints to the destination pads' midpoint, each net offset to... | `kicad_route_pair` |  |+| `route_pair` | Route a differential pair as a pair: one centreline from the source pads' midpoint through waypoints to the destination pads' midpoint, each net offset to... | `kicad_route_diff_pair` |  | | `schematic_review` | Review the schematic before Update PCB: every placed pin (read from the sheet files, with its electrical type) against Altium's compiled netlist. Errors:... | `kicad_sch_check / kicad_design_review / kicad_lint_schematic` (partial) |  | | `silk_designators` | Place every reference designator the way assembly houses want: one size, upright, beside its own part, clear of every pad (JLCPCB: 0.15 mm), every other... |  |  | | `test_board` | Place one footprint, or a ';' list, from the open PcbLib on ONE board: a NEW board (wMm x hMm outline) when pcbPath is new or omitted, APPENDED to the... |  |  |@@ -172,14 +172,14 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `agent_status` | Is the agent loop alive and responsive, in which workspace, and is any loop resident anywhere? Read-only; never starts the agent. |  |  | | `agent_stop` | Stop the selected instance's resident agent loop (drops a stop file and waits up to 12 s for the heartbeat to go stale). |  |  | | `animate_view` | Camera/zoom choreography on the current document - native Altium camera commands, animated by Altium itself. |  |  |-| `check_dialogs` | List every Altium dialog currently open, classified, each with a screenshot (the only way to READ one: Altium paints its dialog text). |  |  |+| `check_dialogs` | List every Altium dialog currently open, classified, each with a screenshot (the only way to READ one: Altium paints its dialog text). |  | `fusion_check_dialogs` | | `close` | Polite close (releases the licence seat). Frees a script engine parked on a breakpoint first (Altium refuses to close over one). discardChanges:true answers... | `kicad_close` | `fusion_stop` | | `close_document` | Close ONE open document by path through its document handle. Never saves. |  | `fusion_close_document` | | `connect_workspace` | Open Altium's workspace picker (the 'Not Connected' menu) and return a screenshot with a coordMap. The list is a custom control with no UIA children, so the... |  |  | | `demo` | The tour. Default: one background beat per call with a screenshot. live:true = the narrated FOREGROUND show: ab caption + document + in-bridge camera... | `kicad_demo` | `fusion_demo` | | `describe` | This list - the bridge's verbs and schemas for ab's Verbs tab. | `kicad_describe` | `fusion_describe` | | `diagnostics` | Bridge-side facts for a bug report: environment variables, every Altium install found, Altium's windows, the agent status block and the cache directory. | `kicad_diagnostics` |  |-| `dialog_log` | What the standing dialog reaper (and the bridge's own recoveries) pressed, newest last: nuisance boxes, script-error boxes, discarded save prompts, silent... |  |  |+| `dialog_log` | What the standing dialog reaper (and the bridge's own recoveries) pressed, newest last: nuisance boxes, script-error boxes, discarded save prompts, silent... |  | `fusion_dialog_log` | | `dismiss_dialogs` | Press one named button (default OK) on the detected Altium dialogs through UIA - no cursor, no focus steal. titles narrows it to dialogs whose title... | `kicad_dismiss_dialogs` | `fusion_dismiss_dialogs` | | `ensure_licensed` | One call to get a usable Altium: launch if needed, then claim a seat (Use License via UIA). Optional escalations: sign out to force a seat release, or start... |  |  | | `eval` | Run a DelphiScript snippet inside Altium (optional Var block, then Begin ... End;) on the CURRENT document, or on filePath opened first. |  |  |@@ -191,34 +191,34 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `instances` | Every running Altium (Designer + Designer Develop can run together). |  |  | | `launch` | Start Altium (the newest numbered install, or the one install names) and wait for its main window, then hand the user's own window back. Answers... | `kicad_launch` | `fusion_launch` | | `license` | Drive the License Management page (UIA first - no cursor, no foreground). |  |  |-| `license_status` | Plain-language answer to 'what Altium licence am I on?': the state from the window title plus a capture of the License Management page. |  |  |-| `list_commands` | Search Altium's process-launcher catalog (about 1,100 Server:Command entries parsed from the install's System/*.rcs files) by text and/or server. |  |  |-| `open_document` | Open a document or project by path through the agent and show it without focusing it. An already-open document is activated, not reloaded. | `kicad_open_board / kicad_open_schematic` (partial) |  |+| `license_status` | Plain-language answer to 'what Altium licence am I on?': the state from the window title plus a capture of the License Management page. |  | `fusion_license_status` |+| `list_commands` | Search Altium's process-launcher catalog (about 1,100 Server:Command entries parsed from the install's System/*.rcs files) by text and/or server. |  | `fusion_list_commands` |+| `open_document` | Open a document or project by path through the agent and show it without focusing it. An already-open document is activated, not reloaded. | `kicad_open_board / kicad_open_schematic` (partial) | `fusion_open_document` | | `open_project` | Open a project (.PrjPcb / .PrjScr / .PrjMbd / .PrjHar / .LibPkg) by path. Same handler as altium_open_document. |  |  | | `panel` | Activate a docked panel TAB (SCH Library, PCB Library, Components, Projects, Properties) in the BACKGROUND - the 'ganged-up view' needs the right panels in... |  |  | | `progress` | The bridge's timing book: phases in flight right now (percent/ETA blocks ab paints on the taskbar), measured phase history and per-verb run statistics. | `kicad_progress` |  | | `readiness` | The one-call gate: is Altium installed, running, licensed, and is the resident agent alive? Answers with Altium closed and never touches the script engine. | `kicad_readiness` | `fusion_readiness` |-| `run_command` | Run an Altium process (Server:Command) through the agent, on the CURRENT document or on filePath opened first. |  |  |-| `run_script` | One shot: run a procedure of YOUR OWN .PrjScr through Altium's -R command line. Only for when the agent is NOT resident. |  |  |-| `save` | Save the focused document, or open filePath first and save that (WorkspaceManager:SaveObject on the focused document). | `kicad_save` |  |+| `run_command` | Run an Altium process (Server:Command) through the agent, on the CURRENT document or on filePath opened first. |  | `fusion_run_command` |+| `run_script` | One shot: run a procedure of YOUR OWN .PrjScr through Altium's -R command line. Only for when the agent is NOT resident. |  | `fusion_run_script` |+| `save` | Save the focused document, or open filePath first and save that (WorkspaceManager:SaveObject on the focused document). | `kicad_save_board` (partial) | `fusion_save` | | `sch_zoom` | Find parts on a sheet: select them (everything else deselected), frame the view on them and return a proof frame. The schematic half of cross-probing (the... |  |  |-| `select_net` | Select one net as a whole on the current board (tracks, arcs, vias, pads, pours) and nothing else, optionally framing it; no net clears the selection. | `kicad_select_net` |  |-| `selection` | What the user has selected in the current board (components with position mm, rotation, side, footprint, size) or sheet (components with location mils and... | `kicad_selection` |  |+| `select_net` | Select one net as a whole on the current board (tracks, arcs, vias, pads, pours) and nothing else, optionally framing it; no net clears the selection. | `kicad_select_net` | `fusion_select_net` |+| `selection` | What the user has selected in the current board (components with position mm, rotation, side, footprint, size) or sheet (components with location mils and... | `kicad_get_selection` |  | | `selftest_script_error` | Regression test for the script-error safety net (from 0.2.23): makes the agent raise a REAL DelphiScript runtime error on purpose and checks that the bridge... |  |  |-| `set_layer_visibility` | Show or hide one layer of the current board (by layer id) and refresh the view and the layer tabs. |  |  |+| `set_layer_visibility` | Show or hide one layer of the current board (by layer id) and refresh the view and the layer tabs. |  | `fusion_set_layer_visibility` | | `setup_trial` | Onboarding state machine: from nothing to a working trial. Each call reports the stage it found (install / launch / signin / done) and the ONE next action;... |  |  | | `show_2d_board` | Open a .PcbDoc, switch to 2D, zoom to fit, and return a proof frame. With no filePath it opens the bundled Bluetooth Sentinel board. | `kicad_show_2d_board` | `fusion_show_2d_board` | | `show_3d_board` | Open a .PcbDoc, switch to 3D, zoom to fit, and return a proof frame. With no filePath it opens the bundled Bluetooth Sentinel board. | `kicad_show_3d_board` | `fusion_show_3d_board` |-| `show_3d_chip` | Open a PcbLib member in the footprint editor in 3D, zoom to fit, and capture a proof frame of the part's 3D body. | `kicad_show_3d_chip` |  |+| `show_3d_chip` | Open a PcbLib member in the footprint editor in 3D, zoom to fit, and capture a proof frame of the part's 3D body. | `kicad_show_3d_chip` | `fusion_show_3d_chip` | | `show_footprint` | Open a PcbLib member in the footprint editor in 2D, zoom to fit, and capture a proof frame. | `kicad_show_footprint` | `fusion_show_footprint` | | `show_library` | Open a .SchLib or .PcbLib (kind taken from the extension), select its first component, return a proof frame and the component names. | `kicad_show_library` | `fusion_show_library` | | `show_project` | Open a project (.PrjPcb) through the agent and return a proof frame of Altium's main window. With no filePath it opens Altium's bundled example project... | `kicad_show_project` | `fusion_show_project` | | `show_schematic` | Open a .SchDoc, zoom to fit, and return a proof frame. With no filePath it opens the bundled Bluetooth Sentinel top sheet. | `kicad_show_schematic` | `fusion_show_schematic` | | `show_symbol` | Open a SchLib member in the Symbol editor and capture a background proof. | `kicad_show_symbol` | `fusion_show_symbol` | | `signin` | Report-only alias of altium_signin_status: it does NOT sign anyone in. Signing in to Altium is a browser flow only the human can complete. |  | `fusion_signin` |-| `signin_status` | Account and Altium 365 workspace connection as Altium's own UI reports it: licence state from the title, and whether the workspace menu reads 'Not Connected'. |  |  |+| `signin_status` | Account and Altium 365 workspace connection as Altium's own UI reports it: licence state from the title, and whether the workspace menu reads 'Not Connected'. |  | `fusion_signin_status` | | `state` | The whole picture in one call: licence state, windows, dialogs, a screenshot of every main/dialog window, and the agent's logical state (focused document,... | `kicad_state` | `fusion_state` |-| `status` | Is Altium running, licensed, and is the resident agent alive? | `kicad_status` |  |+| `status` | Is Altium running, licensed, and is the resident agent alive? | `kicad_status` | `fusion_status` | | `uninstall` | Remove the bridge's own cache directory (agent workspaces, rendered agent scripts, the Altium 365 token file). Altium Designer and the user's designs are... | `kicad_uninstall` | `fusion_uninstall` | | `window_info` | Altium's top-level windows plus any open dialogs, without screenshots. The cheap way to ask 'is a modal blocking the engine?'. | `kicad_window_info` |  | | `zoom_to` | Frame the PCB view on a rectangle, a part (or several) or a whole net, with a margin. |  | `fusion_zoom_to` |
reference/fusion360-1.12.1.jsonadded+228
@@ -0,0 +1,228 @@+{+ "bridge": "fusion360",+ "version": "1.12.1",+ "verbs": [+  "fusion_account",+  "fusion_action_ledger",+  "fusion_activate_document",+  "fusion_addin_status",+  "fusion_alerts",+  "fusion_apply_fusion_update",+  "fusion_apply_pours",+  "fusion_apply_silkscreen",+  "fusion_aps_browse",+  "fusion_aps_create_folder",+  "fusion_aps_download",+  "fusion_aps_file_info",+  "fusion_aps_forget_browser",+  "fusion_aps_get",+  "fusion_aps_get_browser",+  "fusion_aps_open",+  "fusion_aps_recent",+  "fusion_aps_search",+  "fusion_aps_set_browser",+  "fusion_aps_set_client_id",+  "fusion_aps_signin",+  "fusion_aps_status",+  "fusion_aps_upload",+  "fusion_aps_versions",+  "fusion_assembly_bom",+  "fusion_attach_3d_package",+  "fusion_autoroute",+  "fusion_bind_library_3d",+  "fusion_board_bom",+  "fusion_board_info",+  "fusion_board_outline",+  "fusion_board_seed",+  "fusion_board_shape",+  "fusion_board_source",+  "fusion_board_stackup",+  "fusion_board_summary",+  "fusion_bodies",+  "fusion_build_library_3d",+  "fusion_cancel_run",+  "fusion_capture_library_views",+  "fusion_change_pours",+  "fusion_check_dialogs",+  "fusion_check_recovery",+  "fusion_claim_seat",+  "fusion_cleanup_cloud_files",+  "fusion_close_all_documents",+  "fusion_close_document",+  "fusion_close_window",+  "fusion_component_data",+  "fusion_component_pins",+  "fusion_copper_layers",+  "fusion_create_cloud_folder",+  "fusion_create_library",+  "fusion_delete_cloud_file",+  "fusion_demo",+  "fusion_demo_progress",+  "fusion_describe",+  "fusion_detect_layers",+  "fusion_dialog_log",+  "fusion_dismiss_blocking_dialogs",+  "fusion_dismiss_dialogs",+  "fusion_document_info",+  "fusion_eagle_import_status",+  "fusion_electron_pan",+  "fusion_electron_run",+  "fusion_electron_select",+  "fusion_electron_zoom",+  "fusion_electronics_query",+  "fusion_execute_text_command",+  "fusion_export_3mf",+  "fusion_export_board_image",+  "fusion_export_bom",+  "fusion_export_cloud_file",+  "fusion_export_cpl",+  "fusion_export_dwg",+  "fusion_export_dxf",+  "fusion_export_eagle_source",+  "fusion_export_f3d",+  "fusion_export_fbx",+  "fusion_export_gerber",+  "fusion_export_gerbers",+  "fusion_export_iges",+  "fusion_export_lbr",+  "fusion_export_obj",+  "fusion_export_optimized_glb",+  "fusion_export_sat",+  "fusion_export_skp",+  "fusion_export_source",+  "fusion_export_step",+  "fusion_export_stl",+  "fusion_export_usdz",+  "fusion_fetch_optimized_glb",+  "fusion_generate_package",+  "fusion_get_app_state",+  "fusion_get_design_info",+  "fusion_get_parameters",+  "fusion_get_preferences",+  "fusion_import_electronics",+  "fusion_import_step",+  "fusion_inspect_bodies",+  "fusion_install",+  "fusion_install_fusion",+  "fusion_install_library_bundle",+  "fusion_interactive",+  "fusion_kill",+  "fusion_launch",+  "fusion_layer_stack",+  "fusion_layers",+  "fusion_layers_in_use",+  "fusion_library_manager",+  "fusion_library_parts",+  "fusion_license_status",+  "fusion_list_cloud_files",+  "fusion_list_cloud_projects",+  "fusion_list_commands",+  "fusion_list_designators",+  "fusion_list_nets",+  "fusion_list_text_commands",+  "fusion_live_feed",+  "fusion_make_3d_package",+  "fusion_make_showcase_project",+  "fusion_make_test_project",+  "fusion_managed_library_create",+  "fusion_managed_library_link",+  "fusion_managed_library_pull",+  "fusion_managed_library_push",+  "fusion_managed_library_unlink",+  "fusion_mcp_call",+  "fusion_mcp_enable",+  "fusion_mcp_resources",+  "fusion_mcp_status",+  "fusion_mcp_tools",+  "fusion_move_parts",+  "fusion_narrate",+  "fusion_net_classes",+  "fusion_net_connections",+  "fusion_netlist",+  "fusion_new_electronics_from_eagle",+  "fusion_notify_owner",+  "fusion_open_board",+  "fusion_open_by_urn",+  "fusion_open_by_urn_note",+  "fusion_open_cloud_file",+  "fusion_open_design",+  "fusion_open_document",+  "fusion_open_electronics",+  "fusion_open_lbr",+  "fusion_open_schematic",+  "fusion_physical_properties",+  "fusion_place_vias",+  "fusion_plan_library_import",+  "fusion_plan_route",+  "fusion_pour_state",+  "fusion_preflight_lbr",+  "fusion_prefs_close",+  "fusion_prefs_open",+  "fusion_prewarm",+  "fusion_prove_result",+  "fusion_read_rules",+  "fusion_read_sheet_file",+  "fusion_readiness",+  "fusion_release_seat",+  "fusion_remove_items",+  "fusion_remove_pours",+  "fusion_repour",+  "fusion_reset_workspace",+  "fusion_resolve_seat_dialog",+  "fusion_restart_for_addin",+  "fusion_ripup_nets",+  "fusion_route_net",+  "fusion_routing_drc",+  "fusion_routing_state",+  "fusion_rules_by_kind",+  "fusion_run_command",+  "fusion_run_drc",+  "fusion_run_erc",+  "fusion_run_modeling_script",+  "fusion_run_script",+  "fusion_save",+  "fusion_save_document",+  "fusion_save_to_cloud",+  "fusion_schematic",+  "fusion_schematic_plan",+  "fusion_schematic_run",+  "fusion_screenshot_fusion",+  "fusion_search_cloud_files",+  "fusion_select_net",+  "fusion_set_auto_update",+  "fusion_set_design_rules",+  "fusion_set_driving_badge",+  "fusion_set_layer_visibility",+  "fusion_set_outline",+  "fusion_set_parameter",+  "fusion_set_preference",+  "fusion_set_seat_takeover",+  "fusion_set_track_width",+  "fusion_set_window_sizing",+  "fusion_show_2d_board",+  "fusion_show_3d_board",+  "fusion_show_3d_chip",+  "fusion_show_3d_package",+  "fusion_show_attributes",+  "fusion_show_footprint",+  "fusion_show_library",+  "fusion_show_project",+  "fusion_show_schematic",+  "fusion_show_symbol",+  "fusion_signin",+  "fusion_signin_2fa",+  "fusion_signin_status",+  "fusion_silk_state",+  "fusion_start",+  "fusion_state",+  "fusion_status",+  "fusion_stop",+  "fusion_take_screenshot",+  "fusion_uninstall",+  "fusion_verb_times",+  "fusion_view",+  "fusion_walk_cloud_tree",+  "fusion_web_signin",+  "fusion_zoom_to"+ ]+}
verbs/coverage.json+106−46
@@ -4,8 +4,8 @@   "version": "0.2.75"  },  "compared": {-  "kicad": "1.0.62",-  "fusion360": "1.12.0"+  "kicad": "1.0.61",+  "fusion360": "1.12.1"  },  "tiers": {   "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",@@ -44,7 +44,10 @@     "verb": "kicad_silk_fields_batch / kicad_silk_text_batch / kicad_silk_graphics_batch",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_apply_silkscreen",+    "match": "exact"+   }   },   {    "name": "board_outline",@@ -54,7 +57,10 @@     "verb": "kicad_board_outline",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_board_outline",+    "match": "exact"+   }   },   {    "name": "board_shape",@@ -64,7 +70,10 @@     "verb": "kicad_board_outline",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_board_shape",+    "match": "exact"+   }   },   {    "name": "board_summary",@@ -137,7 +146,7 @@    "tier": "core",    "altium": "altium_create_footprint",    "kicad": {-    "verb": "kicad_create_footprint",+    "verb": "kicad_fp_create",     "match": "exact"    },    "fusion360": null@@ -147,7 +156,7 @@    "tier": "core",    "altium": "altium_create_symbol",    "kicad": {-    "verb": "kicad_create_symbol",+    "verb": "kicad_sym_create",     "match": "exact"    },    "fusion360": null@@ -163,10 +172,7 @@    "name": "find_symbol",    "tier": "core",    "altium": "altium_find_symbol",-   "kicad": {-    "verb": "kicad_find_symbol",-    "match": "exact"-   },+   "kicad": null,    "fusion360": null   },   {@@ -372,7 +378,7 @@    "tier": "core",    "altium": "altium_read_symbol",    "kicad": {-    "verb": "kicad_read_symbol",+    "verb": "kicad_sym_info",     "match": "exact"    },    "fusion360": null@@ -392,14 +398,17 @@     "verb": "kicad_remove_route",     "match": "partial"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_remove_items",+    "match": "exact"+   }   },   {    "name": "remove_symbol",    "tier": "core",    "altium": "altium_remove_symbol",    "kicad": {-    "verb": "kicad_remove_symbol",+    "verb": "kicad_sym_delete",     "match": "exact"    },    "fusion360": null@@ -502,8 +511,8 @@    "tier": "core",    "altium": "altium_sch_sheet_symbol",    "kicad": {-    "verb": "kicad_sch_sheet_symbol",-    "match": "exact"+    "verb": "kicad_sch_sheet",+    "match": "partial"    },    "fusion360": null   },@@ -542,7 +551,10 @@     "verb": "kicad_board_outline",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_set_outline",+    "match": "exact"+   }   },   {    "name": "set_params",@@ -559,7 +571,10 @@     "verb": "kicad_modify_track",     "match": "partial"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_set_track_width",+    "match": "exact"+   }   },   {    "name": "set_visibility",@@ -614,7 +629,7 @@    "tier": "native",    "altium": "altium_add_rule",    "kicad": {-    "verb": "kicad_add_rule",+    "verb": "kicad_custom_rules",     "match": "exact"    },    "fusion360": null@@ -624,7 +639,7 @@    "tier": "native",    "altium": "altium_annotate",    "kicad": {-    "verb": "kicad_annotate",+    "verb": "kicad_sch_annotate",     "match": "exact"    },    "fusion360": null@@ -650,7 +665,10 @@     "verb": "kicad_autoroute",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_autoroute",+    "match": "exact"+   }   },   {    "name": "build_symbol_modes",@@ -718,8 +736,8 @@    "tier": "native",    "altium": "altium_export_manufacturing",    "kicad": {-    "verb": "kicad_export_manufacturing",-    "match": "exact"+    "verb": "kicad_export_gerber / kicad_export_pos",+    "match": "partial"    },    "fusion360": {     "verb": "fusion_export_gerbers / fusion_export_cpl / fusion_export_bom",@@ -784,7 +802,7 @@    "tier": "native",    "altium": "altium_net_classes",    "kicad": {-    "verb": "kicad_net_classes",+    "verb": "kicad_netclasses",     "match": "exact"    },    "fusion360": {@@ -860,7 +878,7 @@    "tier": "native",    "altium": "altium_repour",    "kicad": {-    "verb": "kicad_repour",+    "verb": "kicad_refill_zones",     "match": "exact"    },    "fusion360": {@@ -902,7 +920,10 @@     "verb": "kicad_run_erc",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_run_erc",+    "match": "exact"+   }   },   {    "name": "set_design_rules",@@ -953,8 +974,8 @@    "tier": "native",    "altium": "altium_update_pcb",    "kicad": {-    "verb": "kicad_update_pcb",-    "match": "exact"+    "verb": "kicad_update_pcb_from_schematic",+    "match": "partial"    },    "fusion360": null   },@@ -1056,7 +1077,7 @@    "tier": "checks",    "altium": "altium_fab_check",    "kicad": {-    "verb": "kicad_fab_check",+    "verb": "kicad_validate_for_fab",     "match": "exact"    },    "fusion360": null@@ -1166,7 +1187,7 @@    "tier": "checks",    "altium": "altium_route_pair",    "kicad": {-    "verb": "kicad_route_pair",+    "verb": "kicad_route_diff_pair",     "match": "exact"    },    "fusion360": null@@ -1259,7 +1280,10 @@    "tier": "app",    "altium": "altium_check_dialogs",    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_check_dialogs",+    "match": "exact"+   }   },   {    "name": "close",@@ -1332,7 +1356,10 @@    "tier": "app",    "altium": "altium_dialog_log",    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_dialog_log",+    "match": "exact"+   }   },   {    "name": "dismiss_dialogs",@@ -1431,14 +1458,20 @@    "tier": "app",    "altium": "altium_license_status",    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_license_status",+    "match": "exact"+   }   },   {    "name": "list_commands",    "tier": "app",    "altium": "altium_list_commands",    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_list_commands",+    "match": "exact"+   }   },   {    "name": "open_document",@@ -1448,7 +1481,10 @@     "verb": "kicad_open_board / kicad_open_schematic",     "match": "partial"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_open_document",+    "match": "exact"+   }   },   {    "name": "open_project",@@ -1492,24 +1528,33 @@    "tier": "app",    "altium": "altium_run_command",    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_run_command",+    "match": "exact"+   }   },   {    "name": "run_script",    "tier": "app",    "altium": "altium_run_script",    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_run_script",+    "match": "exact"+   }   },   {    "name": "save",    "tier": "app",    "altium": "altium_save",    "kicad": {-    "verb": "kicad_save",-    "match": "exact"+    "verb": "kicad_save_board",+    "match": "partial"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_save",+    "match": "exact"+   }   },   {    "name": "sch_zoom",@@ -1526,14 +1571,17 @@     "verb": "kicad_select_net",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_select_net",+    "match": "exact"+   }   },   {    "name": "selection",    "tier": "app",    "altium": "altium_selection",    "kicad": {-    "verb": "kicad_selection",+    "verb": "kicad_get_selection",     "match": "exact"    },    "fusion360": null@@ -1550,7 +1598,10 @@    "tier": "app",    "altium": "altium_set_layer_visibility",    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_set_layer_visibility",+    "match": "exact"+   }   },   {    "name": "setup_trial",@@ -1593,7 +1644,10 @@     "verb": "kicad_show_3d_chip",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_show_3d_chip",+    "match": "exact"+   }   },   {    "name": "show_footprint",@@ -1675,7 +1729,10 @@    "tier": "app",    "altium": "altium_signin_status",    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_signin_status",+    "match": "exact"+   }   },   {    "name": "state",@@ -1698,7 +1755,10 @@     "verb": "kicad_status",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_status",+    "match": "exact"+   }   },   {    "name": "uninstall",