docs: capture exploration — core plugin port inventory, Horoskopia and Wavepath seeds

This commit is contained in:
Jakub Zych
2026-10-07 20:10:28 +02:00
parent b3ca53cbc1
commit 5429d46751
4 changed files with 160 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
---
title: Golem15 plugin inventory and core plugin port order (Phases 17–19.1)
date: 2026-10-07
context: /gsd-explore session on porting the remaining core plugins after Journal
---
# Golem15 plugin inventory and port order
A survey of every `plugins/golem15/*` copy under `/media/nvme/dev/golem15` and `/media/nvme/dev/jz/wavepath.org` on 2026-10-07. "Live" counts top-level projects. LOC is PHP without tests or vendor, measured on the largest copy.
## Port status
- **Ported:** user, translate, journal, golem, feedback. Apparatus became framework packages (`apparatus-dissolved-into-framework.md`).
- **Not ported, covered by the framework:** websockets. `modules/lighthouse` and its `centrifugo` driver already provide the publisher, the token route, the subscribe proxy and per-namespace `Authorizer`s, which are what Wavepath's code calls (`BroadcastEventJob`, `CentrifugoClient`, `AuthorizerRegistry`, `ChannelAuthorizerInterface`).
- **Not ported:** knobwidget and dualformfield/dualformwidget. They are about 150 LOC of form widgets each, and the admin SPA field types replace them.
## Shared plugins and how much each is worth porting
| Plugin | Live projects | LOC | Decision |
|---|---|---|---|
| paymentgateway + pgstripe | 19 installed, 7 real users | 18.7k + 1.9k | Phase 18 |
| paymentgatewaysubscriptions | 5 | 5.5k | Phase 18.1 if it does not fit in 18 |
| sitemap | 21 | 1.9k | Phase 17 |
| menu | 8 | 1.0k | Phase 17 |
| faq | 16 | 0.5k | Phase 17 |
| chat | 17 installed, Wavepath is the heaviest user | 4.4k | Phase 19 |
| chatchannels | Wavepath | 2.8k | Phase 19 |
| chatbots, chatvideo, forum, herald, userfriends | Wavepath (userfriends also in PHP fonoteka; fonoteka.go has no port) | 0.6k–1.7k each | Phase 19.1 |
| oauthserver | Wavepath | 5.5k | With the Wavepath port, on `wristband` |
| newsletter | horoskopia | 2.3k | Backlog 999.1 |
| github, quote | 16 / 13 | 3.4k / 0.8k | Not scheduled. Quote is cheap because golem and journal are ported |
| seo, sitemanager | 6 | 4.3k / 0.9k | Not scheduled. Phase 16 replaces both with `@nuxtjs/seo` and app content |
| blog, bloghub, ai | 3–4 | 7.5k–9.6k | Not scheduled. This is the older blog line; journal is its successor |
Third-party plugins in many projects: `winter/location` is in 19, `winter/blocks` in 13 and `winter/pages` in 10. Whether paymentgateway shipping or user profiles need `winter/location` is an open question.
## PaymentGateway facts that matter for Phase 18
- **Which projects really use it:** sklep.figs (shop), portal.golem15.com (invoicer), getaround.world (tourism with its own StripeConnect operator, quotify, subscriptions), quotify.pro, drzewo.net, horoskopia.eu and queststream.online. In the others it is installed only because the starter ships it.
- **Drivers:** Stripe is the only real driver. No PayU, Przelewy24, PayPal or Tpay code exists anywhere.
- **Operator registration:** operators extend the abstract `core/Operator` and push their class onto the config key `golem15.paymentgateway.operators` from inside the `paymentgateway.booted` event. In Go this becomes build-time registration through an interface.
- **Webhooks:** one CSRF-exempt notification route, `_paymentgateway/{operator}/{mode?}/{result?}`. pgstripe adds `POST /webhook/stripe/subscriptions` for the subscriptions plugin.
- **State machines and events:**
- Payment: Created, Sent, Accepted, Rejected, Canceled, Refunded.
- Order: 12 states and about 18 transitions, 7 of them refund paths.
- 19 Order events and 5 Payment events drive about 26 mail templates.
- `OrderPaid` is the event consumers listen to most.
- **Acceptance consumer:** Horoskopia. Its `horoscope` plugin (37k LOC, 65 routes, Nuxt 4 frontend `vue-horoskopia-app`) requires PaymentGatewaySubscriptions and PGStripe. It uses `Order`, `OrderFactory`, `Cart`/`Item`/`Details`, `Settings`, `Payment`, `Subscription`, `SubscriptionPlan` and the `SubscriptionGateway` contract.
## Port order decided on 2026-10-07
1. **Phase 17, Blog companions:** sitemap, menu and FAQ, plus a framework menu-item type registry.
2. **Phase 18, Payment Gateway:** paymentgateway and pgstripe. Subscriptions and Stripe add-ons go into 18.1, 18.2 and so on if the Phase 18 discussion splits them out.
3. **Phase 19, Chat and ChatChannels.**
4. **Phase 19.1, Chat satellites:** chatbots, chatvideo, forum, herald and userfriends.
5. **Phase 20, Płytarium cutover.**
6. **After Phase 20:** the Horoskopia port comes first, then the Wavepath port. Neither is planned yet. This stretch is about preparing the shared plugins, not migrating apps, and a stabilization phase may come first. See the seeds for both ports.
## Related
- `core-plugins-own-repos.md`: each shared plugin gets an `sm-<name>-plugin` repo
- `../seeds/keios-port-themes-payments.md`: an earlier seed that also covers paymentgateway

