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.

plugin.tstak, jak ji zapíše bun forge new
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í.
handlers.tsjedna funkce na operaci
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í.

Vývojové prostředí pluginu bun forge dev s přepínači obrazovky, oprávnění, režimu a jazyka
Vývojové prostředí: obrazovka pluginu s přepínači obrazovky, oprávnění, režimu jen pro čtení, vzhledu a jazyka.

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.
state
schema je schéma zod jediného dokumentu se stavem pluginu, maxBytes jeho 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 --check jen 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.