← Commit history

1.0.113: header CSS restored per dash-header (wiki #66), brand 'KiCad Bridge ยท AI control for KiCad', Say-it phrases and prompts name real wiki content (ray/xl555, adom boards, Adom PCM libraries); dead demo part aravk/in-s42ata replaced

John Lauer ·228d1c0c8b ·1mo ago ·parent 7393888
5 files changed +61−30
SKILL.md+7
@@ -246,3 +246,10 @@ Rules live on the wiki page adom/pcb-design-rules and are fetched at call time,  - `kicad_list_symbols {"libraryName": "Adom"}` (default Adom, or `libraryPath`): the names inside the library, plus `kicadParser.symbols` (what KiCad itself loads). - `kicad_show_library` resolves an MPN or file name to the real symbol name (exact, then case-insensitive, then a unique prefix match) and reports `aliasedFrom` / `aliasHow`; an ambiguous or missing name is stated in `aliasNote`.++### Real content to try (the dashboard's "Say it" phrases point here)++- **A full wiki part page**: `ray/xl555` (XL555 timer: `xl555.kicad_sym`, `xl555.kicad_mod`, `xl555.step`, `xl555.glb`). Fetch its files with `adom-wiki repo show ray/xl555 <file>` (or the files API), `push_file` them to the desktop, then `kicad_install_symbol` / `kicad_install_footprint` (or `kicad_install_library_bundle` for a zip) and `kicad_show_library` / `kicad_show_footprint`.+- **Adom boards with a schematic and a PCB**: `adom/drone-motor-carrier`, `adom/esc-g431`, `adom/carrier-fc-rp2350a-mini`, `adom/rp2350a-ads1220` (each carries `<slug>.kicad_sch`, `<slug>.kicad_pcb`, `.step`, `.glb`). Pull the `.kicad_sch` + `.kicad_pcb`, push them to the desktop, then `kicad_open_board` / `kicad_show_2d_board` / `kicad_show_3d_board`, `kicad_lint_board`, `kicad_set_design_rules {"fab":"adom-instapcb"}`, `kicad_export_gerbers`.+- **The Adom PCM libraries** (symbols, footprints and 3D for every part on the Adom line): `kicad_pcm_install {"repositoryUrl":"https://wiki.adom.inc/api/v1/pages/kicad-pcm/files/repository.json","identifier":"inc.adom.kicad.basic-parts"}` (also `inc.adom.kicad.rp2040`). KiCad registers the libraries on its next start.+- Never quote a wiki page you have not fetched: `aravk/in-s42ata`, an older example, no longer exists.
dashboard/kicad_dashboard.py+14−8
@@ -73,13 +73,19 @@ LOGO_PATH = UI_DIR / "dock-kicad.svg" # list lives in dockbar.json (`say`) so the dock's interstitial and the # dashboard teach the same phrases; the built-in copy is the fallback for an # installed dashboard that ships without the manifest beside it.+# Every phrase names REAL wiki content a user can open right now (John,+# 2026-09-03: "give them real content to open or try in each example").+# ray/xl555 is a full part page (.kicad_sym, .kicad_mod, .step); the adom/+# boards carry .kicad_pcb + .kicad_sch; Adom Basic Parts is the PCM library on+# adom/kicad-pcm. If one of these pages disappears, replace it with another+# real one; never fall back to a placeholder phrase. _SAY_FALLBACK = [-    "open the symbol in kicad",-    "send this footprint to kicad",-    "show me the board in kicad 3d",-    "open my project in kicad",-    "install this part into kicad",-    "export gerbers from kicad",+    "open the XL555 symbol from wiki part ray/xl555 in kicad",+    "send the footprint of ray/xl555 to kicad",+    "show me adom/drone-motor-carrier in kicad 3d",+    "open the wiki project adom/esc-g431 in kicad",+    "install the Adom Basic Parts library into kicad",+    "export gerbers for adom/carrier-fc-rp2350a-mini from kicad" ]  @@ -753,7 +759,7 @@ def probe_targets(): def part_tour(target, args):     """Clone a wiki part page, push its CAD files to the box, install symbol +     footprint + 3D model, then generate a single-component project."""-    page = (args or {}).get("page") or "aravk/in-s42ata"+    page = (args or {}).get("page") or "ray/xl555"     steps = []     tmp = tempfile.mkdtemp(prefix="kdash-part-")     try:@@ -761,7 +767,7 @@ def part_tour(target, args):                            capture_output=True, text=True, timeout=180)         if p.returncode != 0:             return {"success": False, "error": f"clone failed: {p.stderr[:200]}",-                    "_hint": "Give an owner/slug page reference that exists, e.g. aravk/in-s42ata."}+                    "_hint": "Give an owner/slug page reference that exists, e.g. ray/xl555."}         found = {".kicad_sym": None, ".kicad_mod": None, ".step": None}         for root, _dirs, names in os.walk(tmp):             for n in names:
dashboard/ui/index.html+33−15
@@ -3,11 +3,14 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1">-<title>KiCad Dashboard</title>+<title>KiCad Bridge</title> <link rel="icon" type="image/svg+xml" href="favicon.svg"> <style> :root{   --bg:#0d1117;--surface:#161b22;--elevated:#1c2128;--overlay:#21262d;--border:#30363d;+  /* aliases: rules below were written against the dash-header names (--line/--muted/--teal)+     while this sheet defines --border/--text-2/--accent; both must resolve (wiki #66) */+  --line:#30363d;--muted:#8b949e;--teal:#00b8b1;--sans:'Familjen Grotesk',sans-serif;   --text:#e6edf3;--text-body:#c9d1d9;--text-2:#8b949e;   --accent:#00b8b1;--accent-hover:#00d4cb;--on-accent:#05221f;--green:#3fb950;--red:#f85149;--yellow:#d29922;--blue:#64abff;   --brand-heading:'Familjen Grotesk',sans-serif;--brand-body:'Satoshi',sans-serif;@@ -41,8 +44,23 @@ header{height:44px;display:flex;align-items:center;gap:12px;padding:0 16px;margi    scrollWidth to 410. Everything below the header already fitted. So the bar    shrinks: brand ellipsises, the chip caps and ellipsises, the buttons never    shrink (they are the controls), and the subtitle drops out first. */-.brand{min-width:0;overflow:hidden;text-overflow:ellipsis}-.brand svg{flex:none}+/* wiki #66: the visual rules for the header were deleted at some point (the orphaned+   .iconbtn:focus-visible rule outlived them); UA-default white boxes were the result.+   Values are dash-header's numbers (John, 2026-08-24). */+.brand{display:flex;align-items:center;gap:8px;font-family:'Familjen Grotesk',sans-serif;font-weight:600;font-size:15px;letter-spacing:-.01em;color:var(--text);white-space:nowrap;min-width:0;overflow:hidden;text-overflow:ellipsis}+.brand svg{flex:none;width:18px;height:18px;stroke:var(--text)}+.brand .sub{font-size:13px;font-weight:400;color:var(--muted);margin-left:8px}+.vsep{width:1px;height:20px;background:var(--border);flex:none}+.target-chip{display:inline-flex;align-items:center;gap:6px;font:12px 'JetBrains Mono',ui-monospace,monospace;color:var(--text-body);background:var(--elevated);border:1px solid var(--border);border-radius:999px;padding:3px 10px;white-space:nowrap}+.target-chip .tdot{width:8px;height:8px;border-radius:50%;background:var(--muted);flex:none}+.target-chip[data-state="ok"] .tdot{background:var(--green)}+.target-chip[data-state="bad"] .tdot{background:var(--red)}+.actions{margin-left:auto;display:flex;gap:6px;flex:none}+.iconbtn{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:none;border:1px solid transparent;border-radius:8px;color:var(--text-2);cursor:pointer;padding:0;transition:background .15s ease,border-color .15s ease,transform .06s ease}+.iconbtn svg{width:18px;height:18px}+.iconbtn:hover{background:var(--elevated);border-color:var(--border);color:var(--accent)}+.iconbtn:active{transform:scale(.9);background:var(--overlay)}+.iconbtn[aria-pressed="true"]{color:var(--accent)} .actions{flex:none} .target-chip{min-width:0;max-width:38vw;overflow:hidden} .target-chip #chipName{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@@ -306,7 +324,7 @@ main a:hover{border-bottom-color:var(--accent)} <header>   <div class="brand" id="brand" tabindex="0">     <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="flex:none"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="M7.5 15.5H9.5L16.5 8.5"/><circle cx="7.5" cy="15.5" r="2.5"/><circle cx="16.5" cy="8.5" r="2.5"/></svg>-    KiCad Dashboard <span class="sub" style="color:var(--text-2);font-weight:400">&middot; the KiCad bridge</span>+    KiCad Bridge <span class="sub">&middot; AI control for KiCad</span>   </div>   <div class="vsep"></div>   <!-- dash-header: the standard target chip (which box answers), LED inside;@@ -314,8 +332,8 @@ main a:hover{border-bottom-color:var(--accent)}   <span class="target-chip" id="targetChip" data-tip="The box this bridge answers on. Switch boxes with the pills under Status."><span class="tdot" id="chipDot"></span><span id="chipName">connecting...</span></span>   <div class="actions">     <button class="iconbtn" id="btnRefresh" data-tip="Re-read every facet's status from the bridge right now (also auto-refreshes every 15s)" aria-label="Refresh"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M21 12a9 9 0 1 1-2.64-6.36M21 3v6h-6"/></svg></button>-    <button class="iconbtn" id="btnHelp" aria-pressed="true" aria-label="Hide the prompts panel" data-tip="Hide the prompts panel"><svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z"/></svg></button>-    <button class="iconbtn" id="btnSettings" title="Settings" aria-label="Settings"><!-- the shared Adom cog, OUTLINE per the 2026-08-24 fleet ruling (mdi:cog-outline; filled is deprecated) --><svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true"><path fill="currentColor" d="M12 8a4 4 0 0 1 4 4a4 4 0 0 1-4 4a4 4 0 0 1-4-4a4 4 0 0 1 4-4m0 2a2 2 0 0 0-2 2a2 2 0 0 0 2 2a2 2 0 0 0 2-2a2 2 0 0 0-2-2m-2 12c-.25 0-.46-.18-.5-.42l-.37-2.65c-.63-.25-1.17-.59-1.69-.99l-2.49 1.01c-.22.08-.49 0-.61-.22l-2-3.46a.493.493 0 0 1 .12-.64l2.11-1.66L4.5 12l.07-1l-2.11-1.63a.493.493 0 0 1-.12-.64l2-3.46c.12-.22.39-.31.61-.22l2.49 1c.52-.39 1.06-.73 1.69-.98l.37-2.65c.04-.24.25-.42.5-.42h4c.25 0 .46.18.5.42l.37 2.65c.63.25 1.17.59 1.69.98l2.49-1c.22-.09.49 0 .61.22l2 3.46c.13.22.07.49-.12.64L19.43 11l.07 1l-.07 1l2.11 1.63c.19.15.25.42.12.64l-2 3.46c-.12.22-.39.31-.61.22l-2.49-1c-.52.39-1.06.73-1.69.98l-.37 2.65c-.04.24-.25.42-.5.42zm1.25-18l-.37 2.61c-1.2.25-2.26.89-3.03 1.78L5.44 7.35l-.75 1.3L6.8 10.2a5.55 5.55 0 0 0 0 3.6l-2.12 1.56l.75 1.3l2.43-1.04c.77.88 1.82 1.52 3.01 1.76l.37 2.62h1.52l.37-2.61c1.19-.25 2.24-.89 3.01-1.77l2.43 1.04l.75-1.3l-2.12-1.55c.4-1.17.4-2.44 0-3.61l2.11-1.55l-.75-1.3l-2.41 1.04a5.42 5.42 0 0 0-3.03-1.77L12.75 4z"/></svg></button>+    <button class="iconbtn" id="btnHelp" aria-pressed="true" aria-label="Hide the prompts panel" data-tip="Hide the prompts panel"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.7.4-1 1-1 1.7"/><path d="M12 17h.01"/></svg></button>+    <button class="iconbtn" id="btnSettings" title="Settings" aria-label="Settings"><!-- THE Adom cog: adom-ui-design assets/icons/settings-cog-outline.svg, stroke swapped to currentColor for hover --><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg></button>        </div> </header>@@ -353,7 +371,7 @@ main a:hover{border-bottom-color:var(--accent)}     <div class="led-label">Tour a wiki part end to end</div>     <div class="led-sub">Pulls a part page from wiki.adom.inc, installs its symbol, footprint and 3D model into KiCad, then generates a single-component project you can open.</div>     <div class="btnrow">-      <input id="partPage" value="aravk/in-s42ata" data-tip="Any wiki part page that ships .kicad_sym / .kicad_mod / .step files" style="flex:1;min-width:180px;background:var(--elevated);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:8px 10px;font:13px 'JetBrains Mono',monospace">+      <input id="partPage" value="ray/xl555" data-tip="Any wiki part page that ships .kicad_sym / .kicad_mod / .step files" style="flex:1;min-width:180px;background:var(--elevated);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:8px 10px;font:13px 'JetBrains Mono',monospace">       <button class="btn" id="btnPartTour">Tour this part</button>     </div>     <div class="barlabel" id="partLabel"></div>@@ -605,7 +623,7 @@ function buildSay(){ } function doMount(phrases){   AdomNewbiePanel.mount({-    mount:'#newbie', app:'kicad', appName:'KiCad Dashboard', slug:'kicad-bridge',+    mount:'#newbie', app:'kicad', appName:'KiCad Bridge', slug:'kicad-bridge',     toggleButton:'#btnHelp',     demo:{label:'Play the demo', meta:'6 views, about 2 minutes',           onPlay:function(){ startDemo(); }},@@ -787,13 +805,13 @@ $('#btnSetupNext').onclick=async()=>{  // Copy-paste AI prompts (teach the user to drive the bridge through their AI). const PROMPTS=[-  'run the kicad demo and show me each step screenshot as it arrives',-  'tour the wiki part aravk/in-s42ata in kicad: symbol, footprint, 3d chip, project, schematic, 2d board, 3d board',-  'is kicad up to date on all my boxes? update whatever is behind',-  'show me the symbol and footprint for the part I just installed',-  'make a single-component project for this part and show me the 3d board',-  'export gerbers for the open board and tell me the KiCad version stamp',-  'are any kicad windows in my foreground? prove the bridge stayed in the background',+  "run the kicad demo and show me each step screenshot as it arrives",+  "tour the wiki part ray/xl555 in kicad: symbol, footprint, 3d chip, project, schematic, 2d board, 3d board",+  "install the Adom Basic Parts and Adom RP2040 libraries from adom/kicad-pcm into kicad",+  "open adom/drone-motor-carrier in kicad and show me the schematic, the 2d board and the 3d board",+  "check adom/esc-g431 against the InstaPCB 2-layer design rules in kicad and list every violation",+  "export gerbers for adom/carrier-fc-rp2350a-mini from kicad and tell me the KiCad version stamp",+  "are any kicad windows in my foreground? prove the bridge stayed in the background" ]; $('#prompts').innerHTML=PROMPTS.map(p=>`<div class="prompt"><code>${p}</code><button class="btn copy" onclick="navigator.clipboard.writeText('${p.replace(/'/g,"\\'")}');toast('copied','ok')">Copy</button></div>`).join(''); 
dockbar.json+6−6
@@ -1,12 +1,12 @@ {   "dock_manifest": "1.2.0",   "say": [-    "open the symbol in kicad",-    "send this footprint to kicad",-    "show me the board in kicad 3d",-    "open my project in kicad",-    "install this part into kicad",-    "export gerbers from kicad"+    "open the XL555 symbol from wiki part ray/xl555 in kicad",+    "send the footprint of ray/xl555 to kicad",+    "show me adom/drone-motor-carrier in kicad 3d",+    "open the wiki project adom/esc-g431 in kicad",+    "install the Adom Basic Parts library into kicad",+    "export gerbers for adom/carrier-fc-rp2350a-mini from kicad"   ],   "webview": {     "title": "KiCad Dashboard",
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "kicad-bridge",-  "version": "1.0.112",+  "version": "1.0.113",   "type": "app",   "description": "Skills for your container so your AI knows how to drive the KiCad bridge. The bridge runtime itself is the release zip; Adom Bridge loads that.",   "tags": [