permdock 0.0.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +327 -1
- package/dist/a2a/index.d.ts +169 -0
- package/dist/a2a/index.js +232 -0
- package/dist/adapter-context-mlWsVGGg.js +23 -0
- package/dist/ai-sdk/index.d.ts +95 -0
- package/dist/ai-sdk/index.js +154 -0
- package/dist/approval-required-TzNB9oQA.js +6 -0
- package/dist/approvals/index.d.ts +3 -0
- package/dist/approvals/index.js +5 -0
- package/dist/approvals-DbYAuNkG.js +224 -0
- package/dist/approvers-DT4AVyIg.js +52 -0
- package/dist/arazzo-BAgw9ap6.js +70 -0
- package/dist/arazzo-cmvX2jDe.js +54 -0
- package/dist/authzen/index.d.ts +39 -0
- package/dist/authzen/index.js +302 -0
- package/dist/better-auth/index.d.ts +109 -0
- package/dist/better-auth/index.js +344 -0
- package/dist/better-supabase/index.d.ts +206 -0
- package/dist/better-supabase/index.js +620 -0
- package/dist/bind-CVy3Espv.d.ts +25 -0
- package/dist/bind-VnYn2HKq.js +97 -0
- package/dist/boundary-BM8a_P6E.js +13 -0
- package/dist/boundary-BmHxVH1J.d.ts +15 -0
- package/dist/budget-JqcRqyhK.d.ts +11 -0
- package/dist/budget-NbEtbJC_.js +11 -0
- package/dist/canonical-json-DemiK4Vp.js +26 -0
- package/dist/capability-4qPdO9gk.js +173 -0
- package/dist/capability-Dq43tT1u.d.ts +99 -0
- package/dist/catalog/index.d.ts +12 -0
- package/dist/catalog/index.js +2 -0
- package/dist/catalog-BjZSovXQ.js +2 -0
- package/dist/catalog-doc-Dsc9y7sd.js +309 -0
- package/dist/catalog-h2tlKFkq.js +48 -0
- package/dist/catalog-path-CnI0XTFK.js +12 -0
- package/dist/catalog-z8q6bi_r.js +55 -0
- package/dist/claude-agent/index.d.ts +72 -0
- package/dist/claude-agent/index.js +77 -0
- package/dist/clerk/index.d.ts +65 -0
- package/dist/clerk/index.js +301 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.js +20 -0
- package/dist/cli/index.d.ts +46 -0
- package/dist/cli/index.js +5 -0
- package/dist/clients-C7zLFuWT.d.ts +12 -0
- package/dist/clients-DjU5ABMy.js +23 -0
- package/dist/cloud/index.d.ts +90 -0
- package/dist/cloud/index.js +404 -0
- package/dist/cloud-BGhHS-lY.js +50 -0
- package/dist/cloud-Bo3e9Ak3.js +118 -0
- package/dist/collect-DDDv_ESs.js +502 -0
- package/dist/collect-DLlujdHC.js +83 -0
- package/dist/collect-rG2IQ3t0.js +2 -0
- package/dist/commands-DWOrSQic.js +97 -0
- package/dist/compact-y6vfu2_f.js +19 -0
- package/dist/compare-pfyVnBjE.js +12 -0
- package/dist/compile/index.d.ts +3 -0
- package/dist/compile/index.js +2 -0
- package/dist/compile-Ba4blROR.js +613 -0
- package/dist/compile-CNnl6uIt.d.ts +94 -0
- package/dist/config-BJiM-xAm.js +157 -0
- package/dist/config-Bn00Z3ks.js +36 -0
- package/dist/config-report-Dw_JcUqT.js +44 -0
- package/dist/connection-CU8MQxRi.js +194 -0
- package/dist/context-Ttp0ekMT.js +82 -0
- package/dist/convex/index.d.ts +45 -0
- package/dist/convex/index.js +65 -0
- package/dist/create-BWyx3jua.d.ts +245 -0
- package/dist/create-CPhDL6qx.js +253 -0
- package/dist/credential-8P81ff4u.js +306 -0
- package/dist/delegation-D8pUEuce.js +103 -0
- package/dist/describe-B_gVZEVi.js +94 -0
- package/dist/describe-PdoqESvg.d.ts +36 -0
- package/dist/diff-B8Tunc3o.js +451 -0
- package/dist/diff-CzqLxZ77.js +48 -0
- package/dist/digest-B3kc_PgQ.d.ts +19 -0
- package/dist/digest-BI-6aa6d.js +27 -0
- package/dist/doctor-WpvG6p4k.js +1194 -0
- package/dist/doctor-collect-ByfYlNv1.js +664 -0
- package/dist/doctor-rOr-4ZfS.js +53 -0
- package/dist/drizzle/index.d.ts +73 -0
- package/dist/drizzle/index.js +160 -0
- package/dist/duration-xK2jGFVc.js +25 -0
- package/dist/elysia/index.d.ts +49 -0
- package/dist/elysia/index.js +59 -0
- package/dist/errors-CWfoNg9N.js +47 -0
- package/dist/errors-Cz5zn0mW.js +123 -0
- package/dist/errors-DAqevpNk.d.ts +125 -0
- package/dist/errors-DRnGZHzF.js +30 -0
- package/dist/evaluation-items-CfCCejQd.js +40 -0
- package/dist/evaluations-tz6D9A2G.js +461 -0
- package/dist/eve/index.d.ts +86 -0
- package/dist/eve/index.js +176 -0
- package/dist/expiry-BoBJ8Tvc.js +7 -0
- package/dist/express/index.d.ts +23 -0
- package/dist/express/index.js +78 -0
- package/dist/fastify/index.d.ts +33 -0
- package/dist/fastify/index.js +92 -0
- package/dist/fields-BMl1RxoX.js +26 -0
- package/dist/files-DWUN9PzI.js +125 -0
- package/dist/fixtures-ht28Cplr.js +67 -0
- package/dist/freeze-CrU8nQeX.js +60 -0
- package/dist/from-snapshot-C3sHpZNS.js +569 -0
- package/dist/generate-CH7ThJ14.js +173 -0
- package/dist/grantee-Cv5Sogfv.js +602 -0
- package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
- package/dist/headers-BZSDieNT.js +6 -0
- package/dist/headers-Cf-zWvsO.d.ts +6 -0
- package/dist/helpers-H_KARDVC.js +421 -0
- package/dist/hono/index.d.ts +48 -0
- package/dist/hono/index.js +99 -0
- package/dist/hosted-DJQw46hn.js +266 -0
- package/dist/http-BIhmLfCc.js +95 -0
- package/dist/http-DPuDaChb.d.ts +13 -0
- package/dist/http-SO7qGttf.js +44 -0
- package/dist/ids-DC4V4CFu.js +18 -0
- package/dist/index-A0YNL8jZ.d.ts +177 -0
- package/dist/index-CtE07CBF.d.ts +6 -0
- package/dist/index-D3vbkoSI.d.ts +483 -0
- package/dist/index-D6_cSa1z.d.ts +201 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +26 -0
- package/dist/instance-options-BK_rNOSC.d.ts +11 -0
- package/dist/instance-options-Dhhcnm3y.js +22 -0
- package/dist/json-schema-BsAflUGW.js +106 -0
- package/dist/jwt/index.d.ts +91 -0
- package/dist/jwt/index.js +590 -0
- package/dist/kernel-GSQnMz3O.js +208 -0
- package/dist/kysely/index.d.ts +78 -0
- package/dist/kysely/index.js +129 -0
- package/dist/live-options-H2eG8dfJ.js +60 -0
- package/dist/load-DhWEB9P1.js +75 -0
- package/dist/load-DwJUafYN.js +2 -0
- package/dist/load-jose-BL6LH4bL.js +11 -0
- package/dist/lru-8q4WZjBV.js +28 -0
- package/dist/manifest-iaoBXHKc.js +783 -0
- package/dist/manifest-uDS9y5de.d.ts +206 -0
- package/dist/map-AcxK9o_D.js +147 -0
- package/dist/map-claims-Z4QZOiFF.js +369 -0
- package/dist/map-error-pgUWNNtG.js +23 -0
- package/dist/markers-B0hYLvMD.js +60 -0
- package/dist/may-use-DndQ5tQ-.js +77 -0
- package/dist/mcp/index.d.ts +159 -0
- package/dist/mcp/index.js +603 -0
- package/dist/nest/index.d.ts +75 -0
- package/dist/nest/index.js +261 -0
- package/dist/next/client.d.ts +23 -0
- package/dist/next/client.js +33 -0
- package/dist/next/index.d.ts +93 -0
- package/dist/next/index.js +180 -0
- package/dist/next/plugin.d.ts +14 -0
- package/dist/next/plugin.js +33 -0
- package/dist/node/index.d.ts +24 -0
- package/dist/node/index.js +34 -0
- package/dist/openai/index.d.ts +62 -0
- package/dist/openai/index.js +92 -0
- package/dist/openapi/index.d.ts +176 -0
- package/dist/openapi/index.js +3 -0
- package/dist/openapi-Bbg4wGVL.js +164 -0
- package/dist/openapi-BqRBvAng.js +538 -0
- package/dist/openapi-CqqEbHsL.js +250 -0
- package/dist/openapi-import-cmwetbzw.js +5959 -0
- package/dist/openapi-schema--ARjyfQr.js +6902 -0
- package/dist/orpc/index.d.ts +51 -0
- package/dist/orpc/index.js +145 -0
- package/dist/otel/index.d.ts +13 -0
- package/dist/otel/index.js +202 -0
- package/dist/package-root-zGkxO3oN.js +30 -0
- package/dist/parse-BuyjxhZV.js +53 -0
- package/dist/parse-local-manifest-BkGQNzAh.d.ts +10 -0
- package/dist/parse-local-manifest-BrMozJCo.js +36 -0
- package/dist/pdp/index.d.ts +22 -0
- package/dist/pdp/index.js +682 -0
- package/dist/peer-BOr_kJE1.js +31 -0
- package/dist/permdock-CzqXjCpU.js +3471 -0
- package/dist/permissions-CDgvKG5L.d.ts +52 -0
- package/dist/permissions-CpZrivYv.js +142 -0
- package/dist/permissions-DVoF6dMt.js +662 -0
- package/dist/permissions-DttnqqxC.d.ts +214 -0
- package/dist/pins-8ILTftC9.js +12 -0
- package/dist/policy-CFZAr_Al.d.ts +2252 -0
- package/dist/policy-D8UFyERw.d.ts +20 -0
- package/dist/policy-xyWg7QdR.js +1122 -0
- package/dist/powersync-A8x_Yyvh.js +2 -0
- package/dist/powersync-C7kLglqX.js +540 -0
- package/dist/powersync-yW1UUFzp.js +62 -0
- package/dist/prisma/index.d.ts +136 -0
- package/dist/prisma/index.js +455 -0
- package/dist/problem-B43ztKIm.js +191 -0
- package/dist/problem-details-CkL50EEf.d.ts +7 -0
- package/dist/problem-details-_AMOYz-w.js +144 -0
- package/dist/prompt-CXYhLfsS.js +32 -0
- package/dist/protected-CNsMzrVd.d.ts +27 -0
- package/dist/protected-Cs6kTaHo.js +100 -0
- package/dist/protected-bZs6rbT1.d.ts +40 -0
- package/dist/provider-Cjr62YMV.d.ts +6 -0
- package/dist/provider-DLzpb2Xz.js +52 -0
- package/dist/provider-store-DNyC1y48.js +43 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.js +7 -0
- package/dist/react/provider-client.d.ts +2 -0
- package/dist/react/provider-client.js +3 -0
- package/dist/react-native/index.d.ts +198 -0
- package/dist/react-native/index.js +696 -0
- package/dist/refs-KYb4ntaz.js +91 -0
- package/dist/relations-cjOL01hZ.js +505 -0
- package/dist/replay-BsOyTrdV.js +28 -0
- package/dist/replay-sqBGMnNs.d.ts +5 -0
- package/dist/resource-ref-CaS9yVPi.js +20 -0
- package/dist/revocations-Bhr0aMIC.js +27 -0
- package/dist/revocations-Cy06JNx2.d.ts +21 -0
- package/dist/rls-BMNydpHk.js +2521 -0
- package/dist/rls-CEvs64Kj.js +238 -0
- package/dist/rls-fields-BMasREhR.js +3502 -0
- package/dist/rls-graph-pc9fuXYm.js +435 -0
- package/dist/rls-import-D8F7j35Q.js +943 -0
- package/dist/rls-migrate-7wikfrVI.js +367 -0
- package/dist/rls-ownership-B5Lkq62W.js +843 -0
- package/dist/rls-shared-aOQ4hGTO.js +493 -0
- package/dist/rls-verify-D8B7dOTh.js +745 -0
- package/dist/row-check-Dt35czLy.d.ts +40 -0
- package/dist/rpc-DOK54_CS.js +89 -0
- package/dist/run-YXCJDNYk.js +174 -0
- package/dist/runtime-CB8gQFvS.js +11 -0
- package/dist/saas-Bj_FFkjN.js +1203 -0
- package/dist/schema-D3MnDMxa.js +300 -0
- package/dist/scim/index.d.ts +2 -0
- package/dist/scim/index.js +2 -0
- package/dist/scim-BFGBBAqR.js +1445 -0
- package/dist/scopes-CVdPrWN-.js +239 -0
- package/dist/server/index.d.ts +134 -0
- package/dist/server/index.js +11 -0
- package/dist/server-DlZ28Oz5.js +268 -0
- package/dist/sha256-BO0swRXL.js +150 -0
- package/dist/shared-DRu8VFVM.js +123 -0
- package/dist/sink-Bd9PSyfq.js +141 -0
- package/dist/sink-Gs6TTVa-.d.ts +104 -0
- package/dist/skills-Biq5uup3.js +192 -0
- package/dist/skills-JaymNCdK.js +56 -0
- package/dist/snapshot-Enxd0n-s.js +975 -0
- package/dist/snapshot-cache-D6jLelln.js +44 -0
- package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
- package/dist/solid/index.d.ts +93 -0
- package/dist/solid/index.js +188 -0
- package/dist/sources-B0UvrJ21.js +534 -0
- package/dist/sources-BcJgw0lt.d.ts +192 -0
- package/dist/sql-xdg5f4Fi.js +27 -0
- package/dist/src-CSbUiozF.js +568 -0
- package/dist/ssf/index.d.ts +4 -0
- package/dist/ssf/index.js +596 -0
- package/dist/store-DMAWwAJV.js +371 -0
- package/dist/store-D_pjn91-.d.ts +36 -0
- package/dist/store-options-yO0V6gRn.js +716 -0
- package/dist/stores-4_sqiOA1.js +87 -0
- package/dist/stores-DVR5NHLE.d.ts +52 -0
- package/dist/stream-DDpvynSB.js +66 -0
- package/dist/stream-DlvG2hs-.d.ts +12 -0
- package/dist/style-CTm1AXDT.js +22 -0
- package/dist/subject-C6dLxqHU.js +24 -0
- package/dist/subject-settings-BwBmCdTR.js +128 -0
- package/dist/supabase/index.d.ts +183 -0
- package/dist/supabase/index.js +5 -0
- package/dist/supabase/middleware.d.ts +82 -0
- package/dist/supabase/middleware.js +102 -0
- package/dist/supabase-CwafwxxF.js +83 -0
- package/dist/supabase-DTBaC20O.js +774 -0
- package/dist/supabase-config-Bs44dare.js +472 -0
- package/dist/supabase-hook-BuxLQLpU.js +1814 -0
- package/dist/supabase-hook-D5qVd_D8.js +2 -0
- package/dist/supautils-DYZnzRWV.js +91 -0
- package/dist/svelte/PermissionBoundary.svelte +37 -0
- package/dist/svelte/Protected.svelte +40 -0
- package/dist/svelte/index.d.ts +13 -0
- package/dist/svelte/index.js +107 -0
- package/dist/svelte/runtime.d.ts +7 -0
- package/dist/svelte/runtime.js +4 -0
- package/dist/svelte/source.d.ts +13 -0
- package/dist/svelte/source.js +11 -0
- package/dist/terminal/index.d.ts +163 -0
- package/dist/terminal/index.js +833 -0
- package/dist/testing/index.d.ts +745 -0
- package/dist/testing/index.js +3672 -0
- package/dist/testing/saas/index.d.ts +194 -0
- package/dist/testing/saas/index.js +3 -0
- package/dist/testing/saas/permissions.d.ts +2 -0
- package/dist/testing/saas/permissions.js +2 -0
- package/dist/text-diff-BdkkYSbi.js +15 -0
- package/dist/thenable-okc2xDsj.js +10 -0
- package/dist/timeout-D51niuQP.js +8 -0
- package/dist/token-CIWxJOCh.js +50 -0
- package/dist/trpc/index.d.ts +61 -0
- package/dist/trpc/index.js +122 -0
- package/dist/types-9AWO9EGt.d.ts +197 -0
- package/dist/types-BPxgszlT.d.ts +550 -0
- package/dist/types-BVyImy5I.d.ts +120 -0
- package/dist/types-Bvc4oWT6.d.ts +9 -0
- package/dist/types-C3s9xVJG.d.ts +48 -0
- package/dist/types-Dnemwd77.d.ts +183 -0
- package/dist/types-kxznc7cn.d.ts +52 -0
- package/dist/types-vKyAMtcX.d.ts +157 -0
- package/dist/types-vNSDF7Dq.d.ts +66 -0
- package/dist/types-yF5LmQVD.d.ts +306 -0
- package/dist/unplugin/index.d.ts +7 -0
- package/dist/unplugin/index.js +31 -0
- package/dist/usage-D07N9QJ3.js +42 -0
- package/dist/usage-D82l1CwK.js +2 -0
- package/dist/usage-DG1oeCca.js +693 -0
- package/dist/validation-error-CnjZ4t92.js +33 -0
- package/dist/validation-error-CtF23SrC.d.ts +26 -0
- package/dist/validity-uOp8UpYn.js +245 -0
- package/dist/verifier-BxBo6I44.js +466 -0
- package/dist/version-BvacVTZR.js +17 -0
- package/dist/views-Soe7bGSC.js +95 -0
- package/dist/vocabulary-DA8a8zif.d.ts +56 -0
- package/dist/vue/index.d.ts +79 -0
- package/dist/vue/index.js +196 -0
- package/dist/watch-Etoa_Mvr.js +2 -0
- package/dist/watch-UihESpsJ.js +128 -0
- package/dist/webmcp/index.d.ts +75 -0
- package/dist/webmcp/index.js +307 -0
- package/package.json +450 -5
- package/rulesets/permdock.yaml +29 -0
- package/schemas/approval-request-v1.json +175 -0
- package/schemas/catalog-v1.json +535 -0
- package/schemas/openapi/oas-3.1.json +1298 -0
- package/schemas/openapi/oas-3.2.json +1516 -0
- package/schemas/openapi/overlay-1.1.json +79 -0
- package/schemas/supabase-claims-v1.json +144 -0
- package/schemas/supabase-manifest-v1.json +361 -0
- package/skills/permdock/SKILL.md +66 -0
- package/skills/permdock-agents/SKILL.md +77 -0
- package/skills/permdock-agents/references/runtimes.md +213 -0
- package/skills/permdock-approvals/SKILL.md +80 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +94 -0
- package/skills/permdock-audit/SKILL.md +67 -0
- package/skills/permdock-credentials/SKILL.md +55 -0
- package/skills/permdock-credentials/references/tokens-keys-links.md +132 -0
- package/skills/permdock-data/SKILL.md +57 -0
- package/skills/permdock-data/references/queries-and-rls.md +62 -0
- package/skills/permdock-data/references/relationships.md +67 -0
- package/skills/permdock-tenancy/SKILL.md +80 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +89 -0
- package/skills/permdock-wire/SKILL.md +116 -0
- package/skills/permdock-wire/references/adapters.md +492 -0
- package/skills/permdock-wire/references/policy-options.md +45 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$id": "https://spec.openapis.org/overlay/1.1/schema/2026-04-01",
|
|
3
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
|
+
"description": "The description of Overlay v1.1.x documents",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"overlay": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"pattern": "^1\\.1\\.\\d+$"
|
|
10
|
+
},
|
|
11
|
+
"info": {
|
|
12
|
+
"$ref": "#/$defs/info-object"
|
|
13
|
+
},
|
|
14
|
+
"extends": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"format": "uri-reference"
|
|
17
|
+
},
|
|
18
|
+
"actions": {
|
|
19
|
+
"type": "array",
|
|
20
|
+
"minItems": 1,
|
|
21
|
+
"uniqueItems": true,
|
|
22
|
+
"items": {
|
|
23
|
+
"$ref": "#/$defs/action-object"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"required": ["overlay", "info", "actions"],
|
|
28
|
+
"$ref": "#/$defs/specification-extensions",
|
|
29
|
+
"unevaluatedProperties": false,
|
|
30
|
+
"$defs": {
|
|
31
|
+
"info-object": {
|
|
32
|
+
"type": "object",
|
|
33
|
+
"properties": {
|
|
34
|
+
"title": {
|
|
35
|
+
"type": "string"
|
|
36
|
+
},
|
|
37
|
+
"version": {
|
|
38
|
+
"type": "string"
|
|
39
|
+
},
|
|
40
|
+
"description": {
|
|
41
|
+
"type": "string"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"required": ["title", "version"],
|
|
45
|
+
"$ref": "#/$defs/specification-extensions",
|
|
46
|
+
"unevaluatedProperties": false
|
|
47
|
+
},
|
|
48
|
+
"action-object": {
|
|
49
|
+
"type": "object",
|
|
50
|
+
"properties": {
|
|
51
|
+
"target": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"pattern": "^\\$"
|
|
54
|
+
},
|
|
55
|
+
"description": {
|
|
56
|
+
"type": "string"
|
|
57
|
+
},
|
|
58
|
+
"update": {
|
|
59
|
+
"type": ["string", "boolean", "object", "array", "number", "null"]
|
|
60
|
+
},
|
|
61
|
+
"copy": {
|
|
62
|
+
"type": "string"
|
|
63
|
+
},
|
|
64
|
+
"remove": {
|
|
65
|
+
"type": "boolean",
|
|
66
|
+
"default": false
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"required": ["target"],
|
|
70
|
+
"$ref": "#/$defs/specification-extensions",
|
|
71
|
+
"unevaluatedProperties": false
|
|
72
|
+
},
|
|
73
|
+
"specification-extensions": {
|
|
74
|
+
"patternProperties": {
|
|
75
|
+
"^x-": true
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://permdock.com/schemas/supabase-claims-v1.json",
|
|
4
|
+
"title": "PermDock claims in a Supabase access token",
|
|
5
|
+
"description": "The claims the permdock supabase hook writes and the SQL helpers and subjectFromSupabase read, plus the OAuth claims subjectFromSupabase maps to the actor and delegation. Other claims pass through. Each hook claim may also sit under app_metadata. supabaseClaims() in permdock/supabase validates the same shape; tenant_id is the default rls.tenantClaim.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"allOf": [{ "$ref": "#/$defs/permdockClaims" }],
|
|
8
|
+
"properties": {
|
|
9
|
+
"client_id": {
|
|
10
|
+
"description": "The OAuth client of a third-party app; becomes actor.id when there is no act claim.",
|
|
11
|
+
"type": "string"
|
|
12
|
+
},
|
|
13
|
+
"scope": {
|
|
14
|
+
"description": "OAuth scopes, space-separated or as a list; becomes delegation.scopes.",
|
|
15
|
+
"anyOf": [
|
|
16
|
+
{ "type": "string" },
|
|
17
|
+
{ "type": "array", "items": { "type": "string" } }
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"act": { "$ref": "#/$defs/act" },
|
|
21
|
+
"app_metadata": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"allOf": [{ "$ref": "#/$defs/permdockClaims" }]
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"$defs": {
|
|
27
|
+
"permdockClaims": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"properties": {
|
|
30
|
+
"user_role": {
|
|
31
|
+
"description": "Global roles: one name, a list, or null for none.",
|
|
32
|
+
"anyOf": [
|
|
33
|
+
{ "type": "string" },
|
|
34
|
+
{ "type": "array", "items": { "type": "string" } },
|
|
35
|
+
{ "type": "null" }
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
"roles": {
|
|
39
|
+
"type": "array",
|
|
40
|
+
"items": { "type": "string" }
|
|
41
|
+
},
|
|
42
|
+
"memberships": {
|
|
43
|
+
"type": "array",
|
|
44
|
+
"items": { "$ref": "#/$defs/membership" }
|
|
45
|
+
},
|
|
46
|
+
"memberships_truncated": {
|
|
47
|
+
"description": "true when the size budget cut memberships or attrs.",
|
|
48
|
+
"type": "boolean"
|
|
49
|
+
},
|
|
50
|
+
"tenant_id": {
|
|
51
|
+
"description": "The active tenant (the default rls.tenantClaim): the canonical text of one instance of the first scope.",
|
|
52
|
+
"type": "string"
|
|
53
|
+
},
|
|
54
|
+
"attrs": {
|
|
55
|
+
"description": "Allow-listed server-owned attributes, read as principal.claims.attrs.<key>.",
|
|
56
|
+
"type": "object"
|
|
57
|
+
},
|
|
58
|
+
"authz_ver": {
|
|
59
|
+
"description": "The principal's authorization version.",
|
|
60
|
+
"type": "integer"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"act": {
|
|
65
|
+
"description": "RFC 8693 actor chain: the outermost sub is the current actor, each nested act a prior one. The outermost kind names the actor: none is an OAuth client or agent, support a support session (needs session_id), impersonation an admin acting as the user.",
|
|
66
|
+
"type": "object",
|
|
67
|
+
"required": ["sub"],
|
|
68
|
+
"properties": {
|
|
69
|
+
"sub": { "type": "string", "minLength": 1 },
|
|
70
|
+
"kind": { "enum": ["support", "impersonation"] },
|
|
71
|
+
"session_id": { "type": "string", "minLength": 1 },
|
|
72
|
+
"read_only": { "type": "boolean" },
|
|
73
|
+
"reason": { "type": "string" },
|
|
74
|
+
"act": { "$ref": "#/$defs/act" }
|
|
75
|
+
},
|
|
76
|
+
"if": {
|
|
77
|
+
"required": ["kind"],
|
|
78
|
+
"properties": { "kind": { "const": "support" } }
|
|
79
|
+
},
|
|
80
|
+
"then": { "required": ["session_id"] }
|
|
81
|
+
},
|
|
82
|
+
"membership": {
|
|
83
|
+
"type": "object",
|
|
84
|
+
"required": ["roles"],
|
|
85
|
+
"properties": {
|
|
86
|
+
"scope": { "type": "string" },
|
|
87
|
+
"id": {
|
|
88
|
+
"description": "Canonical text of the scope instance id (uuid::text for a uuid column); compared exactly, never lower-cased.",
|
|
89
|
+
"type": "string"
|
|
90
|
+
},
|
|
91
|
+
"within": {
|
|
92
|
+
"description": "The id of every ancestor scope instance, by scope name.",
|
|
93
|
+
"type": "object",
|
|
94
|
+
"additionalProperties": { "type": "string" }
|
|
95
|
+
},
|
|
96
|
+
"on": {
|
|
97
|
+
"type": "object",
|
|
98
|
+
"required": ["resource", "id"],
|
|
99
|
+
"properties": {
|
|
100
|
+
"resource": { "type": "string" },
|
|
101
|
+
"id": { "type": "string" }
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"tenant": { "type": "string" },
|
|
105
|
+
"team": { "type": "string" },
|
|
106
|
+
"roles": {
|
|
107
|
+
"type": "array",
|
|
108
|
+
"minItems": 1,
|
|
109
|
+
"items": { "type": "string" }
|
|
110
|
+
},
|
|
111
|
+
"via": { "type": "string" },
|
|
112
|
+
"expiresAt": {
|
|
113
|
+
"description": "Seconds since the epoch.",
|
|
114
|
+
"type": "number"
|
|
115
|
+
},
|
|
116
|
+
"grantedBy": { "type": "string" },
|
|
117
|
+
"reason": { "type": "string" },
|
|
118
|
+
"member": {
|
|
119
|
+
"description": "The subgroup a membership source's group fills.",
|
|
120
|
+
"type": "object",
|
|
121
|
+
"required": ["group"],
|
|
122
|
+
"properties": { "group": { "type": "string", "minLength": 1 } }
|
|
123
|
+
},
|
|
124
|
+
"managedBy": { "const": "idp" },
|
|
125
|
+
"entitlements": { "type": "array", "items": { "type": "string" } },
|
|
126
|
+
"keep": {
|
|
127
|
+
"description": "Set when the instance or an ancestor is suspended: the permission keys the membership still grants.",
|
|
128
|
+
"type": "array",
|
|
129
|
+
"items": { "type": "string", "minLength": 1 }
|
|
130
|
+
},
|
|
131
|
+
"grants": {
|
|
132
|
+
"description": "Custom roles in compact form, read by the helpers in jwt mode.",
|
|
133
|
+
"type": "object"
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"anyOf": [
|
|
137
|
+
{ "required": ["scope", "id"] },
|
|
138
|
+
{ "required": ["tenant"] },
|
|
139
|
+
{ "required": ["team"] },
|
|
140
|
+
{ "required": ["on"] }
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://permdock.com/schemas/supabase-manifest-v1.json",
|
|
4
|
+
"title": "PermDock Supabase hook manifest v1",
|
|
5
|
+
"description": "What `permdock supabase inspect --json` prints and `--out` writes: the generated hook, the SQL helpers, the claims, the membership sources and the columns that decide them. Fields are only added within v1.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"$schema",
|
|
9
|
+
"version",
|
|
10
|
+
"hook",
|
|
11
|
+
"helpers",
|
|
12
|
+
"tenantClaim",
|
|
13
|
+
"budget",
|
|
14
|
+
"claims",
|
|
15
|
+
"authzVersion",
|
|
16
|
+
"memberships",
|
|
17
|
+
"rls",
|
|
18
|
+
"decidingColumns",
|
|
19
|
+
"markers"
|
|
20
|
+
],
|
|
21
|
+
"properties": {
|
|
22
|
+
"$schema": {
|
|
23
|
+
"const": "https://permdock.com/schemas/supabase-manifest-v1.json"
|
|
24
|
+
},
|
|
25
|
+
"version": { "const": 1 },
|
|
26
|
+
"hook": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"required": ["schema", "function", "out"],
|
|
29
|
+
"properties": {
|
|
30
|
+
"schema": { "$ref": "#/$defs/identifier" },
|
|
31
|
+
"function": { "const": "custom_access_token_hook" },
|
|
32
|
+
"out": { "type": "string" },
|
|
33
|
+
"before": {
|
|
34
|
+
"type": "array",
|
|
35
|
+
"items": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*$"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"helpers": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"required": ["schema", "functions"],
|
|
45
|
+
"properties": {
|
|
46
|
+
"schema": { "$ref": "#/$defs/identifier" },
|
|
47
|
+
"functions": {
|
|
48
|
+
"type": "array",
|
|
49
|
+
"items": { "$ref": "#/$defs/helperName" }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"tenantClaim": { "$ref": "#/$defs/identifier" },
|
|
54
|
+
"budget": {
|
|
55
|
+
"type": "object",
|
|
56
|
+
"required": ["bytes", "measure"],
|
|
57
|
+
"properties": {
|
|
58
|
+
"bytes": { "type": "integer", "minimum": 1 },
|
|
59
|
+
"measure": { "type": "string" }
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"claims": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"items": {
|
|
65
|
+
"type": "object",
|
|
66
|
+
"required": ["name", "source", "budget"],
|
|
67
|
+
"properties": {
|
|
68
|
+
"name": { "$ref": "#/$defs/identifier" },
|
|
69
|
+
"source": {
|
|
70
|
+
"type": "string",
|
|
71
|
+
"pattern": "^(permdock|[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*)$"
|
|
72
|
+
},
|
|
73
|
+
"budget": { "type": "boolean" }
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"authzVersion": { "type": "boolean" },
|
|
78
|
+
"authzVersionBump": {
|
|
79
|
+
"type": "object",
|
|
80
|
+
"required": ["schema", "function", "args"],
|
|
81
|
+
"properties": {
|
|
82
|
+
"schema": { "$ref": "#/$defs/identifier" },
|
|
83
|
+
"function": { "const": "permdock_bump_authz_version_for" },
|
|
84
|
+
"args": { "const": "p_users uuid[]" }
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"memberships": {
|
|
88
|
+
"type": "array",
|
|
89
|
+
"items": { "$ref": "#/$defs/membership" }
|
|
90
|
+
},
|
|
91
|
+
"rls": {
|
|
92
|
+
"type": "object",
|
|
93
|
+
"required": [
|
|
94
|
+
"schema",
|
|
95
|
+
"mode",
|
|
96
|
+
"tenantClaim",
|
|
97
|
+
"scopes",
|
|
98
|
+
"helpers",
|
|
99
|
+
"memberships"
|
|
100
|
+
],
|
|
101
|
+
"properties": {
|
|
102
|
+
"schema": { "$ref": "#/$defs/identifier" },
|
|
103
|
+
"mode": { "enum": ["jwt", "database"] },
|
|
104
|
+
"tenantClaim": { "$ref": "#/$defs/identifier" },
|
|
105
|
+
"scopes": {
|
|
106
|
+
"type": "array",
|
|
107
|
+
"items": {
|
|
108
|
+
"type": "object",
|
|
109
|
+
"required": ["name", "type"],
|
|
110
|
+
"properties": {
|
|
111
|
+
"name": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" },
|
|
112
|
+
"type": { "type": "string" },
|
|
113
|
+
"within": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"helpers": {
|
|
118
|
+
"type": "array",
|
|
119
|
+
"items": {
|
|
120
|
+
"type": "object",
|
|
121
|
+
"required": ["name", "args", "returns", "execute"],
|
|
122
|
+
"properties": {
|
|
123
|
+
"name": { "$ref": "#/$defs/helperName" },
|
|
124
|
+
"args": { "type": "string" },
|
|
125
|
+
"returns": { "type": "string" },
|
|
126
|
+
"execute": {
|
|
127
|
+
"type": "array",
|
|
128
|
+
"items": {
|
|
129
|
+
"enum": ["anon", "authenticated", "supabase_auth_admin"]
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"memberships": {
|
|
136
|
+
"type": "array",
|
|
137
|
+
"items": { "$ref": "#/$defs/membership" }
|
|
138
|
+
},
|
|
139
|
+
"customRoles": { "type": "boolean" },
|
|
140
|
+
"roles": {
|
|
141
|
+
"type": "object",
|
|
142
|
+
"required": ["table", "user", "role"],
|
|
143
|
+
"additionalProperties": false,
|
|
144
|
+
"properties": {
|
|
145
|
+
"table": { "type": "string" },
|
|
146
|
+
"user": { "$ref": "#/$defs/column" },
|
|
147
|
+
"role": {
|
|
148
|
+
"oneOf": [
|
|
149
|
+
{ "$ref": "#/$defs/role" },
|
|
150
|
+
{
|
|
151
|
+
"type": "array",
|
|
152
|
+
"minItems": 2,
|
|
153
|
+
"items": { "$ref": "#/$defs/role" }
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
"suspension": {
|
|
160
|
+
"type": "object",
|
|
161
|
+
"additionalProperties": false,
|
|
162
|
+
"properties": {
|
|
163
|
+
"users": { "$ref": "#/$defs/activeRow" },
|
|
164
|
+
"scopes": {
|
|
165
|
+
"type": "object",
|
|
166
|
+
"additionalProperties": { "$ref": "#/$defs/activeRow" }
|
|
167
|
+
},
|
|
168
|
+
"memberships": {
|
|
169
|
+
"type": "object",
|
|
170
|
+
"required": ["keep"],
|
|
171
|
+
"additionalProperties": false,
|
|
172
|
+
"properties": {
|
|
173
|
+
"keep": {
|
|
174
|
+
"description": "The permission keys a membership whose disabledAt column is set still holds.",
|
|
175
|
+
"type": "array",
|
|
176
|
+
"items": { "type": "string" }
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
"assignments": {
|
|
183
|
+
"type": "object",
|
|
184
|
+
"required": ["tables"],
|
|
185
|
+
"additionalProperties": false,
|
|
186
|
+
"properties": {
|
|
187
|
+
"tables": { "type": "array", "items": { "type": "string" } }
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
"apiKeys": {
|
|
191
|
+
"type": "object",
|
|
192
|
+
"required": ["claim", "scopes", "tenant", "roles", "serviceRoles"],
|
|
193
|
+
"additionalProperties": false,
|
|
194
|
+
"properties": {
|
|
195
|
+
"claim": { "type": "string" },
|
|
196
|
+
"scopes": { "type": "string" },
|
|
197
|
+
"tenant": { "type": "string" },
|
|
198
|
+
"roles": { "type": "string" },
|
|
199
|
+
"serviceRoles": { "type": "array", "items": { "type": "string" } }
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
"decidingColumns": {
|
|
205
|
+
"type": "array",
|
|
206
|
+
"items": {
|
|
207
|
+
"type": "string",
|
|
208
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*$"
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
"markers": {
|
|
212
|
+
"type": "object",
|
|
213
|
+
"required": ["hook", "grants"],
|
|
214
|
+
"properties": {
|
|
215
|
+
"hook": { "const": "v1" },
|
|
216
|
+
"grants": { "const": "v1" }
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
"requires": {
|
|
220
|
+
"description": "The supabase/sdk capability-matrix feature ids the hook, the helpers and subjectFromSupabase depend on, as of the matrix release tag.",
|
|
221
|
+
"type": "object",
|
|
222
|
+
"required": ["matrix", "capabilities"],
|
|
223
|
+
"additionalProperties": false,
|
|
224
|
+
"properties": {
|
|
225
|
+
"matrix": {
|
|
226
|
+
"type": "string",
|
|
227
|
+
"pattern": "^capability-matrix-v1\\.[0-9]+\\.[0-9]+$"
|
|
228
|
+
},
|
|
229
|
+
"capabilities": {
|
|
230
|
+
"type": "array",
|
|
231
|
+
"uniqueItems": true,
|
|
232
|
+
"items": {
|
|
233
|
+
"type": "string",
|
|
234
|
+
"pattern": "^[a-z][a-z0-9_]*\\.[a-z0-9_]+\\.[a-z0-9_]+$"
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
"$defs": {
|
|
241
|
+
"membership": {
|
|
242
|
+
"type": "object",
|
|
243
|
+
"required": ["table", "user", "scope", "id", "role", "columns"],
|
|
244
|
+
"properties": {
|
|
245
|
+
"table": {
|
|
246
|
+
"type": "string",
|
|
247
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*$"
|
|
248
|
+
},
|
|
249
|
+
"user": { "$ref": "#/$defs/user" },
|
|
250
|
+
"scope": { "$ref": "#/$defs/value" },
|
|
251
|
+
"id": { "$ref": "#/$defs/column" },
|
|
252
|
+
"role": {
|
|
253
|
+
"oneOf": [
|
|
254
|
+
{ "$ref": "#/$defs/role" },
|
|
255
|
+
{
|
|
256
|
+
"type": "array",
|
|
257
|
+
"minItems": 2,
|
|
258
|
+
"items": { "$ref": "#/$defs/role" }
|
|
259
|
+
}
|
|
260
|
+
]
|
|
261
|
+
},
|
|
262
|
+
"within": {
|
|
263
|
+
"oneOf": [
|
|
264
|
+
{ "$ref": "#/$defs/column" },
|
|
265
|
+
{
|
|
266
|
+
"type": "object",
|
|
267
|
+
"required": ["columns"],
|
|
268
|
+
"additionalProperties": false,
|
|
269
|
+
"properties": {
|
|
270
|
+
"columns": {
|
|
271
|
+
"type": "object",
|
|
272
|
+
"additionalProperties": { "$ref": "#/$defs/identifier" }
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
]
|
|
277
|
+
},
|
|
278
|
+
"via": { "$ref": "#/$defs/value" },
|
|
279
|
+
"expiresAt": { "$ref": "#/$defs/column" },
|
|
280
|
+
"disabledAt": { "$ref": "#/$defs/column" },
|
|
281
|
+
"columns": {
|
|
282
|
+
"type": "array",
|
|
283
|
+
"items": { "$ref": "#/$defs/identifier" }
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
},
|
|
287
|
+
"identifier": { "type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" },
|
|
288
|
+
"activeRow": {
|
|
289
|
+
"type": "object",
|
|
290
|
+
"required": ["table", "id"],
|
|
291
|
+
"additionalProperties": false,
|
|
292
|
+
"properties": {
|
|
293
|
+
"table": { "type": "string" },
|
|
294
|
+
"id": { "$ref": "#/$defs/identifier" },
|
|
295
|
+
"disabledAt": { "$ref": "#/$defs/identifier" },
|
|
296
|
+
"status": { "$ref": "#/$defs/identifier" },
|
|
297
|
+
"active": { "type": "array", "items": { "type": "string" } },
|
|
298
|
+
"keep": {
|
|
299
|
+
"description": "A scope only: the permission keys members of a suspended instance still hold.",
|
|
300
|
+
"type": "array",
|
|
301
|
+
"items": { "type": "string" }
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
"helperName": {
|
|
306
|
+
"type": "string",
|
|
307
|
+
"pattern": "^(permdock_has(_for)?|permitted_[a-z][a-z0-9_]*_(ids|permission_keys)(_for)?|member_[a-z][a-z0-9_]*_ids(_for)?|permdock_can_assign(_any|_custom_role)?(_for)?|permdock_api_key_allows|permdock_user_id)$"
|
|
308
|
+
},
|
|
309
|
+
"column": {
|
|
310
|
+
"type": "object",
|
|
311
|
+
"required": ["column"],
|
|
312
|
+
"additionalProperties": false,
|
|
313
|
+
"properties": { "column": { "$ref": "#/$defs/identifier" } }
|
|
314
|
+
},
|
|
315
|
+
"role": {
|
|
316
|
+
"oneOf": [{ "$ref": "#/$defs/value" }, { "$ref": "#/$defs/through" }]
|
|
317
|
+
},
|
|
318
|
+
"user": {
|
|
319
|
+
"oneOf": [{ "$ref": "#/$defs/column" }, { "$ref": "#/$defs/through" }]
|
|
320
|
+
},
|
|
321
|
+
"through": {
|
|
322
|
+
"type": "object",
|
|
323
|
+
"required": ["column", "through"],
|
|
324
|
+
"additionalProperties": false,
|
|
325
|
+
"properties": {
|
|
326
|
+
"column": { "$ref": "#/$defs/identifier" },
|
|
327
|
+
"through": {
|
|
328
|
+
"type": "object",
|
|
329
|
+
"required": ["table", "id", "column"],
|
|
330
|
+
"additionalProperties": false,
|
|
331
|
+
"properties": {
|
|
332
|
+
"table": {
|
|
333
|
+
"type": "string",
|
|
334
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*\\.[A-Za-z_][A-Za-z0-9_]*$"
|
|
335
|
+
},
|
|
336
|
+
"id": { "$ref": "#/$defs/identifier" },
|
|
337
|
+
"column": { "$ref": "#/$defs/identifier" }
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
"value": {
|
|
343
|
+
"oneOf": [
|
|
344
|
+
{ "$ref": "#/$defs/column" },
|
|
345
|
+
{
|
|
346
|
+
"type": "object",
|
|
347
|
+
"required": ["value"],
|
|
348
|
+
"additionalProperties": false,
|
|
349
|
+
"properties": {
|
|
350
|
+
"value": {
|
|
351
|
+
"oneOf": [
|
|
352
|
+
{ "type": "string" },
|
|
353
|
+
{ "type": "array", "items": { "type": "string" } }
|
|
354
|
+
]
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
]
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: permdock
|
|
3
|
+
description: Explains how PermDock decides and routes to the right PermDock skill. Use first for any work with permdock, typed permissions, roles or access control in a TypeScript app, when a check is denied and the reason is unclear, when reading a Decision, denial reason or doctor code, when looking up current PermDock identifiers through the docs MCP, or when choosing between the permdock-wire, permdock-audit, permdock-agents, permdock-approvals, permdock-tenancy, permdock-data and permdock-credentials skills.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
author: ScaleDockHQ
|
|
7
|
+
homepage: https://permdock.com/docs/for-ai-agents
|
|
8
|
+
repository: https://github.com/ScaleDockHQ/permdock
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# PermDock
|
|
12
|
+
|
|
13
|
+
PermDock is typed permissions for TypeScript apps, APIs, databases and AI agents. Permissions are defined once, decided in process, compiled to queries and RLS, and serialised to client snapshots ([for AI agents](https://permdock.com/docs/for-ai-agents)). This skill holds the model every other PermDock skill assumes, and says which one to load.
|
|
14
|
+
|
|
15
|
+
## Inputs (find out before starting)
|
|
16
|
+
|
|
17
|
+
- Whether the app already has `permissions.ts`, `policy.ts` and a `createPermDock` factory file. None means start with `permdock-wire`.
|
|
18
|
+
- The task: set up, review, or one area (agents, approvals, tenants, queries and RLS, tokens and keys).
|
|
19
|
+
- Whether the `permdock` binary runs in the repo (`pnpm exec permdock doctor`).
|
|
20
|
+
|
|
21
|
+
## Invariants
|
|
22
|
+
|
|
23
|
+
1. **Fail-closed.** Anything unknown, invalid or thrown denies. `can()` never throws. A `Decision` is only `granted`, `denied` or `approval-required`.
|
|
24
|
+
2. **Deny overrides allow.** Allows OR together; any matching `deny` wins.
|
|
25
|
+
3. **References, not strings.** Pass `permissions.post.update`; strings appear only as `.key` / `.scope` on the wire, in catalogs and in audit.
|
|
26
|
+
4. **Authentication is upstream.** Core never verifies a token. The subject comes from a `subjectFrom*` resolver or the server session, never from a request body, an unsigned header, a CLI flag or model output.
|
|
27
|
+
5. **Server and client stay apart.** `policy.ts` and `createPermDock` never reach a client entry (doctor PD001); clients read snapshots, and a client check is a hint the server repeats.
|
|
28
|
+
6. **Portable first.** Conditions that the in-memory evaluator, `where()` and RLS all understand beat closures.
|
|
29
|
+
7. **The Cloud is optional.** No decision waits on PermDock Cloud; every hosted feature is an interface with an in-process default.
|
|
30
|
+
|
|
31
|
+
## Workflow
|
|
32
|
+
|
|
33
|
+
1. **Pick the skill.** Install the one the task needs with `npx skills add ScaleDockHQ/PermDock --skill <name>` (or all of them with `npx skills add ScaleDockHQ/PermDock`, or `pnpm exec permdock skills install` to match the installed package version):
|
|
34
|
+
|
|
35
|
+
| Task | Skill |
|
|
36
|
+
| ------------------------------------------------------- | ---------------------- |
|
|
37
|
+
| Add PermDock, first guard, limits, plans, CLI checks | `permdock-wire` |
|
|
38
|
+
| Review an app or a pull request | `permdock-audit` |
|
|
39
|
+
| Agent tool calls, actors, delegation, A2A, WebMCP | `permdock-agents` |
|
|
40
|
+
| Human approval, approvers, quorum, resume | `permdock-approvals` |
|
|
41
|
+
| Named scopes, memberships, ownership, custom roles | `permdock-tenancy` |
|
|
42
|
+
| ORM queries, generated RLS, relationship graphs, parity | `permdock-data` |
|
|
43
|
+
| Access tokens, API keys, service accounts, share links | `permdock-credentials` |
|
|
44
|
+
|
|
45
|
+
✓ The skill for the task is loaded, and `permdock-wire` has run first if the app has no factory file.
|
|
46
|
+
|
|
47
|
+
2. **Look identifiers up, never guess them.** Read the owning page through the docs MCP (`https://permdock.com/mcp`, tools `search`, `list_pages` and `get_page`), or append `.md` to any `https://permdock.com/docs/...` URL. Every public name follows the [naming convention](https://permdock.com/docs/getting-started/naming).
|
|
48
|
+
✓ Each identifier written into the app appears on a docs page or in `node_modules/permdock`.
|
|
49
|
+
3. **Read a decision.** `decide()` returns `{ outcome, denials: [{ reason, ... }], alternatives }`. `reason` is one of the closed list on [decisions](https://permdock.com/docs/concepts/decisions); `alternatives` are permissions on the same resource the subject does hold. HTTP adapters answer RFC 9457 Problem Details ([errors](https://permdock.com/docs/concepts/errors)); for the format, defer to the `problem-details` spec skill (`npx skills add ScaleDockHQ/scaledock-skills --skill problem-details`).
|
|
50
|
+
✓ Each denial the user asked about is named by its reason.
|
|
51
|
+
4. **Explain an unexpected denial.** Run `permdock.explain(permission, data)` in a test or a script. `trace.denies[0]` is the deny that won (give denies a `name` so it reads as a rule), `trace.allows` the allows it overrode, `trace.skipped` the grants passed over and why ([explain](https://permdock.com/docs/concepts/decisions#explain)). The trace never reaches the decision log. To preview a plan before acting, `simulate([[permission, data], ...])` returns every decision.
|
|
52
|
+
✓ The cause is a named grant, condition or missing input, not a guess.
|
|
53
|
+
5. **Check the project.** Run `pnpm exec permdock doctor` (`--json` for machine output). Each finding has a stable `PD0xx` code and a one-line fix ([doctor](https://permdock.com/docs/cli/doctor)); the topic skills name the codes for their area.
|
|
54
|
+
✓ `permdock doctor` reports no error.
|
|
55
|
+
|
|
56
|
+
## Verify before done
|
|
57
|
+
|
|
58
|
+
- [ ] No identifier was written from memory; each one is on a docs page or in the package.
|
|
59
|
+
- [ ] Nothing reads a subject, tenant, membership or approval token from model output, a request body or an unsigned header.
|
|
60
|
+
- [ ] `policy.ts` is imported only from server code.
|
|
61
|
+
- [ ] The topic skill used for the task has its Verify list passing.
|
|
62
|
+
|
|
63
|
+
## Reference index
|
|
64
|
+
|
|
65
|
+
- Skills: `permdock-wire`, `permdock-audit`, `permdock-agents`, `permdock-approvals`, `permdock-tenancy`, `permdock-data`, `permdock-credentials`, all from `npx skills add ScaleDockHQ/PermDock --skill <name>`.
|
|
66
|
+
- Docs: [for AI agents](https://permdock.com/docs/for-ai-agents), [naming](https://permdock.com/docs/getting-started/naming), [policies](https://permdock.com/docs/concepts/policies), [decisions](https://permdock.com/docs/concepts/decisions), [threat model](https://permdock.com/docs/security/threat-model), [doctor](https://permdock.com/docs/cli/doctor), `https://permdock.com/llms.txt`.
|