Files
example/manifest.ts
T
pastilhasandClaude Opus 5 9460f01c97 the frontend convention is panels.ts and layout.ts, not Router.tsx
The reference plugin named web/Router.tsx as the way to ship a frontend. Discovery checks for
web/panels.ts and web/layout.ts by those exact names and refuses a web/ directory missing either — so
anyone following the example would have written a plugin the platform rejects.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 03:39:01 +00:00

37 lines
1.5 KiB
TypeScript

import type { PluginManifest } from '@@/plugins/manifest';
// The reference plugin. Not a fixture — this is what a plugin author reads first, and it is deliberately
// the smallest thing that is still a real one: a manifest and one route.
//
// Everything structural is convention, so this directory IS the documentation:
//
// manifest.ts you are here — only what a directory listing cannot say
// api/router.ts exports `router`; mounted at /api/example
// db/schema.ts tables, if it had any (every name prefixed `example_`)
// sidecar/index.ts a process, if it needed one (.mjs instead means node)
// web/panels.ts panels, if it had a frontend — REQUIRED with web/, and checked by name
// web/layout.ts how they are arranged — also required with web/
//
// `appName` is not declared anywhere: it is the directory name, so the id cannot disagree with where the
// code sits.
export const manifest: PluginManifest = {
publisher: 'officerdev',
version: '1.0.0',
platform: '>=1.0.0',
label: 'Example',
summary: 'The reference plugin — one route, nothing else',
icon: 'Puzzle',
color: '#94a3b8',
// One permission gating the whole surface. `ownerOnly: false` means a role can be granted it — which is
// the interesting case, because it is the one the permission gate actually has to resolve.
permissions: [
{
key: 'example',
label: 'Example',
description: 'The reference plugin',
},
],
};