@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.
Files changed (272) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +115 -0
  3. package/claude/_docs/workflows-optimizations.md +359 -0
  4. package/claude/agents/api-tester.md +634 -0
  5. package/claude/agents/architecture-supervisor.md +1351 -0
  6. package/claude/agents/backend-developer.md +997 -0
  7. package/claude/agents/backend-validator.md +417 -0
  8. package/claude/agents/bdd-docs-writer.md +737 -0
  9. package/claude/agents/block-developer.md +677 -0
  10. package/claude/agents/code-reviewer.md +1432 -0
  11. package/claude/agents/db-developer.md +721 -0
  12. package/claude/agents/db-validator.md +407 -0
  13. package/claude/agents/demo-video-generator.md +493 -0
  14. package/claude/agents/documentation-writer.md +1268 -0
  15. package/claude/agents/frontend-developer.md +1234 -0
  16. package/claude/agents/frontend-validator.md +777 -0
  17. package/claude/agents/functional-validator.md +630 -0
  18. package/claude/agents/mock-analyst.md +387 -0
  19. package/claude/agents/product-manager.md +963 -0
  20. package/claude/agents/qa-automation.md +1762 -0
  21. package/claude/agents/release-manager.md +634 -0
  22. package/claude/agents/selectors-translator.md +262 -0
  23. package/claude/agents/unit-test-writer.md +785 -0
  24. package/claude/agents/visual-comparator.md +329 -0
  25. package/claude/agents/workflow-maintainer.md +352 -0
  26. package/claude/commands/do/README.md +88 -0
  27. package/claude/commands/do/create-api.md +64 -0
  28. package/claude/commands/do/create-entity.md +66 -0
  29. package/claude/commands/do/create-migration.md +64 -0
  30. package/claude/commands/do/create-plugin.md +56 -0
  31. package/claude/commands/do/create-theme.md +70 -0
  32. package/claude/commands/do/mock-data.md +67 -0
  33. package/claude/commands/do/reset-db.md +71 -0
  34. package/claude/commands/do/setup-scheduled-action.md +75 -0
  35. package/claude/commands/do/sync-code-review.md +117 -0
  36. package/claude/commands/do/update-selectors.md +112 -0
  37. package/claude/commands/do/use-skills.md +90 -0
  38. package/claude/commands/do/validate-blocks.md +69 -0
  39. package/claude/commands/how-to/README.md +261 -0
  40. package/claude/commands/how-to/add-metadata.md +692 -0
  41. package/claude/commands/how-to/add-taxonomies.md +806 -0
  42. package/claude/commands/how-to/add-translations.md +571 -0
  43. package/claude/commands/how-to/create-api.md +577 -0
  44. package/claude/commands/how-to/create-block.md +575 -0
  45. package/claude/commands/how-to/create-child-entities.md +771 -0
  46. package/claude/commands/how-to/create-entity.md +597 -0
  47. package/claude/commands/how-to/create-migrations.md +605 -0
  48. package/claude/commands/how-to/create-plugin.md +654 -0
  49. package/claude/commands/how-to/customize-app.md +481 -0
  50. package/claude/commands/how-to/customize-dashboard.md +553 -0
  51. package/claude/commands/how-to/customize-theme.md +438 -0
  52. package/claude/commands/how-to/define-features-flows.md +632 -0
  53. package/claude/commands/how-to/deploy.md +507 -0
  54. package/claude/commands/how-to/handle-file-uploads.md +746 -0
  55. package/claude/commands/how-to/implement-search.md +1001 -0
  56. package/claude/commands/how-to/install-plugins.md +352 -0
  57. package/claude/commands/how-to/manage-test-coverage.md +984 -0
  58. package/claude/commands/how-to/run-tests.md +400 -0
  59. package/claude/commands/how-to/set-app-languages.md +601 -0
  60. package/claude/commands/how-to/set-plans-and-permissions.md +575 -0
  61. package/claude/commands/how-to/set-scheduled-actions.md +527 -0
  62. package/claude/commands/how-to/set-user-roles-and-permissions.md +550 -0
  63. package/claude/commands/how-to/setup-authentication.md +388 -0
  64. package/claude/commands/how-to/setup-claude-code.md +440 -0
  65. package/claude/commands/how-to/setup-database.md +274 -0
  66. package/claude/commands/how-to/setup-email-providers.md +598 -0
  67. package/claude/commands/how-to/setup-mobile-dev.md +627 -0
  68. package/claude/commands/how-to/start.md +500 -0
  69. package/claude/commands/how-to/use-devtools.md +639 -0
  70. package/claude/commands/how-to/use-superadmin.md +622 -0
  71. package/claude/commands/session/README.md +193 -0
  72. package/claude/commands/session/block-create.md +190 -0
  73. package/claude/commands/session/block-list.md +203 -0
  74. package/claude/commands/session/block-update.md +192 -0
  75. package/claude/commands/session/block-validate.md +218 -0
  76. package/claude/commands/session/changelog.md +115 -0
  77. package/claude/commands/session/close.md +225 -0
  78. package/claude/commands/session/commit.md +174 -0
  79. package/claude/commands/session/db-entity.md +206 -0
  80. package/claude/commands/session/db-fix.md +212 -0
  81. package/claude/commands/session/db-sample.md +206 -0
  82. package/claude/commands/session/demo.md +178 -0
  83. package/claude/commands/session/doc-bdd.md +207 -0
  84. package/claude/commands/session/doc-feature.md +218 -0
  85. package/claude/commands/session/doc-read.md +225 -0
  86. package/claude/commands/session/execute.md +204 -0
  87. package/claude/commands/session/explain.md +202 -0
  88. package/claude/commands/session/fix-bug.md +210 -0
  89. package/claude/commands/session/fix-build.md +182 -0
  90. package/claude/commands/session/fix-test.md +189 -0
  91. package/claude/commands/session/pending.md +232 -0
  92. package/claude/commands/session/refine.md +188 -0
  93. package/claude/commands/session/resume.md +192 -0
  94. package/claude/commands/session/review.md +192 -0
  95. package/claude/commands/session/scope-change.md +181 -0
  96. package/claude/commands/session/start-blocks.md +347 -0
  97. package/claude/commands/session/start.md +604 -0
  98. package/claude/commands/session/status.md +169 -0
  99. package/claude/commands/session/test-fix.md +221 -0
  100. package/claude/commands/session/test-run.md +203 -0
  101. package/claude/commands/session/test-write.md +242 -0
  102. package/claude/commands/session/validate.md +162 -0
  103. package/claude/config/context.json +40 -0
  104. package/claude/config/github.json +69 -0
  105. package/claude/config/github.schema.json +106 -0
  106. package/claude/config/team.json +46 -0
  107. package/claude/config/team.schema.json +106 -0
  108. package/claude/config/workspace.json +43 -0
  109. package/claude/config/workspace.schema.json +75 -0
  110. package/claude/skills/README.md +228 -0
  111. package/claude/skills/accessibility/SKILL.md +573 -0
  112. package/claude/skills/api-bypass-layers/SKILL.md +550 -0
  113. package/claude/skills/asana-integration/SKILL.md +499 -0
  114. package/claude/skills/better-auth/SKILL.md +666 -0
  115. package/claude/skills/billing-subscriptions/SKILL.md +660 -0
  116. package/claude/skills/block-decision-matrix/SKILL.md +359 -0
  117. package/claude/skills/clickup-integration/SKILL.md +434 -0
  118. package/claude/skills/core-theme-responsibilities/SKILL.md +485 -0
  119. package/claude/skills/create-plugin/SKILL.md +425 -0
  120. package/claude/skills/create-theme/SKILL.md +331 -0
  121. package/claude/skills/cypress-api/SKILL.md +511 -0
  122. package/claude/skills/cypress-api/scripts/generate-api-controller.py +329 -0
  123. package/claude/skills/cypress-api/scripts/generate-api-test.py +930 -0
  124. package/claude/skills/cypress-e2e/SKILL.md +526 -0
  125. package/claude/skills/cypress-e2e/scripts/extract-selectors.py +383 -0
  126. package/claude/skills/cypress-e2e/scripts/generate-uat-test.py +788 -0
  127. package/claude/skills/cypress-selectors/SKILL.md +309 -0
  128. package/claude/skills/cypress-selectors/scripts/extract-missing.py +243 -0
  129. package/claude/skills/cypress-selectors/scripts/generate-block-selectors.py +283 -0
  130. package/claude/skills/cypress-selectors/scripts/validate-selectors.py +145 -0
  131. package/claude/skills/database-migrations/SKILL.md +335 -0
  132. package/claude/skills/database-migrations/scripts/generate-sample-data.py +284 -0
  133. package/claude/skills/database-migrations/scripts/validate-migration.py +323 -0
  134. package/claude/skills/design-system/SKILL.md +682 -0
  135. package/claude/skills/documentation/SKILL.md +540 -0
  136. package/claude/skills/entity-api/SKILL.md +482 -0
  137. package/claude/skills/entity-system/SKILL.md +635 -0
  138. package/claude/skills/entity-system/scripts/generate-child-migration.py +298 -0
  139. package/claude/skills/entity-system/scripts/generate-metas-migration.py +233 -0
  140. package/claude/skills/entity-system/scripts/generate-migration.py +382 -0
  141. package/claude/skills/entity-system/scripts/generate-sample-data.py +418 -0
  142. package/claude/skills/entity-system/scripts/scaffold-entity.py +661 -0
  143. package/claude/skills/github/SKILL.md +467 -0
  144. package/claude/skills/i18n-nextintl/SKILL.md +302 -0
  145. package/claude/skills/i18n-nextintl/scripts/add-translation.py +243 -0
  146. package/claude/skills/i18n-nextintl/scripts/extract-hardcoded.py +246 -0
  147. package/claude/skills/i18n-nextintl/scripts/validate-translations.py +260 -0
  148. package/claude/skills/impact-analysis/SKILL.md +203 -0
  149. package/claude/skills/jest-unit/SKILL.md +306 -0
  150. package/claude/skills/jest-unit/references/component-testing.md +371 -0
  151. package/claude/skills/jest-unit/references/mocking-patterns.md +380 -0
  152. package/claude/skills/jest-unit/references/service-hook-testing.md +454 -0
  153. package/claude/skills/jira-integration/SKILL.md +539 -0
  154. package/claude/skills/media-library/SKILL.md +743 -0
  155. package/claude/skills/mock-analysis/SKILL.md +276 -0
  156. package/claude/skills/monorepo-architecture/SKILL.md +162 -0
  157. package/claude/skills/nextjs-api-development/SKILL.md +364 -0
  158. package/claude/skills/nextjs-api-development/scripts/generate-crud-tests.py +456 -0
  159. package/claude/skills/nextjs-api-development/scripts/scaffold-endpoint.py +481 -0
  160. package/claude/skills/nextjs-api-development/scripts/validate-api.py +283 -0
  161. package/claude/skills/notion-integration/SKILL.md +641 -0
  162. package/claude/skills/npm-development-workflow/SKILL.md +480 -0
  163. package/claude/skills/page-builder-blocks/SKILL.md +530 -0
  164. package/claude/skills/page-builder-blocks/scripts/scaffold-block.py +444 -0
  165. package/claude/skills/permissions-system/SKILL.md +619 -0
  166. package/claude/skills/plugins/SKILL.md +340 -0
  167. package/claude/skills/plugins/references/plugin-templates.md +414 -0
  168. package/claude/skills/plugins/references/plugin-testing.md +353 -0
  169. package/claude/skills/plugins/references/plugin-types.md +198 -0
  170. package/claude/skills/plugins/scripts/scaffold-plugin.py +443 -0
  171. package/claude/skills/pom-patterns/SKILL.md +452 -0
  172. package/claude/skills/pom-patterns/scripts/generate-pom.py +392 -0
  173. package/claude/skills/rate-limiting/SKILL.md +342 -0
  174. package/claude/skills/react-best-practices/AGENTS.md +2410 -0
  175. package/claude/skills/react-best-practices/README.md +123 -0
  176. package/claude/skills/react-best-practices/SKILL.md +125 -0
  177. package/claude/skills/react-best-practices/metadata.json +15 -0
  178. package/claude/skills/react-best-practices/rules/_sections.md +46 -0
  179. package/claude/skills/react-best-practices/rules/_template.md +28 -0
  180. package/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  181. package/claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  182. package/claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
  183. package/claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
  184. package/claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
  185. package/claude/skills/react-best-practices/rules/async-parallel.md +28 -0
  186. package/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  187. package/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  188. package/claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  189. package/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  190. package/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  191. package/claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
  192. package/claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  193. package/claude/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
  194. package/claude/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  195. package/claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  196. package/claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  197. package/claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  198. package/claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  199. package/claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  200. package/claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  201. package/claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
  202. package/claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  203. package/claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
  204. package/claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  205. package/claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  206. package/claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  207. package/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  208. package/claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
  209. package/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  210. package/claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  211. package/claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  212. package/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  213. package/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  214. package/claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  215. package/claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  216. package/claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  217. package/claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  218. package/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  219. package/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  220. package/claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
  221. package/claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  222. package/claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  223. package/claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  224. package/claude/skills/react-best-practices/rules/server-cache-react.md +76 -0
  225. package/claude/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
  226. package/claude/skills/react-best-practices/rules/server-serialization.md +38 -0
  227. package/claude/skills/react-patterns/SKILL.md +688 -0
  228. package/claude/skills/registry-system/SKILL.md +331 -0
  229. package/claude/skills/scheduled-actions/SKILL.md +671 -0
  230. package/claude/skills/scope-enforcement/SKILL.md +542 -0
  231. package/claude/skills/scope-enforcement/scripts/validate-scope.py +357 -0
  232. package/claude/skills/server-actions/SKILL.md +493 -0
  233. package/claude/skills/service-layer/SKILL.md +587 -0
  234. package/claude/skills/session-management/SKILL.md +266 -0
  235. package/claude/skills/session-management/scripts/create-session.py +166 -0
  236. package/claude/skills/session-management/scripts/iteration-close.sh +105 -0
  237. package/claude/skills/session-management/scripts/iteration-init.sh +180 -0
  238. package/claude/skills/session-management/scripts/session-archive.sh +87 -0
  239. package/claude/skills/session-management/scripts/session-close.sh +133 -0
  240. package/claude/skills/session-management/scripts/session-init.sh +225 -0
  241. package/claude/skills/session-management/scripts/session-list.sh +163 -0
  242. package/claude/skills/session-management/scripts/split-plan.sh +116 -0
  243. package/claude/skills/shadcn-components/SKILL.md +586 -0
  244. package/claude/skills/shadcn-theming/SKILL.md +446 -0
  245. package/claude/skills/suspense-loading/SKILL.md +280 -0
  246. package/claude/skills/tailwind-theming/SKILL.md +507 -0
  247. package/claude/skills/tanstack-query/SKILL.md +608 -0
  248. package/claude/skills/test-coverage/SKILL.md +239 -0
  249. package/claude/skills/web-design-guidelines/SKILL.md +39 -0
  250. package/claude/skills/zod-validation/SKILL.md +537 -0
  251. package/claude/templates/blocks/progress.md +86 -0
  252. package/claude/templates/iteration/changes.md +61 -0
  253. package/claude/templates/iteration/progress.md +55 -0
  254. package/claude/templates/log.md +31 -0
  255. package/claude/templates/story/context.md +77 -0
  256. package/claude/templates/story/pendings.md +37 -0
  257. package/claude/templates/story/plan.md +299 -0
  258. package/claude/templates/story/requirements.md +109 -0
  259. package/claude/templates/story/scope.json +10 -0
  260. package/claude/templates/story/tests.md +91 -0
  261. package/claude/templates/task/progress.md +58 -0
  262. package/claude/templates/task/requirements.md +54 -0
  263. package/claude/workflows/README.md +154 -0
  264. package/claude/workflows/blocks.md +614 -0
  265. package/claude/workflows/story.md +1207 -0
  266. package/claude/workflows/task.md +927 -0
  267. package/claude/workflows/tweak.md +527 -0
  268. package/cursor/.gitkeep +0 -0
  269. package/package.json +35 -0
  270. package/scripts/postinstall.mjs +198 -0
  271. package/scripts/setup.mjs +282 -0
  272. 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 |