View File

@@ -0,0 +1,9 @@
# Open research questions
## From the core plugin port exploration (2026-10-07)
- **Does PaymentGateway need `winter/location`?** It is installed in 19 projects. Check whether PaymentGateway shipping addresses, the shop or user profiles read its countries and states. If they do, Phase 18 needs a Go equivalent (a framework module or an `sm-location-plugin`). Phase: 18.
- **Does Horoskopia define the full Phase 18 acceptance contract?** Which `vue-horoskopia-app` requests reach PaymentGateway or subscription code? Do they cover the order and refund paths, or only subscriptions? Are other order flows tested only through hand-written host tests? Phase: 18.
- **Which chat source should Phase 19 port?** Wavepath's chat has `root_id` threading and `thread_summaries`. Compare it with the starter's `wn-chat-plugin` and the other 16 copies, and pick the newest as the 1:1 source. Phase: 19.
- **Does any Płytarium route need userfriends?** PHP fonoteka has `golem15/userfriends`, but fonoteka.go has no port, and Phase 14 reached 175/175 routes without one. Confirm before porting it for Wavepath in Phase 19.1, so there is one shared copy. Phase: 19.1.
- **How should Herald's Web Push be done in Go?** Herald uses `minishlink/web-push`. Choose a Go Web Push/VAPID library (or a stdlib implementation) and record it in a decision note before Phase 19.1 code lands. Phase: 19.1.

View File

