CodeNomad/docs/help/en/extensions.md
Pascal André c0d53f13d4
docs(help): multilingual help site with in-app Help menu and palette entry (#859)
## Summary

A complete public CodeNomad help site in the app's ten languages,
published on GitHub Pages (https://neuralnomadsai.github.io/CodeNomad/)
and opened from the app.

- **Content:** 25 pages in 8 sections (Start, Workflows, OpenCode setup,
Remote access, Customize, Extensions, Desktop, Help), written for
OpenCode power users and covering the current version only. It includes
everything user-relevant from `README.md`, `packages/server/README.md`
(server, network, auth, TLS, Remote Control) and the user-facing
dev-docs, with flags, defaults, labels and safety boundaries checked
against source.
- **Languages:** en, fr, de, es, he (RTL), ja, ne, ru, tr, zh-Hans.
Interface labels reuse each locale's own app strings; native desktop
menu names, code, commands, flags, paths and anchors stay unchanged.
- **Site:** `scripts/build-help.mjs` renders
`docs/help/<locale>/<slug>.md` with translated chrome
(`docs/help/i18n/`), stable `{#id}` anchors identical across locales,
same-article language links with hreflang, a root language chooser, and
a first-party offline per-locale search (Ctrl/⌘+K, substring matching
for CJK, Devanagari and Hebrew, hidden without JS). No analytics or
remote resources.
- **Validation:** `npm run test:help` fails on any missing page or
string, heading drift, broken link/anchor/asset or invalid search
target. `.github/workflows/help-pages.yml` validates PRs and deploys
only from `dev`.
- **App entry points:** one `open-help` command for the palette and a
new **CodeNomad Help** item at the top of the Electron and Tauri Help
menus. It opens the help in the invoking window's UI language through
the existing external opener, falls back to the root URL for windows
without the handler, and reports failures without replay.
- Documents the strict boolean environment-variable rule from #959 and
the updater entry points from #960.

## Review

Delivered as a CodeNomad mission with independent review loops, each to
zero findings:
- English content audit (5 passes, 14 fixes) and technical gatekeeper (2
passes) before translation.
- After translation: QA, UX review, and a final multilingual gatekeeper
(35 translation/label findings fixed, then verified), plus a visual fix
for the search focus ring and a verified sync with #960.

## Validation

- `npm run test:help`: 9/9 (25 pages × 10 locales, strict, including
negative tests); `npm run build:help`: 250 pages.
- `node scripts/test-help-browser.mjs`: 44/44; Playwright: 500 page
visits at 390 and 1280 px, all locales, no overflow, no external
requests.
- UI help-command and desktop-updates browser tests 19/19; help URL unit
tests; Electron menu tests; UI and Electron typechecks; Tauri `cargo
test` 272/272.
2026-10-14 22:44:56 +02:00

5.3 KiB

Panel extensions

Browse installed and online extensions

  1. Open Customize right panel in the right-panel tab bar.
  2. Expand Extensions below the separator.
  3. Use Search extensions to search the single list of installed addons and the official online catalogue. Hover or focus an entry for its metadata.

The disclosure starts collapsed each time the customization popup opens. Installed and online entries are combined by extension ID; there is no separate manager window or installed/online mode. Browsing catalogue metadata does not download or execute the author's panel code. The catalogue is maintained in CodeNomad Extensions; inclusion and claimed author names are not signatures or proof of trust.

If the catalogue is unavailable, installed extensions and Install from ZIP… remain available. Refresh to retry discovery. Collapsing or dismissing the popup abandons its pending review/confirmation UI; it does not silently install anything.

Review and install disabled

  1. Choose Install… on a catalogue entry, or Install from ZIP… for a package you obtained separately.
  2. Review the package ID, author, repository, version, API/permissions and SHA-256 digest. Expand technical details when needed.
  3. Verify the publisher and, where available, compare the digest through a trusted channel.
  4. Only if you trust the code, select I trust this package and its author, then Install disabled.

Inspection downloads/revalidates the selected package; author code is not executed by inspection. A digest identifies exact bytes, not the author's identity. Catalogue packages come from the exact declared GitHub release asset, not an arbitrary URL. Manual packages are ZIPs containing only manifest.json and self-contained panel.html; invalid or unsupported packages are rejected.

Installation needs no OpenCode restart and never grants activation automatically. A failed validation, conflict or storage operation does not authorize a retry with different bytes. Reinspect the package before a new installation attempt.

Activate and understand the scope

  1. Return to the addon row above the Extensions disclosure in Customize right panel. Installed disabled addons remain in that list.
  2. Select its checkbox to activate it. Clear that same checkbox to disable it.

That checkbox is the only activation control: there is no extra manager switch or per-window visibility gate. Activation is configuration-wide across projects, not per folder. On a remote connection it affects the server's installed extension store, not just your viewing device.

The extension store is panel-extensions/ beside the selected CodeNomad configuration. Separate desktop data profiles do not isolate extensions when those profiles use the same configuration directory. Conversely, opening a different configuration is not a grant to run an addon installed elsewhere. See Desktop windows and data for the distinction.

An enabled panel can mount when selected; hiding it can dispose its temporary UI state. Disabling revokes its activation. Reset in customization only restores built-in layout and does not enable, disable or uninstall extensions.

Replace or remove

  1. Use Change version… or inspect another ZIP with the same ID to replace an installed package.
  2. Review the new digest and permissions, acknowledge trust, then install it disabled.
  3. Reactivate through the normal checkbox only after deciding to trust the replacement.
  4. To uninstall, use Remove… and Confirm removal after reviewing the target.

Every replacement revokes activation across all projects, even if the permission list is unchanged. Validation/conflict/storage failure preserves the installed package. There are no silent extension updates. Removal deletes the package and its activation settings, not OpenCode sessions or project files. To recover from unwanted code, disable it first; reinstall only a verified trusted package.

Context, asset consent and sandbox limits

Contract What activation permits
API 1 / session.context Current session identifier (or none), interface language and appearance. No transcript text or filesystem access.
API 2 / session.assets.read plus context Explicitly reviewed permission to list bounded current-session tool-result image/attachment metadata and read supported embedded bytes. It is not general transcript, file or URL access.

Asset access follows the currently mounted host/session, not an author-selected session. Local/remote references may be listed as unavailable; the asset API does not fetch arbitrary remote URLs or open local files. Switching sessions, disconnecting or revoking consent invalidates old access.

Author code runs in a restricted iframe, not in the trusted application renderer. It receives no native/OpenCode bridge, credential access, general RPC, forms, popups or downloads; network APIs and external resources are restricted. Extensions are UI addons, not OpenCode plugins.

The sandbox is not process/CPU isolation or a promise that approved code is harmless. A hostile extension can disrupt its renderer. Install only trusted authors, do not provide secrets, and disable/remove an addon if it behaves unexpectedly.