chore: scaffold, CI, and the export bundle verbatim

The export bundle is the input to this port, not a sketch: the curriculum,
the tutor prompt and the five logic modules are finished and tested. They
land here byte-identical and stay that way.

  diff -r export/data data && diff -r export/lib lib
  diff -r export/prompt prompt && diff export/validate.mjs validate.mjs

data/, lib/, prompt/ and validate.mjs sit at the repo root so validate.mjs
runs verbatim with no path edits. All four are excluded from lint and
formatting — they are not ours to restyle. Types for lib/ live alongside in
types/ rather than as sibling .d.ts files, so the verbatim check stays a
plain directory diff.

CI runs the curriculum gate first, before anything else can pass:

  node validate.mjs   PASS — 0 blocking, 0 advisory

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
MechaCat02
2026-09-08 19:11:40 +02:00
commit b80deb2f6f
22 changed files with 7984 additions and 0 deletions

40
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: CI
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# The curriculum gate comes first, before anything else can run.
# validate.mjs reads only data/ and lib/ and exits non-zero on a
# blocking failure. Baseline: PASS — 0 blocking, 167 advisory.
- name: Curriculum validation
run: node validate.mjs
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- name: Typecheck
run: npm run typecheck
- name: Tests
run: npm test
# Every word in every unit's words[] must resolve in lemma or surface.
# Runs against the committed band files in app/public/dict/.
- name: Roadmap word coverage
run: npm run dict:assert
- name: Build
run: npm run build