From 79589528dd71b3eba02c5884288dfadb8a32c4d1 Mon Sep 17 00:00:00 2001 From: Arena Agent Date: Sat, 12 Sep 2026 21:58:23 +0000 Subject: [PATCH 1/2] V1 upgrade: brand, design system, content pipeline, roadmap graph, learn workspace, practice, search, SEO, docs Phases 1-16 of the V1 upgrade mission (see docs/V1-UPGRADE-AUDIT.md): - Audit: docs/V1-UPGRADE-AUDIT.md; docs rewritten (DESIGN-SYSTEM v2, CONTENT-SYSTEM, ARCHITECTURE, PRACTICE-ENGINE); CHANGELOG 1.0.0. - Branding: new geometric path mark (SVG sources + rendered PNGs in branding/), favicon.svg/.ico, apple-touch-icon, icon-512, social preview; removed old raster logo + Next boilerplate SVGs. - Content: learnpath-youtube-resources.json validated, normalized and imported via scripts/import-resources.mjs into generated TS modules (resources.imported.ts, skills.imported.ts, skill-wiring.ts); catalog now 218 resources / 58 skills / 6 staged roadmaps; import gate in tests/import.test.ts. - Roadmaps: staged roadmap graph with dependency edges, prereq/locked/ completed states, legend, progress rails. - Learn workspace: goal -> prereqs -> stages -> skills -> resources -> practice -> projects; click-to-load YouTube facade (youtube-nocookie, Referrer-Policy, Player API errors); notes + progress per skill. - Practice: lazy Monaco chunk with textarea fallback; +6 exercises and +4 challenges; SQL challenge starters no longer leak solutions; projects view supports multi-file starters. - Progress: pure applyProgress() (sticky completion, changed-flag) in progress-shared with tests; provider syncs only changed records. - Search: MiniSearch kept; event-driven search-results UI (debounce + sequence guard, no effects); /api/search grouped hits. - Pages: homepage redesign, /me rewrite, community (Discord), open-source (GitHub CTA), courses, search, resource pages with VideoObject JSON-LD. - SEO/infra: layout icons + WebSite/SearchAction JSON-LD + canonical; stable sitemap dates; generic error.tsx; CI reordered (typecheck after build). - Deps: dropped unused direct nanoid. Gates: content:validate, vitest 15/15, eslint 0 problems, tsc clean, next build OK (219 SSG resource pages). --- .github/workflows/ci.yml | 5 +- .gitignore | 4 + CHANGELOG.md | 71 +- README.md | 3 +- branding/logo-dark.png | Bin 964909 -> 0 bytes branding/mark-light-512.png | Bin 0 -> 38852 bytes branding/mark-light.svg | 8 + branding/mark.svg | 10 + branding/og-image.png | Bin 1343978 -> 0 bytes branding/social-preview.png | Bin 0 -> 94136 bytes content/research/README.md | 26 + .../research/learnpath-resources.import.json | 3901 +++++ .../research/learnpath-youtube-resources.json | 12233 ++++++++++++++++ docs/ARCHITECTURE.md | 88 +- docs/CONTENT-SYSTEM.md | 90 +- docs/DESIGN-SYSTEM.md | 132 +- docs/PRACTICE-ENGINE.md | 6 +- docs/V1-UPGRADE-AUDIT.md | 480 + package-lock.json | 19 - package.json | 1 - public/apple-touch-icon.png | Bin 0 -> 11123 bytes public/favicon.ico | Bin 0 -> 658 bytes public/favicon.svg | 15 +- public/file.svg | 1 - public/globe.svg | 1 - public/icon-512.png | Bin 0 -> 37176 bytes public/logo.png | Bin 964909 -> 0 bytes public/next.svg | 1 - public/og.png | Bin 1343978 -> 94136 bytes public/vercel.svg | 1 - public/window.svg | 1 - scripts/import-resources.mjs | 447 + scripts/render-brand-assets.py | 164 + src/app/api/notes/route.ts | 5 +- src/app/community/page.tsx | 105 +- src/app/courses/page.tsx | 44 +- src/app/error.tsx | 11 +- src/app/favicon.ico | Bin 25931 -> 0 bytes src/app/globals.css | 296 +- src/app/layout.tsx | 31 +- src/app/learn/[roadmap]/[skill]/page.tsx | 1 + src/app/learn/[roadmap]/[skill]/ui.tsx | 231 +- src/app/me/ui.tsx | 160 +- src/app/open-source/page.tsx | 90 +- src/app/page.tsx | 397 +- src/app/projects/[slug]/page.tsx | 3 +- src/app/projects/[slug]/ui.tsx | 43 +- src/app/resources/[id]/page.tsx | 250 +- src/app/resources/page.tsx | 49 +- src/app/roadmaps/[slug]/page.tsx | 103 +- src/app/roadmaps/page.tsx | 78 +- src/app/search/page.tsx | 42 +- src/app/sitemap.ts | 48 +- src/app/skills/[slug]/page.tsx | 198 +- src/components/continue-learning.tsx | 52 + src/components/github-icon.tsx | 7 + src/components/logo.tsx | 28 +- src/components/path-canvas.tsx | 152 +- src/components/practice/editor-field.tsx | 73 + src/components/practice/monaco-field.tsx | 58 +- src/components/practice/workspace.tsx | 6 +- src/components/progress-provider.tsx | 38 +- src/components/resource-card.tsx | 126 +- src/components/resource-library.tsx | 94 + src/components/roadmap-card.tsx | 58 + src/components/roadmap-graph.tsx | 218 +- src/components/roadmap-progress.tsx | 29 + src/components/search-box.tsx | 41 +- src/components/search-results.tsx | 115 + src/components/site-footer.tsx | 107 +- src/components/site-header.tsx | 115 +- src/components/theme-toggle.tsx | 7 +- src/components/ui-client.tsx | 69 + src/components/ui.tsx | 214 +- src/components/youtube-embed.tsx | 202 +- src/lib/content/challenges.ts | 67 + src/lib/content/index.ts | 62 +- src/lib/content/practice.ts | 45 +- src/lib/content/resources.imported.ts | 3513 +++++ src/lib/content/roadmaps.ts | 485 +- src/lib/content/schema.ts | 25 + src/lib/content/skill-wiring.ts | 42 + src/lib/content/skills.imported.ts | 151 + src/lib/progress-shared.ts | 20 + tests/import.test.ts | 64 + tests/progress.test.ts | 32 +- 86 files changed, 25026 insertions(+), 1182 deletions(-) delete mode 100644 branding/logo-dark.png create mode 100644 branding/mark-light-512.png create mode 100644 branding/mark-light.svg create mode 100644 branding/mark.svg delete mode 100644 branding/og-image.png create mode 100644 branding/social-preview.png create mode 100644 content/research/README.md create mode 100644 content/research/learnpath-resources.import.json create mode 100644 content/research/learnpath-youtube-resources.json create mode 100644 docs/V1-UPGRADE-AUDIT.md create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico delete mode 100644 public/file.svg delete mode 100644 public/globe.svg create mode 100644 public/icon-512.png delete mode 100644 public/logo.png delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg delete mode 100644 public/window.svg create mode 100644 scripts/import-resources.mjs create mode 100644 scripts/render-brand-assets.py delete mode 100644 src/app/favicon.ico create mode 100644 src/components/continue-learning.tsx create mode 100644 src/components/github-icon.tsx create mode 100644 src/components/practice/editor-field.tsx create mode 100644 src/components/resource-library.tsx create mode 100644 src/components/roadmap-card.tsx create mode 100644 src/components/roadmap-progress.tsx create mode 100644 src/components/search-results.tsx create mode 100644 src/components/ui-client.tsx create mode 100644 src/lib/content/resources.imported.ts create mode 100644 src/lib/content/skill-wiring.ts create mode 100644 src/lib/content/skills.imported.ts create mode 100644 tests/import.test.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d5b17ee..3ebced4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,9 @@ jobs: cache: npm - run: npm ci - run: npm run content:validate - - run: npm run typecheck + # typecheck must run AFTER a build once: Next.js generates the route + # types (.next/types) that typed App Router files reference. Running it + # first made CI fail on every clean clone. See docs/V1-UPGRADE-AUDIT.md §3.1. - run: npm run lint - run: npm test - run: npm run build @@ -25,3 +27,4 @@ jobs: BETTER_AUTH_URL: http://localhost:3000 BETTER_AUTH_SECRET: ci-secret-ci-secret-ci-secret-ci TURSO_DATABASE_URL: file:./data/learnpath.db + - run: npm run typecheck diff --git a/.gitignore b/.gitignore index 09f816b..ae761f2 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,7 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# python caches (brand asset render scripts) +__pycache__/ +*.pyc diff --git a/CHANGELOG.md b/CHANGELOG.md index fa0b0cd..bffc7bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,66 @@ # Changelog -## 0.1.0 — 2026-09-12 +## 1.0.0 — 2026-09-13 + +V1 product upgrade: audited, repaired, integrated, redesigned. + +### Repaired (verified defects) + +- **CI order:** `typecheck` ran before the build that generates Next's route types, failing every + clean clone. Workflow now typechecks after build; `layout.tsx` no longer depends on generated + globals either. +- **Progress sync:** re-marking an existing entity uploaded the wrong record (array tail instead of + the changed record). `mark()` now sends exactly the record that changed. +- **YouTube fallback:** DOM `onerror` on a cross-origin iframe never fires; the documented + "unavailable" state was unreachable. Now detected via the official IFrame Player API `onError`, + with alternatives + report so the path continues. +- **Notes corruption:** server-side `replace(/