lilleman
1787754781
Extend the read-only treatment to OAuth2 clients and write-intent GETs
2026-08-05 15:38:56 +02:00
lilleman
765f349007
Model the read/write split in the UI: read-only views, self-revoke and inherited-grant guards
2026-08-05 15:38:37 +02:00
lilleman
29d654c012
Permissions are a fixed list from plugin code; grant them on Users and Groups
2026-08-05 15:38:21 +02:00
lilleman
fb4382be9d
Enforce the permission-name rule at discovery, for every plugin
2026-08-05 15:38:00 +02:00
lilleman
27fee5f8a3
Permission names are <resource>:<action>, replacing the catch-all admin permission
2026-08-05 15:37:39 +02:00
lilleman
690d67728b
Watch what a beforeAll logs, and record where each message came from
CI / full-gate (push) Successful in 2m48s
2026-08-05 11:15:37 +02:00
lilleman
e808f87fbd
Fail an E2E test on anything the browser logs, in all three engines
CI / full-gate (push) Successful in 2m51s
2026-08-05 11:00:25 +02:00
lilleman
e5bdc15262
Prune deleted tags on the GitHub mirror so it stops advertising dropped versions
CI / full-gate (push) Successful in 2m40s
Mirror / github-mirror (push) Successful in 7s
2026-08-05 10:42:39 +02:00
lilleman
2fb5e695e1
Record the docs-skip and no-release decisions, and blind the guard to comments
CI / full-gate (push) Successful in 2m42s
2026-08-05 10:34:46 +02:00
lilleman
cfeee10fa8
Wrap each popover menu and give it a caller-named id
CI / full-gate (push) Successful in 2m43s
2026-08-05 01:58:11 +02:00
lilleman
5d9bdebf59
Close the popup menus on an outside click, via the popover API
CI / full-gate (push) Successful in 2m40s
2026-08-05 01:37:58 +02:00
lilleman
2b09635ed5
Hold the one-verb rule in AGENTS.md instead of a unit test
CI / full-gate (push) Successful in 2m38s
Mirror / github-mirror (push) Successful in 6s
2026-08-05 00:52:09 +02:00
lilleman
9a9c63e625
Widen the one-verb guard to inflections and drop the last competing English string
CI / full-gate (push) Successful in 2m38s
2026-08-05 00:43:05 +02:00
lilleman
34b668d49f
Use one verb per action in the English UI: sign in, sign out, create account
CI / full-gate (push) Successful in 2m39s
2026-08-05 00:34:05 +02:00
lilleman
46548ae758
Narrow the settings-cog test assertions and record the icon-registry contract
CI / full-gate (push) Successful in 2m37s
Mirror / github-mirror (push) Successful in 6s
2026-08-05 00:20:34 +02:00
lilleman
e03c1d1a2f
Let an operator mount plugin catalogs; document the end-user personas
CI / full-gate (push) Successful in 2m37s
2026-08-04 10:31:08 +02:00
lilleman
37b88b2fe6
Show the language picker on every page, targeting the nearest page that answers GET
CI / full-gate (push) Successful in 2m39s
2026-08-04 09:37:03 +02:00
lilleman
7e4c6940c9
Escape the values interpolated into the one markup-carrying message
CI / full-gate (push) Successful in 2m37s
2026-08-04 00:42:54 +02:00
lilleman
18e1a8d29d
Keep the chrome lazy for error pages, guard the guard-error render, split the recovery link
CI / full-gate (push) Successful in 2m38s
2026-08-04 00:31:19 +02:00
lilleman
be3bc2bdbb
Stability fixes: plugin-scoped contexts for owned pages, absent-href guard, checked locale mounts
CI / full-gate (push) Successful in 2m37s
2026-08-03 23:51:40 +02:00
lilleman
2b20497785
Pin the chrome's locale carrying in unit tests; keep one carrier list
CI / full-gate (push) Successful in 2m36s
2026-08-03 23:25:54 +02:00
lilleman
b3df7084c4
Reserve the locale param, carry it on breadcrumbs, translate the permissions detail view
CI / full-gate (push) Successful in 2m38s
2026-08-03 23:21:38 +02:00
lilleman
6440c543e5
Architecture review fixes: partials carry the locale, mountable locales/, shared core words
CI / full-gate (push) Successful in 2m36s
2026-08-03 23:12:18 +02:00
lilleman
245d1ad5b5
Add i18n support: per-locale catalogs, URL-driven locale, translated core and examples
CI / full-gate (push) Successful in 2m37s
2026-08-03 22:37:27 +02:00
lilleman
f38b5373bd
Say user throughout, noting Ory's identity naming in the docs
2026-08-03 17:41:40 +02:00
lilleman
9966b6bd46
Record the authorization vocabulary decision in AGENTS.md
2026-08-03 17:41:40 +02:00
lilleman
096720904e
Rename the coarse gate from role to permission, matching RBAC
2026-08-03 17:41:40 +02:00
lilleman
8f9f79ac30
Document the users, groups and roles model in README
2026-08-03 17:41:40 +02:00
lilleman
62f95afe63
Merge branch 'main' into remove-stability-auto-review
CI / full-gate (push) Successful in 5s
Mirror / github-mirror (push) Successful in 6s
2026-08-02 15:19:13 +02:00
lilleman
12cc2d54c2
Clarify todo.md reference and record manual review policy
CI / full-gate (push) Successful in 5s
2026-08-02 15:12:22 +02:00
lilleman
bb6adc40af
Remove stability reviewer auto-run from AGENTS.md
CI / full-gate (push) Successful in 6s
2026-08-02 15:06:48 +02:00
lilleman
9213e5a0de
Make the CI web-image rebuild its own step; note the shared-workspace image-tag race
CI / full-gate (push) Successful in 2m37s
Mirror / github-mirror (push) Successful in 5s
2026-08-02 15:06:21 +02:00
lilleman
23bafd247d
Fix typos in the AGENTS.md comment rules
CI / full-gate (push) Successful in 6s
Mirror / github-mirror (push) Successful in 5s
2026-08-02 15:00:56 +02:00
lilleman
7c66599f35
Todo and agents updates
CI / full-gate (push) Successful in 6s
Mirror / github-mirror (push) Successful in 6s
2026-08-02 14:11:33 +02:00
lilleman
6db0f57bf4
Trim README and workflow prose that restates the code
CI / full-gate (push) Successful in 2m33s
Mirror / github-mirror (push) Successful in 6s
2026-08-02 13:55:50 +02:00
lilleman
cc886936ed
CI: sync release images to Docker Hub on vX.Y.Z tag push
CI / full-gate (push) Successful in 2m31s
Mirror / github-mirror (push) Successful in 2s
Release / retag-image (push) Successful in 14s
2026-07-04 17:08:31 +02:00
lilleman
c78770a713
AGENTS.md: document the todo.md task workflow (interview scope, stability-review loop, PR flow)
2026-07-03 14:50:54 +02:00
lilleman
8afaeccf2c
AGENTS.md: sharpen simplicity/typing/comment guidance, prefer state-in-URL over POST
2026-07-02 13:05:54 +02:00
lilleman
e8ea911b80
Move admin screens (users/groups/roles/oauth2-clients) into a drop-in example plugin; add the ctx.system capability surface
2026-07-02 08:01:15 +02:00
lilleman
2202bdbaa0
config/ becomes an empty drop-in mount; examples/ mirrors the mount dirs; plugins & config import the host via #plugin-api/#menu-config subpath imports
2026-07-01 23:19:48 +02:00
lilleman
4adf14f386
docs: restructure README around the plugin-author path, add examples/README, genericize the plugin walkthrough
2026-06-30 23:30:13 +02:00
lilleman
de22f51c12
Organize src/ into concern folders (http, auth, admin, plugin-host, ui); co-locate tests, move plugin-api barrel into plugin-host, sync docs + AGENTS layout
2026-06-24 00:23:55 +02:00
lilleman
6d316c4888
Drop .mjs: rename e2e/dev mock servers to .ts, update refs, document the convention in AGENTS.md
2026-06-23 23:54:42 +02:00
lilleman
bb612baa2c
Reorganize README for two readers: first-run Quick start + nested ToC, overview-first ordering; document the convention in AGENTS.md
2026-06-23 23:15:24 +02:00
lilleman
a9f25a7692
Remove completed todo.md + html-css-foundation mockups; strip dead §N phase refs from comments/docs (simplify visual E2E to drop the mockup-comparison oracle)
2026-06-23 22:49:28 +02:00
lilleman
e22d24aa8a
§10 - one menu everywhere (buildPluginChrome) + shell on every page; instructional starter dashboard; Kratos-native email docs
...
Collapse the three nav builders into buildPluginChrome: chrome.bestHref does longest-prefix matching so deep admin routes mark their leaf. Delete adminNav; buildConfirmModel and the admin model builders take the resolved nav. The same role-filtered sidebar now renders signed in or out, collapsing to a burger on narrow screens.
shell.ejs gains menu (default true; menu:false -> single-column .app-bare), docTitle (separate <title> from the topbar, so the body keeps the single <h1>), and hideSignIn (suppress the footer Sign-in on auth pages to avoid a login loop). auth/home/landing now render inside the shell.
Dashboard is a replaceable instructional starter (definePlugin snippet, no mock data). Email stays delegated to Kratos: documented its built-in courier.template_override_path instead of adding web-side SMTP.
2026-06-23 21:26:00 +02:00
lilleman
a9e3dedbb4
§9 structured logging + OTLP observability (todo §9); structured, OTLP-native logging on @larvit/log (2.3.0, pinned; itself zero-dependency — the one new runtime dep). New pure src/logger.ts: createLogger() builds one app Log tagged service.name=plainpages (level/format/OTLP from config, injectable stdout/stderr); requestLogger() clones it per request (own root trace, inheriting level/format/streams/OTLP) into a "request" span, adopting an inbound W3C traceparent so a request continues an upstream proxy's distributed trace (malformed ⇒ fresh trace; clone honours a passed traceparent while dropping the parent's, unlike parentLog). app.ts builds the per-request log at the top of the handler and on res "close" (fires on completion AND abort, unlike "finish") emits one access line (method/path-without-query/status/ms/requestId, guarded) then end()s to flush the span (fire-and-forget .catch — a flaky collector never crashes a served request); the catch-all 500 + Ory-unreachable re-mint now log via reqLog.error/warn; static.ts mid-stream error takes an injected onError. server.ts builds the app logger, logs discovery/listen/shutdown, end()-flushes on SIGTERM/SIGINT (re-entry-guarded). bootstrap.ts events go structured (the human first-run banner stays raw). Config (environment-agnostic, fail-loud): LOG_LEVEL (info), LOG_FORMAT (text; prod compose → json), OTLP_ENDPOINT (unset ⇒ console-only; set ⇒ export logs + spans to an OTel Collector), OTLP_PROTOCOL (http/json|http/protobuf). compose: base sets LOG_FORMAT=json, dev override flips it to text. Tests-first: logger.test.ts (service.name/severity/level-gate/format, OTLP-only-when-endpoint, a stubbed-fetch proof it POSTs /v1/logs, requestLogger context-merge/own-root-trace/traceparent-continue/malformed-ignored), config.test.ts (4 toggles + validation), app.test.ts (live request emits the JSON access line), compose.test.ts (prod json / dev text). Stability-reviewer: APPROVE, no Critical/High (addressed both yellow nits — guarded access line + "finish"→"close" so aborted requests log; shutdown re-entry guard — and the green ones). README (config table, new Observability section, Status, Layout, runtime-deps) + AGENTS (deps) updated. typecheck + 326 units green (317 → 326).
2026-06-20 02:11:10 +02:00
lilleman
0a5eafd2f8
Tighten §5 admin comments + README (todo §5 cleanup); compress the three near-identical admin module headers (drop restatement the README/code already carry), shorten the README Layout views/ run-on + add the missing delete-confirm view. Also bank a pre-existing AGENTS.md tweak: skip the stability-reviewer for purely doc/comment changes. Docs/comments-only — typecheck + 244 units green.
2026-06-18 19:25:02 +02:00
lilleman
a016a0131e
Built-in Roles & permissions admin screen (todo §5); /admin/roles list (search/sort/paginate) + create/delete + assign-to-users/groups + "effective access" (Keto expand → transitive members), writing only to Keto — gated admin-only + CSRF-guarded like Users/Groups (Kratos read only to label members). A role = Keto subject set Role:<name>#members; reuses the Groups membership helpers (now-exported pagedTuples/memberCandidates/safeDecode); added a Roles nav entry (i-shield) + a .plain-list CSS rule. Stability-reviewer run as a local PR: APPROVE, no Critical/High; addressed its explicit-expand-depth nit. Live boot-verify caught a real bug the tests missed — Keto v26.2.0 nests the expand subject under tuple (not node top-level as the §4 ExpandTree type guessed), so expandToEffectiveUsers returned []; fixed type+walker+fixtures, re-verified a group-only member surfaces in effective access. 237→243 units + typecheck green; expand chain boot-verified live then torn down.
2026-06-18 18:18:18 +02:00
lilleman
e83cf4da88
Address project-wide review (todo §3); fix JWKS_URL default → tokenizer signing key + read-only web mount, cap bootstrap restart, --no-deps for unit commands
2026-06-17 16:49:37 +02:00