pageta/STATUS.md
Till JS 717aee4e51 docs(status): Rechtsklick-Kontextmenü dokumentiert
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 14:05:20 +02:00

15 KiB

Pageta — Status

Letzter Stand: 2026-05-22. LIVE 🚀 + voll-featured

2026-06-03 — Rechtsklick-Kontextmenü auf der Lese-Liste

Geteiltes @mana/shared-ui/organisms ContextMenu auf jedem Artikel-<li>: Lesen / Original öffnen / Status (gelesen·ungelesen) / Archivieren bzw. Aus-Archiv / Taggen / Löschen — dieselben api.batch*-Handler wie die Batch-Toolbar, aber direkt pro Artikel ohne Auswahl-Modus. Ergänzt die sichtbaren Aktionen (Touch/Mobile bleibt bedienbar). svelte-check 0 neue Fehler, build grün, Screenshot verifiziert, live auf app.pageta.com. (683ff3f)

Folge-Sprint 2026-05-22 — Web-/Native-Parität + Cross-Device

Landing-Cutover 2026-05-22 19:30

Subdomain-Migration ausgeführt (LANDING_CUTOVER.md): pageta.com zeigt jetzt auf die Astro-Marketing-Landing (pageta-landing:3201), die App lebt unter app.pageta.com (pageta-web:3100, war vorher pageta.com).

  • GET https://pageta.com/200 Marketing-Landing (Title: „pageta — Pocket ist tot. Lies in Ruhe weiter.")
  • GET https://pageta.com/{ueber,mitwirken,pocket-import}200
  • GET https://pageta.com/sitemap.xml200 (4 Marketing-URLs)
  • GET https://pageta.com/.well-known/apple-app-site-association200 application/json (Universal Links bleiben funktional)
  • GET https://pageta.com/{lese-liste,article/*,feed,konto,markierungen,recherche,auth/*}301 → app.pageta.com/...
  • GET https://app.pageta.com/307 → /lese-liste (App-Default)
  • GET https://app.pageta.com/{lese-liste,feed,konto,markierungen}200
  • GET https://pageta-api.mana.how/healthz{"status":"ok"}
  • POST https://pageta-api.mana.how/api/v1/summarize (kein JWT) → 401

