---
name: adom-tts-publish
description: >-
  Cut and publish a new adom-tts release to THE Adom Wiki. Single source of
  truth for WHERE this app lives (https://wiki.adom.inc/adom/adom-tts — org
  `adom`, slug `adom-tts`) and HOW to ship it with the adom-wiki CLI (adompkg
  and all *.adom.cloud slug hosts are DEPRECATED — never use them). Covers the
  version bump, the test gate, packaging, `adom-wiki pkg publish`, `repo push`
  for source + dev/publish skills, keeping the hero linked, deprecating a bad
  version, and the mandatory verify-in-pup step. Triggers: publish adom-tts,
  release adom-tts, ship adom-tts, bump adom-tts, push adom-tts to the wiki,
  update the adom-tts page, re-link the adom-tts hero.
---

# Publish adom-tts to the wiki

**Where this app lives (memorize):**
- Page: `https://wiki.adom.inc/adom/adom-tts` (org **adom**, slug **adom-tts**, type app)
- Page title: **Adom TTS — Text to Speech** (the hero headline matches it verbatim)
- CLI: **`adom-wiki`** — the ONLY wiki tool. `adompkg`, "wiki v1/v2", and any
  `*.adom.cloud` slug host are DEPRECATED; if a doc says otherwise it is stale.
- The wiki has TWO unsynced layers: the **package registry** (`pkg publish` /
  `pkg install` — what installers get) and the **git page repo** (`repo push` —
  the Files tab, README, dev-skills/, publish-skills/, screenshots). Ship BOTH.

## Release steps

1. **Bump every version file** (any code change = new version; versions are
   immutable on the registry):
   ```bash
   cd /home/adom/project/adom-tts
   echo "X.Y.Z" > VERSION
   sed -i 's/^version = .*/version = "X.Y.Z"/' Cargo.toml
   sed -i 's/"version": "[0-9.]*"/"version": "X.Y.Z"/' package.json page.json
   ```

2. **Gate on tests, build, deploy locally** (see `dev-skills/adom-tts-dev` for
   the full dev cycle and the byte-compare sweep):
   ```bash
   cargo test --release 2>&1 | grep -q "test result: ok" || { echo "TESTS FAILED"; exit 1; }
   ./build.sh && install -m 0755 target/release/adom-tts ~/.local/bin/adom-tts
   ```

3. **Publish the package — the binary ships INSIDE it. NO release uploads.**
   Read the adom-wiki skill carefully: packages are resolved PER PLATFORM and
   the skill's own example says "a Linux consumer installs the package (CLI +
   skills)". Release assets exist ONLY for artifacts fetched OUTSIDE the
   install flow (a Windows installer a laptop downloads directly, pup's bridge
   zip that Adom Desktop fetches itself). adom-tts has no such consumer —
   every user is a Linux container running `pkg install` — so a release for
   adom-tts makes NO sense. (Got this wrong twice: first shipped src+pngs+
   binary in a fat tarball AND a duplicate release; then over-corrected to a
   skills-only tarball with the binary as a release. Correct: lean allowlist
   WITH the binary, zero releases.)
   - package.json `files` allowlist: manifest + install/uninstall scripts +
     `bin/adom-tts` + `skills/**` + `completions/**` (~2.3 MB). NO src/, NO
     pngs (page assets via repo push). dev-/publish-skills auto-excluded.
   ```bash
   adom-wiki pkg pack --json    # VERIFY: ~10 files, ~2.3 MB, bin/adom-tts present
   adom-wiki pkg publish --org adom
   ```
   Then prove the loop: `HOME=$(mktemp -d) adom-wiki pkg install adom/adom-tts`
   and run `$HOME/.local/bin/adom-tts --version` from that fresh home.

4. **Push the source** — README, src/, screenshots, page.json, and the dev +
   publish skills (they reach the page ONLY via repo push; the Skills tab shows
   them under its Dev / Publish sub-tabs):
   ```bash
   adom-wiki repo push adom/adom-tts -m "vX.Y.Z — <changelog>"
   ```

5. **Keep the hero linked.** The hero lives in `page.json` ONLY (never embed it
   in the README):
   ```json
   "hero": { "type": "image", "path": "screenshots/hero-v3.png" }
   ```
   If a publish/step ever clobbers page metadata, re-push `page.json` LAST and
   re-check the page header. Regenerate the hero itself with the
   `adom-wiki-hero` skill (fresh REAL player screenshot, bleed-bottom/midnight,
   title = the page title verbatim).

6. **Verify live — in pup, always** (never claim published without looking):
   ```bash
   adom-desktop --target <laptop> browser_open_window '{"sessionId":"wiki-check","url":"https://wiki.adom.inc/adom/adom-tts?cb=<epoch>"}'
   adom-desktop --target <laptop> browser_screenshot '{"sessionId":"wiki-check"}'   # read the PNG it saves
   ```
   Check: version, hero renders, Skills tab shows User + Dev + Publish tiers,
   README intact, Install command correct, and NO EMOJIS anywhere in the README
   or skills (user rule — plain typographic marks only).

7. **Prove playback end-to-end** (the release isn't done until a human can
   hear it):
   ```bash
   adom-tts say "release X.Y.Z verification" --out /tmp/rel.mp3 --thread release --play --confirm
   # must print: ✓ CONFIRMED
   ```

## Stale things get DELETED, not deprecated (user rule, pre-launch)

We have not launched: leaving "[DEPRECATED]" garbage around is worse than
removing it. A bad package VERSION: fix, bump, republish (registry versions are
immutable; the new version supersedes). A stale PAGE, hero, or file: delete it
outright — `adom-wiki repo rm <ref> <path>` for files, `adom-wiki repo delete
<ref> --hard --confirm` for whole pages. Only reach for deprecation notices
after we launch and third parties depend on things.

## Skills live IN this repo (user rule)

Never create a standalone wiki skill page that just points at adom-tts — all
skills associated with the app belong in THIS repo's tiers (skills/,
dev-skills/, publish-skills/) so they version and ship with the app. Example:
tts-pronunciation was a scattered standalone page and is now
skills/tts-pronunciation/ here. The one sanctioned standalone is
adom/hands-free — a cross-cutting trigger router, kept deliberately thin.

## A rename is not just a slug change

Renaming a page = slug + title + brief/description + SKILL.md name +
install paths + discovery triggers + THE HERO (the old pixels carry the old
name — regenerate it with the adom-wiki-hero skill) + deleting old-name art
and directories everywhere (wiki files, ~/.claude/skills, installers). The
im-driving → hands-free rename missed the hero on the first pass; don't
repeat that.

## Distribution notes

- Other containers pick the release up via their wiki auto-update hook; inside
  THIS container run the byte-compare sweep (dev skill) so every copy matches.
- The running drainer self-supersedes to the new version on the next
  `say --play` — do not kill it.
