Commit Graph

1892 Commits

Author SHA1 Message Date
Jakub Zych
76694c7cb9 docs: fill G2 in the external-escalation reply 2026-10-22 21:36:43 +02:00
Jakub Zych
3026cf61fb docs(quick-261022-tb4): password login refuses a not-activated account 2026-10-22 21:32:30 +02:00
Jakub Zych
cb33c497be docs(quick-261022-k9k): admin keyboard shortcuts 2026-10-22 21:11:24 +02:00
Jakub Zych
604fee757e chore(quick-261022-k9k): rebuild embedded admin dist 2026-10-22 21:08:31 +02:00
Jakub Zych
058738efdf test(quick-261022-k9k): keyboard shortcut coverage
- hotkey core: combos, AltGr and layouts, labels, aria-keyshortcuts, editable
  targets, modal root, refcounted install, disabled and repeat
- smoke: record, create, Create and new (new session key), Esc, modal scope,
  settings Save and close, My account, list search and the help dialog
- ShortcutHelpDialog rows, keys and close button
2026-10-22 21:07:40 +02:00
Jakub Zych
66bb96eebd docs: capture six user-plugin escalation quicks 2026-10-22 21:04:34 +02:00
Jakub Zych
101cad0365 feat(quick-261022-k9k): Esc, slash and help shortcuts, settings, account and modal save keys
- '?' help dialog (ShortcutHelpDialog) listing the current screen's shortcuts
- Esc = Cancel on record forms; '/' focuses the list search
- settings forms: Save and close (Ctrl/Cmd+Enter, then /settings) and Ctrl/Cmd+S
- My account: Ctrl/Cmd+S
- modal forms: Ctrl/Cmd+S and Ctrl/Cmd+Enter submit the innermost dialog only
- docs: Keyboard shortcuts section in the admin SPA page
2026-10-22 21:03:30 +02:00
Jakub Zych
49accf675e feat(quick-261022-k9k): admin save shortcuts and Create and new on record forms
- app/hotkeys.ts: dependency-free data-hotkey core (Ctrl/Cmd+S, Ctrl/Cmd+Enter,
  Ctrl/Cmd+Shift+S, Esc, / and ?), innermost-modal root, capture-phase modifier
  listener, platform labels and the help-dialog state
- Button hotkey prop (data-hotkey, aria-keyshortcuts); shortcuts installed by AppShell
- FormView: save keys and tooltips, Create and new on create forms via remountView
- phrasebook: form.create_and_new and the shortcuts group (en, pl)
2026-10-22 21:00:57 +02:00
Jakub Zych
1aff96f58a docs(19.7-02): record deferred items from the pier session router 2026-10-22 18:36:23 +02:00
Jakub Zych
8c6c0a3654 feat(19.7-02): identity kinds, ceilings, prompts and the MCP services page
- personal tokens only behind mcp.allow_personal_tokens (401 without a
  lookup otherwise); an admin token yields a backend-only identity with
  its scope limit per dispatched method, a user token a frontend-only one
- read/write ceiling and prompts proven by the tracer's subtests; the
  audit line asserted to carry the tool and never the arguments or token
- the mounted *pier.Pier is published on the application (test seams in
  export_test.go)
- docs/services/mcp.md with the tested acme.blog example, site.yaml note,
  cross-links from authentication.md, registration.md and the surf README
2026-10-22 18:34:39 +02:00
Jakub Zych
806e87c510 feat(19.7-02): Redis sessions, event fan-out, stateless protocol path and resource metadata
- store_redis.go: records with PX TTLs, per-binding sets, pub/sub events,
  opened lazily from redis.url under cooler's prefix (nothing dials at mount)
- events.go: pact.MCPSubjectChanged republished through the store; every
  instance recomputes the subject's sessions and stateless servers
  (list_changed) or ends them on revocation; the link cache is dropped
- stateless.go: the SDK's stateless handler over per-identity servers for
  2026-07-28 clients, routed by the protocol header or server/discover
- prm.go: RFC 9728 metadata at both well-known paths; long GET streams
  re-verify their bearer every minute
