Build & Deploy
Toolchain 2 builds every plugin from a standard layout. The legacy per-plugin build-config file and arbitrary build command arrays have been removed.
Project and package layouts
A source plugin contains manifest.json, a UI at ui-src/package.json (or prebuilt ui/), and an optional Worker at worker/pom.xml or root pom.xml. A packaged .fyp contains only:
manifest.json
ui/
index.html
backend/
worker.jarUI commands come from the project's standard scripts dev, optional test, and build — npm for scaffolded projects, Yarn 4 (pinned via packageManager) for the in-repo official plugins. Worker commands are Maven test and package, run through the nearest Maven Wrapper. A Worker build must produce exactly one target/*-worker.jar.
Lifecycle
fengyu check .
fengyu build .build installs UI dependencies when needed, runs tests unless --skip-tests is set, builds the UI and Worker, stages runtime-only files, validates the manifest/UI/JAR, and atomically writes:
dist/<plugin-id>-<version>.fyp
dist/<plugin-id>-<version>.fyp.sha256Use --out <file> to select another archive path. A failed build removes temporary staging and archive files.
External Java plugins resolve the independently versioned Worker SDK through the generated .mvn/settings.xml. Set FENGYU_GITHUB_TOKEN or GITHUB_TOKEN with read:packages; credentials are passed through the environment and never written into the project.
Official plugins
node toolchain/cli/bin/fengyu.mjs build OfficialPlugins/plugin-markdown
node toolchain/cli/bin/fengyu.mjs build OfficialPlugins/plugin-excel
node toolchain/cli/bin/fengyu.mjs build OfficialPlugins/plugin-email
node toolchain/cli/bin/fengyu.mjs build OfficialPlugins/plugin-offlinepythonInstall a resulting .fyp through the host marketplace UI or POST /api/plugin-market/upload. The host validates archive limits, paths, manifest, UI entry, and Worker structure before registering it.