Vývojáři
Vy napíšete plugin. O zbytek se postará platforma.
Plugin je malý projekt v TypeScriptu: jedna deklarace, server v Bunu a obrazovky v Reactu. Platforma podepisuje každé volání, uchovává stav a obrazovky zobrazí přímo v Portálu.
Plugin jedním příkazem.
Příkaz bun forge new <name> vytvoří typovanou deklaraci, server v Bunu a TypeScriptu, obrazovky v Reactu 19 a Tailwindu 4, testovací data a test v Playwrightu. CI při každé změně ověřuje, že se čerstvě vytvořený plugin sestaví, projde testy a zabalí do image.
import { definePlugin } from '@forge-plugins/server/define';
import { z } from 'zod';
export const plugin = definePlugin({
name: 'notes',
version: '0.1.0',
displayName: { cs: 'Poznámky', en: 'Notes' },
screens: { main: { title: { cs: 'Poznámky', en: 'Notes' } } },
state: {
schema: z.looseObject({ note: z.string().max(2000).optional() }),
maxBytes: 16_384,
},
ops: {
saveNote: {
privileges: ['TASKS'],
task: true,
effects: true,
timeoutMs: 5_000,
input: z.object({ note: z.string().max(2000) }),
},
},
});Co příkaz vytvoří
plugin.ts- Deklarace: obrazovky, stav, datové sady a operace.
fixtures.ts- Syntetický úkol, ze kterého vychází vývojové prostředí i test.
server/src/handlers.ts- Právě jedna obslužná funkce pro každou operaci.
web/src/screens/main.tsx- Obrazovka postavená na sadě UI komponent pro pluginy.
web/e2e/<name>.spec.ts- Test v Playwrightu, který běží proti vývojovému prostředí.
import type { Handlers } from '@forge-plugins/server';
import type { plugin } from '../../plugin';
export const handlers = {
saveNote: (input, ctx) => ({
state: { ...ctx.state, note: input.note },
}),
} satisfies Handlers<typeof plugin>;Operace s efektem je čistá funkce: vrátí nový stav a platforma ho zapíše.
Jednou deklarovat, všude typované.
Jeden plugin.ts se schématy zod typuje obslužné funkce na serveru i volání call() a stream() v obrazovkách. Když změníte schéma, kompilátor ukáže každé místo, které ho musí následovat.
Typy od začátku do konce
Obslužné funkce dostanou typovaný vstup a kontext podle příznaků operace. Obrazovky dostanou typovaný stav a typované volání každé operace.
Manifest se generuje
bun forge render zapíše manifest.json i registr platformy z plugin.ts. Manifest nikdo nepíše ručně.
Nesoulad neprojde
bun forge doctor selže, když manifest nebo registr neodpovídá deklaraci, když operaci chybí obslužná funkce nebo když sestavené obrazovky přerostou svůj limit.
Vývoj bez spuštěné platformy.
bun forge dev <name> spustí sestavování obrazovek se sledováním změn, skutečný server pluginu a vývojové prostředí, které odpovídá jako platforma: podepsaná volání, zápis stavu přes compare-and-set a obrazovka zobrazená přesně tak, jak ji zobrazuje Portál.
V liště prostředí přepnete obrazovku, oprávnění uživatele, režim jen pro čtení, vzhled i jazyk. Test v Playwrightu běží proti stejnému prostředí.

Deklarace pole po poli.
Co plugin.ts deklaruje a platforma vynucuje. Vygenerovaný manifest se kontroluje proti verzovanému kontraktu dřív, než ho platforma přijme.
name- Malá písmena a pomlčky, nejvýše 40 znaků. Stává se adresou pluginu v platformě.
version- Sémantická verze pluginu.
displayName- Název, který vidí uživatelé, česky a anglicky.
screens- Každá obrazovka, kterou návrhář procesu může přiřadit formuláři úkolu, s názvem v obou jazycích. Název elementu se odvodí, nedeklaruje se.
stateschemaje schéma zod jediného dokumentu se stavem pluginu,maxBytesjeho limit velikosti, nejvýše 1 MiB. Platforma podle obou kontroluje každý zápis.datasets- Datové sady, které operace smějí číst. Přicházejí s voláním a čtou se s oprávněními uživatele.
ops- Operace, které platforma za plugin zpřístupní. Každá deklaruje:
privileges- Alespoň jedno; uživatel musí mít jedno z nich.
task- Operace běží nad jedním úkolem.
context- Co volání nese: stav, data formuláře jen pro čtení, datové sady.
effects- Stav z odpovědi nahradí stav pluginu a zapíše se přes compare-and-set.
stream- Odpověď se streamuje jako server-sent events.
timeoutMs- Časový limit jednoho pokusu.
input / output- Schémata zod pro vstup a výstup. Typují obslužnou funkci i volání z obrazovky.
Příkazy bun forge.
bun forge new <name>- Vytvoří typovaný plugin a zaregistruje ho: deklaraci, server, obrazovky, testovací data a test v Playwrightu.
bun forge render- Zapíše manifest a registr z
plugin.ts. S přepínačem--checkjen porovná, pro CI. bun forge dev <name>- Spustí plugin ve vývojovém prostředí, zobrazený přesně jako v Portálu, a po každém uložení ho znovu sestaví.
bun forge doctor- Jediná kontrola, kterou spouští CI: vygenerované soubory sedí, každý server nastartuje s jednou obslužnou funkcí na operaci a sestavené obrazovky dodrží svůj limit i pravidla pro CSS.
Řekněte nám proces, který vás stojí peníze.
Přineste na ukázku jeden skutečný proces. Popíšeme ho společně Studiu a uvidíte, jak vzniká na funkční platformě, ne na slidech.