221 lines
15 KiB
Markdown
221 lines
15 KiB
Markdown
# 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`](../mana/docs/playbooks/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.xml` → **200** (4 Marketing-URLs)
|
|
- `GET https://pageta.com/.well-known/apple-app-site-association` →
|
|
**200 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.
|
|
|
|
### Cross-Device Cookie-Wall via @mana/shared-schemas@0.1.11
|
|
|
|
`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.
|