marketplace: minesweeper in the catalogue

Without an entry the plugin is invisible to every server but this one — the
catalogue is what a remote host reads, and the bundled constant is only the
fallback when marketplace.officer.dev cannot be reached.

Its git remote was the tailnet address, which marketplace-sync would have
published verbatim: a clone URL that works on this network and nowhere else,
failing at authentication in a way that reads as a broken plugin rather than a
wrong catalogue. Repointed at gitea.officer.dev, which is the rule the sync
script's own comment already spells out.

Synced. 18/18, and the entry is live with the right source, permissions and six
osDependencies; the repo answers an anonymous https clone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Officer-Session: 656f5c85-e49a-4f1f-b9f3-042a04b4d043
This commit is contained in:
2026-08-23 18:07:50 +00:00
co-authored by Claude Opus 5
parent 1ff271bb5e
commit 6e092c32ea
10 changed files with 196 additions and 115 deletions
-7
View File
@@ -75,13 +75,6 @@ rolesRouter.patch('/:name', async (ctx) => {
throw errors.BAD_REQUEST('a role name cannot be empty');
case 'duplicate':
throw errors.CONFLICT(`a role named '${body.name.trim()}' already exists`);
case 'in-use':
// Refused while held, because there is no ON UPDATE CASCADE yet — see `renameRole`. The count is
// in the message because 'in use' without a number is something nobody can act on.
throw errors.CONFLICT(
`'${from}' is held by ${result.holderCount ?? 'some'} account(s) — renaming it would leave them ` +
'pointing at a role that no longer exists',
);
}
}
return ctx.json({ role: result.role });