Adom Wiki Skill Pack
Public Unreviewedby John Lauer
How to use the Adom Wiki without breaking pages — the wiki is six tools in one (git, adompkg, releases, discussions, PRs, discovery), and three repo archetypes have emerged from real use: Page, Skillpack, and Family. Plus how to publish rich component pages (chips, molecules, boards). One install, 15 skills, plus a write-up of the design patterns for the people who build the wiki.
name: wiki-publish-safely description: >- The hard rules and operational pitfalls for editing Adom Wiki pages (wiki.adom.inc) without breaking them — write both storage layers, never base64 a text file, versions are immutable, soft-delete blocks re-creation, the hero gets clobbered on publish, rate limits, and the non-negotiable verify-in-pup step. Read this before AND after any publish, file push, README change, or metadata edit. Trigger words: wiki publish broke the page, page shows placeholder, readme is gibberish, files tab empty, hero disappeared, hero unlinked, UNIQUE constraint pages, immutable version, adompkg 429, ghost page, verify wiki in pup, wiki publish checklist, don't break the wiki page.
Parent skill: adom-wiki-skillpack
Publishing to the wiki without breaking the page
Every item here is a real incident that recurs. Treat them as hard rules. The mechanics live in wiki-api; this is the "don't shoot yourself in the foot" companion.
The five rules that prevent broken pages
Write BOTH layers, every publish. Git repo (
POST /files) and package registry (adompkg publish). Only one → the page is broken (placeholder Files tab, or a README that won'tadompkg install). See wiki-anatomy.The hero gets clobbered — re-push
page.jsonLAST.adompkg publishoverwrites the repo'spage.jsonwith the package manifest, which has nohero— so the page-header hero is unlinked on every publish. The PNG is NOT deleted; only its reference is dropped. Fix: publish first, then push a completepage.json(withhero:{type:"image",path:"screenshots/hero.png"}, title, brief, tags) as the final commit, and confirmGET /api/v1/pages/<slug>showshero_pathset. Full detail → wiki-hero. The same clobber resets the page title and brief to the package values — the completepage.jsonre-push restores those too. Two title traps: (a) put atitlein package.json as well — the manifest has none by default, so the clobber resets the title to the bare slug; (b) the title must be a human, descriptive name — NEVER the slug echo (Wiki Hero Image Skill, notadom-wiki-hero-image). Cards, search, the homepage, and the screensaver all show the title; nobody reads slugs. → wiki-repo-styles / wiki-family.Text is plain; only binaries are base64. Base64-encoding a
.md/.json/.shmakes the wiki store the base64 string as the file content → README renders as gibberish. Images/fonts/archives go base64; everything else plain.Versions are immutable; never delete-and-recreate. Once
0.1.0is published it can't be overwritten —adompkg version patchbefore republishing changed source. AndDELETE /pages/:slugonly soft-deletes (setsdeleted_at), after which republishing the same slug fails withUNIQUE constraint failed: pages.owner, pages.slug. Bump the version instead of deleting. (Hard purge exists —DELETE /pages/<slug>?hard=true— but it's irreversible and rarely the right move.)Verify with your eyes — open the live page in pup. After ANY wiki edit (publish, file push, metadata/README/hero change, even a one-file fix), open the page in a pup window on the user's laptop and screenshot-confirm it rendered. Do not report a wiki edit as done from API JSON alone.
OWNER=john; SLUG=my-page; LAP=AdomLapper # `adom-desktop status` shows the laptop host adom-desktop browser_open_window \ "{\"sessionId\":\"wiki\",\"profile\":\"wiki\",\"url\":\"https://wiki.adom.inc/$OWNER/$SLUG\"}" \ --target "$LAP" sleep 3 adom-desktop browser_screenshot '{"sessionId":"wiki","maxWidth":1500}' --target "$LAP" # Read the screenshot; confirm it rendered before telling the user it's done.Reuse
sessionId:"wiki"/profile:"wiki"every time so the login persists;browser_navigatean already-open window rather than spawning new ones.
Never show the hero twice
The page header renders the hero from page.json automatically. Do NOT also
embed the hero image in the README body — the human would see the same image
twice, back to back. It's the most common README mistake on the wiki. Inline
README images must be other screenshots/diagrams. Before publishing, grep the
README for the hero filename and delete any line that references it. → wiki-readme.
Other gotchas
- Cloudflare WAF blocks Python urllib/requests without a
User-Agent→ sendUser-Agent: adompkg/2.1.0. curl sends its own UA and is fine. - Publish-only pages create ghost rows.
adompkg publishwithout firstPOST /pagesmakes a tarball but no git repo; a laterPOST /filesthen inserts a second page row (a duplicate on the listing). Always create the page first. - Rate limit: ~10 publishes/minute → HTTP 429. Space them or retry.
- Search hyphen bug: FTS reads
-as a column operator (chip-fetcher→ "no such column: fetcher"). Most slugs have hyphens; expect this until fixed. - Inline images need HEAD support on
/blob/routes — a known wiki bug means<img>can 404 on preflight even though the tag is correct. Verify visually.
The publish checklist
-
package.json: version bumped,files[]complete,dependenciesset - Page created (first time only) via
POST /pages -
adompkg publishsucceeded (tarball in registry) - ALL source pushed to git (text plain, binaries base64, UA header)
- Complete
page.jsonpushed LAST →hero_path, title, brief restored - Title is descriptive, NOT the slug (and
titleis set inpackage.jsontoo, so publish won't reset it to the slug) - README does NOT embed the hero image (page header shows it already)
- Opened in pup + screenshot read: README renders, Files tab full, hero shows
-
adompkg info <slug>shows the right version + dependencies
---
name: wiki-publish-safely
description: >-
The hard rules and operational pitfalls for editing Adom Wiki pages
(wiki.adom.inc) without breaking them — write both storage layers, never
base64 a text file, versions are immutable, soft-delete blocks re-creation, the
hero gets clobbered on publish, rate limits, and the non-negotiable verify-in-pup
step. Read this before AND after any publish, file push, README change, or
metadata edit. Trigger words: wiki publish broke the page, page shows
placeholder, readme is gibberish, files tab empty, hero disappeared, hero
unlinked, UNIQUE constraint pages, immutable version, adompkg 429, ghost page,
verify wiki in pup, wiki publish checklist, don't break the wiki page.
---
Parent skill: **adom-wiki-skillpack**
# Publishing to the wiki without breaking the page
Every item here is a real incident that recurs. Treat them as hard rules. The
mechanics live in **wiki-api**; this is the "don't shoot yourself in the foot"
companion.
## The five rules that prevent broken pages
1. **Write BOTH layers, every publish.** Git repo (`POST /files`) *and* package
registry (`adompkg publish`). Only one → the page is broken (placeholder Files
tab, or a README that won't `adompkg install`). See **wiki-anatomy**.
2. **The hero gets clobbered — re-push `page.json` LAST.** `adompkg publish`
overwrites the repo's `page.json` with the package manifest, which has **no
`hero`** — so the page-header hero is unlinked on every publish. The PNG is NOT
deleted; only its reference is dropped. **Fix:** publish first, then push a
*complete* `page.json` (with `hero:{type:"image",path:"screenshots/hero.png"}`,
title, brief, tags) as the final commit, and confirm
`GET /api/v1/pages/<slug>` shows `hero_path` set. Full detail → **wiki-hero**.
The same clobber resets the page **title and brief** to the package values —
the complete `page.json` re-push restores those too. Two title traps: (a) put a
`title` in **package.json** as well — the manifest has none by default, so the
clobber resets the title to the bare **slug**; (b) the title must be a
**human, descriptive name — NEVER the slug echo** (`Wiki Hero Image Skill`, not
`adom-wiki-hero-image`). Cards, search, the homepage, and the screensaver all
show the title; nobody reads slugs. → **wiki-repo-styles** / **wiki-family**.
3. **Text is plain; only binaries are base64.** Base64-encoding a `.md`/`.json`/
`.sh` makes the wiki store the base64 string as the file content → README
renders as gibberish. Images/fonts/archives go base64; everything else plain.
4. **Versions are immutable; never delete-and-recreate.** Once `0.1.0` is
published it can't be overwritten — `adompkg version patch` before republishing
changed source. And `DELETE /pages/:slug` only *soft*-deletes (sets
`deleted_at`), after which republishing the same slug fails with
`UNIQUE constraint failed: pages.owner, pages.slug`. Bump the version instead
of deleting. (Hard purge exists — `DELETE /pages/<slug>?hard=true` — but it's
irreversible and rarely the right move.)
5. **Verify with your eyes — open the live page in pup.** After ANY wiki edit
(publish, file push, metadata/README/hero change, even a one-file fix), open
the page in a pup window on the user's laptop and screenshot-confirm it
rendered. Do not report a wiki edit as done from API JSON alone.
```bash
OWNER=john; SLUG=my-page; LAP=AdomLapper # `adom-desktop status` shows the laptop host
adom-desktop browser_open_window \
"{\"sessionId\":\"wiki\",\"profile\":\"wiki\",\"url\":\"https://wiki.adom.inc/$OWNER/$SLUG\"}" \
--target "$LAP"
sleep 3
adom-desktop browser_screenshot '{"sessionId":"wiki","maxWidth":1500}' --target "$LAP"
# Read the screenshot; confirm it rendered before telling the user it's done.
```
Reuse `sessionId:"wiki"` / `profile:"wiki"` every time so the login persists;
`browser_navigate` an already-open window rather than spawning new ones.
## Never show the hero twice
The page header renders the hero from `page.json` automatically. **Do NOT also
embed the hero image in the README body** — the human would see the same image
twice, back to back. It's the most common README mistake on the wiki. Inline
README images must be *other* screenshots/diagrams. Before publishing, grep the
README for the hero filename and delete any line that references it. → **wiki-readme**.
## Other gotchas
- **Cloudflare WAF blocks Python urllib/requests without a `User-Agent`** →
send `User-Agent: adompkg/2.1.0`. curl sends its own UA and is fine.
- **Publish-only pages create ghost rows.** `adompkg publish` without first
`POST /pages` makes a tarball but no git repo; a later `POST /files` then
inserts a *second* page row (a duplicate on the listing). Always create the
page first.
- **Rate limit: ~10 publishes/minute** → HTTP 429. Space them or retry.
- **Search hyphen bug:** FTS reads `-` as a column operator (`chip-fetcher` →
"no such column: fetcher"). Most slugs have hyphens; expect this until fixed.
- **Inline images need HEAD support** on `/blob/` routes — a known wiki bug means
`<img>` can 404 on preflight even though the tag is correct. Verify visually.
## The publish checklist
- [ ] `package.json`: version bumped, `files[]` complete, `dependencies` set
- [ ] Page created (first time only) via `POST /pages`
- [ ] `adompkg publish` succeeded (tarball in registry)
- [ ] ALL source pushed to git (text plain, binaries base64, UA header)
- [ ] **Complete `page.json` pushed LAST** → `hero_path`, title, brief restored
- [ ] **Title is descriptive, NOT the slug** (and `title` is set in `package.json` too, so publish won't reset it to the slug)
- [ ] README does NOT embed the hero image (page header shows it already)
- [ ] Opened in pup + screenshot read: README renders, Files tab full, hero shows
- [ ] `adompkg info <slug>` shows the right version + dependencies