mirror of
https://github.com/storytold/figcraft.git
synced 2026-10-13 23:17:43 +00:00
Sandboxed WebAssembly plugins whose API is the command registry: - figcraft-plugin (new crate, L2): the figcraft-plugin.json manifest (menu commands with parameters, read/write access, command allowlist) and the sandbox: wasmi (pure Rust, no JIT, also in the web build) with fuel metering, a memory cap, no WASI and seven host functions (call, selection, reply_len, reply_read, log, notify, set_output). - Engine: plugin.list / plugin.import / plugin.remove / plugin.run, plugins.runLast (Alt+Cmd+P; Ctrl+Alt+Shift+P on Windows/Linux) and plugins.manage. A run is one undo step (Session::grouped, which command.batch now uses too) and is rolled back when it fails. Files, other documents, the undo history, dialogs and plugins are off limits; read-only plugins can't change the document. Installed plugins live in the preferences; development plugins re-read their module every run. - UI: installed plugins in the Plugins menu, a parameters form drawn from the manifest, Manage plugins, Plugins > Development > Import plugin from manifest. - plugins/: a no_std Rust SDK and two example plugins (Tidy names, Swatch grid), built for wasm32 by `cargo xtask plugins` (part of `cargo xtask wasm`). - Docs: docs/plugins.md (manifest, permissions, limits, ABI, SDK), docs/mcp.md, docs/control-protocol.md, README, ROADMAP, parity. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
34 lines
945 B
TOML
34 lines
945 B
TOML
# FigCraft plugins written in Rust: the SDK and example plugins. A workspace of its own (not part of
|
|
# the app's): it builds for wasm32-unknown-unknown with `cargo xtask plugins` (from the repository
|
|
# root), which puts each example's .wasm next to its figcraft-plugin.json under target/plugins/.
|
|
[workspace]
|
|
resolver = "3"
|
|
members = ["sdk", "examples/*"]
|
|
|
|
[workspace.package]
|
|
version = "0.1.0"
|
|
edition = "2024"
|
|
license = "MIT OR Apache-2.0"
|
|
rust-version = "1.95"
|
|
repository = "https://github.com/storytold/figcraft"
|
|
|
|
[workspace.dependencies]
|
|
figcraft-plugin-sdk = { path = "sdk" }
|
|
serde_json = { version = "1", default-features = false, features = ["alloc"] }
|
|
|
|
[workspace.lints.clippy]
|
|
unwrap_used = "deny"
|
|
expect_used = "deny"
|
|
panic = "deny"
|
|
todo = "deny"
|
|
unimplemented = "deny"
|
|
unreachable = "deny"
|
|
|
|
# Small modules: a plugin is loaded on every run.
|
|
[profile.release]
|
|
opt-level = "z"
|
|
lto = true
|
|
codegen-units = 1
|
|
panic = "abort"
|
|
strip = true
|