Commit graph

12 commits

Author SHA1 Message Date
doxa-maps
719c8bb218 Laptop: the Plugin Studio route in LAPTOP-6WAY, and one route on port 4616 at a time
LAPTOP-6WAY described two routes. The third, the public Plugin Studio (bun run laptop plugin-studio),
had only its compose profile and the command's help. It now has its own section: what the command
starts, the addresses, the admin password for publishing and PocketBase's dashboard, how the two
per-request addresses are set, and what to set while dx-maps' development has no public mode yet.
"Checked" records what was proven on 2026-09-29, the halves separately, and says the one command
end to end has not been run yet.

The subdomain and Plugin Studio routes both publish the dx-maps container on port 4616. Starting one
while the other runs failed inside docker compose with a port error. bun run laptop now stops first
and says to run bun run laptop down.
2026-09-29 05:34:23 +00:00
doxa-maps
9e6e9a4bff Plugin Studio branch: lint the new code to the site's style
The map slot's template puts one attribute per line. The runtime loader and the
map composable put one statement per line. The origins check drops a redundant
pair of parentheses. No behaviour changes. Every file this branch touched now
has no more lint findings than it had before.
2026-09-29 05:12:51 +00:00
doxa-maps
551df57915 New check: check:origins, no deployment address baked into the site
bun scripts/check-runtime-origins.ts (bun run check:origins) holds the
branch's rule:
- nuxt.config declares neither per-deployment address;
- under app/, only the runtime loader reads dxMapsBase, and only it and the
  menu read researchGalleryUrl;
- no source file or static page names a deployment host (nuxtbase.app,
  sslip.io, a *.localhost address or a 46xx laptop port).
It refuses to pass on fewer than 50 files.

This branch: PASS, 306 files. The subdomain branch it was cut from fails
with 12 problems: two addresses in nuxt.config, six reads under app/, and
the hardcoded maps host in nuxt.config and in the two static pages.
2026-09-29 04:48:59 +00:00
doxa-maps
8770903270 Laptop: the plugin-studio route in one command, bun run laptop plugin-studio
A second compose profile beside "subdomain":
- dx-maps-studio: the dx-maps container with ACCESS=public on research.localhost:4616, the
  PUBLIC Plugin Studio. There is no sign-in provider; publishing and PocketBase's dashboard ask
  for ADMIN_PASSWORD. Its /cdn is built from main with EMBED_BASE_URL=http://research.localhost:4616/cdn.
- dxlife-studio: this site's research-gallery-plugin-studio branch on :4614. Its two settings,
  NUXT_PUBLIC_RESEARCH_GALLERY_URL and NUXT_PUBLIC_DX_MAPS_BASE (names agreed with dx-base), point
  at the Studio and its /cdn, and are read at run time.
The two routes use separate data volumes. .env.laptop gains a generated ADMIN_PASSWORD (never
printed). laptop-dxlife.sh takes DXLIFE_PORT (4613 subdomain, 4614 plugin-studio).
2026-09-29 04:43:02 +00:00
doxa-maps
226992541f The laptop's subdomain route in one command: bun run laptop subdomain
The Research Gallery now has two routes: drop-in (this site alone, no Docker, the default)
and subdomain (the dx-maps team container with PocketBase). The CDN route is retired.
compose.laptop.yaml runs the subdomain route on 127.0.0.1:
- dx-maps: the image the team's server runs, built from dx-maps' root Dockerfile. It carries
  the Plugin Studio, PocketBase and the research site on research.localhost:4615, and
  publishes main by itself.
- a local sign-in provider with admin, designer and plain-member users. It runs inside dx-maps'
  network, so localhost:4620 is the same address for the browser and the container.
- this site on the subdomain branch, pointed at the research site.
scripts/laptop.ts makes .env.laptop (secrets, never committed), checks Docker's memory (and
names what to close or the lighter route), starts the three, waits for each and prints the
addresses. LAPTOP-6WAY.md describes the two routes.

Checked on a Docker host tunnelled to a laptop-like browser: 20/20 route checks (sign-in,
roles, PocketBase's team API, the research site, /regions) and check-embed-6way 7/7 at 6/6.
2026-09-29 03:35:37 +00:00
corsacca
9d05a039f8 remove the one-shot WordPress migration scripts
The importer and menu-order sync wrote pages.parent_slug, dropped in
migration 010; the scraper fed the importer and read the site being
replaced; po-to-json rebuilt the locale JSON from the WP theme's .po
files, which the glossary now owns. Content lives in the database and
is edited through the doxa-cms MCP server.
2026-09-18 10:09:38 +01:00
corsacca
a994baec4f read the glossary from pray.doxa.life instead of a vendored file
config/glossaries.ts was generated from the retired translation repo's DeepL
TSVs, so it had no source left and only the German, Spanish and Portuguese
rows had been hand-patched. Both it and its build script are gone.

- fetch GET /api/glossary/{lang} at runtime, cached ten minutes, serving the
  last good answer when the request fails and an empty one when it never
  succeeded. A reviewer's correction now reaches auto-translate without a
  deploy here
- carry the glossary's notes as well as its terms: register, acronym policy
  and number format, placed after the term list so a rule about inflection
  governs the pairs above it
- glossary_used on the MCP translate tool now means the locale's terminology
  was available, and reads false for a language whose glossary has not been
  started
- add /add-language and /sync-language skills for the site strings, the map
  widget locales and bundles, the /terms edition, and the CMS pages
2026-09-18 10:06:13 +01:00
corsacca
7dfad0ee07 replace deepl with llm translation via openrouter
- translateText/translateTexts call OpenRouter chat-completions; glossary
  terms are prompt-injected from config/glossaries.ts, generated from the
  translation repo's TSVs by scripts/build-glossaries.ts
- model resolution: per-language override in config/languages.ts →
  translation.model site setting (new admin field) → TRANSLATION_MODEL env
  → anthropic/claude-opus-5, at low reasoning effort
- blank fragments are held back from the model, which drops them and breaks
  the one-translation-per-fragment count the caller maps results back on
- OpenRouter failures map to a typed error with a human-readable message;
  an unrecoverable one (no credits, bad key, rejected model) stops the run
  instead of repeating the same call for every remaining locale
- machine translations record source 'auto-translate'; 'deepl' stays
  readable for snapshots written before the switch
2026-09-07 16:30:48 +01:00
corsacca
76a064d068 Implement page categories 2026-04-23 15:50:52 +01:00
corsacca
2d4e47af33 Central tiptap block definitions 2026-04-23 11:05:05 +01:00
corsacca
a3919e0764 phase 7 2026-04-22 08:19:38 +01:00
corsacca
d21f4e82c0 phase 2 2026-04-21 13:27:38 +01:00