Stan: fazy 0-6 zrobione (2026-10-17), repo na GitHubie, paczki jeszcze nieopublikowane. Repo kododo-dev/WayShell, paczki Kododo.Way.Shell (NuGet) i @kododo-dev/way-shell (npm). Decyzje: sekcja 5. Kontekst i historia decyzji: punkt 9 w ../../IDEAS.md.
Wspólna powłoka UI dla bibliotek Way (ConfigWay, CultureWay, RunWay, LogWay, później TraceWay, AuthWay):
- Jeden Way w aplikacji: Way wygląda i działa jak dziś (
app.UseConfigWay("/config")), ale układ, motyw, i18n, klient API i obsługa sesji pochodzą z Shella, a nie z kopii w każdym SPA. - Kilka Way w aplikacji: opcjonalny wspólny panel (np.
/admin) z nawigacją między Way, jednym motywem i jednym użytkownikiem. - Jedna wersja React/MUI w aplikacji: Shell jest zależnością NuGet każdego Way i jedynym dostawcą bibliotek wspólnych; NuGet rozwiązuje go do jednej wersji.
Poza zakresem v1: Way z innych aplikacji (iframe, SSO), agregacja MCP, własne moduły hosta (np. strony Polyglota), zmiana routingu z hash na history.
- Backend:
Use*Wayto 50-100 linii, bo Reiho już robiMapRequestsiMapEmbeddedSpa.MapEmbeddedSpaserwujeSPA/distz zasobów osadzonych w assembly, podmienia__BASE_PATH__windex.html(<base href>), pliki statyczne mająimmutable. Nie ma fallbacku naindex.htmldla nieznanych ścieżek, więc wszystkie SPA używająHashRouter. - SPA: Vite 8 + React 19 + MUI 9 (RunWay: MUI 7 / Vite 7),
react-router-dom7, emotion. Kopiowane i rozjechane między Way:ThemeContext,LayoutContext,MainLayout,SideMenu,PageHeader,api.ts(SessionExpiredError,ForbiddenError,ApiErrorz ProblemDetails, nasłuch wygaśnięcia sesji),i18n/I18nContext(wybór: użytkownik > host > przeglądarka). - Ustawienia hosta są w każdym Way osobno: CultureWay
EditorOptions(Title,HomeUrl,Language,Links,User, uprawnienia), LogWayLogWayUiOptions(Title,User,AllowAnonymous), przekazywane do SPA przezGetEditorSettings/GetUiSettings. - Ochrona: LogWay (UI i MCP) odpowiada 403 poza Development, jeśli endpointy nie wymagają autoryzacji ani nie są jawnie anonimowe. ConfigWay i CultureWay tego nie robią.
| Paczka | Zawartość |
|---|---|
Kododo.Way.Shell (NuGet, net8/9/10) |
Rejestr Way, UseWayShell, API powłoki, ochrona, osadzone: SPA powłoki, paczka bibliotek wspólnych (vendor), runtime @kododo-dev/way-shell, import map |
@kododo-dev/way-shell (npm) |
Typy kontraktu modułu, hooki i komponenty (useShell, useI18n, PageHeader, ...), klient API, preset Vite wayModule(), WayDevHost do pracy lokalnej |
Wersje NuGet i npm są zawsze takie same i budowane z jednego repo. Wersja główna = wersja kontraktu.
- Shell buduje jako moduły ES:
react,react-dom/client,react/jsx-runtime,@emotion/react,@emotion/styled,@mui/material,react-router-dom,@kododo-dev/way-shell(runtime). Pliki z hashem w nazwie, cacheimmutable. index.htmlpowłoki zawiera<script type="importmap">z mapowaniem nazw na te pliki, wstawiany przez backend razem z<base href>.- Nie współdzielimy
@mui/icons-material: współdzielenie wyłącza tree-shaking, a pełny zestaw ikon jest ogromny. Ikony są bezstanowe, więc każdy Way dołącza tylko swoje. Podobnie inne bezstanowe biblioteki (np.country-flag-iconsw CultureWay). - Singletonami muszą być React (hooki), emotion (motyw, cache stylów), router i runtime Shella (konteksty).
Wszystkie Way są w React, więc w v1 moduł eksportuje komponent, a nie framework-agnostyczne mount(element). Dzięki temu konteksty, portale i dialogi są w jednym drzewie.
// way.js, budowany presetem wayModule()
import { defineWay } from '@kododo-dev/way-shell';
export default defineWay({
contract: 2,
App, // React.ComponentType<WayProps>, renderowany wewnątrz routera powłoki
translations, // opcjonalnie: słowniki Way per język
theme, // opcjonalnie: nadpisania motywu (np. gęsty, monospace w LogWay)
});WayProps / useShell(): apiBase, api (klient z obsługą sesji i ProblemDetails), language, themeMode, navigate(wayId, path), user, settings (ustawienia hosta + ustawienia własne Way z backendu).
builder.Services.AddConfigWay().AddUI(); // rejestruje deskryptor Way w Shellu
app.UseConfigWay("/config"); // tryb pojedynczy: powłoka z jednym modułem pod /config
app.UseWayShell("/admin") // opcjonalnie: wspólny panel wszystkich Way
.RequireAuthorization("Admin");- Rejestr:
Use*Waydodaje doWayRegistrydeskryptor (id, nazwa, ikona, ścieżka, URL modułu, wersja kontraktu, „wrażliwy”, np. LogWay). Powłoka czyta rejestr leniwie przy żądaniu, więc kolejnośćUse*nie ma znaczenia. - API powłoki (Reiho):
GetShellSettingszwraca tytuł, homeUrl, język, linki, użytkownika i listę Way, do których bieżący użytkownik ma dostęp. Dostęp oceniamy polityką złożoną z metadanychIAuthorizeDataendpointów danego Way (AuthorizationPolicy.CombineAsync+IPolicyEvaluator). - Ustawienia hosta w jednym miejscu:
ShellOptions { Title, HomeUrl, Language, Links, User }. Pola zEditorOptionsiLogWayUiOptionsdostają[Obsolete]i są przekazywane do Shella, więc nie ma zmiany łamiącej w C#. Uprawnienia specyficzne dla Way (CanImport,CanManageCultures) zostają w Way. - Ochrona: mechanizm z LogWay (403 poza Development bez jawnej autoryzacji) przeniesiony do Shella i włączony dla wszystkich Way. Wyjście:
RequireAuthorization(...),AllowAnonymous()na grupie alboShellOptions.AllowAnonymous(dema). Ostrzeżenie w logu przy starcie dla niechronionego Way, a treść 403 (ProblemDetails) mówi, jak to naprawić. To zmiana zachowania dla ConfigWay, CultureWay i RunWay, więc wchodzi z majorem rodziny (2.0.0). - Serwowanie: Reiho 2.1.0 dostaje ogólny hak w
MapEmbeddedSpa: własne podstawienia windex.htmlliczone per żądanie, obok__BASE_PATH__, np.o.Placeholder("__IMPORT_MAP__", ctx => ...). Cała wiedza o import map, rejestrze i modułach Way jest w Shellu. Cache, PathBase i<base href>zostają w Reiho, bez kopiowania. Moduł Way (way.js+ css) dalej osadzony w assembly Way.
- Way zależy od
Kododo.Way.Shellz zakresem[2.0, 3.0), więc NuGet nie pozwoli zmieszać wersji głównych. Kontrakt modułu ma numer wersji głównej rodziny: 2 (poprawione 2026-10-16, w fazie 1 omyłkowo było 1). - Moduł niesie numer kontraktu z czasu budowania. Jeśli powłoka go nie obsługuje, pokazuje kartę błędu „przebuduj Way” zamiast się wywrócić.
- Każdy Way jest w osobnej granicy błędów (error boundary).
- Podbicie wersji głównej React/MUI = wersja główna Shella = zgrane wydanie wszystkich Way.
- Wspólny major rodziny: Shell i wszystkie biblioteki Way mają ten sam numer główny, a minor i patch są indywidualne. Pierwsze wydanie na Shellu to 2.0.0 dla
Kododo.Way.Shelli każdego Way. Zmiana łamiąca w pojedynczym Way czeka na major rodziny albo idzie przez[Obsolete]. Reiho i aplikacje (Polyglot, Logle) mają własne numery. - Routing w v1: hash (
/admin#/logs/...,/config#/...). Router należy do Shella, więc późniejsze przejście na history to zmiana tylko w Shellu.
npm run devw Way:WayDevHostz@kododo-dev/way-shellrenderuje powłokę wokół modułu, a biblioteki są dołączane normalnie (bez import map), proxy/apina backend.npm run build: presetwayModule(), czyli Vite w trybie lib,external= biblioteki wspólne, wynikdist/way.js+way.css.- Testy Vitest Way działają bez zmian; nowe testy kontraktu w repo Shella.
Cel: potwierdzić, że podejście działa, zanim cokolwiek ruszymy w Way.
- Minimalna powłoka + dwa sztuczne moduły Way w osobnych assembly, import map z vendor bundle React 19 / MUI 9 / emotion / router.
- Sprawdzić: jedna instancja React (hooki), wspólny motyw emotion w modułach, dialogi i portale MUI, lazy
import()modułu, CSS modułu, PathBase (ASPNETCORE_PATHBASE,UsePathBase). - Zmierzyć: rozmiar vendor bundle (gzip) wobec dzisiejszego SPA jednego Way; czas ładowania.
- Sprawdzić ocenę dostępu do Way z polityk
RequireAuthorizationgrupy. - Kryterium wyjścia: wszystko działa w Chrome/Firefox/Safari (import maps) i rozmiar jest akceptowalny; inaczej wracamy do wariantu iframe.
- Stan 2026-10-16: prototyp zrobiony i usunięty przed pierwszym commitem repo (2026-10-17); jego ustalenia weszły do fazy 1. 65/65 scenariuszy w Chrome, Edge, Firefoxie i WebKicie (przybliżenie Safari), także z PathBase. Biblioteki wspólne razem 297 KB gzip, moduł 2-3 KB (dziś SPA ConfigWay 162 KB). Kryterium wyjścia spełnione, iframe niepotrzebny. Najważniejsze ustalenie: preset
wayModule()musi przepisywać głębokie importy@mui/material/*.
- Repo
WayShell:src/Way.Shell(NuGet),src/Way.Shell.Tests,src/way-shell(npm),src/Way.Shell.Demo. - Konwencje rodziny: Directory.Build.props, net8/9/10, Reiho 2, CI (build, testy, ESLint, Vitest), README po angielsku, ten dokument po polsku.
- Typy kontraktu v1,
defineWay, presetwayModule(). - Publikacja npm (organizacja
kododo-devna npmjs założona 2026-10-16, plan Free, właścicieljacalapa):- Docelowo Trusted Publishing z GitHub Actions (OIDC) z provenance, bez długowiecznego tokenu w sekretach.
- Kolejność: pierwsza publikacja
@kododo-dev/way-shellręcznie z maszyny użytkownika (albo granularnym tokenem o krótkiej ważności), bo zaufanego wydawcę ustawia się na istniejącej paczce. Potem w ustawieniach paczki Trusted Publisher = repokododo-dev/WayShell+ plik workflow publikacji. Na koniec ustawienie „require 2FA and disallow tokens”. - Workflow publikacji:
permissions: id-token: write,npm publish --provenance --access public, wersja npm = wersja NuGet z tego samego tagu. - E-mail konta npm trafia do metadanych każdej paczki (publicznie). Przed pierwszą publikacją zdecydować, czy zostaje adres służbowy, czy adres projektu.
- Po stronie konta (robi użytkownik): 2FA na koncie, wymuszenie 2FA w organizacji, podpięcie GitHuba do odzyskiwania, opcjonalnie drugi właściciel organizacji.
- Stan 2026-10-16: szkielet gotowy lokalnie (bez gita i publikacji).
src/Way.Shell:WayShellContract.Version, deskryptorWayModulez walidacją id. 14 testów na net8/9/10, w tym zgodność numeru kontraktu z paczką npm.src/way-shell: kontrakt (CONTRACT,defineWay,WayProps,useShell,ShellContext), lista bibliotek wspólnych i presetwayModule()z ustaleniami z prototypu: przepisywanie@mui/material/*ireact-router, wstrzykiwanie kontraktu przy budowaniu, błąd przy próbie dołączenia drugiej kopii biblioteki wspólnej (np. przez@mui/system) albo przy JSX deweloperskim. 9 testów Vitest, w tym budowanie modułów testowych. ESLint,tsc,npm packczyste..github/workflows:ci.yml(.NET + npm),publish.yml(jeden tag publikuje NuGet i npm; npm przez Trusted Publishing z provenance, wersje przedpremierowe pod tagiemnext).- Odłożone do fazy 2, bo bez backendu Shella byłyby puste:
Way.Shell.Demoi zależność od Reiho 2. - Vitest 4 zamiast 3: Vitest 3 (np. w LogWay) ma zgłoszone podatności w zależnościach deweloperskich (tinypool, @vitest/mocker).
-
Reiho 2.1.0: hak podstawień w
MapEmbeddedSpa+ testy (osobny PR i wydanie Reiho, minor). -
WayRegistry, deskryptor Way,UseWayShell, APIGetShellSettings. -
ShellOptions, ocena dostępu per Way, ochrona 403 dla wszystkich Way (ostrzeżenie przy starcie, czytelny ProblemDetails). -
Serwowanie powłoki z import map i
<base href>. -
Testy: rejestr, filtrowanie po uprawnieniach, PathBase, 403 poza Development, cache.
-
Stan 2026-10-16: zrobione lokalnie (bez gita i publikacji), poza przekazaniem opcji z Way (
[Obsolete]), które jest w fazie 5.- Reiho 2.1.0 wydane:
MapEmbeddedSpa(assembly, o => o.Placeholder(...))(PR kododo-dev/Reiho#17). AddWayShell,MapWay(module, path)dla bibliotek Way,UseWayShell(path),ShellOptions(Title,HomeUrl,Language,Links,User,AllowAnonymous,AssetsPath,Noncedla CSP).- UI powłoki w
src/Way.Shell/UI: biblioteki wspólne, runtime ze źródełway-shell(Vitededupe, żeby nie było dwóch Reactów) i minimalna aplikacja powłoki (pełny layout w fazie 3). - Demo
src/Way.Shell.Demoz modułem zbudowanym presetemwayModule()(dwa Way z jednego modułu, panel, logowanie „na niby”) i scenariuszami Playwright we2e/check.mjs: 18/18 w Chrome, Edge, Firefoxie i WebKicie, także zASPNETCORE_PATHBASE. - 44 testy .NET na net8/9/10: strona i import map, ustawienia, PathBase (także z
PathBasew konfiguracji), nonce, pliki modułu i bibliotek, 403 poza Development dla strony, plików modułu i API,FallbackPolicy, ostrzeżenie przy starcie, lista Way w panelu wg uprawnień.
- Reiho 2.1.0 wydane:
-
Zmiany wobec planu (2026-10-16):
- Ustawienia trafiają do strony jako JSON (
<script type="application/json">), zamiast osobnego APIGetShellSettings: o jedno żądanie mniej, a i tak są liczone przy każdym wejściu. - Wspólne pliki pod
/_way-shell(anonimowo, raz na aplikację, ścieżka wShellOptions.AssetsPath); moduł Way pod{ścieżka Way}/_way/, więc obejmuje go autoryzacja Way. <base href>liczy Shell zRequest.PathBase, a nie Reiho z__BASE_PATH__. Reiho dokleja wartośćPathBasez konfiguracji doRequest.PathBase, więc przyASPNETCORE_PATHBASE+UsePathBase(jak radzi README Reiho i jak robią dema) prefiks jest podwójny (/demo/demo/hello/). Do poprawienia w Reiho osobno.- Ochrona 403: filtr dla handlerów (API) i owinięcie
RequestDelegatedla stron i plików; jako decyzja liczy się teżFallbackPolicy(LogWay jej nie widzi). WayInfo.settingsjest na razie puste; hak na ustawienia Way dojdzie przy pilotażu ConfigWay (faza 4).
- Ustawienia trafiają do strony jako JSON (
-
Layout jako uogólnienie obecnych
MainLayout/SideMenu/PageHeader: tytuł, homeUrl, linki hosta, użytkownik z wylogowaniem, przełącznik motywu i języka. -
Klient API (
ApiError,SessionExpiredError,ForbiddenError) +SessionExpiredDialogz CultureWay. -
i18n: język w powłoce, słowniki Shella + słowniki Way.
-
Ładowanie modułu, error boundary, karta niezgodnego kontraktu,
WayDevHost. -
Tryb pojedynczy: bez przełącznika Way.
-
Stan 2026-10-16: zrobione lokalnie (bez gita i publikacji).
- Cały UI powłoki (
ShellApp) jest w paczce npm, asrc/Way.Shell/UItylko buduje biblioteki i go renderuje. Dzięki temuWayDevHostpokazuje przynpm run devtę samą powłokę co aplikacja. - Układ jak w CultureWay: boczne menu z tytułem (link
HomeUrl), wyborem języka i motywu, listą Way w panelu (ikony po nazwie), miejscem na menu Way (WayMenu, portal), linkami hosta i użytkownikiem z wylogowaniem (POST) na dole. Na wąskim ekranie menu wysuwa się z przycisku wPageHeader; Way bezPageHeaderdostaje od powłoki wąski pasek z tym przyciskiem. - Dla modułów:
WayProps.api(createApi:ApiErrorz polami,ForbiddenError,SessionExpiredError, jedno okno „sesja wygasła” w powłoce),useI18n()(słowniki Way, język: wybór użytkownika > host > przeglądarka, zapamiętany),PageHeader,WayMenu,themeWay (obiekt albo funkcja trybu) nakładany na motyw powłoki. - Język i motyw pamiętane w
localStorage(way-shell:language,way-shell:theme), wspólne dla wszystkich Way na tej samej domenie. - Backend:
ShellUser.AccountUrl,ShellLink.Icon, adresy~/...w opcjach dostająPathBase. Reiho 2.1.1 (poprawka podwójnego prefiksu) wydane i użyte. - Preset
wayModule()wvite devdeduplikuje biblioteki wspólne (paczka podpięta przezfile:albo w monorepo dawała drugi React). - Testy: 22 w Vitest, 45 .NET na net8/9/10, scenariusze demo 31/31 w Chrome, Edge, Firefoxie i WebKicie (też z
ASPNETCORE_PATHBASE), w tym język, motyw, wygasła sesja, wylogowanie i widok telefonu;WayDevHostsprawdzony ręcznie przez Playwright. - Biblioteki wspólne z całą powłoką: 304 KB gzip.
- Cały UI powłoki (
-
ConfigWay jest najprostszy i ma już MUI 9, więc problemy Shella nie mieszają się z migracją MUI.
-
SPA → moduł; usunięte skopiowane konteksty i layout;
UseConfigWaybez zmian w API C#. -
Istniejące testy, e2e i demo (
kododo.dev/configway/demo) muszą przejść bez zmian w zachowaniu. -
Po pilotażu: przegląd kontraktu i ewentualne poprawki, zanim migrujemy resztę.
-
Stan 2026-10-16: pilotaż zrobiony lokalnie na gałęzi
nextConfigWay (bez commitów).- Backend:
UseConfigWay=MapWay(WayModule("config", "Configuration", ..., "SPA/dist") { Icon = "settings" })+ API Reiho na/api;AddUiEditorrejestruje powłokę. API C# bez zmian. - SPA → moduł (
src/way.tsx): usunięteMainLayout,ThemeContext,LayoutContexti globalnyindex.css; motyw ConfigWay jakothemeWay; menu sekcji wWayMenu;PageHeaderConfigWay opakowuje nagłówek powłoki;useI18nConfigWay bierze język z powłoki (słownikit.kluczbez zmian); API przezuseShell().api.npm run devzWayDevHost. - Moduł 13 KB gzip (dotąd całe SPA 162 KB).
- Testy ConfigWay bez zmian w zachowaniu poza zamierzonym 403: hosty testowe i demo dostały
.AllowAnonymous(). NoweShellTests(strona, moduł, 403). 170 × 3 TFM + 23 PG + 23 SQL zielone. Scenariusze w przeglądarce na demo (ConfigWay.Demo.Web/e2e/check.mjs): 14/14 w Chrome, Edge, Firefoxie i WebKicie, w tym zapis ustawień, język, motyw, telefon. - Do czasu publikacji paczek ConfigWay korzysta z WayShell obok (
UseLocalWayShell, domyślnietrue; npmfile:zinstall-links=true). CI i deploy ConfigWay nanextnie zadziałają, dopóki paczki nie będą w NuGet i npm (faza 7 przełącza na wersje z rejestrów).
- Backend:
-
Przegląd kontraktu po pilotażu (zmiany w Shellu):
- Numer kontraktu 2 = wersja główna rodziny (w fazie 1 było omyłkowo 1).
navigate(wayId, path, { replace }): w trasie z gwiazdką powłoki (/:wayId/*) linki względne routera poza własnym<Routes>modułu liczą się od całego adresu (section/xz#/config/section/a→.../section/a/section/x). Menu Way i przekierowania „od korzenia Way” idą przeznavigate; opisane w kontrakcie i README, demo też przestawione.- Motyw Way budowany od nowa z połączonych opcji powłoki i Way, a nie nakładany na gotowy motyw (warianty typografii miały już font powłoki, więc font ConfigWay nie docierał).
- Powłoka zamyka menu na telefonie po każdej nawigacji, także z menu Way.
- Zależność
file:jako symlink dawała drugi zestaw typów MUI w TS;install-links=trueodwzorowuje instalację z rejestru. - Ryzyko globalnego CSS potwierdzone (
index.cssConfigWay ustawiał font:rooti paski przewijania dla całej strony) i usunięte. Przy migracji pozostałych Way sprawdzać globalne style. - Uwagi poboczne: lint ConfigWay nie działał już wcześniej (brak konfiguracji ESLint, CI go nie uruchamia); naprawione podatności dev w lockfile ConfigWay (
npm audit fix).
-
CultureWay:
EditorOptions.Title/HomeUrl/Language/Links/User→ShellOptions([Obsolete]z przekazaniem);HostMenuiSessionExpiredDialogjuż w Shellu. -
RunWay: podbicie MUI 7 → 9 i Vite 7 → 8 razem z migracją.
-
LogWay: własny motyw jako nadpisanie, gęsty układ, SSE,
AllowAnonymous→ ochrona w Shellu; MCP bez zmian. -
Hosty: Polyglot i Logle przechodzą na
ShellOptions(tytuł, linki, użytkownik). Testy HTTP hostów muszą przejść. -
Stan 2026-10-16: CultureWay i RunWay zmigrowane lokalnie na gałęziach
next(bez commitów), LogWay wstrzymany (pomysł TelemetryWay/Polymeter).- CultureWay (
translations, „Translations”):EditorOptions.Title/HomeUrl/Language/User[Obsolete]z przekazaniem doShellOptions; przestrzeń nazw w adresie (#/ns/...); 201 × 3 TFM + 43 PG; przeglądarki 15/15 × 4; moduł 78 KB gzip (dotąd 223 KB, głównie wszystkie flagi zcountry-flag-icons). Demo dostałoUseRouting()poUsePathBase(405 dla POST pod prefiksem). - RunWay (
scheduler, „Scheduler”): MUI 7 → 9.5, Vite 7 → 8; Data Grid 9.0.0-rc.0 i Lab 9.0.0-beta.10 (stabilne 8.x nie wspierają MUI 9); 61 × 3 TFM + 37 PG + 37 SQL; przeglądarki 17/17 × 4; moduł 266 KB gzip (dotąd 412 KB; Data Grid, recharts, Lab, dayjs). - Poprawki Shella po migracji (zrobione 2026-10-16, obejścia w CultureWay i RunWay usunięte):
ShellOptions.DynamicLinks: lista funkcji z linkami liczonymi przy każdym żądaniu (każdy Way i host może dodać swoje).EditorOptions.LinksCultureWay[Obsolete], przekazywane tam;HostLinksw module usunięte.@mui/systemw bibliotekach wspólnych (+5 KB gzip, razem 309 KB). Preset przepisuje@mui/material/Xi@mui/system/Xna korzeń, a eksport domyślny bierze z eksportu korzenia o tej samej nazwie (działa teżimport useMediaQuery from '@mui/material/useMediaQuery').- Preset podstawia
use-sync-external-storemodułem ES na wspólnym React; a każdyrequire()biblioteki wspólnej w zależności CommonJS kończy build czytelnym błędem (hooktransformna plikach.js/.cjs, plus zabezpieczenie na komunikat Rolldowna w wyniku). - Otwarte: ostrzeżenie presetu o dużym
way.js, leniwe ładowanie flag w CultureWay i wykresów w RunWay.
- Polyglot po CultureWay 2.0: opcje do
AddWayShell,.AllowAnonymous()w trybie bez logowania, klucz motywuway-shell:theme.
- CultureWay (
-
UseWayShell("/admin"): menu zarejestrowanych Way, routing#/{wayId}/...,navigate(wayId, path)między Way. -
Demo z czterema Way w jednej aplikacji (kandydat na kododo.dev).
-
Przygotowanie pod TraceWay: link z
trace:w LogWay do śladu. -
Stan 2026-10-17: zrobione lokalnie (bez gita i publikacji).
- Panel, menu Way, routing
#/{wayId}/...inavigatew panelu były już od faz 2-3. Nowe w kontrakcie (nadal 2, bo jeszcze niewydany):WayProps.ways(Way, które bieżący użytkownik może otworzyć) ihref(wayId, path)(adres do<a href>,nulldla Way niedostępnego).navigatedo innego Way na stronie pojedynczego Way przechodzi na jego stronę; dotąd nic nie robił, bo strona znała tylko swój Way. - Backend: strona pojedynczego Way dostaje też pozostałe Way widoczne dla użytkownika (ta sama ocena dostępu co panel) i
wayIdbieżącego. Menu Way pokazuje się dalej tylko w panelu. - Pod TraceWay: LogWay pokaże link
href('traces', 'trace/{id}')tylko, gdy nie jestnull. Way, do którego linkują inne, dokumentuje swoje trasy jako publiczne (READMEway-shell). - Demo z trzema Way:
../../Showcase(osobny folder, bo zależy od ConfigWay, CultureWay i RunWay; kandydat na kododo.dev). Sklep na niby: ustawienia w ConfigWay, teksty strony w CultureWay, zadania w RunWay czytające ustawienia; panel/admini każdy Way pod własną ścieżką. ScenariuszeShowcase/src/Showcase/e2e/check.mjs: 32/32 w Chrome, Edge, Firefoxie i WebKicie, także zPathBase=/demo. Dockerfile i deploy w fazie 7 (kontekst budowania obejmuje kilka repo, dopóki nie ma paczek). - Testy: 47 .NET × 3 TFM, 28 Vitest, demo Shella 37/37 × 4 przeglądarki (w Production).
- Panel, menu Way, routing
-
Znalezione przy łączeniu Way (poprawione na
nextRunWay):- RunWay.PostgreSQL brał dostawcę EF Core 8 na każdym TFM, a ConfigWay i CultureWay Npgsql 10: w jednej aplikacji
TypeLoadExceptionw Npgsql. Do tego kod RunWay zbudowany pod EF Core 8 nie działa na EF Core 10 (SetPropertyCallswExecuteUpdatezniknął), więc żadna aplikacja net10 z własnym EF Core 10 nie uruchomiłaby RunWay. Teraz EF Core i Npgsql w RunWay idą za TFM (8/9/10), a RunWay.SqlServer przypina poprawionySystem.Security.Cryptography.Pkcsjak ConfigWay. - EF Core 10 na SQL Server wysyła listę w
Containsjako osobne parametry; taki plan dawał zakleszczenia w testach współbieżności RunWay. RunWay.SqlServer na net10 wraca do jednego parametru JSON (UseParameterizedCollectionMode(Parameter)), jak EF Core 8 i 9. - Testy RunWay: 61 × 3 TFM + 37 PG + 37 SQL; demo RunWay 17/17 × 4 przeglądarki w Production.
- Otwarte w RunWay (sprzed zmian): ostrzeżenia EF o
Skip/TakebezOrderByi o dwóch relacjachDbRecurrence.Job/DbJob.Recurrence. - Uwaga do uruchamiania dem:
dotnet runbierze port i środowisko zlaunchSettings.json(Development), więc sprawdzanie „w Production” wymaga--no-launch-profile.
- RunWay.PostgreSQL brał dostawcę EF Core 8 na każdym TFM, a ConfigWay i CultureWay Npgsql 10: w jednej aplikacji
-
Drobne po fazie 6 (2026-10-17):
- Shell: propsy Way (
api,navigate) mają stałą tożsamość. WcześniejuseNavigate()zmieniał się po każdej zmianie adresu, więc każda nawigacja dawała nowego klienta API, a CultureWay pobierał tłumaczenia od nowa (i mógł zgubić niezapisaną edycję). Test regresji w e2e CultureWay. - Preset: to, co moduł ładuje przez
import(), trafia dodist/chunks/[name]-[hash].js(osadzane i serwowane obokway.js, z autoryzacją Way i długim cache); ostrzeżenie, gdyway.jsma ponad 100 KB po gzipie (sizeWarningKb). - CultureWay: flagi ładowane po jednej (
country-flag-icons/string/3x2),way.js78 → 24 KB gzip. RunWay: wykres i strony z Data Grid / Lab ładowane leniwie,way.js266 → 7 KB gzip. - RunWay: zadania zawsze posortowane (na końcu po id, stabilne stronicowanie), relacje zadanie ↔ cykl skonfigurowane jawnie zamiast
[ForeignKey]po obu stronach; model bez zmian wobec migracji, bez ostrzeżeń EF przy starcie. - Wszystkie dema w Production (
--no-launch-profile) w Chrome, Edge, Firefoxie i WebKicie: Shell 37/37, ConfigWay 14/14, CultureWay 17/17, RunWay 17/17, Showcase 32/32.
- Shell: propsy Way (
-
2.1.0 (2026-10-17, gałąź
feat/shell-2.1), dla Polyglota jako jednej aplikacji w panelu:ShellOptions.Notice: notka nad każdym Way (panel i strona Way), np. „publiczne demo”.WayModule.IsHidden: Way bez pozycji w menu panelu, otwierany pod#/{id}/(np. konto z linku pod nazwą użytkownika); panel przekierowuje na pierwszy widoczny Way.UseWayShell("/"): panel w korzeniu aplikacji. Konwencja na grupie zawęża trasę catch-all Reiho do samego/(pliki panelu i tak idą zAssetsPath); bez tego każdy nieznany adres dostawał 404 panelu albo przekierowanie na logowanie (klient API z kluczem: 302 zamiast 404). Inne endpointy hosta odpowiadają jak dotąd.MapWayw korzeniu dalej zabronione.- 2.1.1: pod PathBase adres aplikacji bez końcowego ukośnika (
/app) ma pustą ścieżkę, z której Reiho nie umiał wyciąć/trasy panelu w korzeniu (500 u zalogowanego na demie Polyglota). Konwencja ustawia wtedyPath = "/"; test z adresem bez ukośnika. - Kontrakt modułu bez zmian (2). Testy: 53 × 3 TFM, npm 31; demo Shella (notka, ukryty Way „Account”) 40/40 × 4 przeglądarki.
- Dokumentacja (README Shella, sekcje „Using with other Ways” w README Way, przewodnik migracji opcji).
- Reiho 2.1.0 przed Shellem. Potem jednym rzutem 2.0.0: Way.Shell → ConfigWay → CultureWay → RunWay → LogWay; następnie hosty (Polyglot, Logle) na nowych paczkach.
- Przewodnik migracji do 2.0: blokada 403, opcje
[Obsolete]→ShellOptions, Reiho 2 dla aplikacji używających Reiho bezpośrednio, zmiana kształtu odpowiedzi API edytorów (204 + ProblemDetails). - Po wydaniu: szablon
dotnet new kododo-way(pomysł 10) oparty na Shellu.
-
Nazwa: repo
kododo-dev/WayShell, NuGet i namespaceKododo.Way.Shell. PrzestrzeńKododo.Way.*zostaje dla infrastruktury rodziny (późniejKododo.Way.All, szablon). -
npm: npmjs.com, scope
@kododo-dev, paczka@kododo-dev/way-shell. Scope@kododojest zajęty przez innego użytkownika (paczkatelegram-js-botz 2022), a@kododo-devbył wolny 2026-10-16. Organizacja założona 2026-10-16; publikacja przez Trusted Publishing (faza 1). -
Routing: hash w v1; history później, tylko w Shellu.
-
Ochrona 403 poza Development: dla wszystkich Way (secure by default), z jawnymi wyjściami i ostrzeżeniem przy starcie.
-
Wersjonowanie: wspólny major rodziny (Shell + wszystkie biblioteki Way), minor i patch indywidualnie; Reiho i aplikacje osobno. Pierwsze wydanie na Shellu = 2.0.0 dla wszystkich. ConfigWay nie jest wydawany teraz: zmiany z 2026-10-15 (Reiho 2, RequestException, przypięty Pkcs) wychodzą razem z Shellem jako 2.0.0. CultureWay, LogWay i RunWay wychodzą teraz jako kolejne preview/alpha 1.0.0-*, a stabilnego 1.0 nie dostaną.
-
Serwowanie: ogólny hak podstawień w
MapEmbeddedSpa(Reiho 2.1.0), logika import map i modułów w Shellu. -
ConfigWay 1.0.3 nie będzie (2026-10-16): poprawka CVE w
System.Security.Cryptography.Pkcswychodzi dopiero z 2.0.0. Zmiany ConfigWay i RunWay czekają na gałęziachnext; RunWay też wychodzi jako 2.0.0 z Shellem (na NuGecie jest już RunWay 1.0.0).
- Rozmiar vendor bundle: całe MUI bez tree-shakingu; mierzone w fazie 0, a dla panelu admina zwykle akceptowalne.
- Zgrane wydania przy podbiciu React/MUI: świadoma cena jednej wersji bibliotek.
- Ukryte zależności od globalnego CSS i
document.titlew obecnych SPA: do wyłapania w pilotażu. - Kolejka wydań: praca nad Shellem zaczyna się po wydaniu bieżących zmian (LogWay, Logle, CultureWay, RunWay, Polyglot; ConfigWay czeka na 2.0.0); migracje Way dotykają tych samych repo.
- ConfigWay i RunWay na gałęziach
nextprzez cały czas prac nad Shellem (od 2026-10-16): migracja na Shell idzie odnext, a poprawki domaintrzeba przenosić nanext.