- TestPierSessionsSmoke, TestPierFanOutSmoke, TestPierStatelessSmoke on
  miniredis; README features, configuration and operational notes
2026-10-22 18:23:43 +02:00
Jakub Zych
cfdbaf0e47 feat(19.7-02): pier MCP module tracer with in-process dispatch and sessions
- modules/pier: Host contract, mcp.* config, catalog compiled from
  pact.HasMCP (prefixing, route binding, guard resolution, schema
  reflection, annotations), per-request identity through the published
  verifier and resolvers, built-in backend guard provider, in-process
  dispatch with the bouncer marker, per-identity SDK server with the
  per-request re-filter, stateful session router with rehydration over a
  memory store, audit lines
- modules/surf/pier_on.go: the summercms_mcp hook adapting the router to
  pier.Host; the untagged hello binary carries no SDK
- go.mod: go-sdk v1.8.0 and jsonschema-go v0.4.3 (decision note committed
  before this change)
- TestPierTracerSmoke: SDK client lists and calls acme_echo end to end
  through surf's compiled guard chain; README and root table row
2026-10-22 18:15:59 +02:00
Jakub Zych
3ea82a1543 docs(19.7-02): decide the MCP Go SDK
- decision note for go-sdk v1.8.0 and jsonschema-go v0.4.3 with the
  transitive graph, size, govulncheck result and the build-tag containment
- STACK.md rows for both modules naming the note (D-24)
2026-10-22 18:00:16 +02:00
Jakub Zych
3746675c72 docs(19.7-01): complete framework seams plan 2026-10-22 16:45:12 +02:00
Jakub Zych
fab99e0a00 chore(19.7-01): rebuild the embedded admin for account contributions and prompted actions 2026-10-22 16:38:37 +02:00
Jakub Zych
9a5f27e86c feat(19.7-01): admin SPA account contributions and prompted record actions
- AccountContributions.vue on My account: one card per contributed section
  with status and outline buttons; confirm or danger actions go through the
  shared ConfirmDialog; a returned URL opens in a new tab (noopener) and stays
  as a visible link; 409 reloads with the stale toast
- ConfirmRequest.prompt and useConfirm value; ConfirmDialog renders one
  labelled text input (maxlength, autocomplete off, aria-describedby comment,
  autofocus), confirm disabled until a value is typed, Enter confirms
- RecordActions posts {payload} for a prompted action and {} otherwise; a 422
  on payload shows the server's detail as a danger toast
- types.ts exports RecordActionPrompt, AccountContribution,
  AccountContributionAction, AccountActionResult
- vitest smokes AccountContributions.test.ts and RecordActionsPrompt.test.ts
2026-10-22 16:38:37 +02:00
Jakub Zych
9f14cf603c feat(19.7-01): account contributions, prompted record actions and backend subject events
- pact.HasAccountContributions compiled at Activate; GET /account/contributions
  and POST /account/contributions/{name}/actions/{action} behind interactiveOnly
  (AccountContributionView, AccountContributionActionView, AccountActionResultView)
- RecordAction.prompt (RecordActionPrompt) for a pact.AdminRecordAction with a
  Prompt; the record action route accepts payload only for such an action
  (trimmed JSON string, non-empty, capped at max_length) and hands it to Run as
  Value through CRUDService.RecordActionWithValue; a prompt without a label
  fails boot
- fireSubjectChanged: pact.MCPSubjectChanged for revoked tokens, Administrators
  saves that changed role, permissions or superuser, Roles saves that changed
  grants, deactivation and deletion
- phrases backend::lang.form.action_prompt_required/_too_long (en, pl)
- smoke tests TestAccountContributionsSmoke and TestRecordActionPromptSmoke;
  TestRecordActionPromptRun on Postgres; route inventories, CSRF walk and
  OpenAPI conformance cases extended for the two routes
- regenerated admin/openapi/admin.json and admin/src/api/schema.d.ts; cabana
  README, docs/backend/{admin-controllers,users-and-permissions}.md
