Alex Dunmow b6d40ed8ac feat: bootstrap block/pluginsdk — the proto-first plugin SDK (P1)
Bootstrap the plugin-facing SDK module so the fleet migration (P2) becomes a
mechanical block/core/X -> block/pluginsdk/X import rewrite.

- abi/proto/v1: the single source-of-truth ABI proto tree, copied from the cms
  authoring source (cms/backend/abi/proto/v1) with go_package retargeted to
  git.dev.alexdunmow.com/block/pluginsdk/abi/v1;abiv1. Kills the hand-kept
  cms/core proto duplication (audit gap 4).
- abi/v1: generated Go bindings (buf generate); byte-identical to core's abi/v1
  save the embedded go_package path.
- plugin/ (registration + DI surface), plugin/wasmguest/** (transport shim,
  caps stubs, bnwasm db driver, testdata fixtures + golden .pb), and the
  guest-facing type packages: blocks (+builtin/shared/tags), templates
  (+pongo/bn), auth, settings, content, gating, crypto, rbac, video, ai,
  subscriptions, menus, datasources. Internal imports rewritten core ->
  pluginsdk; zero block/core references remain.
- README/AGENTS(+CLAUDE symlink)/Makefile: proto is the contract, Go is one
  binding; no replace directives; templates/bn is a synced copy authored in cms.

Spec: cms docs/superpowers/specs/2026-07-07-proto-first-plugin-sdk-design.md

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 10:51:00 +08:00

47 lines
1.9 KiB
Go

// Package wasmguest is the guest half of the BlockNinja wasm plugin ABI:
// the go:wasmexport entry points (bn_alloc / bn_invoke / bn_free), guest
// memory pinning, the generic host-call import, and the dispatch table that
// adapts an unmodified plugin.PluginRegistration to ABI hook calls.
//
// The wire contract lives in core/docs/wasm-abi.md; the messages in
// git.dev.alexdunmow.com/block/pluginsdk/abi/v1.
//
// # Plugin boilerplate
//
// A plugin becomes a wasm plugin by adding one main file next to its
// Registration:
//
// //go:build wasip1
//
// package main
//
// import "git.dev.alexdunmow.com/block/pluginsdk/plugin/wasmguest"
//
// func init() { wasmguest.Serve(Registration) }
// func main() {} // never called — reactor mode
//
// and compiling in REACTOR mode (Go >= 1.24 toolchain; this repo's floor is
// higher):
//
// GOOS=wasip1 GOARCH=wasm go build -buildmode=c-shared -o plugin.wasm .
//
// Reactor modules export `_initialize` instead of `_start`: the host runs
// `_initialize` once per instance — which runs the init func above, hence
// Serve — before any bn_invoke. Serve is non-blocking: it stores the
// registration, runs the Register pass against capture registries, and
// returns; all work then arrives through bn_invoke.
//
// Command mode (plain `go build`) does NOT work and must not be used: its
// `_start` runs main synchronously, so a blocking main deadlocks the Go
// runtime ("all goroutines are asleep") and a returning main exits and
// closes the module — either way the exports are never callable
// (empirically verified against wazero v1.12.0; see wasm-abi.md).
//
// # Build shape
//
// Dispatch, describe, capture-registry, and context-reconstruction logic is
// plain Go and builds on every GOOS so it stays natively testable. Only
// exports.go (go:wasmexport, memory pinning) and hostcalls.go
// (go:wasmimport blockninja host_call) carry the wasip1 build tag.
package wasmguest