feat: namespace plugin permissions and keep them valid when a plugin is off

This commit is contained in:
LukeGus committed 2026-09-22 17:30:00 -05:00
1 parent 8431570ff7
commit cc15559ea1
53 files changed
+31442 -351

No files matched your search

+34
View File
@@ -26,6 +26,40 @@
"network:serve",
"ui:surface"
],
"contributes": {
"permissions": [
{
"name": "view",
"titleKey": "permissions.view.title",
"descriptionKey": "permissions.view.description",
"defaultRoles": ["user"]
},
{
"name": "create",
"titleKey": "permissions.create.title",
"descriptionKey": "permissions.create.description",
"defaultRoles": ["user"]
},
{
"name": "edit",
"titleKey": "permissions.edit.title",
"descriptionKey": "permissions.edit.description",
"defaultRoles": ["user"]
},
{
"name": "delete",
"titleKey": "permissions.delete.title",
"descriptionKey": "permissions.delete.description",
"defaultRoles": ["user"]
},
{
"name": "run",
"titleKey": "permissions.run.title",
"descriptionKey": "permissions.run.description",
"defaultRoles": ["user"]
}
]
},
"locales": "locales",
"platforms": ["linux", "win32", "darwin"]
}
@@ -0,0 +1,60 @@
import { describe, it, expect } from "vitest";
import fs from "node:fs";
import path from "node:path";
import { parseManifest, qualifyPermission } from "@termix/plugin-sdk/manifest";
/**
* The permission ids an admin grants.
*
* Core registers each declared name as `<pluginId>.<name>`, so these strings
* are what end up stored in a role. They have to keep matching what automations
* shipped before the permissions moved out of the core catalog, or every role
* holding one would silently stop working.
*/
const EXPECTED = [
"automations.view",
"automations.create",
"automations.edit",
"automations.delete",
"automations.run",
];
describe("automations permissions", () => {
const manifest = parseManifest(
JSON.parse(
fs.readFileSync(
path.resolve(import.meta.dirname, "../../manifest.json"),
"utf8",
),
),
);
it("parses cleanly", () => {
expect(manifest.errors).toEqual([]);
});
it("registers exactly the ids roles already hold", () => {
const ids = (manifest.manifest?.contributes?.permissions ?? []).map(
(permission) => qualifyPermission("automations", permission.name),
);
expect(ids).toEqual(EXPECTED);
});
it("declares a title and description for every permission", () => {
for (const permission of manifest.manifest?.contributes?.permissions ??
[]) {
expect(permission.titleKey).toBeTruthy();
expect(permission.descriptionKey).toBeTruthy();
}
});
// Core used to grant these through SYSTEM_ROLE_DEFAULTS, so a fresh install
// has to keep giving them to the user role.
it("keeps the fresh-install defaults core used to seed", () => {
for (const permission of manifest.manifest?.contributes?.permissions ??
[]) {
expect(permission.defaultRoles).toEqual(["user"]);
}
});
});