[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C69FRFB6XSSQ2CW559RGS1":3,"skill-same:01M6C69FRFB6XSSQ2CW559RGS1":100},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":6,"ownerHtmlUrl":60,"ownerBlogUrl":61,"ownerDescription":62,"updatedAt":63,"install":64,"resources":77},"01M6C69FRFB6XSSQ2CW559RGS1","clerk-orgs",null,"Clerk Organizations for B2B SaaS - create multi-tenant apps with org switching, role-based access, verified domains, and enterprise SSO. Use for team workspaces, RBAC, org-based routing, member management.","Allternit\u002Fallternit-platform","Allternit","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F250397232?v=4","01M6C67T2SPVP033M7REAAHYHX","01M6C67T7CXM1DKVQY8DFAFRB2",1,"MIT","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-orgs\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"clerk","clerk orgs","workspaces","tenant","for","verified","mode","org","domains","apps","app","switching","b2b","next","dashboard","Story","use","webfetch","management","public","access","team","saas","sso","Enterprise","routing","create","rbac","2026-11-10 10:12:30",false,"---\nname: clerk-orgs\ndescription: Clerk Organizations for B2B SaaS - create multi-tenant apps with org\n  switching, role-based access, verified domains, and enterprise SSO. Use for team\n  workspaces, RBAC, org-based routing, member management.\nallowed-tools: WebFetch\nlicense: MIT\ncompatibility: Requires NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY and CLERK_SECRET_KEY. Organizations must be enabled in Clerk Dashboard → Organizations. Membership mode (required vs optional) must match the B2B vs B2C + B2B coexistence story of your app.\nmetadata:\n  author: clerk\n  version: 3.0.0\n---\n\n# Organizations (B2B SaaS)\n\n> **STOP — prerequisite.** Organizations must be enabled before any org-related API, hook, or component works. Two paths: (1) [Dashboard → Organizations settings](https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=organizations-settings), or (2) `clerk enable orgs` (see \"Agent-first: Programmatic org management\" below). Pick the Membership mode deliberately: `Membership required` (default since 2025-08-22) routes signed-in users through the `choose-organization` task and disables personal accounts, while `Membership optional` keeps personal accounts available for B2C + B2B coexistence. Pick `optional` if you need personal subscriptions alongside org subscriptions.\n>\n> **Version**: This skill targets current SDKs (`@clerk\u002Fnextjs` v7+, `@clerk\u002Freact` v6+ — Core 3). Core 2 differences are noted inline with `> **Core 2 ONLY (skip if current SDK):**` callouts — see `clerk` skill for the full version table.\n\n## Quick Start\n\n1. **Enable Organizations** — via [Dashboard → Organizations settings](https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=organizations-settings) or `clerk enable orgs` (see Agent-first section). Pick `Membership required` (B2B-only) or `Membership optional` (B2C + B2B).\n2. **Create an org** — via `\u003COrganizationSwitcher \u002F>`, `\u003CCreateOrganization \u002F>`, or programmatically with `clerkClient().organizations.createOrganization()`.\n3. **Protect routes** — read `orgId` \u002F `orgSlug` from `auth()` and gate with `has({ role })` or `has({ permission })`.\n4. **Manage members** — send invitations via Backend API or the built-in `\u003COrganizationProfile \u002F>` tab.\n5. **Cap membership** — set `maxAllowedMemberships` at org creation or pick a seat-limited Billing Plan (see `clerk-billing` skill).\n\n## What Do You Need?\n\n| Task | Reference |\n|------|-----------|\n| System permissions catalog, custom roles, role sets | references\u002Froles-permissions.md |\n| Invitation lifecycle (create, list, revoke, built-in UI) | references\u002Finvitations.md |\n| Enterprise SSO setup, provider field access, domain verification | references\u002Fenterprise-sso.md |\n| Next.js adaptations for orgs (role\u002Fpermission middleware, slug invariants, orgId-scoped writes) | references\u002Fnextjs-patterns.md |\n\n## References\n\n| Reference | Description |\n|-----------|-------------|\n| `references\u002Froles-permissions.md` | Default + custom roles, System Permissions catalog, permission naming |\n| `references\u002Finvitations.md` | Backend API for invitations + built-in UI |\n| `references\u002Fenterprise-sso.md` | SAML\u002FOIDC per-org, domain verification, correct field access |\n| `references\u002Fnextjs-patterns.md` | Next.js adaptations specific to orgs. For generic Next.js patterns see `clerk-nextjs-patterns` skill. |\n\n## Dashboard shortcuts\n\n| Action | URL |\n|---|---|\n| Enable Organizations + Membership mode | `https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=organizations-settings` |\n| Manage roles + permissions | `https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=organizations-settings\u002Froles` |\n| Create\u002Fedit an organization | `https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=organizations` |\n| Webhooks for org events | `https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=webhooks` |\n\n## Agent-first: Programmatic org management\n\nOrg settings (enable toggle, membership cap, admin delete, domains) are patchable via PLAPI Instance Config. Org CRUD + memberships + invitations live in BAPI. Useful for agents seeding orgs, replicating settings across instances, or version-controlling org structure.\n\nPre-req: project linked (`clerk auth login` + `clerk link`, see `clerk-setup`).\n\n### Enable Organizations + settings via CLI\n\n```bash\nclerk enable orgs\n```\n\nFor additional settings (membership cap, verified domains, admin delete), patch the instance config:\n\n```bash\nclerk api --platform PATCH \u002Fv1\u002Fplatform\u002Fapplications\u002F\u003Capp_id>\u002Finstances\u002F\u003Cins_id>\u002Fconfig \\\n  -d '{\"organization_settings\":{\"max_allowed_memberships\":50,\"domains_enabled\":true,\"admin_delete_enabled\":true}}'\n```\n\n### Create \u002F list \u002F delete orgs (BAPI)\n\n```bash\n# Create:\nclerk api -X POST \u002Fv1\u002Forganizations \\\n  -d '{\"name\":\"Acme\",\"slug\":\"acme\",\"created_by\":\"user_xxx\",\"max_allowed_memberships\":10}'\n\n# List:\nclerk api \u002Fv1\u002Forganizations --query 'limit=20'\n\n# Get one:\nclerk api \u002Fv1\u002Forganizations\u002F\u003Corg_id>\n\n# Update:\nclerk api -X PATCH \u002Fv1\u002Forganizations\u002F\u003Corg_id> -d '{\"name\":\"Acme Inc.\"}'\n\n# Delete:\nclerk api -X DELETE \u002Fv1\u002Forganizations\u002F\u003Corg_id>\n```\n\n### Memberships\n\n```bash\n# Add a user to an org:\nclerk api -X POST \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Fmemberships \\\n  -d '{\"user_id\":\"user_xxx\",\"role\":\"org:admin\"}'\n\n# List members:\nclerk api \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Fmemberships --query 'limit=50'\n\n# Update role:\nclerk api -X PATCH \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Fmemberships\u002F\u003Cuser_id> \\\n  -d '{\"role\":\"org:member\"}'\n\n# Remove:\nclerk api -X DELETE \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Fmemberships\u002F\u003Cuser_id>\n```\n\n### Invitations\n\n```bash\n# Send:\nclerk api -X POST \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Finvitations \\\n  -d '{\"email_address\":\"alice@example.com\",\"role\":\"org:member\",\"redirect_url\":\"https:\u002F\u002Fapp.com\u002Faccept\"}'\n\n# List pending:\nclerk api \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Finvitations --query 'status=pending'\n\n# Revoke:\nclerk api -X POST \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Finvitations\u002F\u003Cinv_id>\u002Frevoke \\\n  -d '{\"requesting_user_id\":\"user_xxx\"}'\n```\n\n### Notes\n\n- This handles **org config + CRUD**. Subscription \u002F billing for orgs (org plans, seat-limit pricing) flows through `clerk-billing` skill.\n- Roles + permissions catalog is editable in `references\u002Froles-permissions.md`. Custom role creation goes through `clerk config patch` (instance-level role definitions) — see Dashboard's role editor for the UX equivalent.\n- For SSO \u002F verified domain provisioning, see `references\u002Fenterprise-sso.md`.\n\n## Documentation\n\n- [Overview](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Foverview)\n- [Configure + enable](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fconfigure)\n- [Roles and permissions](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fcontrol-access\u002Froles-and-permissions)\n- [Check access](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fcontrol-access\u002Fcheck-access)\n- [Invitations](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fadd-members\u002Finvitations)\n- [OrganizationSwitcher](https:\u002F\u002Fclerk.com\u002Fdocs\u002Freference\u002Fcomponents\u002Forganization\u002Forganization-switcher)\n- [Verified domains](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fadd-members\u002Fverified-domains)\n- [Enterprise SSO](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fadd-members\u002Fsso)\n\n## Key Patterns\n\nExamples use `@clerk\u002Fnextjs` by default. For other frameworks swap the import to `@clerk\u002Freact` (Vite\u002FCRA), `@clerk\u002Fastro\u002Fcomponents`, `@clerk\u002Fvue`, `@clerk\u002Fexpo`, `@clerk\u002Freact-router`, or `@clerk\u002Ftanstack-react-start` — the feature-level APIs (`has()`, `orgId`, `\u003COrganizationSwitcher \u002F>`, `\u003CShow>`) are identical across SDKs. Framework-specific patterns (middleware, redirects) live in `references\u002Fnextjs-patterns.md`.\n\n### 1. Read Organization from Auth\n\nServer-side access to active organization:\n\n```typescript\nimport { auth } from '@clerk\u002Fnextjs\u002Fserver'\n\nconst { orgId, orgSlug, orgRole } = await auth()\nif (!orgId) {\n  \u002F\u002F user has no active org — either not in any, or viewing Personal Account\n}\n```\n\n`auth()` is Next.js-specific. Equivalent server-side accessors per SDK: `auth(event)` (Nuxt via `event.context.auth()`), `context.locals.auth()` (Astro), `getAuth(req)` (Express, after `clerkMiddleware()`). Client-side: `useAuth()` (React-based SDKs) or composables (Vue\u002FNuxt). All return the same `orgId` \u002F `orgSlug` \u002F `orgRole` shape.\n\n### 2. Dynamic Routes with Org Slug\n\nRoute-per-org pattern works in any framework supporting file-based dynamic routes. Next.js example:\n\n```\napp\u002Forgs\u002F[slug]\u002Fpage.tsx\napp\u002Forgs\u002F[slug]\u002Fsettings\u002Fpage.tsx\n```\n\nAlways verify the URL slug matches the active org slug — otherwise users can hit `\u002Forgs\u002Fother-org\u002F...` with a stale `orgSlug` in their session:\n\n```typescript\nexport default async function OrgPage({ params }: { params: { slug: string } }) {\n  const { orgSlug } = await auth()\n  if (orgSlug !== params.slug) {\n    redirect('\u002Fdashboard')  \u002F\u002F or whatever your \"no-access\" flow is\n  }\n  return \u003Cdiv>Welcome to {orgSlug}\u003C\u002Fdiv>\n}\n```\n\n### 3. Role-Based Access Control\n\n```typescript\nconst { has } = await auth()\n\nif (!has({ role: 'org:admin' })) {\n  return \u003Cdiv>Admin access required\u003C\u002Fdiv>\n}\n```\n\nPermission checks use the same `has()` surface:\n\n```typescript\nif (!has({ permission: 'org:sys_memberships:manage' })) {\n  redirect('\u002Funauthorized')\n}\n```\n\n**Permission naming convention.** System Permissions prefix with `org:sys_`; custom Permissions use `org:\u003Cresource>:\u003Caction>`. The full System Permissions catalog lives in `references\u002Froles-permissions.md` — the short list is:\n\n- `org:sys_memberships:{read, manage}`\n- `org:sys_profile:{manage, delete}`\n- `org:sys_domains:{read, manage}`\n- `org:sys_billing:{read, manage}`\n\nDo NOT invent names like `org:create`, `org:manage_members`, `org:update_metadata` — those are not real permission slugs. See `references\u002Froles-permissions.md` for custom roles and the permission table.\n\n### 4. Conditional Rendering with `\u003CShow>`\n\n```tsx\nimport { Show } from '@clerk\u002Fnextjs'\n\n\u003CShow when={{ role: 'org:admin' }}>\n  \u003CAdminPanel \u002F>\n\u003C\u002FShow>\n\n\u003CShow when={{ permission: 'org:sys_memberships:manage' }}>\n  \u003CMembersTab \u002F>\n\u003C\u002FShow>\n```\n\n> **Core 2 ONLY (skip if current SDK):** Use `\u003CProtect role=\"org:admin\">` \u002F `\u003CProtect permission=\"...\">` instead of `\u003CShow>`. `\u003CShow>` replaced both `\u003CProtect>` and `\u003CSignedIn>`\u002F`\u003CSignedOut>` in Core 3.\n\nAstro template syntax for the same component (imported from `@clerk\u002Fastro\u002Fcomponents`):\n\n```astro\n\u003CShow when={{ role: 'org:admin' }}>\n  \u003CAdminPanel \u002F>\n\u003C\u002FShow>\n```\n\n### 5. OrganizationSwitcher\n\n```tsx\nimport { OrganizationSwitcher } from '@clerk\u002Fnextjs'\n\n\u003COrganizationSwitcher\n  hidePersonal\n  afterCreateOrganizationUrl=\"\u002Forgs\u002F:slug\u002Fdashboard\"\n  afterSelectOrganizationUrl=\"\u002Forgs\u002F:slug\u002Fdashboard\"\n\u002F>\n```\n\nKey props:\n- `hidePersonal: boolean` — hide the Personal Account option. Defaults to `false`. Pass `true` for B2B-only apps.\n- `afterCreateOrganizationUrl`, `afterSelectOrganizationUrl`, `afterLeaveOrganizationUrl`, `afterSelectPersonalUrl` — navigation hooks. `:slug` is substituted at runtime.\n- `createOrganizationMode`, `organizationProfileMode` — `'modal' | 'navigation'` (default `'modal'`).\n\nThe full prop list lives in the [component reference](https:\u002F\u002Fclerk.com\u002Fdocs\u002Freference\u002Fcomponents\u002Forganization\u002Forganization-switcher).\n\n### 6. Session Task — Choose Organization\n\nWhen `Membership required` is enabled (the default), users without an org are routed through a `choose-organization` session task after sign-in. Clerk handles this automatically inside `\u003CSignIn \u002F>`, but you can host the UI yourself:\n\n```tsx\nimport { ClerkProvider } from '@clerk\u002Fnextjs'\n\n\u003CClerkProvider taskUrls={{ 'choose-organization': '\u002Fsession-tasks\u002Fchoose-organization' }}>\n  {children}\n\u003C\u002FClerkProvider>\n```\n\n```tsx\n\u002F\u002F app\u002Fsession-tasks\u002Fchoose-organization\u002Fpage.tsx\nimport { TaskChooseOrganization } from '@clerk\u002Fnextjs'\n\nexport default function Page() {\n  return \u003CTaskChooseOrganization redirectUrlComplete=\"\u002Fdashboard\" \u002F>\n}\n```\n\n`TaskChooseOrganization` ships as an imported component in the React-based SDKs (`@clerk\u002Fnextjs`, `@clerk\u002Freact`, `@clerk\u002Freact-router`, `@clerk\u002Ftanstack-react-start`). For the JS Frontend SDK (`@clerk\u002Fclerk-js`) the equivalent is `clerk.mountTaskChooseOrganization(node)` \u002F `clerk.unmountTaskChooseOrganization(node)`.\n\n> **Core 2 ONLY (skip if current SDK):** Session tasks aren't available. Force an org selection at sign-in by redirecting to a page that renders `\u003COrganizationSwitcher hidePersonal \u002F>`.\n\n## Default Roles + System Permissions\n\n| Role | Default meaning |\n|------|-------------|\n| `org:admin` | Full access — all System Permissions, can manage org + memberships |\n| `org:member` | Read members + Read billing Permissions only |\n\nYou can create up to 10 custom roles per instance in Dashboard → Organizations → Roles & Permissions. Role-per-org is controlled via **Role Sets** — see `references\u002Froles-permissions.md` for the full model (custom roles, Creator\u002FDefault role settings, role sets, and the System Permissions catalog).\n\n## Billing Checks\n\n`has()` also supports plan and feature checks when Clerk Billing is enabled:\n\n```typescript\nconst { has } = await auth()\n\nhas({ plan: 'gold' })        \u002F\u002F subscription plan\nhas({ feature: 'widgets' })  \u002F\u002F feature entitlement\n```\n\n> **Core 2 ONLY (skip if current SDK):** `has()` only supports `role` and `permission`. Billing checks aren't available.\n\nSee `clerk-billing` for the full Billing surface and seat-limit plan model.\n\n## Enterprise SSO\n\nPer-org SAML\u002FOIDC. Configured in Dashboard → Configure → Enterprise Connections (or per-org: Organizations → select org → SSO Connections). The SSO connection owns its domain directly; no separate Verified Domain is required (and the two features are mutually exclusive on the same domain). Auto-join on first SSO sign-in uses JIT Provisioning, not Verified Domains. Key fact: the `provider` field lives on `enterpriseConnection`, not on `enterpriseAccounts[0]` directly. See `references\u002Fenterprise-sso.md` for the full flow and correct field access.\n\n```typescript\n\u002F\u002F Strategy name for Enterprise SSO (Core 3)\nstrategy: 'enterprise_sso'\n```\n\n> **Core 2 ONLY (skip if current SDK):** Uses `strategy: 'saml'` and `user.samlAccounts` instead of `user.enterpriseAccounts`.\n\n## Gotchas\n\n### `maxAllowedMemberships` caps seats\n\n```typescript\nconst clerk = await clerkClient()\nawait clerk.organizations.createOrganization({\n  name: 'Acme Corp',\n  createdBy: userId,\n  maxAllowedMemberships: 10,\n})\n\n\u002F\u002F Update later:\nawait clerk.organizations.updateOrganization(orgId, {\n  maxAllowedMemberships: 25,\n})\n```\n\nFor tier-based seat limits tied to a subscription, use a seat-limited Billing Plan (see `clerk-billing`).\n\n### Billing gates Permissions at the Feature level\n\nWhen Clerk Billing is enabled, `has({ permission: 'org:posts:edit' })` returns `false` if the Feature associated with that permission is not included in the organization's active Plan — even if the user has the Permission assigned via their role. Ensure the Feature is attached to the active Plan in Dashboard → Billing → Plans → Features.\n\n### Metadata updates REPLACE, not merge\n\n`updateOrganization({ publicMetadata })` overwrites all public metadata. Read first, spread, then write:\n\n```typescript\nconst org = await clerk.organizations.getOrganization({ organizationId: orgId })\nawait clerk.organizations.updateOrganization(orgId, {\n  publicMetadata: { ...org.publicMetadata, newField: 'value' },\n})\n```\n\nApplies identically to `privateMetadata` and to user metadata via `clerkClient.users.updateUser`.\n\n## Error Signatures (diagnose fast)\n\nMost \"org-related\" failures are configuration, not code. Do not edit components before checking these:\n\n| Error \u002F symptom | Root cause | Fix |\n|---|---|---|\n| `orgId` \u002F `orgSlug` is `undefined` for a signed-in user | Organizations not enabled for this instance, OR user has no active org (personal account) | Enable in Dashboard → Organizations; check Membership mode; surface `\u003COrganizationSwitcher \u002F>` |\n| `has({ permission: 'org:manage_members' })` always `false` | Using an invented permission slug | Use `org:sys_memberships:manage` (see roles-permissions.md catalog) |\n| `has({ role })` returns `false` but user looks like an admin | Session token stale after role change | Re-sign-in, or refresh the session: `await clerk.session?.reload()` |\n| `has({ permission })` `false` even with the role assigned | Feature not attached to active Plan (Billing gates permissions) | Dashboard → Billing → Plans → attach Feature |\n| `\u003COrganizationSwitcher \u002F>` doesn't show \"Personal Account\" | `Membership required` mode is on (the default since Aug 22, 2025) | Dashboard → Organizations settings → `Membership optional` |\n| `TaskChooseOrganization` throws \"cannot render when a user doesn't have current session tasks\" | Rendered outside a `choose-organization` task context | Wrap in a `choose-organization` session-task route only; don't render unconditionally |\n| `enterpriseAccounts[0].provider` is `undefined` | Accessing `provider` at the wrong nesting level | Use `user.enterpriseAccounts[0].enterpriseConnection?.provider` |\n\n## Authorization Pattern (Complete Example)\n\nServer component protecting a slug-scoped admin page:\n\n```typescript\nimport { auth } from '@clerk\u002Fnextjs\u002Fserver'\nimport { redirect } from 'next\u002Fnavigation'\n\nexport default async function AdminPage({ params }: { params: { slug: string } }) {\n  const { orgSlug, has } = await auth()\n\n  if (orgSlug !== params.slug) redirect('\u002Fdashboard')\n  if (!has({ role: 'org:admin' })) redirect(`\u002Forgs\u002F${orgSlug}`)\n\n  return \u003Cdiv>Admin settings for {orgSlug}\u003C\u002Fdiv>\n}\n```\n\nFor middleware-level protection (Next.js) see `references\u002Fnextjs-patterns.md`.\n\n## Invitations (short form)\n\nSend from a server action or route handler:\n\n```typescript\nimport { clerkClient, auth } from '@clerk\u002Fnextjs\u002Fserver'\n\nexport async function inviteMember(organizationId: string, emailAddress: string, role: string) {\n  const { userId, has } = await auth()\n\n  if (!userId) throw new Error('Not signed in')\n  if (!has({ permission: 'org:sys_memberships:manage' })) {\n    throw new Error('Not authorized to invite members')\n  }\n\n  const clerk = await clerkClient()\n  return clerk.organizations.createOrganizationInvitation({\n    organizationId,\n    inviterUserId: userId,       \u002F\u002F required per Backend API\n    emailAddress,\n    role,                        \u002F\u002F e.g. 'org:admin' or 'org:member'\n    redirectUrl: 'https:\u002F\u002Fyourapp.com\u002Faccept-invite',\n  })\n}\n```\n\nThe full lifecycle (list, revoke, bulk create, built-in `\u003COrganizationProfile \u002F>` UI) lives in `references\u002Finvitations.md`.\n\n## Workflow\n\n1. **Enable** — Organizations + Membership mode in Dashboard\n2. **Create org** — via UI component or Backend API\n3. **Invite members** — Backend API or built-in UI, with `inviterUserId`\n4. **Gate access** — `has({ role })` \u002F `has({ permission })` with canonical `org:sys_*` names\n5. **Scope routes** — `orgSlug === params.slug` on every protected page\n6. **Switch orgs** — `\u003COrganizationSwitcher \u002F>` handles the whole flow\n\n## See Also\n\n- `clerk-setup` — Initial Clerk install\n- `clerk-billing` — Seat-limit plans, per-plan billing, `has({ plan })` \u002F `has({ feature })`\n- `clerk-webhooks` — Sync org events to your database (`organization.created`, `organizationMembership.*`)\n- `clerk-backend-api` — Full Backend API reference\n- `clerk-nextjs-patterns` — Framework-specific middleware, server actions, caching\n","# Organizations (B2B SaaS)\n\n> **STOP — prerequisite.** Organizations must be enabled before any org-related API, hook, or component works. Two paths: (1) [Dashboard → Organizations settings](https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=organizations-settings), or (2) `clerk enable orgs` (see \"Agent-first: Programmatic org management\" below). Pick the Membership mode deliberately: `Membership required` (default since 2025-08-22) routes signed-in users through the `choose-organization` task and disables personal accounts, while `Membership optional` keeps personal accounts available for B2C + B2B coexistence. Pick `optional` if you need personal subscriptions alongside org subscriptions.\n>\n> **Version**: This skill targets current SDKs (`@clerk\u002Fnextjs` v7+, `@clerk\u002Freact` v6+ — Core 3). Core 2 differences are noted inline with `> **Core 2 ONLY (skip if current SDK):**` callouts — see `clerk` skill for the full version table.\n\n## Quick Start\n\n1. **Enable Organizations** — via [Dashboard → Organizations settings](https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=organizations-settings) or `clerk enable orgs` (see Agent-first section). Pick `Membership required` (B2B-only) or `Membership optional` (B2C + B2B).\n2. **Create an org** — via `\u003COrganizationSwitcher \u002F>`, `\u003CCreateOrganization \u002F>`, or programmatically with `clerkClient().organizations.createOrganization()`.\n3. **Protect routes** — read `orgId` \u002F `orgSlug` from `auth()` and gate with `has({ role })` or `has({ permission })`.\n4. **Manage members** — send invitations via Backend API or the built-in `\u003COrganizationProfile \u002F>` tab.\n5. **Cap membership** — set `maxAllowedMemberships` at org creation or pick a seat-limited Billing Plan (see `clerk-billing` skill).\n\n## What Do You Need?\n\n| Task | Reference |\n|------|-----------|\n| System permissions catalog, custom roles, role sets | references\u002Froles-permissions.md |\n| Invitation lifecycle (create, list, revoke, built-in UI) | references\u002Finvitations.md |\n| Enterprise SSO setup, provider field access, domain verification | references\u002Fenterprise-sso.md |\n| Next.js adaptations for orgs (role\u002Fpermission middleware, slug invariants, orgId-scoped writes) | references\u002Fnextjs-patterns.md |\n\n## References\n\n| Reference | Description |\n|-----------|-------------|\n| `references\u002Froles-permissions.md` | Default + custom roles, System Permissions catalog, permission naming |\n| `references\u002Finvitations.md` | Backend API for invitations + built-in UI |\n| `references\u002Fenterprise-sso.md` | SAML\u002FOIDC per-org, domain verification, correct field access |\n| `references\u002Fnextjs-patterns.md` | Next.js adaptations specific to orgs. For generic Next.js patterns see `clerk-nextjs-patterns` skill. |\n\n## Dashboard shortcuts\n\n| Action | URL |\n|---|---|\n| Enable Organizations + Membership mode | `https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=organizations-settings` |\n| Manage roles + permissions | `https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=organizations-settings\u002Froles` |\n| Create\u002Fedit an organization | `https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=organizations` |\n| Webhooks for org events | `https:\u002F\u002Fdashboard.clerk.com\u002Flast-active?path=webhooks` |\n\n## Agent-first: Programmatic org management\n\nOrg settings (enable toggle, membership cap, admin delete, domains) are patchable via PLAPI Instance Config. Org CRUD + memberships + invitations live in BAPI. Useful for agents seeding orgs, replicating settings across instances, or version-controlling org structure.\n\nPre-req: project linked (`clerk auth login` + `clerk link`, see `clerk-setup`).\n\n### Enable Organizations + settings via CLI\n\n```bash\nclerk enable orgs\n```\n\nFor additional settings (membership cap, verified domains, admin delete), patch the instance config:\n\n```bash\nclerk api --platform PATCH \u002Fv1\u002Fplatform\u002Fapplications\u002F\u003Capp_id>\u002Finstances\u002F\u003Cins_id>\u002Fconfig \\\n  -d '{\"organization_settings\":{\"max_allowed_memberships\":50,\"domains_enabled\":true,\"admin_delete_enabled\":true}}'\n```\n\n### Create \u002F list \u002F delete orgs (BAPI)\n\n```bash\n# Create:\nclerk api -X POST \u002Fv1\u002Forganizations \\\n  -d '{\"name\":\"Acme\",\"slug\":\"acme\",\"created_by\":\"user_xxx\",\"max_allowed_memberships\":10}'\n\n# List:\nclerk api \u002Fv1\u002Forganizations --query 'limit=20'\n\n# Get one:\nclerk api \u002Fv1\u002Forganizations\u002F\u003Corg_id>\n\n# Update:\nclerk api -X PATCH \u002Fv1\u002Forganizations\u002F\u003Corg_id> -d '{\"name\":\"Acme Inc.\"}'\n\n# Delete:\nclerk api -X DELETE \u002Fv1\u002Forganizations\u002F\u003Corg_id>\n```\n\n### Memberships\n\n```bash\n# Add a user to an org:\nclerk api -X POST \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Fmemberships \\\n  -d '{\"user_id\":\"user_xxx\",\"role\":\"org:admin\"}'\n\n# List members:\nclerk api \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Fmemberships --query 'limit=50'\n\n# Update role:\nclerk api -X PATCH \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Fmemberships\u002F\u003Cuser_id> \\\n  -d '{\"role\":\"org:member\"}'\n\n# Remove:\nclerk api -X DELETE \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Fmemberships\u002F\u003Cuser_id>\n```\n\n### Invitations\n\n```bash\n# Send:\nclerk api -X POST \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Finvitations \\\n  -d '{\"email_address\":\"alice@example.com\",\"role\":\"org:member\",\"redirect_url\":\"https:\u002F\u002Fapp.com\u002Faccept\"}'\n\n# List pending:\nclerk api \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Finvitations --query 'status=pending'\n\n# Revoke:\nclerk api -X POST \u002Fv1\u002Forganizations\u002F\u003Corg_id>\u002Finvitations\u002F\u003Cinv_id>\u002Frevoke \\\n  -d '{\"requesting_user_id\":\"user_xxx\"}'\n```\n\n### Notes\n\n- This handles **org config + CRUD**. Subscription \u002F billing for orgs (org plans, seat-limit pricing) flows through `clerk-billing` skill.\n- Roles + permissions catalog is editable in `references\u002Froles-permissions.md`. Custom role creation goes through `clerk config patch` (instance-level role definitions) — see Dashboard's role editor for the UX equivalent.\n- For SSO \u002F verified domain provisioning, see `references\u002Fenterprise-sso.md`.\n\n## Documentation\n\n- [Overview](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Foverview)\n- [Configure + enable](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fconfigure)\n- [Roles and permissions](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fcontrol-access\u002Froles-and-permissions)\n- [Check access](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fcontrol-access\u002Fcheck-access)\n- [Invitations](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fadd-members\u002Finvitations)\n- [OrganizationSwitcher](https:\u002F\u002Fclerk.com\u002Fdocs\u002Freference\u002Fcomponents\u002Forganization\u002Forganization-switcher)\n- [Verified domains](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fadd-members\u002Fverified-domains)\n- [Enterprise SSO](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fguides\u002Forganizations\u002Fadd-members\u002Fsso)\n\n## Key Patterns\n\nExamples use `@clerk\u002Fnextjs` by default. For other frameworks swap the import to `@clerk\u002Freact` (Vite\u002FCRA), `@clerk\u002Fastro\u002Fcomponents`, `@clerk\u002Fvue`, `@clerk\u002Fexpo`, `@clerk\u002Freact-router`, or `@clerk\u002Ftanstack-react-start` — the feature-level APIs (`has()`, `orgId`, `\u003COrganizationSwitcher \u002F>`, `\u003CShow>`) are identical across SDKs. Framework-specific patterns (middleware, redirects) live in `references\u002Fnextjs-patterns.md`.\n\n### 1. Read Organization from Auth\n\nServer-side access to active organization:\n\n```typescript\nimport { auth } from '@clerk\u002Fnextjs\u002Fserver'\n\nconst { orgId, orgSlug, orgRole } = await auth()\nif (!orgId) {\n  \u002F\u002F user has no active org — either not in any, or viewing Personal Account\n}\n```\n\n`auth()` is Next.js-specific. Equivalent server-side accessors per SDK: `auth(event)` (Nuxt via `event.context.auth()`), `context.locals.auth()` (Astro), `getAuth(req)` (Express, after `clerkMiddleware()`). Client-side: `useAuth()` (React-based SDKs) or composables (Vue\u002FNuxt). All return the same `orgId` \u002F `orgSlug` \u002F `orgRole` shape.\n\n### 2. Dynamic Routes with Org Slug\n\nRoute-per-org pattern works in any framework supporting file-based dynamic routes. Next.js example:\n\n```\napp\u002Forgs\u002F[slug]\u002Fpage.tsx\napp\u002Forgs\u002F[slug]\u002Fsettings\u002Fpage.tsx\n```\n\nAlways verify the URL slug matches the active org slug — otherwise users can hit `\u002Forgs\u002Fother-org\u002F...` with a stale `orgSlug` in their session:\n\n```typescript\nexport default async function OrgPage({ params }: { params: { slug: string } }) {\n  const { orgSlug } = await auth()\n  if (orgSlug !== params.slug) {\n    redirect('\u002Fdashboard')  \u002F\u002F or whatever your \"no-access\" flow is\n  }\n  return \u003Cdiv>Welcome to {orgSlug}\u003C\u002Fdiv>\n}\n```\n\n### 3. Role-Based Access Control\n\n```typescript\nconst { has } = await auth()\n\nif (!has({ role: 'org:admin' })) {\n  return \u003Cdiv>Admin access required\u003C\u002Fdiv>\n}\n```\n\nPermission checks use the same `has()` surface:\n\n```typescript\nif (!has({ permission: 'org:sys_memberships:manage' })) {\n  redirect('\u002Funauthorized')\n}\n```\n\n**Permission naming convention.** System Permissions prefix with `org:sys_`; custom Permissions use `org:\u003Cresource>:\u003Caction>`. The full System Permissions catalog lives in `references\u002Froles-permissions.md` — the short list is:\n\n- `org:sys_memberships:{read, manage}`\n- `org:sys_profile:{manage, delete}`\n- `org:sys_domains:{read, manage}`\n- `org:sys_billing:{read, manage}`\n\nDo NOT invent names like `org:create`, `org:manage_members`, `org:update_metadata` — those are not real permission slugs. See `references\u002Froles-permissions.md` for custom roles and the permission table.\n\n### 4. Conditional Rendering with `\u003CShow>`\n\n```tsx\nimport { Show } from '@clerk\u002Fnextjs'\n\n\u003CShow when={{ role: 'org:admin' }}>\n  \u003CAdminPanel \u002F>\n\u003C\u002FShow>\n\n\u003CShow when={{ permission: 'org:sys_memberships:manage' }}>\n  \u003CMembersTab \u002F>\n\u003C\u002FShow>\n```\n\n> **Core 2 ONLY (skip if current SDK):** Use `\u003CProtect role=\"org:admin\">` \u002F `\u003CProtect permission=\"...\">` instead of `\u003CShow>`. `\u003CShow>` replaced both `\u003CProtect>` and `\u003CSignedIn>`\u002F`\u003CSignedOut>` in Core 3.\n\nAstro template syntax for the same component (imported from `@clerk\u002Fastro\u002Fcomponents`):\n\n```astro\n\u003CShow when={{ role: 'org:admin' }}>\n  \u003CAdminPanel \u002F>\n\u003C\u002FShow>\n```\n\n### 5. OrganizationSwitcher\n\n```tsx\nimport { OrganizationSwitcher } from '@clerk\u002Fnextjs'\n\n\u003COrganizationSwitcher\n  hidePersonal\n  afterCreateOrganizationUrl=\"\u002Forgs\u002F:slug\u002Fdashboard\"\n  afterSelectOrganizationUrl=\"\u002Forgs\u002F:slug\u002Fdashboard\"\n\u002F>\n```\n\nKey props:\n- `hidePersonal: boolean` — hide the Personal Account option. Defaults to `false`. Pass `true` for B2B-only apps.\n- `afterCreateOrganizationUrl`, `afterSelectOrganizationUrl`, `afterLeaveOrganizationUrl`, `afterSelectPersonalUrl` — navigation hooks. `:slug` is substituted at runtime.\n- `createOrganizationMode`, `organizationProfileMode` — `'modal' | 'navigation'` (default `'modal'`).\n\nThe full prop list lives in the [component reference](https:\u002F\u002Fclerk.com\u002Fdocs\u002Freference\u002Fcomponents\u002Forganization\u002Forganization-switcher).\n\n### 6. Session Task — Choose Organization\n\nWhen `Membership required` is enabled (the default), users without an org are routed through a `choose-organization` session task after sign-in. Clerk handles this automatically inside `\u003CSignIn \u002F>`, but you can host the UI yourself:\n\n```tsx\nimport { ClerkProvider } from '@clerk\u002Fnextjs'\n\n\u003CClerkProvider taskUrls={{ 'choose-organization': '\u002Fsession-tasks\u002Fchoose-organization' }}>\n  {children}\n\u003C\u002FClerkProvider>\n```\n\n```tsx\n\u002F\u002F app\u002Fsession-tasks\u002Fchoose-organization\u002Fpage.tsx\nimport { TaskChooseOrganization } from '@clerk\u002Fnextjs'\n\nexport default function Page() {\n  return \u003CTaskChooseOrganization redirectUrlComplete=\"\u002Fdashboard\" \u002F>\n}\n```\n\n`TaskChooseOrganization` ships as an imported component in the React-based SDKs (`@clerk\u002Fnextjs`, `@clerk\u002Freact`, `@clerk\u002Freact-router`, `@clerk\u002Ftanstack-react-start`). For the JS Frontend SDK (`@clerk\u002Fclerk-js`) the equivalent is `clerk.mountTaskChooseOrganization(node)` \u002F `clerk.unmountTaskChooseOrganization(node)`.\n\n> **Core 2 ONLY (skip if current SDK):** Session tasks aren't available. Force an org selection at sign-in by redirecting to a page that renders `\u003COrganizationSwitcher hidePersonal \u002F>`.\n\n## Default Roles + System Permissions\n\n| Role | Default meaning |\n|------|-------------|\n| `org:admin` | Full access — all System Permissions, can manage org + memberships |\n| `org:member` | Read members + Read billing Permissions only |\n\nYou can create up to 10 custom roles per instance in Dashboard → Organizations → Roles & Permissions. Role-per-org is controlled via **Role Sets** — see `references\u002Froles-permissions.md` for the full model (custom roles, Creator\u002FDefault role settings, role sets, and the System Permissions catalog).\n\n## Billing Checks\n\n`has()` also supports plan and feature checks when Clerk Billing is enabled:\n\n```typescript\nconst { has } = await auth()\n\nhas({ plan: 'gold' })        \u002F\u002F subscription plan\nhas({ feature: 'widgets' })  \u002F\u002F feature entitlement\n```\n\n> **Core 2 ONLY (skip if current SDK):** `has()` only supports `role` and `permission`. Billing checks aren't available.\n\nSee `clerk-billing` for the full Billing surface and seat-limit plan model.\n\n## Enterprise SSO\n\nPer-org SAML\u002FOIDC. Configured in Dashboard → Configure → Enterprise Connections (or per-org: Organizations → select org → SSO Connections). The SSO connection owns its domain directly; no separate Verified Domain is required (and the two features are mutually exclusive on the same domain). Auto-join on first SSO sign-in uses JIT Provisioning, not Verified Domains. Key fact: the `provider` field lives on `enterpriseConnection`, not on `enterpriseAccounts[0]` directly. See `references\u002Fenterprise-sso.md` for the full flow and correct field access.\n\n```typescript\n\u002F\u002F Strategy name for Enterprise SSO (Core 3)\nstrategy: 'enterprise_sso'\n```\n\n> **Core 2 ONLY (skip if current SDK):** Uses `strategy: 'saml'` and `user.samlAccounts` instead of `user.enterpriseAccounts`.\n\n## Gotchas\n\n### `maxAllowedMemberships` caps seats\n\n```typescript\nconst clerk = await clerkClient()\nawait clerk.organizations.createOrganization({\n  name: 'Acme Corp',\n  createdBy: userId,\n  maxAllowedMemberships: 10,\n})\n\n\u002F\u002F Update later:\nawait clerk.organizations.updateOrganization(orgId, {\n  maxAllowedMemberships: 25,\n})\n```\n\nFor tier-based seat limits tied to a subscription, use a seat-limited Billing Plan (see `clerk-billing`).\n\n### Billing gates Permissions at the Feature level\n\nWhen Clerk Billing is enabled, `has({ permission: 'org:posts:edit' })` returns `false` if the Feature associated with that permission is not included in the organization's active Plan — even if the user has the Permission assigned via their role. Ensure the Feature is attached to the active Plan in Dashboard → Billing → Plans → Features.\n\n### Metadata updates REPLACE, not merge\n\n`updateOrganization({ publicMetadata })` overwrites all public metadata. Read first, spread, then write:\n\n```typescript\nconst org = await clerk.organizations.getOrganization({ organizationId: orgId })\nawait clerk.organizations.updateOrganization(orgId, {\n  publicMetadata: { ...org.publicMetadata, newField: 'value' },\n})\n```\n\nApplies identically to `privateMetadata` and to user metadata via `clerkClient.users.updateUser`.\n\n## Error Signatures (diagnose fast)\n\nMost \"org-related\" failures are configuration, not code. Do not edit components before checking these:\n\n| Error \u002F symptom | Root cause | Fix |\n|---|---|---|\n| `orgId` \u002F `orgSlug` is `undefined` for a signed-in user | Organizations not enabled for this instance, OR user has no active org (personal account) | Enable in Dashboard → Organizations; check Membership mode; surface `\u003COrganizationSwitcher \u002F>` |\n| `has({ permission: 'org:manage_members' })` always `false` | Using an invented permission slug | Use `org:sys_memberships:manage` (see roles-permissions.md catalog) |\n| `has({ role })` returns `false` but user looks like an admin | Session token stale after role change | Re-sign-in, or refresh the session: `await clerk.session?.reload()` |\n| `has({ permission })` `false` even with the role assigned | Feature not attached to active Plan (Billing gates permissions) | Dashboard → Billing → Plans → attach Feature |\n| `\u003COrganizationSwitcher \u002F>` doesn't show \"Personal Account\" | `Membership required` mode is on (the default since Aug 22, 2025) | Dashboard → Organizations settings → `Membership optional` |\n| `TaskChooseOrganization` throws \"cannot render when a user doesn't have current session tasks\" | Rendered outside a `choose-organization` task context | Wrap in a `choose-organization` session-task route only; don't render unconditionally |\n| `enterpriseAccounts[0].provider` is `undefined` | Accessing `provider` at the wrong nesting level | Use `user.enterpriseAccounts[0].enterpriseConnection?.provider` |\n\n## Authorization Pattern (Complete Example)\n\nServer component protecting a slug-scoped admin page:\n\n```typescript\nimport { auth } from '@clerk\u002Fnextjs\u002Fserver'\nimport { redirect } from 'next\u002Fnavigation'\n\nexport default async function AdminPage({ params }: { params: { slug: string } }) {\n  const { orgSlug, has } = await auth()\n\n  if (orgSlug !== params.slug) redirect('\u002Fdashboard')\n  if (!has({ role: 'org:admin' })) redirect(`\u002Forgs\u002F${orgSlug}`)\n\n  return \u003Cdiv>Admin settings for {orgSlug}\u003C\u002Fdiv>\n}\n```\n\nFor middleware-level protection (Next.js) see `references\u002Fnextjs-patterns.md`.\n\n## Invitations (short form)\n\nSend from a server action or route handler:\n\n```typescript\nimport { clerkClient, auth } from '@clerk\u002Fnextjs\u002Fserver'\n\nexport async function inviteMember(organizationId: string, emailAddress: string, role: string) {\n  const { userId, has } = await auth()\n\n  if (!userId) throw new Error('Not signed in')\n  if (!has({ permission: 'org:sys_memberships:manage' })) {\n    throw new Error('Not authorized to invite members')\n  }\n\n  const clerk = await clerkClient()\n  return clerk.organizations.createOrganizationInvitation({\n    organizationId,\n    inviterUserId: userId,       \u002F\u002F required per Backend API\n    emailAddress,\n    role,                        \u002F\u002F e.g. 'org:admin' or 'org:member'\n    redirectUrl: 'https:\u002F\u002Fyourapp.com\u002Faccept-invite',\n  })\n}\n```\n\nThe full lifecycle (list, revoke, bulk create, built-in `\u003COrganizationProfile \u002F>` UI) lives in `references\u002Finvitations.md`.\n\n## Workflow\n\n1. **Enable** — Organizations + Membership mode in Dashboard\n2. **Create org** — via UI component or Backend API\n3. **Invite members** — Backend API or built-in UI, with `inviterUserId`\n4. **Gate access** — `has({ role })` \u002F `has({ permission })` with canonical `org:sys_*` names\n5. **Scope routes** — `orgSlug === params.slug` on every protected page\n6. **Switch orgs** — `\u003COrganizationSwitcher \u002F>` handles the whole flow\n\n## See Also\n\n- `clerk-setup` — Initial Clerk install\n- `clerk-billing` — Seat-limit plans, per-plan billing, `has({ plan })` \u002F `has({ feature })`\n- `clerk-webhooks` — Sync org events to your database (`organization.created`, `organizationMembership.*`)\n- `clerk-backend-api` — Full Backend API reference\n- `clerk-nextjs-patterns` — Framework-specific middleware, server actions, caching\n",{"name":5,"license":14,"metadata":51,"description":7,"allowed-tools":53,"compatibility":54},{"author":18,"version":52},"3.0.0","WebFetch","Requires NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY and CLERK_SECRET_KEY. Organizations must be enabled in Clerk Dashboard → Organizations. Membership mode (required vs optional) must match the B2B vs B2C + B2B coexistence story of your app.","main","7db7c6f88fb96b6792195dacabdb088419b7a9fa",".agents\u002Fskills\u002Fclerk-orgs",0,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform","https:\u002F\u002Fgithub.com\u002FAllternit","https:\u002F\u002Fallternit.com","Allternit builds AI agents that work on your computer, in the cloud, and from your phone. Home of Allternit Desktop and Gizzi Code.","2026-11-13 03:03:58",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add Allternit\u002Fallternit-platform --skill clerk-orgs",{"tool":70,"command":71},"bunx","bunx skills add Allternit\u002Fallternit-platform --skill clerk-orgs",{"tool":73,"command":74},"pnpm","pnpm dlx skills add Allternit\u002Fallternit-platform --skill clerk-orgs","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-orgs\u002FSKILL.md",true,[78,84,88,92,96],{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"evals\u002Fevals.json","REFERENCE","参考文档",8287,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-orgs\u002Fevals\u002Fevals.json",{"path":85,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Fenterprise-sso.md",6688,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-orgs\u002Freferences\u002Fenterprise-sso.md",{"path":89,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Finvitations.md",6024,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-orgs\u002Freferences\u002Finvitations.md",{"path":93,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fnextjs-patterns.md",4008,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-orgs\u002Freferences\u002Fnextjs-patterns.md",{"path":97,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Froles-permissions.md",5606,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-orgs\u002Freferences\u002Froles-permissions.md",[101,127,145,168,192,222],{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":105,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":46},"01M6C6GBWRCJNWQP5S16PKXB77","jev","Ask typed System One judgments (noul \u002F choice \u002F score) against Allternit's LOCAL System One server instead of prompting a chat model to \"return JSON\". Use when classifying, routing, scoring, or screening something and code needs a probability it can branch on, or when the user runs \u002Fjev. Official TypeSafe Jev is an optional, explicit remote lane.","Apache-2.0","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fsystem-one-local\u002Fskills\u002Fjev\u002FSKILL.md",[],[103,109,43,110,111,112,113,114,115,116,117,118,119,34,120,121,122,123,124,125,126],"official","code","server","lane","system","json","model","choice","branch","ask","user","scoring","chat","local","probability","remote","can","when",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":105,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":46},"01M6C6G9CGB9MX47NSQ31QNNB7","jev-route","Route with local System One answers — map Choice + confidence to act \u002F confirm \u002F human lanes, or pick a model tier by Choice label. Also documents the separate `route-model` helper for OpenRouter's typesafe\u002Fjev-router (a chat-model router, NOT System One). Use for confidence routing, model-tier routing, or when the user runs \u002Fjev-route.","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fsystem-one-local\u002Fskills\u002Fjev-route\u002FSKILL.md",[],[103,134,135,136,43,113,115,137,116,138,119,34,139,140,121,141,122,142,143,22,144,126],"jev route","route","documents","pick","openrouter","router","model router","map","helper","with","model-tier",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":105,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":46},"01M6C6G6JZE0RC50QWWE6HG320","jev-guardrail","Screen text or agent tool calls with a battery of local System One Noul hazards plus a Score, with policy in code — and the Claude Code PreToolUse guard (hooks\u002Fpretooluse-guard) that puts deterministic hard rules first and lets Jev only raise friction. Use for injection\u002Fsecret\u002Fdestructive-action screening or when the user runs \u002Fjev-guardrail.","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fsystem-one-local\u002Fskills\u002Fjev-guardrail\u002FSKILL.md",[],[103,152,153,154,110,155,156,157,113,158,159,160,119,34,161,162,163,164,122,165,166,22,167,126],"jev guardrail","guardrail","policy","injection","first","guard","tool","text","Rules","friction","only","hooks","deterministic","battery","calls","agent tool",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":105,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":179,"publishedAt":46},"01M6C6G426P7Q5J3F98HVYDCB2","jev-fanout","Ask every independent System One question over the same state in ONE POST \u002Fv1\u002Fsystemone to the local server (speculative fan-out). Use for parallel judgments, compound commands, one-call turn assessment, or when the user runs \u002Fjev-fanout. Do not fire one HTTP call per question.","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fsystem-one-local\u002Fskills\u002Fjev-fanout\u002FSKILL.md",[174],{"categoryNo":175,"categoryName":176,"taxonomyType":177,"taxonomyTypeDesc":178},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[103,180,181,182,183,184,111,113,185,118,186,119,34,187,188,122,189,190,22,191,126],"fanout","jev fanout","http","assessment","state","parallel","question","do","call","post","v1","local server",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":105,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":198,"publishedAt":46},"01M6C6G13D7JK869Q3DHMQ9542","memory-drive","Read and write the user's Allternit Memory Drive, a git repo of markdown memories in the open Agent Memory Repo format. Use at the start of a session to load what the user's agents remember (MEMORY.md), when the user says \"remember this\", when you learn a durable fact about the user or their work, and before answering questions that depend on past sessions.","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fmemory-drive-plugin\u002Fskills\u002Fmemory-drive\u002FSKILL.md",[],[199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,119,215,34,216,217,218,219,220,221,126],"memory","drive","memory drive","sessions","remember","learn","git","agent memory","start","open","markdown","format","work","repo","read","write","session","what the","memories","about","questions","you","load",{"skillNo":223,"name":224,"nameZh":6,"description":225,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":105,"licenseFileUrl":6,"sourceHtmlUrl":226,"categories":227,"keywords":231,"publishedAt":46},"01M6C6FX778N1047QAJ39Y582H","agent-orchestrator","Orchestrate external CLI agents (kimi, codex, agy, claude, grok, gizzi) through the Allternit Factory (gizzi agents \u002F orchestration \u002F workspace \u002F workflows). Use when the user asks to delegate, offload, or farm out implementation work to another CLI agent \u002F terminal session, or to run work outside this session to save tokens. Part of Allternit Agents \u002F Bot Agents — not a separate product.","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fagent-orchestrator\u002FSKILL.md",[228],{"categoryNo":229,"categoryName":230,"taxonomyType":177,"taxonomyTypeDesc":178},"01JBSEEDCAT000000000000023","Skill与智能体开发",[232,233,234,235,236,237,238,239,240,241,242,243,244,211,245,246,215,34,247,248,249,250,251,252,253,254,126],"orchestrator","agent orchestrator","bot","cli","terminal","codex","orchestration","workflows","run","product","orchestrate","save","workspace","delegate","factory","grok","kimi","implementation","offload","tokens","cli agents","farm","terminal session"]