Per the rule for a new plugin: the public gitea repository and its infrastructure come first, so there is somewhere for the work to land rather than a directory that becomes a repository later. What is here is the shape and the two decisions it deliberately does not make — where the container runs, and whether Officer's agents call OpenSEO's /mcp directly or Officer wraps it as native tools. Both are the owner's, both are recorded in the todo this came from, and the scaffold keeps both open by proxying. Everything in the README was verified against upstream's compose.yaml and its own skills rather than its marketing: one container, port 3001 on loopback, SQLite in a volume, AUTH_MODE=local_noauth, and DATAFORSEO_API_KEY as base64 of login:password.
31 lines
1.4 KiB
TypeScript
31 lines
1.4 KiB
TypeScript
import type { PluginManifest } from '@@/plugins/manifest';
|
|
|
|
/**
|
|
* OpenSEO — self-hosted SEO research, behind Officer's permission gate.
|
|
*
|
|
* ── It points at an instance; it does not own one ──
|
|
*
|
|
* OpenSEO is a container, and a plugin has no primitive for "bring a container": `osDependencies`
|
|
* installs OS packages. So this follows the shape `jellyfin`, `gitea` and `proxy-manager` already use —
|
|
* a stored connection to a service running somewhere, with the credential write-only across the
|
|
* boundary.
|
|
*
|
|
* That is a decision to revisit rather than a permanent one. `todo/infra/opm-officer-s-own-process-manager`
|
|
* is heading toward the Docker network, and on the day a plugin can declare a container the connection
|
|
* becomes something this plugin provisions instead of something somebody types.
|
|
*
|
|
* ── Why the mount matters more here than usual ──
|
|
*
|
|
* Upstream self-hosting runs `AUTH_MODE=local_noauth` by design, and their docs say to expose it only
|
|
* behind auth. Everything this plugin serves is therefore gated by Officer, and the pass-through below
|
|
* is the only door. Nothing here may publish OpenSEO's own port.
|
|
*/
|
|
export const manifest: PluginManifest = {
|
|
name: 'OpenSEO',
|
|
description: 'Keyword research, rank tracking, competitors, backlinks and site audits — self-hosted.',
|
|
mountPrefix: '/openseo',
|
|
version: '0.1.0',
|
|
};
|
|
|
|
export default manifest;
|