← Commit history
Cargo.lock+1−1
@@ -10,7 +10,7 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"  [[package]] name = "adom-usb"-version = "0.3.0"+version = "0.3.2" dependencies = [  "base64",  "clap",
Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "adom-usb"-version = "0.3.1"+version = "0.3.2" edition = "2021" description = "Adom USB device mesh — see every USB device across the Adom ecosystem (laptop, WSL2, cloud container, Azure VM, workcells) and mount/unmount/reset/test/sniff it from one dashboard" license = "MIT"
VERSION+1−1
@@ -1 +1 @@-0.3.1+0.3.2
package.json+3−3
@@ -1,8 +1,8 @@ {   "slug": "adom-usb",-  "version": "0.3.1",+  "version": "0.3.2",   "type": "app",-  "description": "See every USB device across the entire Adom ecosystem — laptop, WSL2 / Hydrogen Desktop, cloud container, Azure VM, workcells — in one dashboard, and mount / unmount / reset / test / force-class / sniff any of them. USB/IP slingshot for the whole mesh.",+  "description": "See every USB device across the entire Adom ecosystem \u2014 laptop, WSL2 / Hydrogen Desktop, cloud container, Azure VM, workcells \u2014 in one dashboard, and mount / unmount / reset / test / force-class / sniff any of them. USB/IP slingshot for the whole mesh.",   "dependencies": {},   "tags": [     "usb",@@ -31,4 +31,4 @@     "README.md",     "screenshots/**"   ]-}+}\ No newline at end of file
page.json+11−36
@@ -2,36 +2,20 @@   "type": "app",   "slug": "adom-usb",   "title": "Adom USB",-  "brief": "See every USB device across the entire Adom ecosystem \u2014 laptop, WSL2, cloud container, Azure VM, workcells \u2014 in one dashboard, and mount / unmount / reset / test / force-class / sniff any of them. USB/IP slingshot for the whole mesh.",+  "brief": "See every USB device across the entire Adom ecosystem — laptop, WSL2, cloud container, Azure VM, workcells — in one dashboard, and mount / unmount / reset / test / force-class / sniff any of them. USB/IP slingshot for the whole mesh.",   "visibility": "public",-  "hero": {-    "type": "image",-    "path": "screenshots/hero.png"-  },-  "install": {-    "binary_name": "adom-usb"-  },+  "hero": { "type": "image", "path": "screenshots/hero.png" },+  "install": { "binary_name": "adom-usb" },   "metadata": {     "repo": "adom-inc/adom-usb",-    "version": "0.3.1",+    "version": "0.3.2",     "discovery_triggers": [-      "usb devices",-      "usb dashboard",-      "list usb",-      "mount usb",-      "attach usb",-      "usbip",-      "slingshot usb",-      "mount my dev board",-      "rp2040 to wsl2",-      "mount device to container",-      "usb mesh",-      "where is my usb device",-      "force hid",-      "sniff usb",-      "usb passthrough"+      "usb devices", "usb dashboard", "list usb", "mount usb", "attach usb",+      "usbip", "slingshot usb", "mount my dev board", "rp2040 to wsl2",+      "mount device to container", "usb mesh", "where is my usb device",+      "force hid", "sniff usb", "usb passthrough"     ],-    "discovery_pitch": "One dashboard for every USB device across your laptop, WSL2 / Hydrogen Desktop, cloud container, Azure VM, and workcells \u2014 mount any device onto any host, then reset / test / force-class / sniff it.",+    "discovery_pitch": "One dashboard for every USB device across your laptop, WSL2 / Hydrogen Desktop, cloud container, Azure VM, and workcells — mount any device onto any host, then reset / test / force-class / sniff it.",     "releases": {       "adom_docker": {         "asset_name": "adom-usb",@@ -39,14 +23,5 @@         "install_hint": "adompkg install adom-usb"       }     }-  },-  "tags": [-    "usb",-    "usbip",-    "device-mesh",-    "hydrogen-desktop",-    "dashboard",-    "open-source"-  ],-  "license": "MIT"-}\ No newline at end of file+  }+}
skills/adom-usb-publish/SKILL.mdadded+72
@@ -0,0 +1,72 @@+---+name: adom-usb-publish+description: >+  How to publish or republish adom-usb and its plugins to the Adom Wiki+  (wiki.adom.inc). Carries the naming + hero + publish-order conventions for the+  whole Adom USB family so they travel with the repo. Use when: release adom-usb,+  publish adom-usb, cut an adom-usb version, publish an adom-usb plugin, add a new+  USB sniffer/firmware plugin to the wiki, fix an adom-usb hero, rename a plugin+  title. Trigger words: publish adom-usb, release adom-usb, bump adom-usb, adom-usb+  plugin publish, adom-usb wiki, adom-usb hero, name an adom-usb plugin.+---++# Publishing Adom USB (app + plugins) to the wiki++The canonical wiki is **https://wiki.adom.inc** via `adompkg` (see the+`adom-wiki-v2` skill for the general flow). This skill pins the conventions that+keep the Adom USB family consistent. Follow them every time.++## 1. Naming — every family member announces it's Adom USB++Users meet plugins out of context (a wiki card, a search hit, a billboard in the+adom-screensaver), so the relationship must be obvious without reading the slug:++- **Slug**: `adom-usb-<kind>-<chip>` — e.g. `adom-usb-stub-rp2040`,+  `adom-usb-sniffer-cdc`. Dash separators; never a colon (illegal in slugs).+- **Title** (the human name shown on cards / search / screensaver — the one that+  matters; nobody reads slugs): MUST lead with **`Adom USB`** and use a **plain+  ASCII hyphen with spaces** as the separator — `Adom USB - RP2040 persona pack`,+  `Adom USB - CDC serial sniffer`. **NEVER an em-dash (—)** — keep it identical to+  the sibling packages. A bare title like "RP2040 persona pack" hides the family.+- **Hero billboard**: carry the family chip `ADOM-USB · FIRMWARE` /+  `ADOM-USB · SNIFFER` (built per the `adom-wiki-hero-image` skill).+- **Tag/keyword**: include `adom-usb-plugin` so `adom-usb plugins search` finds it.++## 2. The hero gotcha — push page.json LAST++The page-header hero renders from the DB `hero_type`/`hero_path`, which the wiki+indexer derives from the repo's **`page.json` `hero:{type,path}`**.+**`adompkg publish` OVERWRITES `page.json` in the repo with the package manifest+(which has no `hero`), clobbering the hero on every publish.** So the order is:++1. `adompkg publish` (the tarball / registry step) FIRST.+2. THEN push a **complete** `page.json` (type, slug, **title**, brief, version,+   visibility, `hero:{type:"image",path:"screenshots/hero.png"}`, install,+   tags, license, metadata) to `POST /api/v1/pages/<slug>/files` as the LAST+   step. That re-indexes and sets `hero_path`. Verify:+   `GET /api/v1/pages/<slug>` → `hero_type:"image", hero_path:"screenshots/hero.png"`.++## 3. App-page requirements (the wiki rejects publishes missing these)++`type:"app"`, top-level `version`, `install.binary_name`, a hero (page.json ++push the PNG to `screenshots/hero.png`), a `SKILL.md` (root or `skills/<slug>/`),+and a non-empty `tags` array.++## 4. Publish steps++```bash+export ADOMPKG_REGISTRY=https://wiki.adom.inc+# org packages (canonical) — publish into the adom org, not your personal namespace:+adompkg publish --org adom -y+# downloadable per-platform binary (adds the "Download for your machine" button):+adompkg release upload adom/<slug>@<ver> ./bin/<bin> --platform linux+# push source + a complete page.json (with title + hero) to the git layer LAST.+```++For the main app, also: bump VERSION/Cargo.toml/package.json/page.json together,+`cargo build --release`, GitHub release, then the steps above.++## 5. After ANY title/hero/page.json change — verify the card++`GET /api/v1/pages/<slug>` and confirm `title` leads with `Adom USB - …` and+`hero_path` is set; the card/search/screensaver read those fields.
skills/adom-usb/SKILL.md+1−1
@@ -80,7 +80,7 @@ at a glance it's part of Adom USB:   `adom-usb-sniffer-cdc`. (Dash, not colon — colons are illegal in slugs.) - **Page title** (the human-readable name shown on cards / search / the   screensaver — this is the one that matters): MUST **lead with "Adom USB"** —-  e.g. `Adom USB — RP2040 persona pack`, `Adom USB — CDC serial sniffer`. A bare+  e.g. `Adom USB - RP2040 persona pack`, `Adom USB - CDC serial sniffer`. A bare   title like "RP2040 persona pack" hides the relationship; the slug only appears   in the install command and **nobody reads slugs**. - **Hero billboard**: carry the `ADOM-USB · FIRMWARE` / `ADOM-USB · SNIFFER`
src/install.rs+12−7
@@ -9,18 +9,23 @@ use std::path::PathBuf; // should fetch SKILL.md from the wiki as the primary source; this baked copy is // only the offline fallback when the wiki is unreachable. const SKILL_MD: &str = include_str!("../skills/adom-usb/SKILL.md");+// The wiki-publish skill travels with the repo so the naming/hero/publish+// conventions for the whole Adom USB family are never lost.+const PUBLISH_SKILL_MD: &str = include_str!("../skills/adom-usb-publish/SKILL.md"); -fn skills_dir() -> PathBuf {+fn skills_root() -> PathBuf {     let home = std::env::var("HOME").unwrap_or_else(|_| "/root".into());-    PathBuf::from(home).join(".claude/skills/adom-usb")+    PathBuf::from(home).join(".claude/skills") }  pub fn install() -> Result<(), String> {-    let dir = skills_dir();-    fs::create_dir_all(&dir).map_err(|e| format!("create {}: {}", dir.display(), e))?;-    let dest = dir.join("SKILL.md");-    fs::write(&dest, SKILL_MD).map_err(|e| format!("write {}: {}", dest.display(), e))?;-    ok(format!("installed skill → {}", dest.display()));+    for (name, body) in [("adom-usb", SKILL_MD), ("adom-usb-publish", PUBLISH_SKILL_MD)] {+        let dir = skills_root().join(name);+        fs::create_dir_all(&dir).map_err(|e| format!("create {}: {}", dir.display(), e))?;+        let dest = dir.join("SKILL.md");+        fs::write(&dest, body).map_err(|e| format!("write {}: {}", dest.display(), e))?;+        ok(format!("installed skill → {}", dest.display()));+    }     note!("  run `adom-usb app --demo` to open the dashboard");     Ok(()) }
wiki/page.json+1−1
@@ -5,7 +5,7 @@   "brief": "See every USB device across the entire Adom ecosystem \u2014 laptop, WSL2, cloud container, Azure VM, workcells \u2014 in one dashboard, and mount / unmount / reset / test / force-class / sniff any of them. USB/IP slingshot for the whole mesh.",   "metadata": {     "repo": "adom-inc/adom-usb",-    "version": "0.3.0",+    "version": "0.3.2",     "releases": {       "adom_docker": {         "asset_name": "adom-usb",