← Commit history
Cargo.lock+1−1
@@ -4,7 +4,7 @@ version = 4  [[package]] name = "adom-chip-fetcher"-version = "1.4.5"+version = "1.4.6" dependencies = [  "anyhow",  "clap",
Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "adom-chip-fetcher"-version = "1.4.5"+version = "1.4.6" edition = "2021" description = "Crawls the web on your behalf to gather everything about the chips you care about (datasheet, symbol, footprint, 3D, stock) into one library, by driving Chrome via pup." 
SKILL.md+2−2
@@ -197,12 +197,12 @@ Each playbook is a focused deep-dive. Read the relevant one when the situation m  ## Adom standard passive size, proactively recommend 0402 -**When a user asks "what size LED / resistor / cap / inductor?", default to 0402 and surface the InstaPCB-respin rationale.** Don't recommend 0603 by reflex, that's the traditional EE default rooted in hand-rework friendliness, and Adom's 4-hour respin loop replaces hand-rework entirely. The full rule + paraphrased justification lives in [`electrical-engineering/SKILL.md`](../electrical-engineering/SKILL.md) §4a; read it once per design conversation.+**When a user asks "what size LED / resistor / cap / inductor?", default to 0402 and surface the fast-respin rationale.** Don't recommend 0603 by reflex, that's the traditional EE default rooted in hand-rework friendliness, and the 3rd party fab's 4-hour respin loop replaces hand-rework entirely. The full rule + paraphrased justification lives in [`electrical-engineering/SKILL.md`](../electrical-engineering/SKILL.md) §4a; read it once per design conversation.  Quick reference (see `solder-jetting/SKILL.md` for the dispense math):  - **0402 = Adom standard.** Solder-jet places it with 250 µm of bridging margin (300 µm dot rule + 550 µm IPC pad gap).-- **0603 = override only.** Recommend when user is hand-prototyping outside InstaPCB, has a high-current rail, RF impedance constraint, or explicitly asks.+- **0603 = override only.** Recommend when user is hand-prototyping outside the 3rd party fab, has a high-current rail, RF impedance constraint, or explicitly asks. - **0201 = surface the dispense warning.** Pad gap 250 µm violates the 300 µm inter-pad rule. - **01005 = out of envelope.** Pads below the 250 µm droplet minimum. 
bin/adom-chip-fetcher
⋯ 1 unchanged line ⋯
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-chip-fetcher",-  "version": "1.4.5",+  "version": "1.4.6",   "type": "app",   "description": "Crawls the web on your behalf to gather everything about the chips you care about: datasheets, symbols, footprints, 3D models, stock and pricing, straight from the manufacturer first, into your EDA tool. Say \"cf\" to your AI.",   "dependencies": {
page.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-chip-fetcher",-  "version": "1.4.5",+  "version": "1.4.6",   "type": "app",   "description": "Crawls the web on your behalf to gather everything about the chips you care about: datasheets, symbols, footprints, 3D models, stock and pricing, straight from the manufacturer first, into your EDA tool. Say \"cf\" to your AI.",   "dependencies": {
playbooks/sourcing-ladder.md+5−5
@@ -64,8 +64,8 @@ When a manufacturer page (or distributor lifecycle field) says any of these, tre **The rule:**  1. **If the user explicitly asked for that exact MPN** → fetch it AND surface the lifecycle warning prominently. *"Heads up, TI has TPS40190EVM marked NRND, expect availability to drop within 2 to 3 years; do you still want it or should I find an active equivalent?"* Pause and let them decide. Their design might already be locked to that specific part for a reason (existing PCB, qual'd component, BOM compatibility).-2. **If chip-fetcher was choosing the part on its own** (default library picks, "popular" suggestions, batch fills, "show me a good op-amp" requests) → **DO NOT add it to the library.** Pick an active replacement. NRND parts will be unbuyable for InstaPCB users in 1 to 3 years; baking them into Adom's default library means real boards won't be manufacturable at scale.-3. **Always include `lifecycle` + `lifecycle_warning` in the stored `stock.json`** so downstream tools (InstaPCB, BOM checker) can flag these without re-scraping.+2. **If chip-fetcher was choosing the part on its own** (default library picks, "popular" suggestions, batch fills, "show me a good op-amp" requests) → **DO NOT add it to the library.** Pick an active replacement. NRND parts will be unbuyable for users building at the 3rd party fab in 1 to 3 years; baking them into Adom's default library means real boards won't be manufacturable at scale.+3. **Always include `lifecycle` + `lifecycle_warning` in the stored `stock.json`** so downstream tools (3rd party fab quoting, BOM checker) can flag these without re-scraping.  Direct user quote: *"if the page says 'not recommended for new designs' that you take that seriously. let the user know if they asked you specifically to get that part, but if you were just thinking that part was a good idea for some reason, it's not a good idea."* @@ -87,7 +87,7 @@ adom-digikey search "<MPN>" | jq '.components[0].lifecycle'  ## Track Mouser stock + pricing as first-class data -chip-fetcher isn't just a CAD library, it's the source-of-truth for whether each chip can actually be put into an InstaPCB build. Every chip in `library/<MPN>/` should have current Mouser stock + price metadata cached alongside the CAD bundle.+chip-fetcher isn't just a CAD library, it's the source-of-truth for whether each chip can actually be put into a 3rd party fab build. Every chip in `library/<MPN>/` should have current Mouser stock + price metadata cached alongside the CAD bundle.  **stock.json schema:** @@ -123,11 +123,11 @@ chip-fetcher isn't just a CAD library, it's the source-of-truth for whether each } ``` -Direct user quote: *"we need to know stuff is in stock at mouser so we can build the instapcb for the user, so you should be tracking that data too in chip-fetcher cuz it's really important data."*+Direct user quote: *"we need to know stuff is in stock at mouser so we can build [the board at the 3rd party fab] for the user, so you should be tracking that data too in chip-fetcher cuz it's really important data."*  ## Multi-package variant tracking -When `adom-mouser search "<MPN>"` returns more than one variant of the chip, save **every variant** to `stock.json` under `variants[]`, not just the best/first one. Downstream tools (InstaPCB BOM picker, schematic-to-board flow, alternate-part suggester) need to know the user's choices, especially when packages differ.+When `adom-mouser search "<MPN>"` returns more than one variant of the chip, save **every variant** to `stock.json` under `variants[]`, not just the best/first one. Downstream tools (3rd party fab BOM picker, schematic-to-board flow, alternate-part suggester) need to know the user's choices, especially when packages differ.  Worked example: TPS25751 has both TPS25751DREFR (3276 @ $2.99, package: DREF) and TPS25751SRSMR (1425 @ $2.66, package: SRSM/RSM). Storing only the highest-stock variant hides that the user can pick a different package for layout reasons. 
src/ui/index.html+2−2
@@ -1388,7 +1388,7 @@ function buildCard(c) {   const desc = c.info && (c.info.summary || c.info.description);   const statusPill = ACTIVE_MPN === c.mpn     ? `<span class="pill accent fetching" data-tooltip="${escapeHtml('Your AI is fetching this part now. Stage: ' + (ACTIVE_STAGE || 'starting'))}">Fetching</span>`-    : (c.fully_bundled ? '<span class="pill ok" data-tooltip="Fully bundled: STEP, KiCad symbol and footprint, Altium and the Fusion .lbr are all here, so every downstream tool (chipsmith, InstaPCB, molecules) can use it.">Full</span>'+    : (c.fully_bundled ? '<span class="pill ok" data-tooltip="Fully bundled: STEP, KiCad symbol and footprint, Altium and the Fusion .lbr are all here, so every downstream tool (chipsmith, 3rd party fab quoting, molecules) can use it.">Full</span>'       : '<span class="pill warn" data-tooltip="Stub: one or more core CAD files are missing (STEP, KiCad symbol or footprint, Altium, Fusion). Use the re-fetch button to fetch the missing pieces from a specific source.">Stub</span>');   card.innerHTML = `     <div class="mpn-row">@@ -1624,7 +1624,7 @@ async function select(mpn, silent) {       <div class="section"><div class="section-title">Open in</div>         <div class="openin-row" data-mpn="${escapeHtml(c.mpn)}">           ${c.has_sym ? `<button class="openbtn" type="button" data-kind="symbol" data-tooltip="Open the schematic symbol in the live adom-symbol app.">adom-symbol</button>` : ''}-          ${c.has_mod ? `<button class="openbtn" type="button" data-kind="footprint" data-tooltip="Open the PCB footprint in the live adom-footprint app (layers plus InstaPCB solder-paste dots).">adom-footprint</button>` : ''}+          ${c.has_mod ? `<button class="openbtn" type="button" data-kind="footprint" data-tooltip="Open the PCB footprint in the live adom-footprint app (layers plus solder-paste dots).">adom-footprint</button>` : ''}           ${(c.has_sym || c.has_mod) ? `<button class="openbtn" type="button" data-kind="lbr" data-tooltip="Build and open a true EAGLE .lbr (symbol plus footprint) in adom-lbr.">adom-lbr</button>` : ''}           ${c.has_step ? `<button class="openbtn" type="button" data-kind="chip3d" data-tooltip="Orbit the real 3D STEP model in the adom-step viewer.">adom-3D</button>` : ''}           ${(c.has_step && c.has_mod) ? `<button class="openbtn" type="button" data-kind="chipsmith" data-tooltip="${escapeHtml('Align pin-1 in chipsmith. Opens the 3D STEP and the footprint together so you can line up the chip\'s pin-1 with the footprint\'s pin-1, then sign off. Chip fetcher reads the result back as the Pin-1 pill and a baked ' + c.mpn + '.chipsmith.step.')}">${c.pin1_signed ? 'Pin-1 signed' : 'Align pin-1'}</button>` : (c.has_step ? `<button class="openbtn" type="button" data-kind="chipsmith" data-tooltip="Open in chipsmith (STEP-native pin detection and sign-off). A footprint is needed before pin-1 can be aligned.">chipsmith</button>` : '')}