2026-10-22 16:31:29 +02:00
Jakub Zych
6887abf575 feat(19.7-01): SDK-free pact contracts for MCP, account contributions and prompted actions
- pact/mcp.go: HasMCP, MCP, MCPTool, MCPPrompt, MCPGuard, MCPGuards,
  MCPSubject, MCPDispatch, MCPTokenVerifier, MCPGrant, ErrMCPTokenInvalid,
  MCPPersonalTokenResolver, MCPLinkedBackendResolver, LinkedBackendUser,
  MCPSubjectChanged and its kinds, FrontendPermission, HasFrontendPermissions
- capabilities.go: AdminActionPrompt, AdminRecordAction.Prompt,
  AdminRecordActionInput.Value, HasAccountContributions, AccountContribution,
  AccountAction, AccountActionInput, AccountActionResult
- discovery tests, MCPGuards registry test and a go list -deps assertion
  that pact names neither the MCP SDK, jsonschema-go nor bouncer
- pact README and docs/plugins/registration.md rows
2026-10-22 16:16:35 +02:00
Jakub Zych
5c15dea569 feat(19.7-01): streaming routes, MCP mount hook, configurable authorize scopes
- surf.Router.MountStream and recoverStream: a raw, unbuffered route kind
  whose http.Flusher reaches the client; panic after the first byte only
  aborts the body
- surf.MCPBuildTag and the mountPier hook: mcp.enabled is inert without the
  summercms_mcp tag until it is true, then boot fails naming the tag
  (pier_off.go is the untagged side)
- wristband parseAuthorizeScopes takes the server's allowed set built from
  Options.ScopesSupported; the default set is unchanged
- cooler.KeyPrefix exported for the MCP module's Redis keys
- smoke tests TestStreamingRouteSmoke, TestPierMountSmoke, TestMCPScopesSmoke
- surf, wristband and cooler READMEs, docs/services/{routing,oauth-server}.md
2026-10-22 16:11:37 +02:00
Jakub Zych
1bd91a4522 feat(19.7-01): in-process dispatch marker and compiled handler lookup
- bouncer.Dispatch, WithDispatch, Dispatched: context-only pre-resolved
  principal marker honoured by Registry.Middleware for listed guard names
- cabana.ResolveBackend honours a backend-kind marker; additive
  ResolveBackendToken, ScopeLimitFor and BackendPrincipal resolvers
- surf.Router.Handler and compileHandlers: one compiled chain per route,
  shared by BuildRouter validation and compile
