diff --git a/.studio/skills-manifest.json b/.studio/skills-manifest.json index bfe050a..815b789 100644 --- a/.studio/skills-manifest.json +++ b/.studio/skills-manifest.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "sha256": "41f41a9daf9573ed28eae2c87c23f2624489a52a3809b9792ac1701921390bca", + "sha256": "ade673a75c943a29456a7588b40329d260c496c6dc0c14a0d57f767b1d7fa661", "skills": [ "jmix-add-dialog-detail-flow", "jmix-add-entity-event-listener", @@ -15,9 +15,11 @@ "jmix-create-liquibase-changelog", "jmix-create-list-view", "jmix-create-resource-role", + "jmix-create-row-level-role", "jmix-create-service", "jmix-create-test", "jmix-ide-static-analysis", + "jmix-role-based-access", "jmix-verify-api-symbol", "jmix-verify-bootrun" ], diff --git a/content/AGENTS.md b/content/AGENTS.md index 6fd475f..c50f22e 100644 --- a/content/AGENTS.md +++ b/content/AGENTS.md @@ -92,7 +92,9 @@ READ the most specific skill for each artifact: - Detail dialog from a button/action, OR master-row selection → filtered child grid: `jmix-add-dialog-detail-flow` - Entity lifecycle/event business logic: `jmix-add-entity-event-listener` - Database schema: `jmix-create-liquibase-changelog` -- Resource roles: `jmix-create-resource-role` +- Role-based access — model, security scope, `ui.loginToUi` login invariant (READ FIRST before any role): `jmix-role-based-access` +- Resource role — WHAT a user can do (entity/attribute/view/menu policies): `jmix-create-resource-role` +- Row-level role — WHICH rows a user sees (JPQL/predicate policies): `jmix-create-row-level-role` - User-visible text / entity-enum captions: `jmix-add-i18n-keys` - Tests: `jmix-create-test` - Fetch plans / unfetched-reference / N+1 tuning: `jmix-configure-fetch-plan` @@ -106,7 +108,9 @@ For each new persistent entity, run through: `jmix-create-entity` + `jmix-add-i18n-keys`. For a user-facing entity, also add a list and/or detail view (`jmix-create-list-view`, `jmix-create-detail-view`) and a view policy in every role that can open them — **including dialog-only detail views opened -from a composition table**. +from a composition table**. Any user who logs into the UI also needs +`ui-minimal` / `ui.loginToUi` (the most commonly missed defect) — see +`jmix-role-based-access`. Service- or listener-level defaulting does NOT relieve the entity from defaulting required fields on initial persist — defaults must work through diff --git a/content/skills/jmix-create-detail-view/SKILL.md b/content/skills/jmix-create-detail-view/SKILL.md index d125c4e..f5e857a 100644 --- a/content/skills/jmix-create-detail-view/SKILL.md +++ b/content/skills/jmix-create-detail-view/SKILL.md @@ -17,9 +17,9 @@ CONSTRUCTION from the WRONG/RIGHT examples below: 1. **An enum attribute is NEVER `entityComboBox`.** `entityComboBox` is for ENTITY references; binding it to an enum (with or without a - made-up `enumClass` attribute) throws `IllegalStateException: Range - is enumeration` at render. There is no `enumClass` attribute on - `entityComboBox`. For a Jmix enum property use a plain `` + made-up `enumClass` attribute) fails at render — `entityComboBox` + requires an entity Range, not an enumeration. There is no `enumClass` + attribute on `entityComboBox`. For a Jmix enum property use a plain `` or `