name: new-plugin
description: Scaffold a new Neovate Desktop plugin across main, shared, and renderer
disable-model-invocation: true
argument-hint: " (e.g. bookmarks, snippets)"
Scaffold New Plugin
Create the boilerplate for a new Neovate Desktop plugin across all three processes. All paths are relative to packages/desktop/.
Steps
Create shared contract at
src/shared/plugins/<name>/contract.ts:import { oc } from "@orpc/contract"; export const <name>Contract = { // Define oRPC contract methods here };Register contract in
src/shared/contract.ts:- Add import:
import { <name>Contract } from "./plugins/<name>/contract"; - Add to the
contractobject:<name>: <name>Contract,
- Add import:
Create main plugin at
src/main/plugins/<name>/index.ts:import type { MainPlugin, PluginContext } from "../../core/plugin/types"; import { create<Name>Router } from "./router"; export default { name: "<name>", async configContributions(ctx: PluginContext) { return { router: create<Name>Router(ctx.orpcServer), }; }, } satisfies MainPlugin;Create main router at
src/main/plugins/<name>/router.ts:import type { os } from "@orpc/server"; export function create<Name>Router(orpcServer: typeof os) { return { // Implement contract handlers here }; }Register plugin in
src/main/index.ts:- Add import:
import <name>Plugin from "./plugins/<name>"; - Add
<name>Pluginto thepluginsarray in theMainAppconstructor
- Add import:
Create renderer directory at
src/renderer/src/plugins/<name>/with an initial component if needed.Run
bun checkto verify everything compiles.
Reference
See src/main/plugins/terminal/index.ts for the simplest working example (22 lines).