- smoke tests TestDispatchSmoke, TestDispatchedSmoke, TestDispatchMarkerSmoke
- READMEs and docs/services/{authentication,routing}.md updated
2026-10-22 16:00:19 +02:00
Jakub Zych
a74a218cd9 docs(19.7): mark phase planned after verification 2026-10-22 15:46:30 +02:00
Jakub Zych
3653422572 docs(phase-19.6.1): mark phase complete after UAT and security 2026-10-22 15:36:25 +02:00
Jakub Zych
b28800ad39 docs(phase-19.6.1): add/update security threat verification 2026-10-22 15:27:39 +02:00
Jakub Zych
0a5945d681 test(19.6.1): mark verification passed after UAT retest 2026-10-22 15:24:11 +02:00
Jakub Zych
19c6a65575 test(19.6.1): pass UAT test 2 after relation-label remount fix 2026-10-22 15:24:01 +02:00
Jakub Zych
49ffb395c0 docs(19.7): add pattern map, mark D-36 informational, drop session path from plan 02 2026-10-22 14:59:54 +02:00
Jakub Zych
2f496f6200 test(19.6.1): re-verify after relation-label gap closure 2026-10-22 14:59:34 +02:00
Jakub Zych
43d0f4622c docs(19.7): revise plans after plan check 2026-10-22 14:57:52 +02:00
Jakub Zych
587f9ddf2f docs(19.6.1): review persist relation labels
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 14:51:39 +02:00
Jakub Zych
ed7da85f46 docs(19.6.1-05): mark phase ready for verification 2026-10-22 14:44:14 +02:00
Jakub Zych
1e3b006c5d docs(19.6.1-05): record plan position and decision 2026-10-22 14:44:02 +02:00
Jakub Zych
007c68bab2 docs(19.6.1-05): complete persist relation labels plan 2026-10-22 14:43:34 +02:00
Jakub Zych
51e1a1ea6e chore(19.6.1-05): rebuild embedded admin dist
- modules/boardwalk/dist matches a fresh admin build
- remount-safe relation labels ship in the embedded SPA

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 14:42:18 +02:00
Jakub Zych
d47d6182f0 docs(19.7): create phase plans (5 plans: seams, pier, user plugin, oauthserver+journal+demo, tests and security review) 2026-10-22 14:41:30 +02:00
Jakub Zych
14baafb27c feat(19.6.1-05): persist picked relation labels across FormView tab remount
- FORM_REMEMBER_LABEL inject so hosts keep picked option names
- RelationField choose() writes the label before emit
- Vitest backstops remount and tab-switch labeling

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 14:40:35 +02:00
Jakub Zych
ba0501c274 test(19.6.1): complete UAT - 25 passed, 1 issue 2026-10-22 14:30:13 +02:00
Jakub Zych
51d088a3b2 docs(quick-261022-imo): settings section panel scoped to the current category 2026-10-22 13:54:08 +02:00
Jakub Zych
80bb5aee3d chore(quick-261022-imo): rebuild embedded admin dist 2026-10-22 13:53:06 +02:00
Jakub Zych
85476fa3fe test(quick-261022-imo): settings section panel coverage
- settingsSectionOf: null cases, category order, link entry placement
- SettingsPanel: labels, links, current entry, empty category, collapse
- AppShell: hidden cases, settings-link controllers, collapse, offset, narrow, focus hand-off
2026-10-22 13:52:20 +02:00
Jakub Zych
834ef98572 feat(quick-261022-imo): settings section panel scoped to the current category
- settingsSectionOf returns the current entry's category group (null for one-entry categories)
- SettingsPanel mirrors the plugin side menu, collapse included
- AppShell shows it on settings forms and settings-linked controllers without own navigation
- docs/backend/settings.md describes moving between settings pages
2026-10-22 13:50:39 +02:00
Jakub Zych
a97743a39f test(19.6.1): persist human verification items as UAT 2026-10-22 13:48:03 +02:00
Jakub Zych
d7dc2a385a docs(19.6.1): record gap-closure code review 2026-10-22 13:44:02 +02:00
Jakub Zych
6bd2506db6 docs(19.6.1-04): complete gap-closure plan 2026-10-22 13:37:26 +02:00
Jakub Zych
e62086084b chore(19.6.1-04): require CR-01 and WR-03 tests in the phase gate
The docker stage must refuse a tree that drops TestRolesCodeDeclaredCodeRefused or TestActionExtensionOutranked.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 13:36:12 +02:00
Jakub Zych
ffc0a94afe docs(quick-261022-imo): plan settings section panel scoped to category 2026-10-22 13:34:31 +02:00
Jakub Zych
cb460b6000 docs(19.6.1-04): state Administrators outranking on the D-14 seam
- cabana, not the contributor, applies guardOutranked before a contributed Run
- A contribution to summercms.cabana.users is 403 user.outranked when the target outranks the caller

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 13:30:40 +02:00
Jakub Zych
068adaabf9 fix(19.6.1-04): refuse code-declared role capture and wrap Administrators Runs
- Roles create and update refuse a submitted code that code-declared grants attach to
- compileActionExtensions wraps contributed Administrators Runs with guardOutranked
- Prove both holes on Postgres; keep the boot smoke callable with a superuser principal

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 13:29:38 +02:00
Jakub Zych
422bd1e01f test(19.6.1): complete UAT - 24 passed, 1 issue 2026-10-22 13:17:34 +02:00
Jakub Zych
eadc7810be docs(19.6.1): create gap-closure plan 2026-10-22 13:05:53 +02:00
Jakub Zych
cfebbacc3d docs(19.6.1): verification report, gaps found (22/25) 2026-10-22 12:45:01 +02:00