@@ -0,0 +1,43 @@
---
id: SEED-261007-0tb
status: dormant
planted: 2026-10-07
planted_during: Phase 16 (context gathered)
trigger_when: The Horoskopia port (SEED-261007-j2b) is complete, and Phases 19 and 19.1 (chat and the chat satellites) are done.
scope: Large
---
# SEED-261007-0tb: Wavepath port to SummerCMS
## Why This Matters
Wavepath (`/media/nvme/dev/jz/wavepath.org`) is the largest Golem15 app and the heaviest user of chat and chatchannels. Phases 19 and 19.1 port the shared plugins Wavepath requires so that the app port itself is only the app plugin, OAuth and cutover.
## When to Surface
**Trigger:** after the Horoskopia port, with Phases 19 and 19.1 done. This stretch is about preparing the shared plugins, not migrating apps, and a stabilization phase after Phase 20 may come first.
## Scope Estimate
**Large:** a milestone, probably larger than Płytarium:
- **App plugin:** `wavepath` has 30.6k PHP LOC and **255 routes**, compared with Płytarium's 175. Expect 2–3 API phases plus a cutover phase.
- **Clients:** `vue-wavepath-app`, `wavepath-mcp`, `tauri-wavepath-desktop`, `electron-wavepath` and `hubot-wavepath`. All of them define the parity contract.
- **Required shared plugins:**
- Ported: user.
- Phase 19: chat, chatchannels.
- Phase 19.1: chatbots, chatvideo, forum, herald, userfriends.
- Already covered by framework `lighthouse`: websockets.
- **OAuth:** `oauthserver` (5.5k LOC, 10 routes, OIDC) sits on the framework's `wristband` package. OIDC parts (id_token, userinfo) may be new to `wristband`.
- **Also mounted:** feedback (ported), journal (ported), sitemap and faq (Phase 17), and paymentgateway/pgstripe. Wavepath's own code never references PaymentGateway, so check whether it can be dropped.
## Breadcrumbs
- `.planning/notes/core-plugin-port-inventory.md`
- `.planning/notes/oauth2-wristband-direct-port.md`
- `.planning/ROADMAP.md`: Phases 19 and 19.1
- `.planning/research/questions.md`: chat source version, Herald Web Push dependency
## Notes
Planted during the 2026-10-07 `/gsd-explore` session on porting the core plugins.

View File

@@ -0,0 +1,46 @@
---
id: SEED-261007-j2b
status: dormant
planted: 2026-10-07
planted_during: Phase 16 (context gathered)
trigger_when: Phase 20 (Płytarium cutover) is complete, plus the stabilization phase if one is added. It comes before the Wavepath port.
scope: Large
---
# SEED-261007-j2b: Horoskopia port to SummerCMS
## Why This Matters
Horoskopia (`/media/nvme/dev/golem15/horoskopia.eu`) is the second app port after Płytarium, and the first that takes payments. Its `horoscope` plugin creates orders, uses Stripe subscriptions and reacts to payment events. That makes it the acceptance consumer for Phase 18 (Payment Gateway) and the 18.x subscription phases. Without a real app, the PaymentGateway port has no API contract to test against.
## When to Surface
**Trigger:** Phase 20 (Płytarium cutover) is complete, plus the stabilization phase if one is added. This port comes before the Wavepath port (SEED-261007-0tb).
## Scope Estimate
**Large:** probably a milestone, with the same shape as Płytarium (phases 12–14 and 20):
- **App plugin:** `horoscope` has 37k PHP LOC and 65 routes and requires Apparatus, User, PaymentGatewaySubscriptions and PGStripe.
- **Frontend:** `vue-horoskopia-app` (Nuxt 4), so it gets parity-harness treatment like Płytarium.
- **Shared plugins it needs:**
- Ported: user, translate, journal, golem.
- Phase 17: sitemap, faq.
- Phase 18/18.x: paymentgateway, pgstripe, paymentgatewaysubscriptions.
- Phase 19: chat.
- Backlog 999.1: newsletter.
- Not scheduled: quote and github, which are small.
- Single-project: journalreposter (5.4k LOC), which stays in the app.
- Third-party: `winter/location`.
- **PaymentGateway API it calls:** `Order`, `OrderFactory`, `Cart`/`Item`/`Details`, `Settings`, `Payment`, `Subscription`, `SubscriptionPlan` and the `SubscriptionGateway` contract.
## Breadcrumbs
- `.planning/notes/core-plugin-port-inventory.md`: plugin inventory and port order
- `.planning/ROADMAP.md`: Phase 18 (Payment Gateway) names Horoskopia as its acceptance consumer
- `.planning/research/questions.md`: what the Horoskopia acceptance contract covers, and whether `winter/location` is needed
- Backlog 999.1: the newsletter port source is checked out at `horoskopia.eu/plugins/golem15/newsletter`
## Notes
Planted during the 2026-10-07 `/gsd-explore` session on porting the core plugins.