@vcad/mcp 0.11.0-main.148 → 0.11.0-main.149

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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/index.mjs +55 -6
  3. package/package.json +3 -3
package/README.md CHANGED
@@ -6,4 +6,4 @@ vcad's MCP server as a self-contained bundle (server + BRep kernel WASM).
6
6
  { "mcpServers": { "vcad": { "command": "npx", "args": ["-y", "@vcad/mcp"] } } }
7
7
  ```
8
8
 
9
- Built from 2e90f325d26818101fa84582fe411078142a182b at 2026-11-11T01:59:27.461Z. Source: https://github.com/ecto/vcad
9
+ Built from 94132cad17c41dc78e0ac0abd5a4d89316ac5325 at 2026-11-11T02:03:58.696Z. Source: https://github.com/ecto/vcad
package/index.mjs CHANGED
@@ -44788,6 +44788,22 @@ var init_CHANGELOG = __esm({
44788
44788
  "modeling"
44789
44789
  ]
44790
44790
  },
44791
+ {
44792
+ id: "2026-11-07-router-island-terminals",
44793
+ version: "0.11.0",
44794
+ date: "2026-11-07",
44795
+ category: "fix",
44796
+ title: "Router starts from any copper joined to a pad",
44797
+ summary: "fab-prep routes island-to-island: a connection can start on fan-out stubs, vias or earlier traces already joined to its pad, so a walled-in fine-pitch pad with hand-placed fan-out now routes.",
44798
+ features: [
44799
+ "pcb",
44800
+ "fab-prep",
44801
+ "autoroute"
44802
+ ],
44803
+ mcpTools: [
44804
+ "fab_prep"
44805
+ ]
44806
+ },
44791
44807
  {
44792
44808
  id: "2026-11-07-native-liquid-glass-shell",
44793
44809
  version: "0.11.0",
@@ -44930,6 +44946,24 @@ var init_CHANGELOG = __esm({
44930
44946
  "native"
44931
44947
  ]
44932
44948
  },
44949
+ {
44950
+ id: "2026-11-07-fab-prep-fail-closed-incomplete",
44951
+ version: "0.11.0",
44952
+ date: "2026-11-07",
44953
+ category: "fix",
44954
+ title: "fab-prep fails closed on open nets; pinned, through-only routing",
44955
+ summary: "fab-prep no longer ships boards with unconnected nets (opt in with --allow-incomplete), pins traces to pad layers, emits through vias by default, and autoroute reports true open nets.",
44956
+ features: [
44957
+ "pcb",
44958
+ "fab-prep",
44959
+ "autoroute",
44960
+ "drc",
44961
+ "native-app"
44962
+ ],
44963
+ mcpTools: [
44964
+ "fab_prep"
44965
+ ]
44966
+ },
44933
44967
  {
44934
44968
  id: "2026-11-07-drawing-feature-edges",
44935
44969
  version: "undefined",
@@ -70970,9 +71004,11 @@ async function fabPrep(args) {
70970
71004
  prune_dangling: args.prune_dangling === void 0 ? true : Boolean(args.prune_dangling),
70971
71005
  max_rounds: Math.max(0, Math.round(Number(args.max_rounds ?? 8))),
70972
71006
  accept_rules: Array.isArray(args.accept_rules) ? args.accept_rules : [],
71007
+ allow_incomplete: args.allow_incomplete === true,
70973
71008
  verdict: {
70974
71009
  budget: Math.max(1, Math.round(Number(args.budget ?? 5e6))),
70975
- max_cluster: Math.max(1, Math.round(Number(args.max_cluster ?? 6)))
71010
+ max_cluster: Math.max(1, Math.round(Number(args.max_cluster ?? 6))),
71011
+ allow_blind_vias: args.allow_blind_vias === true
70976
71012
  }
70977
71013
  };
70978
71014
  const out = await runFabPrep(pcb, options);
@@ -71023,11 +71059,16 @@ async function fabPrep(args) {
71023
71059
  return { content: [{ type: "text", text: JSON.stringify(payload) }] };
71024
71060
  }
71025
71061
  function fabPrepHeadline(report) {
71062
+ const open2 = report.connectivity.open_nets?.length ?? 0;
71026
71063
  if (!report.converged) {
71064
+ if (report.delta.route_attributable_fixable === 0 && open2 > 0) {
71065
+ return `NOT FAB-READY \u2014 board not fully routed, ${open2} net(s) open (${report.blocker ?? "connectivity incomplete"})`;
71066
+ }
71027
71067
  return `NOT FAB-READY \u2014 ${report.delta.route_attributable_fixable} route-attributable violation(s) remain (${report.blocker ?? "loop did not converge"})`;
71028
71068
  }
71069
+ const incomplete = report.shipped_incomplete ? ` \u2014 NOT FULLY ROUTED: ${open2} net(s) open (shipped under allow_incomplete)` : "";
71029
71070
  const waived = report.delta.route_attributable_accepted > 0 ? `, ${report.delta.route_attributable_accepted} waived under ${report.accepted_rules.join("+")}` : "";
71030
- return `zero route-attributable violations${waived} \u2014 ${report.delta.final_total} on the finished board, ${report.delta.baseline_total} on the same board stripped of all routing`;
71071
+ return `zero route-attributable violations${waived} \u2014 ${report.delta.final_total} on the finished board, ${report.delta.baseline_total} on the same board stripped of all routing${incomplete}`;
71031
71072
  }
71032
71073
  async function validateForFab(args) {
71033
71074
  const ctx = resolveDocInput(args);
@@ -76958,6 +76999,14 @@ var init_ecad2 = __esm({
76958
76999
  items: { type: "string" },
76959
77000
  description: 'DRC rule names whose route-attributable violations are ACCEPTED rather than fixed (e.g. ["MinTraceWidth"]). Real fab packages ship with real, named exceptions; the difference between that and a footgun is whether the exception is written down. Waived violations are still counted, still listed, and the waiver is named in the receipt \u2014 it stops blocking the verdict, it does not hide anything. An unrecognised rule name refuses the run rather than silently accepting nothing.'
76960
77001
  },
77002
+ allow_incomplete: {
77003
+ type: "boolean",
77004
+ description: "Let a geometrically clean board that still has OPEN nets (unconnected, islanded, or an SMD pad unstitched from its plane) converge (default FALSE \u2014 such a run fails closed). The opt-in is logged in the receipt and FAB_NOTES says NOT FULLY ROUTED."
77005
+ },
77006
+ allow_blind_vias: {
77007
+ type: "boolean",
77008
+ description: "Let the router emit blind/buried (layer-pair) vias (default FALSE \u2014 through vias only, as standard 2/4-layer processes require). A board that already carries blind/buried/micro vias keeps that process."
77009
+ },
76961
77010
  dry_run: {
76962
77011
  type: "boolean",
76963
77012
  description: "Compute the receipt without writing the fixed board back to the session."
@@ -90592,8 +90641,8 @@ var init_server3 = __esm({
90592
90641
  init_order_feed();
90593
90642
  init_animate();
90594
90643
  PKG_VERSION = (() => {
90595
- if ("0.11.0-main.148") {
90596
- return "0.11.0-main.148";
90644
+ if ("0.11.0-main.149") {
90645
+ return "0.11.0-main.149";
90597
90646
  }
90598
90647
  try {
90599
90648
  const req = createRequire2(import.meta.url);
@@ -90602,8 +90651,8 @@ var init_server3 = __esm({
90602
90651
  return "0.0.0";
90603
90652
  }
90604
90653
  })();
90605
- BUILD_SHA = "2e90f325d26818101fa84582fe411078142a182b";
90606
- BUILD_TIME = "2026-11-11T01:59:27.461Z";
90654
+ BUILD_SHA = "94132cad17c41dc78e0ac0abd5a4d89316ac5325";
90655
+ BUILD_TIME = "2026-11-11T02:03:58.696Z";
90607
90656
  SHORT_SHA = BUILD_SHA === "unknown" ? "unknown" : BUILD_SHA.slice(0, 7);
90608
90657
  VERSION_WITH_BUILD = SHORT_SHA === "unknown" ? PKG_VERSION : `${PKG_VERSION}+${SHORT_SHA}`;
90609
90658
  INSTANCE_ID = randomUUID7().slice(0, 8);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vcad/mcp",
3
- "version": "0.11.0-main.148",
3
+ "version": "0.11.0-main.149",
4
4
  "description": "vcad MCP server — parametric CAD + PCB design tools for AI agents (self-contained: bundled server + kernel WASM)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "homepage": "https://vcad.io",
21
21
  "vcadBuild": {
22
- "sha": "2e90f325d26818101fa84582fe411078142a182b",
23
- "builtAt": "2026-11-11T01:59:27.461Z"
22
+ "sha": "94132cad17c41dc78e0ac0abd5a4d89316ac5325",
23
+ "builtAt": "2026-11-11T02:03:58.696Z"
24
24
  }
25
25
  }