@nextsparkjs/ai-workflow 0.1.0-beta.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/claude/_docs/workflows-optimizations.md +359 -0
- package/claude/agents/api-tester.md +634 -0
- package/claude/agents/architecture-supervisor.md +1351 -0
- package/claude/agents/backend-developer.md +997 -0
- package/claude/agents/backend-validator.md +417 -0
- package/claude/agents/bdd-docs-writer.md +737 -0
- package/claude/agents/block-developer.md +677 -0
- package/claude/agents/code-reviewer.md +1432 -0
- package/claude/agents/db-developer.md +721 -0
- package/claude/agents/db-validator.md +407 -0
- package/claude/agents/demo-video-generator.md +493 -0
- package/claude/agents/documentation-writer.md +1268 -0
- package/claude/agents/frontend-developer.md +1234 -0
- package/claude/agents/frontend-validator.md +777 -0
- package/claude/agents/functional-validator.md +630 -0
- package/claude/agents/mock-analyst.md +387 -0
- package/claude/agents/product-manager.md +963 -0
- package/claude/agents/qa-automation.md +1762 -0
- package/claude/agents/release-manager.md +634 -0
- package/claude/agents/selectors-translator.md +262 -0
- package/claude/agents/unit-test-writer.md +785 -0
- package/claude/agents/visual-comparator.md +329 -0
- package/claude/agents/workflow-maintainer.md +352 -0
- package/claude/commands/do/README.md +88 -0
- package/claude/commands/do/create-api.md +64 -0
- package/claude/commands/do/create-entity.md +66 -0
- package/claude/commands/do/create-migration.md +64 -0
- package/claude/commands/do/create-plugin.md +56 -0
- package/claude/commands/do/create-theme.md +70 -0
- package/claude/commands/do/mock-data.md +67 -0
- package/claude/commands/do/reset-db.md +71 -0
- package/claude/commands/do/setup-scheduled-action.md +75 -0
- package/claude/commands/do/sync-code-review.md +117 -0
- package/claude/commands/do/update-selectors.md +112 -0
- package/claude/commands/do/use-skills.md +90 -0
- package/claude/commands/do/validate-blocks.md +69 -0
- package/claude/commands/how-to/README.md +261 -0
- package/claude/commands/how-to/add-metadata.md +692 -0
- package/claude/commands/how-to/add-taxonomies.md +806 -0
- package/claude/commands/how-to/add-translations.md +571 -0
- package/claude/commands/how-to/create-api.md +577 -0
- package/claude/commands/how-to/create-block.md +575 -0
- package/claude/commands/how-to/create-child-entities.md +771 -0
- package/claude/commands/how-to/create-entity.md +597 -0
- package/claude/commands/how-to/create-migrations.md +605 -0
- package/claude/commands/how-to/create-plugin.md +654 -0
- package/claude/commands/how-to/customize-app.md +481 -0
- package/claude/commands/how-to/customize-dashboard.md +553 -0
- package/claude/commands/how-to/customize-theme.md +438 -0
- package/claude/commands/how-to/define-features-flows.md +632 -0
- package/claude/commands/how-to/deploy.md +507 -0
- package/claude/commands/how-to/handle-file-uploads.md +746 -0
- package/claude/commands/how-to/implement-search.md +1001 -0
- package/claude/commands/how-to/install-plugins.md +352 -0
- package/claude/commands/how-to/manage-test-coverage.md +984 -0
- package/claude/commands/how-to/run-tests.md +400 -0
- package/claude/commands/how-to/set-app-languages.md +601 -0
- package/claude/commands/how-to/set-plans-and-permissions.md +575 -0
- package/claude/commands/how-to/set-scheduled-actions.md +527 -0
- package/claude/commands/how-to/set-user-roles-and-permissions.md +550 -0
- package/claude/commands/how-to/setup-authentication.md +388 -0
- package/claude/commands/how-to/setup-claude-code.md +440 -0
- package/claude/commands/how-to/setup-database.md +274 -0
- package/claude/commands/how-to/setup-email-providers.md +598 -0
- package/claude/commands/how-to/setup-mobile-dev.md +627 -0
- package/claude/commands/how-to/start.md +500 -0
- package/claude/commands/how-to/use-devtools.md +639 -0
- package/claude/commands/how-to/use-superadmin.md +622 -0
- package/claude/commands/session/README.md +193 -0
- package/claude/commands/session/block-create.md +190 -0
- package/claude/commands/session/block-list.md +203 -0
- package/claude/commands/session/block-update.md +192 -0
- package/claude/commands/session/block-validate.md +218 -0
- package/claude/commands/session/changelog.md +115 -0
- package/claude/commands/session/close.md +225 -0
- package/claude/commands/session/commit.md +174 -0
- package/claude/commands/session/db-entity.md +206 -0
- package/claude/commands/session/db-fix.md +212 -0
- package/claude/commands/session/db-sample.md +206 -0
- package/claude/commands/session/demo.md +178 -0
- package/claude/commands/session/doc-bdd.md +207 -0
- package/claude/commands/session/doc-feature.md +218 -0
- package/claude/commands/session/doc-read.md +225 -0
- package/claude/commands/session/execute.md +204 -0
- package/claude/commands/session/explain.md +202 -0
- package/claude/commands/session/fix-bug.md +210 -0
- package/claude/commands/session/fix-build.md +182 -0
- package/claude/commands/session/fix-test.md +189 -0
- package/claude/commands/session/pending.md +232 -0
- package/claude/commands/session/refine.md +188 -0
- package/claude/commands/session/resume.md +192 -0
- package/claude/commands/session/review.md +192 -0
- package/claude/commands/session/scope-change.md +181 -0
- package/claude/commands/session/start-blocks.md +347 -0
- package/claude/commands/session/start.md +604 -0
- package/claude/commands/session/status.md +169 -0
- package/claude/commands/session/test-fix.md +221 -0
- package/claude/commands/session/test-run.md +203 -0
- package/claude/commands/session/test-write.md +242 -0
- package/claude/commands/session/validate.md +162 -0
- package/claude/config/context.json +40 -0
- package/claude/config/github.json +69 -0
- package/claude/config/github.schema.json +106 -0
- package/claude/config/team.json +46 -0
- package/claude/config/team.schema.json +106 -0
- package/claude/config/workspace.json +43 -0
- package/claude/config/workspace.schema.json +75 -0
- package/claude/skills/README.md +228 -0
- package/claude/skills/accessibility/SKILL.md +573 -0
- package/claude/skills/api-bypass-layers/SKILL.md +550 -0
- package/claude/skills/asana-integration/SKILL.md +499 -0
- package/claude/skills/better-auth/SKILL.md +666 -0
- package/claude/skills/billing-subscriptions/SKILL.md +660 -0
- package/claude/skills/block-decision-matrix/SKILL.md +359 -0
- package/claude/skills/clickup-integration/SKILL.md +434 -0
- package/claude/skills/core-theme-responsibilities/SKILL.md +485 -0
- package/claude/skills/create-plugin/SKILL.md +425 -0
- package/claude/skills/create-theme/SKILL.md +331 -0
- package/claude/skills/cypress-api/SKILL.md +511 -0
- package/claude/skills/cypress-api/scripts/generate-api-controller.py +329 -0
- package/claude/skills/cypress-api/scripts/generate-api-test.py +930 -0
- package/claude/skills/cypress-e2e/SKILL.md +526 -0
- package/claude/skills/cypress-e2e/scripts/extract-selectors.py +383 -0
- package/claude/skills/cypress-e2e/scripts/generate-uat-test.py +788 -0
- package/claude/skills/cypress-selectors/SKILL.md +309 -0
- package/claude/skills/cypress-selectors/scripts/extract-missing.py +243 -0
- package/claude/skills/cypress-selectors/scripts/generate-block-selectors.py +283 -0
- package/claude/skills/cypress-selectors/scripts/validate-selectors.py +145 -0
- package/claude/skills/database-migrations/SKILL.md +335 -0
- package/claude/skills/database-migrations/scripts/generate-sample-data.py +284 -0
- package/claude/skills/database-migrations/scripts/validate-migration.py +323 -0
- package/claude/skills/design-system/SKILL.md +682 -0
- package/claude/skills/documentation/SKILL.md +540 -0
- package/claude/skills/entity-api/SKILL.md +482 -0
- package/claude/skills/entity-system/SKILL.md +635 -0
- package/claude/skills/entity-system/scripts/generate-child-migration.py +298 -0
- package/claude/skills/entity-system/scripts/generate-metas-migration.py +233 -0
- package/claude/skills/entity-system/scripts/generate-migration.py +382 -0
- package/claude/skills/entity-system/scripts/generate-sample-data.py +418 -0
- package/claude/skills/entity-system/scripts/scaffold-entity.py +661 -0
- package/claude/skills/github/SKILL.md +467 -0
- package/claude/skills/i18n-nextintl/SKILL.md +302 -0
- package/claude/skills/i18n-nextintl/scripts/add-translation.py +243 -0
- package/claude/skills/i18n-nextintl/scripts/extract-hardcoded.py +246 -0
- package/claude/skills/i18n-nextintl/scripts/validate-translations.py +260 -0
- package/claude/skills/impact-analysis/SKILL.md +203 -0
- package/claude/skills/jest-unit/SKILL.md +306 -0
- package/claude/skills/jest-unit/references/component-testing.md +371 -0
- package/claude/skills/jest-unit/references/mocking-patterns.md +380 -0
- package/claude/skills/jest-unit/references/service-hook-testing.md +454 -0
- package/claude/skills/jira-integration/SKILL.md +539 -0
- package/claude/skills/media-library/SKILL.md +743 -0
- package/claude/skills/mock-analysis/SKILL.md +276 -0
- package/claude/skills/monorepo-architecture/SKILL.md +162 -0
- package/claude/skills/nextjs-api-development/SKILL.md +364 -0
- package/claude/skills/nextjs-api-development/scripts/generate-crud-tests.py +456 -0
- package/claude/skills/nextjs-api-development/scripts/scaffold-endpoint.py +481 -0
- package/claude/skills/nextjs-api-development/scripts/validate-api.py +283 -0
- package/claude/skills/notion-integration/SKILL.md +641 -0
- package/claude/skills/npm-development-workflow/SKILL.md +480 -0
- package/claude/skills/page-builder-blocks/SKILL.md +530 -0
- package/claude/skills/page-builder-blocks/scripts/scaffold-block.py +444 -0
- package/claude/skills/permissions-system/SKILL.md +619 -0
- package/claude/skills/plugins/SKILL.md +340 -0
- package/claude/skills/plugins/references/plugin-templates.md +414 -0
- package/claude/skills/plugins/references/plugin-testing.md +353 -0
- package/claude/skills/plugins/references/plugin-types.md +198 -0
- package/claude/skills/plugins/scripts/scaffold-plugin.py +443 -0
- package/claude/skills/pom-patterns/SKILL.md +452 -0
- package/claude/skills/pom-patterns/scripts/generate-pom.py +392 -0
- package/claude/skills/rate-limiting/SKILL.md +342 -0
- package/claude/skills/react-best-practices/AGENTS.md +2410 -0
- package/claude/skills/react-best-practices/README.md +123 -0
- package/claude/skills/react-best-practices/SKILL.md +125 -0
- package/claude/skills/react-best-practices/metadata.json +15 -0
- package/claude/skills/react-best-practices/rules/_sections.md +46 -0
- package/claude/skills/react-best-practices/rules/_template.md +28 -0
- package/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/claude/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/claude/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/claude/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/claude/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/claude/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/claude/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/claude/skills/react-patterns/SKILL.md +688 -0
- package/claude/skills/registry-system/SKILL.md +331 -0
- package/claude/skills/scheduled-actions/SKILL.md +671 -0
- package/claude/skills/scope-enforcement/SKILL.md +542 -0
- package/claude/skills/scope-enforcement/scripts/validate-scope.py +357 -0
- package/claude/skills/server-actions/SKILL.md +493 -0
- package/claude/skills/service-layer/SKILL.md +587 -0
- package/claude/skills/session-management/SKILL.md +266 -0
- package/claude/skills/session-management/scripts/create-session.py +166 -0
- package/claude/skills/session-management/scripts/iteration-close.sh +105 -0
- package/claude/skills/session-management/scripts/iteration-init.sh +180 -0
- package/claude/skills/session-management/scripts/session-archive.sh +87 -0
- package/claude/skills/session-management/scripts/session-close.sh +133 -0
- package/claude/skills/session-management/scripts/session-init.sh +225 -0
- package/claude/skills/session-management/scripts/session-list.sh +163 -0
- package/claude/skills/session-management/scripts/split-plan.sh +116 -0
- package/claude/skills/shadcn-components/SKILL.md +586 -0
- package/claude/skills/shadcn-theming/SKILL.md +446 -0
- package/claude/skills/suspense-loading/SKILL.md +280 -0
- package/claude/skills/tailwind-theming/SKILL.md +507 -0
- package/claude/skills/tanstack-query/SKILL.md +608 -0
- package/claude/skills/test-coverage/SKILL.md +239 -0
- package/claude/skills/web-design-guidelines/SKILL.md +39 -0
- package/claude/skills/zod-validation/SKILL.md +537 -0
- package/claude/templates/blocks/progress.md +86 -0
- package/claude/templates/iteration/changes.md +61 -0
- package/claude/templates/iteration/progress.md +55 -0
- package/claude/templates/log.md +31 -0
- package/claude/templates/story/context.md +77 -0
- package/claude/templates/story/pendings.md +37 -0
- package/claude/templates/story/plan.md +299 -0
- package/claude/templates/story/requirements.md +109 -0
- package/claude/templates/story/scope.json +10 -0
- package/claude/templates/story/tests.md +91 -0
- package/claude/templates/task/progress.md +58 -0
- package/claude/templates/task/requirements.md +54 -0
- package/claude/workflows/README.md +154 -0
- package/claude/workflows/blocks.md +614 -0
- package/claude/workflows/story.md +1207 -0
- package/claude/workflows/task.md +927 -0
- package/claude/workflows/tweak.md +527 -0
- package/cursor/.gitkeep +0 -0
- package/package.json +35 -0
- package/scripts/postinstall.mjs +198 -0
- package/scripts/setup.mjs +282 -0
- package/scripts/sync.mjs +209 -0
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
# /how-to:set-user-roles-and-permissions
|
|
2
|
+
|
|
3
|
+
Interactive guide to configure team roles and RBAC permissions in NextSpark.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Required Skills
|
|
8
|
+
|
|
9
|
+
Before executing, these skills provide deeper context:
|
|
10
|
+
- `.claude/skills/permissions-system/SKILL.md` - Three-layer permission model
|
|
11
|
+
- `.claude/skills/service-layer/SKILL.md` - How services check permissions
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Syntax
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/how-to:set-user-roles-and-permissions
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Behavior
|
|
24
|
+
|
|
25
|
+
Guides the user through configuring team roles, custom roles, and entity permissions for RBAC.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Tutorial Structure
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
STEPS OVERVIEW (5 steps)
|
|
33
|
+
|
|
34
|
+
Step 1: Understanding User vs Team Roles
|
|
35
|
+
└── Two separate role systems
|
|
36
|
+
|
|
37
|
+
Step 2: Configure Core Team Roles
|
|
38
|
+
└── owner, admin, member, viewer
|
|
39
|
+
|
|
40
|
+
Step 3: Add Custom Team Roles
|
|
41
|
+
└── editor, contributor, moderator
|
|
42
|
+
|
|
43
|
+
Step 4: Define Entity Permissions
|
|
44
|
+
└── Map actions to roles
|
|
45
|
+
|
|
46
|
+
Step 5: Use Permissions in Code
|
|
47
|
+
└── Server and client checks
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Step 1: Understanding User vs Team Roles
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
56
|
+
📚 HOW TO: SET USER ROLES AND PERMISSIONS
|
|
57
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
58
|
+
|
|
59
|
+
STEP 1 OF 5: Understanding User vs Team Roles
|
|
60
|
+
|
|
61
|
+
⚠️ CRITICAL: NextSpark has TWO separate role systems:
|
|
62
|
+
|
|
63
|
+
┌─────────────────────────────────────────────┐
|
|
64
|
+
│ USER ROLES (App-Level) │
|
|
65
|
+
│ ───────────────────────────────────────── │
|
|
66
|
+
│ Storage: user.role column │
|
|
67
|
+
│ Scope: Global (entire app) │
|
|
68
|
+
│ Extensible: ❌ NO - Fixed in core │
|
|
69
|
+
│ Purpose: Route access control │
|
|
70
|
+
│ ───────────────────────────────────────── │
|
|
71
|
+
│ Roles: member | superadmin | developer │
|
|
72
|
+
└─────────────────────────────────────────────┘
|
|
73
|
+
|
|
74
|
+
┌─────────────────────────────────────────────┐
|
|
75
|
+
│ TEAM ROLES (Team-Level) │
|
|
76
|
+
│ ───────────────────────────────────────── │
|
|
77
|
+
│ Storage: teamMembers.role column │
|
|
78
|
+
│ Scope: Per-team membership │
|
|
79
|
+
│ Extensible: ✅ YES - Themes add roles │
|
|
80
|
+
│ Purpose: Entity permissions │
|
|
81
|
+
│ ───────────────────────────────────────── │
|
|
82
|
+
│ Core: owner | admin | member | viewer │
|
|
83
|
+
│ Custom: editor | contributor | moderator │
|
|
84
|
+
└─────────────────────────────────────────────┘
|
|
85
|
+
|
|
86
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
87
|
+
|
|
88
|
+
📋 When to Use Each:
|
|
89
|
+
|
|
90
|
+
USER ROLES:
|
|
91
|
+
• Route protection (/superadmin/*, /devtools/*)
|
|
92
|
+
• System-level access
|
|
93
|
+
• Checked via middleware
|
|
94
|
+
|
|
95
|
+
TEAM ROLES:
|
|
96
|
+
• Entity CRUD permissions
|
|
97
|
+
• Feature access within team
|
|
98
|
+
• Checked via MembershipService
|
|
99
|
+
|
|
100
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
101
|
+
|
|
102
|
+
What would you like to do?
|
|
103
|
+
|
|
104
|
+
[1] Continue to Step 2 (Core Team Roles)
|
|
105
|
+
[2] I have a question about the difference
|
|
106
|
+
[3] Show me code examples for each
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Step 2: Configure Core Team Roles
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
115
|
+
STEP 2 OF 5: Configure Core Team Roles
|
|
116
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
117
|
+
|
|
118
|
+
Core provides 4 team roles with fixed hierarchy:
|
|
119
|
+
|
|
120
|
+
| Role | Hierarchy | Description |
|
|
121
|
+
|--------|-----------|----------------------------------|
|
|
122
|
+
| owner | 100 | Team creator, all permissions |
|
|
123
|
+
| admin | 50 | Team management, member roles |
|
|
124
|
+
| member | 10 | Standard entity access |
|
|
125
|
+
| viewer | 1 | Read-only access |
|
|
126
|
+
|
|
127
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
128
|
+
|
|
129
|
+
Configure core permissions in your theme:
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
// contents/themes/default/config/permissions.config.ts
|
|
133
|
+
import type { ThemePermissionsConfig } from '@/core/lib/permissions/types'
|
|
134
|
+
|
|
135
|
+
export const PERMISSIONS_CONFIG_OVERRIDES: ThemePermissionsConfig = {
|
|
136
|
+
// Team-level permissions
|
|
137
|
+
teams: [
|
|
138
|
+
{ action: 'team.view', roles: ['owner', 'admin', 'member', 'viewer'] },
|
|
139
|
+
{ action: 'team.edit', roles: ['owner', 'admin'] },
|
|
140
|
+
{ action: 'team.members.invite', roles: ['owner', 'admin'] },
|
|
141
|
+
{ action: 'team.members.remove', roles: ['owner', 'admin'] },
|
|
142
|
+
{ action: 'team.members.changeRole', roles: ['owner', 'admin'] },
|
|
143
|
+
{ action: 'team.billing.manage', roles: ['owner', 'admin'] },
|
|
144
|
+
{ action: 'team.delete', roles: ['owner'], dangerous: true },
|
|
145
|
+
],
|
|
146
|
+
|
|
147
|
+
// Entity permissions (basic example)
|
|
148
|
+
entities: {
|
|
149
|
+
customers: [
|
|
150
|
+
{ action: 'read', roles: ['owner', 'admin', 'member', 'viewer'] },
|
|
151
|
+
{ action: 'create', roles: ['owner', 'admin', 'member'] },
|
|
152
|
+
{ action: 'update', roles: ['owner', 'admin', 'member'] },
|
|
153
|
+
{ action: 'delete', roles: ['owner', 'admin'] },
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
160
|
+
|
|
161
|
+
📋 Hierarchy Rule:
|
|
162
|
+
|
|
163
|
+
Higher hierarchy = more permissions.
|
|
164
|
+
A role inherits all permissions from lower roles.
|
|
165
|
+
|
|
166
|
+
owner (100) > admin (50) > member (10) > viewer (1)
|
|
167
|
+
|
|
168
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
169
|
+
|
|
170
|
+
What would you like to do?
|
|
171
|
+
|
|
172
|
+
[1] Continue to Step 3 (Custom Roles)
|
|
173
|
+
[2] What team permissions are available?
|
|
174
|
+
[3] My app doesn't need all roles
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Step 3: Add Custom Team Roles
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
183
|
+
STEP 3 OF 5: Add Custom Team Roles
|
|
184
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
185
|
+
|
|
186
|
+
Themes can add custom roles between core roles:
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
// contents/themes/default/config/permissions.config.ts
|
|
190
|
+
|
|
191
|
+
export const PERMISSIONS_CONFIG_OVERRIDES: ThemePermissionsConfig = {
|
|
192
|
+
// 1. Define custom roles
|
|
193
|
+
roles: {
|
|
194
|
+
additionalRoles: ['editor', 'contributor', 'moderator'] as const,
|
|
195
|
+
|
|
196
|
+
// Place in hierarchy (between existing roles)
|
|
197
|
+
hierarchy: {
|
|
198
|
+
editor: 5, // Between viewer (1) and member (10)
|
|
199
|
+
contributor: 3, // Above viewer, below editor
|
|
200
|
+
moderator: 7, // Above editor, below member
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
// Display names (i18n keys)
|
|
204
|
+
displayNames: {
|
|
205
|
+
editor: 'common.teamRoles.editor',
|
|
206
|
+
contributor: 'common.teamRoles.contributor',
|
|
207
|
+
moderator: 'common.teamRoles.moderator',
|
|
208
|
+
},
|
|
209
|
+
|
|
210
|
+
// Descriptions for UI
|
|
211
|
+
descriptions: {
|
|
212
|
+
editor: 'Can view and edit content without delete access',
|
|
213
|
+
contributor: 'Can create and edit own content only',
|
|
214
|
+
moderator: 'Can moderate content and manage comments',
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
// 2. Include custom roles in permissions
|
|
219
|
+
teams: [
|
|
220
|
+
{ action: 'team.view', roles: ['owner', 'admin', 'member', 'editor', 'contributor', 'moderator', 'viewer'] },
|
|
221
|
+
// ...
|
|
222
|
+
],
|
|
223
|
+
|
|
224
|
+
entities: {
|
|
225
|
+
products: [
|
|
226
|
+
{ action: 'read', roles: ['owner', 'admin', 'member', 'editor', 'contributor', 'moderator', 'viewer'] },
|
|
227
|
+
{ action: 'create', roles: ['owner', 'admin', 'member', 'editor', 'contributor'] },
|
|
228
|
+
{ action: 'update', roles: ['owner', 'admin', 'member', 'editor'] },
|
|
229
|
+
{ action: 'delete', roles: ['owner', 'admin'] },
|
|
230
|
+
{ action: 'moderate', roles: ['owner', 'admin', 'moderator'] },
|
|
231
|
+
],
|
|
232
|
+
},
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
237
|
+
|
|
238
|
+
📋 Visual Hierarchy After Custom Roles:
|
|
239
|
+
|
|
240
|
+
owner (100)
|
|
241
|
+
│
|
|
242
|
+
admin (50)
|
|
243
|
+
│
|
|
244
|
+
member (10)
|
|
245
|
+
│
|
|
246
|
+
moderator (7) ← Custom
|
|
247
|
+
│
|
|
248
|
+
editor (5) ← Custom
|
|
249
|
+
│
|
|
250
|
+
contributor (3) ← Custom
|
|
251
|
+
│
|
|
252
|
+
viewer (1)
|
|
253
|
+
|
|
254
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
255
|
+
|
|
256
|
+
3️⃣ Add Translations:
|
|
257
|
+
|
|
258
|
+
```json
|
|
259
|
+
// contents/themes/default/messages/en.json
|
|
260
|
+
{
|
|
261
|
+
"common": {
|
|
262
|
+
"teamRoles": {
|
|
263
|
+
"editor": "Editor",
|
|
264
|
+
"contributor": "Contributor",
|
|
265
|
+
"moderator": "Moderator"
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
272
|
+
|
|
273
|
+
What would you like to do?
|
|
274
|
+
|
|
275
|
+
[1] Continue to Step 4 (Entity Permissions)
|
|
276
|
+
[2] How do I choose hierarchy values?
|
|
277
|
+
[3] Can I remove core roles?
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## Step 4: Define Entity Permissions
|
|
283
|
+
|
|
284
|
+
```
|
|
285
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
286
|
+
STEP 4 OF 5: Define Entity Permissions
|
|
287
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
288
|
+
|
|
289
|
+
Define which roles can perform which actions on each entity:
|
|
290
|
+
|
|
291
|
+
```typescript
|
|
292
|
+
// contents/themes/default/config/permissions.config.ts
|
|
293
|
+
|
|
294
|
+
export const PERMISSIONS_CONFIG_OVERRIDES: ThemePermissionsConfig = {
|
|
295
|
+
// ... roles config ...
|
|
296
|
+
|
|
297
|
+
entities: {
|
|
298
|
+
// Products entity
|
|
299
|
+
products: [
|
|
300
|
+
{ action: 'read', roles: ['owner', 'admin', 'member', 'editor', 'contributor', 'moderator', 'viewer'] },
|
|
301
|
+
{ action: 'create', roles: ['owner', 'admin', 'member', 'editor', 'contributor'] },
|
|
302
|
+
{ action: 'update', roles: ['owner', 'admin', 'member', 'editor'] },
|
|
303
|
+
{ action: 'delete', roles: ['owner', 'admin'], dangerous: true },
|
|
304
|
+
{ action: 'export', roles: ['owner', 'admin'] },
|
|
305
|
+
{ action: 'publish', roles: ['owner', 'admin', 'member'] },
|
|
306
|
+
],
|
|
307
|
+
|
|
308
|
+
// Customers entity
|
|
309
|
+
customers: [
|
|
310
|
+
{ action: 'read', roles: ['owner', 'admin', 'member'] },
|
|
311
|
+
{ action: 'create', roles: ['owner', 'admin', 'member'] },
|
|
312
|
+
{ action: 'update', roles: ['owner', 'admin', 'member'] },
|
|
313
|
+
{ action: 'delete', roles: ['owner', 'admin'], dangerous: true },
|
|
314
|
+
{ action: 'export', roles: ['owner', 'admin'] },
|
|
315
|
+
],
|
|
316
|
+
|
|
317
|
+
// Invoices entity (more restricted)
|
|
318
|
+
invoices: [
|
|
319
|
+
{ action: 'read', roles: ['owner', 'admin', 'member'] },
|
|
320
|
+
{ action: 'create', roles: ['owner', 'admin'] },
|
|
321
|
+
{ action: 'update', roles: ['owner', 'admin'] },
|
|
322
|
+
{ action: 'delete', roles: ['owner'], dangerous: true },
|
|
323
|
+
{ action: 'void', roles: ['owner', 'admin'], dangerous: true },
|
|
324
|
+
],
|
|
325
|
+
},
|
|
326
|
+
|
|
327
|
+
// Feature permissions
|
|
328
|
+
features: [
|
|
329
|
+
{
|
|
330
|
+
action: 'page-builder.access',
|
|
331
|
+
roles: ['owner', 'admin', 'editor', 'member'],
|
|
332
|
+
label: 'Access Page Builder',
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
action: 'page-builder.custom-css',
|
|
336
|
+
roles: ['owner', 'admin'],
|
|
337
|
+
dangerous: true,
|
|
338
|
+
label: 'Use custom CSS',
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
action: 'api-keys.manage',
|
|
342
|
+
roles: ['owner', 'admin'],
|
|
343
|
+
label: 'Manage API Keys',
|
|
344
|
+
},
|
|
345
|
+
],
|
|
346
|
+
}
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
350
|
+
|
|
351
|
+
📋 Standard Entity Actions:
|
|
352
|
+
|
|
353
|
+
• read - View individual record
|
|
354
|
+
• list - View list of records
|
|
355
|
+
• create - Create new record
|
|
356
|
+
• update - Edit existing record
|
|
357
|
+
• delete - Remove record
|
|
358
|
+
• export - Export data
|
|
359
|
+
• publish - Publish/unpublish
|
|
360
|
+
• archive - Archive record
|
|
361
|
+
|
|
362
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
363
|
+
|
|
364
|
+
📋 Dangerous Actions:
|
|
365
|
+
|
|
366
|
+
Mark destructive actions with `dangerous: true`:
|
|
367
|
+
• Adds confirmation dialogs in UI
|
|
368
|
+
• Highlighted differently in admin panel
|
|
369
|
+
• Extra audit logging
|
|
370
|
+
|
|
371
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
372
|
+
|
|
373
|
+
What would you like to do?
|
|
374
|
+
|
|
375
|
+
[1] Continue to Step 5 (Use in Code)
|
|
376
|
+
[2] How do I add custom actions?
|
|
377
|
+
[3] Show me the permission matrix UI
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## Step 5: Use Permissions in Code
|
|
383
|
+
|
|
384
|
+
```
|
|
385
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
386
|
+
STEP 5 OF 5: Use Permissions in Code
|
|
387
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
388
|
+
|
|
389
|
+
📋 Server-Side Permission Checks:
|
|
390
|
+
|
|
391
|
+
```typescript
|
|
392
|
+
// In API route or server action
|
|
393
|
+
import { checkPermission } from '@/core/lib/permissions/check'
|
|
394
|
+
import { MembershipService } from '@/core/lib/services/membership.service'
|
|
395
|
+
|
|
396
|
+
export async function DELETE(request: NextRequest, { params }) {
|
|
397
|
+
const { userId, teamId } = await getAuthContext(request)
|
|
398
|
+
|
|
399
|
+
// Method 1: Direct permission check
|
|
400
|
+
const canDelete = await checkPermission(userId, teamId, 'products.delete')
|
|
401
|
+
if (!canDelete) {
|
|
402
|
+
return Response.json({ error: 'Permission denied' }, { status: 403 })
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// Method 2: Full membership context
|
|
406
|
+
const membership = await MembershipService.get(userId, teamId)
|
|
407
|
+
|
|
408
|
+
// Check single permission
|
|
409
|
+
if (!membership.hasPermission('products.delete')) {
|
|
410
|
+
return Response.json({ error: 'Permission denied' }, { status: 403 })
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Check role level
|
|
414
|
+
if (!membership.hasMinHierarchy(50)) { // admin or higher
|
|
415
|
+
return Response.json({ error: 'Admin required' }, { status: 403 })
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Proceed with deletion
|
|
419
|
+
await ProductsService.delete(params.id, userId)
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
424
|
+
|
|
425
|
+
📋 Client-Side Permission Checks:
|
|
426
|
+
|
|
427
|
+
```typescript
|
|
428
|
+
// In React component
|
|
429
|
+
import { usePermission, usePermissions, useTeamRole } from '@/core/lib/permissions/hooks'
|
|
430
|
+
|
|
431
|
+
function ProductActions({ productId }: Props) {
|
|
432
|
+
// Single permission check
|
|
433
|
+
const canDelete = usePermission('products.delete')
|
|
434
|
+
|
|
435
|
+
// Multiple permissions
|
|
436
|
+
const { canEdit, canExport } = usePermissions({
|
|
437
|
+
canEdit: 'products.update',
|
|
438
|
+
canExport: 'products.export',
|
|
439
|
+
})
|
|
440
|
+
|
|
441
|
+
// Current role
|
|
442
|
+
const role = useTeamRole()
|
|
443
|
+
|
|
444
|
+
return (
|
|
445
|
+
<div>
|
|
446
|
+
{canEdit && <EditButton id={productId} />}
|
|
447
|
+
{canDelete && <DeleteButton id={productId} />}
|
|
448
|
+
{canExport && <ExportButton id={productId} />}
|
|
449
|
+
{role === 'owner' && <OwnerSettings />}
|
|
450
|
+
</div>
|
|
451
|
+
)
|
|
452
|
+
}
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
456
|
+
|
|
457
|
+
📋 User Role Checks (App-Level):
|
|
458
|
+
|
|
459
|
+
```typescript
|
|
460
|
+
import { roleHelpers } from '@/core/lib/role-helpers'
|
|
461
|
+
|
|
462
|
+
// Check user roles (NOT team roles)
|
|
463
|
+
if (roleHelpers.isDeveloper(user.role)) {
|
|
464
|
+
// Access to /devtools/*
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
if (roleHelpers.isSuperAdmin(user.role)) {
|
|
468
|
+
// Access to /superadmin/*
|
|
469
|
+
// Bypasses team permission checks
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// ⚠️ WRONG: Never mix contexts
|
|
473
|
+
if (membership.hasRole('superadmin')) {} // This checks TEAM role!
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
477
|
+
|
|
478
|
+
4️⃣ Rebuild Registry:
|
|
479
|
+
|
|
480
|
+
```bash
|
|
481
|
+
node core/scripts/build/registry.mjs
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
485
|
+
|
|
486
|
+
✅ TUTORIAL STORY!
|
|
487
|
+
|
|
488
|
+
You've configured:
|
|
489
|
+
• Team role hierarchy
|
|
490
|
+
• Custom roles for your theme
|
|
491
|
+
• Entity permissions per action
|
|
492
|
+
• Server and client permission checks
|
|
493
|
+
|
|
494
|
+
📚 Related tutorials:
|
|
495
|
+
• /how-to:set-plans-and-permissions - Billing integration
|
|
496
|
+
• /how-to:create-entity - Entity with permissions
|
|
497
|
+
|
|
498
|
+
🔙 Back to menu: /how-to:start
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## Common Questions
|
|
504
|
+
|
|
505
|
+
### "Can I remove core roles?"
|
|
506
|
+
|
|
507
|
+
```
|
|
508
|
+
📋 Core roles CANNOT be removed:
|
|
509
|
+
|
|
510
|
+
• owner - Required for team ownership
|
|
511
|
+
• admin - Required for team management
|
|
512
|
+
• member - Default role for invites
|
|
513
|
+
• viewer - Minimum access role
|
|
514
|
+
|
|
515
|
+
You CAN:
|
|
516
|
+
• Not use certain roles (just don't assign them)
|
|
517
|
+
• Hide roles from selection UI (theme config)
|
|
518
|
+
• Add custom roles between them
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### "How do I choose hierarchy values?"
|
|
522
|
+
|
|
523
|
+
```
|
|
524
|
+
📋 Hierarchy Value Guidelines:
|
|
525
|
+
|
|
526
|
+
Fixed core roles:
|
|
527
|
+
• owner: 100 (maximum)
|
|
528
|
+
• admin: 50
|
|
529
|
+
• member: 10
|
|
530
|
+
• viewer: 1 (minimum)
|
|
531
|
+
|
|
532
|
+
Add custom roles in gaps:
|
|
533
|
+
• 11-49: Higher than member, below admin
|
|
534
|
+
• 2-9: Higher than viewer, below member
|
|
535
|
+
|
|
536
|
+
Example placements:
|
|
537
|
+
• manager: 40 (almost admin-level)
|
|
538
|
+
• editor: 8 (can edit, can't create)
|
|
539
|
+
• contributor: 5 (limited creation)
|
|
540
|
+
• readonly: 2 (slightly above viewer)
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
---
|
|
544
|
+
|
|
545
|
+
## Related Commands
|
|
546
|
+
|
|
547
|
+
| Command | Action |
|
|
548
|
+
|---------|--------|
|
|
549
|
+
| `/how-to:set-plans-and-permissions` | Billing and features |
|
|
550
|
+
| `/how-to:create-entity` | Create entities with permissions |
|