Build ProGit plugins against SDK API 0.3: LuaJIT by default, JSON across the host boundary, manifest-declared capabilities, and optional host bridges like sober.run(action, opts). Publish to plugins.progit.dev when the package is ready.
The runtime loads Lua, but ProGit only sees JSON events and declared capabilities.
LuaJIT behind a runtime-agnostic plugin trait
plugin table()init()()plugin.on_event() A .progit-plugin.json declares identity, hooks, runtime, SDK API, and capabilities
sdk_version()capabilities()hooks() Narrow bridges are deny-by-default and only exposed when the manifest asks for them
storage()http()sober.run() Structured JSON events cross the plugin boundary and keep Lua/WASM swappable
IssueUpdated()PipelineStatusQuery()Custom() Plugins can contribute syntax highlights and experimental diff / fragment renderers
highlight()DiffRenderer()FragmentRenderer() Registry installs use manifest metadata, source paths, trust policy, and package verification
install()verify()search() ProGit plugins are Lua packages with a manifest, not shell scripts with blind power. Declare the runtime, hooks, events, SDK API, and capabilities. The host decides what bridges exist. Once published, your plugin shows up on plugins.progit.dev and installs with a single command.
Implement hooks or plugin.on_event. Keep behavior behind JSON so Lua and future WASM stay interchangeable.
A .progit-plugin.json pins SDK compatibility and gates network, storage, env, and Sober access.
Registry metadata points at source URL, source path, SDK range, runtime, license, and checksum or signature material.
Merged -> listed on plugins.progit.dev -> prog plugin install your-name works for everyone.