Offene Punkte aus dem Cutover:

  • Native iOS-App-AASA hardcoded auf pageta.com — Universal-Links auf /article/* und /lese-liste/* werden weiterhin vom Landing-nginx korrekt ausgeliefert (gleicher JSON-Payload, gleiche App-IDs). Im nächsten TestFlight-Build verifizieren.
  • Erst-Login auf app.pageta.com bei einem User, der vorher auf pageta.com eingeloggt war: ggf. erneutes Login nötig, weil App- spezifische Cookies (falls vorhanden) auf der alten Apex-Domain verwaisen. mana-auth-Cookie auf .mana.how ist nicht betroffen.

warning: string | null lebt jetzt im event-sourced ArticleState, nicht mehr in localStorage. Zwei neue Events:

  • ArticleWarningFlagged setzt state.warning (heute nur "probable_consent_wall")
  • ArticleWarningCleared löscht ihn (UI „Hinweis ausblenden")

Bewusst eigene Events statt ArticleSaved-Payload-Erweiterung — evt_article_saved_v1 bleibt frozen. Native + Web schreiben + lesen beide via ev/article:<id>-Aggregat; Banner zeigt sich auf jedem Gerät, das den Event-Stream replayed hat.

Schaden + Recovery 2026-05-22 13:43: Beim ersten Publish-Versuch wurde @mana/shared-schemas versehentlich komplett unpublished (DELETE auf /-rev/latest). 0.1.1/0.1.6/0.1.7/ 0.1.8/0.1.10 sind weg, nur 0.1.11 ist live. Recovery via Lockfile-Bump

  • pnpm install in allen 8 Schwester-Apps (uload/moodlit/werdrobe/ comicello/nutriphi/wordeck/mukke/herbatrium) auf ^0.1.11. Funktional unkritisch — Schema-Änderungen nur in pageta-Sub-Schema, andere Sub-Schemas byte-gleich.

Konkret eingefügt, alles im Web:

  • Routing-Restructure: / redirected auf /lese-liste (= Standardseite, wie Native). Feed-Tab lebt jetzt auf /feed. Tab-Reihenfolge im Layout spiegelt Native: Lese-Liste · Markierungen · Feed · Recherche · Konto.
  • /konto neue Seite: E-Mail/Tier/Konto-ID, Abmelden + „Konto verwalten ↗", ThemeToggle + VariantPicker (alle 8 mana-Themes), Bookmarklet-Link, Über-Sektion (Datenschutz/Verein/pageta.com). ThemeToggle ist aus dem Header raus (lebt jetzt in /konto), genau wie bei Native.
  • Save-from-Feed: Feed-Items haben jetzt einen „+ In Lese-Liste"-Button (zuvor read-only, nur Original-Link).
  • Vor/Nach-Sibling-Navigation im Reader-Footer (Pfeil + Titel-Karte, identisch zur Native-Variante).
  • Cookie-Wall-Banner im Web-Reader. Lokal-persistiert via localStorage-Map keyed by articleId (Schema-Bump in @mana/shared-schemas vermieden). Banner mit „Original im Browser öffnen" + „Hinweis ausblenden".
  • Tag-Read-back: Article.tags durchgereicht aus ArticleState. Reader zeigt Tags als Pills + Tag-Hinzufügen-Input; emittiert ArticleTagsSet. Native kann Tags ab sofort auch sehen, sobald sie das DTO-Feld liest (eigener Followup, betrifft pageta-native/Sources/Core/Domain/Article.swift).
  • Reading-Progress persistiert: Window-Scroll-Listener mit Debounce (1.5 s), emit ArticleProgressUpdated ab 2 %-Differenz; beim Re-Open springt der Reader an die gespeicherte Position. beforeunload-Hook flusht Pending-Progress vor Tab-Close.
  • LLM-Zusammenfassung im Reader: neue Route POST /api/v1/summarize in pageta-api ruft mana-llm mit Alias mana/fast-text. Client-Sektion „Zusammenfassen " im Reader, ohne Persistierung (Volltext bleibt Source-of-Truth). Pendant zum Native ArticleSummarySection (Foundation Models / Gemma).

Phase

λ-0 + λ-1 + λ-2 + λ-3 + λ-4 + λ-5 + λ-6 + Lift-A + Lift-B + CI + Deploy + Login-Flow + Verein-Landing pageta.mana.how ist erreichbar, alle ursprünglich geplanten λ-Phasen sind live.

Folge-Sprint 2026-05-17

  • Echter Login-Flow — Cards-Pattern: SSO-Cookie → /auth/refresh → JWT in localStorage. apps/web/src/lib/auth/session.svelte.ts, apps/web/src/routes/auth/callback/+page.svelte, AuthGate im Layout mit silent-refresh + Redirect zum Auth-Portal. mana-auth-web hat lesen in der App-Allowlist (Forest-Branding, pageta.mana.how + localhost:3100 als erlaubte Redirect-Origins).
  • Verein-Landing — mana-ev.ch zeigt Lesen als 12. App-Card + Intro „elf eigenständige Produkte". Eigenes lesen.svg.
  • λ-5 Bulk-Import — POST /api/v1/imports (cap 200/Job), Tick-Worker alle 2s mit Postgres pg_try_advisory_lock, State-Machine pending → extracting → saved/duplicate/error. Worker bootet im Container.
  • λ-6 Tool-Handler — 5 Tools live unter /api/v1/tools/:name (save_article, list_articles, archive_article, add_article_tag, add_article_highlight). Alle JWT-gated + zod-validated. JSON-Schemas pro Tool im app-manifest.json#tools[] für mana-mcp-Discovery.

Live-Smoke (2026-05-16 19:13)

  • GET https://pageta.mana.how/ → 200 (SvelteKit-SSR)
  • GET https://pageta-api.mana.how/healthz{"status":"ok","app":"pageta"}
  • GET https://pageta-api.mana.how/.well-known/mana-app.json → Manifest
  • GET https://pageta-api.mana.how/api/v1/feed (kein JWT) → 401
  • POST https://pageta-api.mana.how/api/v1/dsgvo/export (kein Key) → 401
  • POST .../dsgvo/export (Service-Key) → 200, leerer User-Export
  • mana-news-pool Tick: 1133 Artikel im Pool

Container (alle healthy)

Container Port Wo
pageta-postgres 127.0.0.1:5447 pageta-postgres-Volume /Volumes/ManaData/pageta/postgres/
pageta-api 127.0.0.1:3099 im Netz pageta_default + manacore-monorepo_default
pageta-web 127.0.0.1:3100 im Netz pageta_default
mana-news-pool 127.0.0.1:3079 im Netz manacore-monorepo_default, DB mana_news_pool auf mana-infra-postgres

Was steht

Phase Inhalt Status
λ-0 Repo-Skelett: pnpm-workspace, turbo, tsconfig, prettier, docker-compose
λ-0 apps/api Hono-Skeleton (/healthz, /.well-known/mana-app.json)
λ-0 apps/web SvelteKit-Skeleton mit drei Tab-Stubs
λ-0 packages/pageta-domain Pure-TS Feed-Engine + Types + Sources, 9/9 Tests grün
λ-0 PORTS.md-Eintrag in mana/ (pageta-api: 3099, pageta-web: 3100)
λ-1 DB-Schema (Drizzle, 8 Tabellen in Schema reader), db:push grün
λ-2 Auth-Middleware (JWKS + serviceKey), /dsgvo/export+delete, /search, /share/receive, /tools/:name
λ-3 Core-API: /feed (Pool-Proxy + Server-side-Ranking), /articles CRUD, /highlights, /preferences, /reactions mit Auto-Weight-Diff, /extract/preview
λ-4 Web-UI: 3 Tabs, API-Client, Feed + Lese-Liste, Reader-Detail /article/[id] mit Highlight-Selection (4 Farben, Selection-Listener, Plain-Text-Offsets, Highlight-Liste mit Delete), Status-Toggles, Favorit, Delete
CI .github/workflows/ci.yml — install, type-check, db:push, build, web-check, domain-tests
Compose infrastructure/docker-compose.production.yml + Dockerfiles für api/web; .env.production.example
λ-5 Bulk-Import-Worker (Job/Items/Pickup-Pipeline gegen 200 URLs/Job) offen
λ-6 Föderation: accepts: [url] Handler vollständig, Tools-Handler-Implementierungen offen
λ-7 Deployment auf mana-server (pageta.mana.how, pageta-api.mana.how) bereit, ausstehend

Plattform-Lifts (parallel, vor λ-7)

Phase Inhalt Status
Lift-A @mana/shared-rss aus managarten nach mana/packages/ + Verdaccio (Code in mana/packages/shared-rss/, npm publish pending)
Lift-B news-ingester aus managarten → mana-news-pool Plattform-Service (Port 3079) (Code in mana/services/mana-news-pool/, eigene DB mana_news_pool, Schema pool, Dockerfile, Compose-Snippet im CLAUDE.md)
Lift-C News-Research-Endpoints in mana-research integrieren deferred

Verifizierter Stand (lokal, 2026-05-16)

  • pnpm install grün
  • pnpm docker:up → Postgres :5443
  • pnpm --filter @pageta/api db:push → 8 Tabellen + 11 Indizes in Schema reader
  • pnpm --filter @pageta/api type-check → grün
  • pnpm --filter @pageta/api dev → bootet auf :3099
    • GET /healthz → 200
    • GET /.well-known/mana-app.json → Manifest 200
    • GET /api/v1/feed (ohne Auth) → 401
    • GET /api/v1/articles (ohne Auth) → 401
    • POST /api/v1/articles/extract/preview (ohne Auth) → 401
    • POST /api/v1/dsgvo/export (ohne Service-Key) → 401
    • POST /api/v1/dsgvo/export (mit Service-Key + userId) → 200 leerer Export
  • pnpm --filter @pageta/domain test → 9/9 grün
  • pnpm --filter @pageta/web check → 0 errors / 0 warnings (252 files)
  • pnpm --filter @pageta/web build → grün, adapter-node Bundle

Was noch fehlt für „real benutzbar"

  • Echte Auth-Integration: heute localStorage['pageta.dev_token']-Stub. Migration auf @mana/shared-auth mit Auth-Portal-Redirect kommt mit λ-6 (oder mit dem Auth-Portal-Plan im Memory project_auth_portal_migration).
  • Echter Pool-Endpoint: /api/v1/feed ruft MANA_NEWS_POOL_URL/feed — zeigt heute auf localhost:3066 (managartens news-ingester). Nach Lift-B wechseln auf mana-news-pool:3079.
  • Reader-Detail-View /article/[id] mit Highlight-Selection
  • Recherche-Tab (heute Stub) braucht mana-research-Endpoints
  • CI (.github/workflows/ci.yml)
  • Deploy (docker-compose.macmini.yml + Cloudflared)

Offene Punkte

  • Port-Range knapp: 3099+3100 sind die letzten freien. Memoro/Who-Range (3100+) wird damit bewusst angekratzt — beide haben eigene Repos.
  • Encryption AUS: Reading-List + Highlights bleiben Server-side plaintext in Postgres mana_pageta. Nachrüstbar wenn Threat-Modell sich ändert.
  • shared-rss vendored: Code-Copy in apps/api/src/lib/shared-rss/. Wechsel auf Verdaccio-Paket nach Lift-A.
  • Tier-Gate: Manifest sagt tier_required: "public". Wenn Lesen Beta bleiben soll bis Mature, hier umstellen + auth.apps-Eintrag bei mana-auth.
  • Source-Liste: SOURCES_META in packages/pageta-domain/src/sources.ts muss synchron mit mana-news-pool bleiben. Heute Source-of-Truth ist managarten/services/news-ingester/src/sources.ts. Drift-Risiko bis Lift-B durch.
  • DEV-Token-Setup: kein lokaler mana-auth gestartet → man kann lokal keine Live-Calls testen. Quick-Fix: pageta.dev_token im Browser- LocalStorage von einem mana-auth-Token aus einer anderen App übernehmen. Sauber: Login-Flow gegen auth.mana.how in λ-6.