doxa-maps/.gitignore
doxa-maps-88655c70 79bd6d2ac3
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
public/ is one folder: the output tree plus a README, with the Plugin Studio as its front page
Driver decisions (cards BUILD-OUTPUT-IS-ONE-FOLDER, BUILD-PLUGIN-STUDIO-IS-THE-OUTPUT-FRONT-PAGE).

- public/ holds only <tree>/ and a generated README.md. The build no longer writes public/index.html,
  public/assets/ or public/__gallery/; `rm -rf public && bun run build` recreates exactly these two.
- The Plugin Studio is <tree>/index.html (tree-base "."), replacing the staging-forge chooser; nothing
  is written above the tree. check:staging-lang, which tested that chooser, is retired with it.
- Assets are gathered in a temp directory and the fetched allowlist staged into <tree>/assets/ as
  before. fonts/, images/, brand/ and legacy/ existed ONLY in public/assets: they are sources and move
  to data/ (git mv). Poster previews keep their tracked sources in plugin-designs/*/assets/previews
  (all 378 verified present).
- __gallery/ is archived out of public/ (a copy kept in the umbrella's _qa-cycle/archive) and out of
  the build; generate-gallery renders only on request, into a directory you name, never public/.
- Native shells load the output folder: capacitor webDir public/<tree> (cap copy needs an index.html
  there), Tauri frontendDist + window url relative to it. internal/sync-app-shells.mjs keeps both in
  step with the tree's name on every build, so the coming rename stays one config line; the Capacitor
  start page resolves its leaf tree-relative.
- dropin.include now lists only extras (README.md): the tree is always shipped and never named twice;
  excludes are tree-relative ({tree}/...). clean.mjs removes the old root entries from existing
  checkouts; the build lock and public/.gitignore's rules move out of public/.
- check:wp-embed read the BUILT manifest from gates:pre, before the build, so a from-scratch build
  could never pass; it runs in gates:post and reads the tree name from config.
- Stale bundles refreshed by the clean build (key-cities, template-bundle, wall-of-people-groups);
  the CLI doc's quoted scripts re-synced; capability exemplars regenerated; the '#' note leaves
  check:stale-sweep-claim's command (it was already in //scripts).

Proof: rm -rf public && bun run build -> public/ = README.md + doxa-maps/; check:sri, check:drop,
check:parse, check:public-hygiene, check:quoted-scripts, check:capability-exemplars PASS; all 57 pages
(the front page + 56 leaves) mount under /doxa-maps/ on this tree. check:facet-cascade is red as on main.
2026-09-25 17:41:56 +00:00

147 lines
7.2 KiB
Text

# (The build no longer uses an intermediate app/ tree — vite writes straight into
# public/<name>/, which is committed. See "THE SERVED WEB-ROOT" below.)
# Node
node_modules/
.npm/
.pnpm-store/
# Vite cache
.vite/
dist/
# Editor
.vscode/
.idea/
# OS
.DS_Store
# Env
.env
.env.local
.env.*.local
!.env.example
# Research dashboard — developed on its own branch (research-dashboard),
# excluded from the map-only bundle. Do not track dashboard files here.
# Local build artifacts / deploy config — kept on disk, out of the map PR
build-sizes-baseline.json
_archive
# ── BUILD OUTPUT — regenerated by `bun run build`; one tree, three consumers ──
# Not committed: it is derived. Railway builds it in CI; Capacitor copies it via
# `cap sync`; staging serves it locally.
# ── Capacitor generated / machine-specific (the native projects THEMSELVES are
# committed under capacitor/; only their build output is ignored) ──
capacitor/android/app/src/main/assets/public/
capacitor/android/app/src/main/assets/capacitor.config.json
capacitor/android/app/src/main/assets/capacitor.plugins.json
capacitor/android/build/
capacitor/android/app/build/
capacitor/android/.gradle/
capacitor/android/local.properties
capacitor/android/keystore.properties
capacitor/ios/App/build/
capacitor/ios/App/Pods/
*.jks
*.keystore
# ── THE SERVED WEB-ROOT — COMMITTED ───────────────────────────────────────────
# public/ is the product: the shell, the built bundles and the pre-generated
# posters the app fetches at runtime. It is committed whole so a clone (or a
# static host, or the source-control service) has a working site without running
# anything, and so CI regenerates only public/<name>/ in place rather than
# assembling the folder from other directories.
# The exceptions are BOTH Mapbox credentials: token.local.js (local staging, held
# out by public/.gitignore) and api/maps/token.json, which the build writes from
# the MAPBOX_TOKEN environment variable so the value lives in deployment settings
# rather than in git history.
public/api/maps/token.json
# ★ AND the EXTENSIONLESS path — the client requests /api/maps/token (never .json), so
# write-token.mjs emits BOTH. This line was missing when the bare file was added, which
# would have made a live pk. token committable. Same secret, second path.
public/api/maps/token
# ── stale dev-time bundle copies inside the wrapper ───────────────────────────
# The wrapper mounts bundles from ./doxa-maps/ at the served root now; these were
# hand-copied during bring-up and would silently go stale.
layouts/*/profiles/
layouts/*/js/
# ── POSTER GENERATOR OUTPUT ───────────────────────────────────────────────────
# library/scripts/posters/ is source (the template + its snapshots); out/ is what
# it renders — ~95 MB of HTML and 3000x3000 PNGs, all reproducible from source:
# bun run posters && bun run posters:shoot && bun run posters:gallery
# ── EXCEPT the three inputs the build guards read ────────────────────────────
# iso2-map, resource-join and tables-complete verify shipped data against these.
# They are derived, but they are derived from NETWORK FETCHES, and the research
# network policy forbids CI reaching out to those sources — so CI cannot rebuild
# them and, without them committed, three guards fail on a clean clone and the
# deploy dies. 2 MB of the 23 MB out/ tree; the rest stays ignored.
# Visual-gate screenshots are OUTPUT, not fixtures. visual-gate.mjs and
# palette-preview.mjs only ever page.screenshot() INTO this folder — the gate's own
# rule is that it never reads a PNG back, it asserts against the live DOM. So these
# are 11 MB of regenerable pictures of somebody's screen, and they bake build-slice
# vocabulary into pixels where no text scrub can reach it.
plugin-designs/*/data/visual-gate-shots/
library/scripts/*/out/**
internal/*/out/**
# EXCEPT the three inputs the build guards read. iso2-map, resource-join and
# tables-complete verify shipped data against these. They are derived — but derived
# from NETWORK FETCHES, and the research network policy forbids CI reaching those
# sources, so CI cannot rebuild them. Without them committed, three guards fail on a
# clean clone and the deploy dies. 2 MB of the 23 MB out/ tree; the rest stays out.
# (Negations must follow the exclude: the last matching rule wins.)
!library/scripts/research/out/arclight-languages.json
!library/scripts/research/out/iso3-to-iso2.json
!library/scripts/research/out/language-resources.json
!library/scripts/research/out/ebible-translations.csv
!library/scripts/research/out/tables/
!library/scripts/research/out/tables/**
# ── INTERNAL DOCS — the split-plane rule ──────────────────────────────────────
# Agent/internal working docs live here and are NEVER published. The repo's
# public surface stays architecture + code + contributor docs; internal process
# notes, lessons-learned and agent instructions stay out of it.
_qa-cycle/
# ── GENERATOR OUTPUT — regenerable render artifacts, never committed ──────────
# internal/<tool>/out/ holds what the poster/research generators RENDER
# (upg100-posters/out alone is ~619MB / 12,623 PNGs). The generators themselves
# are source and ARE committed; their output is derived.
#
# ⚠ THIS BLOCK USED TO SAY "what actually ships is the exported subset in
# public/assets/ (see export-public.mjs)". BOTH HALVES OF THAT WERE STALE, and
# the sentence is why 80.7 MB sat committed twice:
# - export-public.mjs does NOT write public/assets/. It writes a SIBLING OF THE
# REPO (../../../../upg-100-posters, or $DOXA_PUBLIC), and says so in its own
# header — explicitly "NOT inside public/, because capacitor packages public/
# whole and these are 52 MB that must not ship in the APK".
# - public/assets/<name> is now a GENERATED MIRROR of the tracked data/<name>,
# rewritten by generate-tree.mjs on every `bun run tree`. It is derived, not
# exported, so it is ignored in public/.gitignore — which carries the
# measurements and the one exception (previews/, which has no data/ source
# and must stay tracked).
# The tracked source for shipped assets is data/<name>.
# Private datasets never live in this repo (see DOXA_PRIVATE_DIR in
# library/scripts/research/build-tabulator-tables.mjs). Guard against re-creation.
data-private/
# ── public/ is the OUTPUT FOLDER + README.md only (Driver decision, BUILD-OUTPUT-IS-ONE-FOLDER, 2026-09-25) ──
# These rules used to live in public/.gitignore, which was itself a tracked file INSIDE the generated
# folder (so `rm -rf public && bun run build` deleted it). Local-only files stay untracked:
/public/token.local.js
# the build mutex's stamp (internal/build-lock.sh) — runtime state, now at the repo root
/.build.lock
# what the OLD layout wrote beside the tree; internal/clean.mjs removes any a checkout still has
/public/assets/
/public/__gallery/
/public/index.html