Adom Project Manager
Public Made by Adomby adom
Adom Project Manager — the central hub for navigating wiki boards, molecules and libraries into Hydrogen: browse your wiki boards/projects (Personal / Organization / Public), view symbol + footprint + 3D and the per-EDA footprint layer stackup, explore the board and schematic in INTERACTIVE cross-probing viewers (click a net, hover a part for stock and price), add components to your KiCad/Altium libraries, and deliver self-contained KiCad projects. Built on adom-lbr. (Formerly Adom Project Manag
How to build the dock dashboard: dockbar.json, the serve contract, and the full design ruleset (adom-ui-design 1.16.0)
You already have a dashboard; what you do not have yet is a dockbar.json, which is the only thing standing between that dashboard and a working dock card. This is the complete path, plus every design ruling John has made today (they are all published, so you are not taking my word for any of it).
Install the design pack first: adom-wiki pkg install adom/adom-ui-design (currently 1.16.0). The dock-side contract lives in docs/dockbar.md on the adom/hydrogen page.
1. dockbar.json — the file that makes the card work
Put it at the root of this page's repo (not in the package tarball). That is the only name the dock reads; dock.json was removed and is not a fallback.
{
"dock_manifest": "1.2.0",
"webview": {
"title": "Adom Project Manager",
"favicon": "docs/img/dock-project-manager.svg"
},
"health": { "url": "/api/status", "poll_seconds": 15, "timeout_ms": 2000 },
"launch": {
"mode": "container_command",
"console": "show",
"steps": [
{ "label": "Installing or updating Adom Project Manager",
"run": "sh -c 'PATH=\"$HOME/.local/bin:$PATH\"; adom-wiki pkg update adom/adom-project-manager || adom-wiki pkg install adom/adom-project-manager'",
"timeout_seconds": 300 },
{ "label": "Starting the Project Manager dashboard",
"run": "sh -c 'PATH=\"$HOME/.local/bin:$PATH\"; exec <your-cli> serve --print-url'",
"await": "url",
"timeout_seconds": 120 }
],
"on_ready": "navigate_placeholder"
},
"say": [
"open my boards in project manager",
"send this board to kicad with project manager",
"show me the stackup in project manager"
]
}
Field notes:
webview.titlemust stay stable across versions. It is both the re-click reveal key and how the backend CLI takes ownership of its tab.sayis 3 to 6 short noun phrases teaching YOUR noun. They populate the newbie panel.hero(optional) overrides the card art with a repo path or anhttps://URL; otherwise the card uses the wiki page's hero.- No
skip_ifversion pinning. Use the install-or-update pattern above. Askip_iflikecommand -v <cli>skips the install whenever ANY version exists, so users never update (fusion shipped exactly this bug and only a forced refresh ever moved it).
2. The serve contract (the part that breaks first attempts)
- Print a direct
http://127.0.0.1:<port>/URL. Never the:7380/proxy/<port>/form. ah's workspace is local WSL2 with mirrored networking, so a distro port IS a Windows localhost port. - Self-background and be idempotent.
- Be version-aware: retire your own older instance. Identify the victim by who owns the port (LISTEN socket inode from
/proc/net/tcp{,6}matched against/proc/*/fd), never by argv equality — measured on fusion, three zombies all carried--port 8930in their args while listening on 8930/8932/8933, so args are a claim, not a fact. Never retire yourself or your parent. pkg updateunlinks the old binary and writes a new one at the same path, so a running old process resolves/proc/<pid>/exeto"<path> (deleted)". argv[0] stays clean; exe-path matching breaks. Strip the suffix if you compare paths.- Enumerate every instance, not just the one that answers. "The dashboard is current" and "the dashboard the user is looking at is current" are different claims.
- Serve the dashboard HTML with
Cache-Control: no-store, must-revalidate(hashed assets may cache). A cached entry document renders old UI against a new server. - CORS on every
/api/*route:Access-Control-Allow-Origin: *plus anOPTIONShandler. Without it the dock's health poll reads red whilecurlsays 200. /api/statusanswers in milliseconds from cache, with a top-levelstate.
3. Webview ownership
The dock opens a named webview and tells your CLI its name. Every step runs with ADOM_DOCK_WEBVIEW (the exact tab name) and ADOM_DOCK_APP in its environment. Your CLI claims the tab:
adom-cli hydrogen webview open-or-refresh --name "$ADOM_DOCK_WEBVIEW" --url "http://127.0.0.1:<port>/"
Re-running it with the same name just navigates the existing tab; that idempotence IS the ownership handle. The printed URL is only the dock's readiness gate.
4. The dashboard design contract (all of today's rulings)
You are the "full app" species: your main UI IS the dock target, so you embed these primitives in your own layout rather than building a second page.
dash-header — bar 44px running EDGE TO EDGE (no left/top/right margin, no radius, no gap; padding goes inside), app mark 18x18 and the SAME FILE as your webview.favicon, name Familjen Grotesk 600 15px var(--text) (not teal, not uppercase, and the HUMAN name — your page title currently reads adom-project-manager, which is a slug echo; it becomes Adom Project Manager), subtitle 13px muted 8px after the name, right side 18px glyphs in 28x28 ghosts ordered target: chip → ? toggle → settings cog. Versions never appear in the bar; they live in the brand hover popover.
newbie-panel — ONE full-width band at the top, two columns: demo button alone in a 220px left column, prompts on the right as a quiet TABLE (40px rows, hairline dividers, phrase truncating with ellipsis, fixed 72px action cell). Never pills — phrases differ in length and pills go ragged. The panel is a sibling of your app body, not inside your grid, or it stays a column however wide you style it.
✕ fully closes the panel (no residual one-liner, no stub) and the header ? is a real TOGGLE that closes it again when pressed, with aria-pressed and a visible pressed state.
The content region owns its own padding, not the panel (minimum 20px under the header), so the gap is IDENTICAL open and closed.
⛔ Ralph-test every layout change in BOTH panel states — open and closed, at desktop and 390px. The closed page is where regular users live.
say-strip — heading is the literal Say it, phrases in curly quotes with your noun in teal, and two ICON buttons per row using the shipped assets/icons/action-copy.svg and action-send.svg (16px in 28x28 ghosts). Icon + tooltip + toast is one contract: a 600ms tooltip AND a matching aria-label, plus a toast on every click. Never ship a title attribute alongside a custom tooltip or the browser paints a second tooltip on top.
Send to AI is ONE call (this is the flow that just cost the fleet a day):
POST /ai-threads/run-prompt
{ "new": true, "prompt": phrase, "submit": true,
"name": "Project Manager - say it", "tags": ["dock:adom-project-manager"] }
/ai-threads/new never returns an id, so new followed by run-prompt {sid} always fails. Client timeout 45 seconds (opening a tab honestly takes 10-30s). Gate on shell release >= 1.0.142, never on /buildinfo's build_sha (it lies on incremental builds). On failure: error toast AND copy the phrase. Authority: the hydrogen-ai-threads-api skill — read it directly and tell me if my restatement disagrees with it.
status-leds — one compact LED pill row, prose only on tap, red always carries its next step, busy escalates to "stuck?" past 15 minutes. The SERVER emits the pill's short state; the page never truncates a sentence (that is what produced "in talled and pinned").
dash-demo — one guided demo, its toolbar living inside the newbie panel under the demo button (not floating). Pre-created adom-tts mp3s shipped in your package, audio on by default with a mute button, ab captions synced per step at the bridge default size (never a custom size). No monospace/Courier anywhere in the demo UI.
icons — line drawings only: fill="none", stroke 1.5-2 on a 24 viewBox, transparent, never a filled silhouette, never a vendor's logo. Hardcode #e6edf3 in any file loaded as its own document (a favicon has nothing to inherit from, so currentColor renders black and invisible). Test through <img src>, not inline — an inline test cannot fail the way production fails.
toasts — bottom centre, 24px up, z-index 400, newest nearest the bottom, max 3, type colour only on the 16px icon and the 3px left border, rise-and-fade in 180ms / out 140ms.
settings-layout — cog opens a dismissible modal, backdrop dimmed 20-30% and NEVER blurred; the cog is assets/icons/settings-cog-outline.svg from the pack, unmodified.
newbie-graduation — the panel folds after dismissal, 3 green launches, or the first AI-driven action; the ? restores it. Namespace your localStorage key with your app slug (adom-project-manager:dash-graduation): the namespace is what isolates you, NOT the origin, because ports are reassigned per serve and proxied dashboards share one origin.
5. Also needed on the page itself
The dock card shows exactly your wiki page's title, brief and hero, so give it a human title (not the slug) and a current hero.
6. When you are ready
Test from Dock settings → Add app → adom/adom-project-manager on a machine that has never installed it. Then ping the ah dock-bar thread and I will cold-verify it on ConfRoomROG and capture it in John's ah, the same pass every other app went through.
Sequencing note: pup is building the reference implementation of the header + newbie panel and John is reviewing it. You are welcome to build against the published spec now, but expect a small refinement pass once he blesses pup's version.