rbac-permissions-builder — Claude Code skill: setup and guide
Generates a complete role-based access control architecture in TypeScript: permission matrices, Express route guards, policy classes, and UI checks.
npx skills add patricio0312rev/skills --skill rbac-permissions-builder -a claude-codeWhat rbac-permissions-builder does
This skill guides the agent through building role-based authorization systems. It produces a granular resource:action permission enum alongside a role mapping table. For backend routing, it writes Express middleware like requirePermission and requireOwnership, returning standard 401 or 403 HTTP status codes.
Complex business logic moves into static policy classes like UserPolicy. The skill also outlines client-side integration: an auth endpoint returning active user permissions and a usePermission hook to toggle UI elements.
The code examples target TypeScript and Express. Route guards depend directly on an authentication layer that populates req.user, rejecting requests with 401 if that object is missing.
What it helps with
- map granular permissions to roles using a TypeScript matrix
- secure Express endpoints using permission-based route guards
- verify resource ownership while preserving admin overrides
- render frontend actions conditionally based on user permissions
Example prompts for the agent
- Design an RBAC setup with user, moderator, and admin roles
- Write Express middleware to protect user deletion routes with permissions
- Create a UserPolicy class with rules for profile updates
How to install rbac-permissions-builder
1Skills CLI (Vercel)
npx skills add patricio0312rev/skills --skill rbac-permissions-builder -a claude-code2Manually: put the files in place
~/.claude/skills/rbac-permissions-builder/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/rbac-permissions-builder/
1Skills CLI (Vercel)
npx skills add patricio0312rev/skills --skill rbac-permissions-builder -a codex2Manually: put the files in place
.agents/skills/rbac-permissions-builder/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add patricio0312rev/skills --skill rbac-permissions-builder -a cursor2Manually: put the files in place
.cursor/skills/rbac-permissions-builder/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install patricio0312rev/skills rbac-permissions-builder2Manually: put the files in place
.github/skills/rbac-permissions-builder/SKILL.md1Skills CLI (Vercel)
npx skills add patricio0312rev/skills --skill rbac-permissions-builder -a gemini-cli2Platform CLI
gemini skills install https://github.com/patricio0312rev/skills --path backend/rbac-permissions-builderManually: put the files in place
.devin/skills/rbac-permissions-builder/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add patricio0312rev/skills --skill rbac-permissions-builder -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about rbac-permissions-builder
How to install rbac-permissions-builder in Claude Code?
Run npx skills add patricio0312rev/skills --skill rbac-permissions-builder -a claude-code. The skill file will be placed in ~/.claude/skills/rbac-permissions-builder/SKILL.md.
What does rbac-permissions-builder do?
It generates role matrices, route guards, ownership checks, policy classes, and frontend permission helpers for TypeScript applications.
What prerequisites does the generated RBAC code need?
The patterns are structured for TypeScript and Express. The route guards expect prior authentication middleware to populate req.user before checking permissions.
Source text
SKILL.md · MIT
---
name: rbac-permissions-builder
description: Implements role-based access control with permission matrix, route guards, policy functions, and UI permission hints. Provides middleware/guards, helper utilities, test suggestions, and permission checking patterns. Use when building "RBAC", "permissions", "access control", or "authorization".
---
# RBAC/Permissions Builder
Implement flexible role-based access control systems.
## Permission Matrix
```typescript
// Define permissions
export enum Permission {
USER_READ = "user:read",
USER_WRITE = "user:write",
USER_DELETE = "user:delete",
POST_READ = "post:read",
POST_WRITE = "post:write",
ADMIN_ACCESS = "admin:access",
}
// Define roles
export const ROLE_PERMISSIONS = {
user: [Permission.USER_READ, Permission.POST_READ, Permission.POST_WRITE],
moderator: [...userPermissions, Permission.POST_DELETE],
admin: Object.values(Permission), // All permissions
};
// Check permission
export const hasPermission = (user: User, permission: Permission): boolean => {
return ROLE_PERMISSIONS[user.role]?.includes(permission) ?? false;
};
```
## Route Guards (Express)
```typescript
export const requirePermission = (...permissions: Permission[]) => {
return (req: Request, res: Response, next: NextFunction) => {
if (!req.user) {
return res.status(401).json({ error: "Unauthorized" });
}
const hasAllPermissions = permissions.every((p) =>
hasPermission(req.user, p)
);
if (!hasAllPermissions) {
return res.status(403).json({ error: "Forbidden" });
}
next();
};
};
// Usage
router.delete(
"/users/:id",
authenticate,
requirePermission(Permission.USER_DELETE),
controller.delete
);
```
## Policy Pattern
```typescript
// policies/user.policy.ts
export class UserPolicy {
static canUpdate(currentUser: User, targetUser: User): boolean {
// Users can update themselves
if (currentUser.id === targetUser.id) return true;
// Admins can update anyone
if (hasPermission(currentUser, Permission.USER_WRITE)) return true;
return false;
}
static canDelete(currentUser: User, targetUser: User): boolean {
// Can't delete yourself
if (currentUser.id === targetUser.id) return false;
// Only admins can delete
return hasPermission(currentUser, Permission.USER_DELETE);
}
}
// Usage in controller
if (!UserPolicy.canUpdate(req.user, targetUser)) {
return res.status(403).json({ error: "Cannot update this user" });
}
```
## Resource Ownership
```typescript
export const requireOwnership = (
getResourceUserId: (req: Request) => Promise<string>
) => {
return async (req: Request, res: Response, next: NextFunction) => {
const resourceUserId = await getResourceUserId(req);
// Owner can access
if (req.user.id === resourceUserId) {
return next();
}
// Admin can access anything
if (hasPermission(req.user, Permission.ADMIN_ACCESS)) {
return next();
}
return res.status(403).json({ error: "Forbidden" });
};
};
```
## UI Permission Hints
```typescript
// Return permissions with user
GET /api/me
{
"user": { ... },
"permissions": ["user:read", "post:write"]
}
// Frontend helper
export const usePermission = (permission: Permission): boolean => {
const { user } = useAuth();
return user?.permissions?.includes(permission) ?? false;
};
// Usage
{usePermission('user:delete') && <DeleteButton />}
```
## Best Practices
- Define permissions granularly (resource:action)
- Check at multiple layers (route, controller, UI)
- Use policies for complex rules
- Cache permission checks
- Log permission denials
- Test all permission paths
## Output Checklist
- [ ] Permission enum/constants
- [ ] Role-to-permission mapping
- [ ] Route guard middleware
- [ ] Policy classes for complex rules
- [ ] Ownership checking utilities
- [ ] Permission checking helpers
- [ ] UI permission hints endpoint
- [ ] Test cases for all permission paths
© patricio0312rev · MIT · patricio0312rev/skills