Add plugin host architecture and Storm Sewer add-on package

Generic plugin runtime (src/plugin/, HostSession, per-tab plugin_state, command router). QGIS-style add-on layout with plugin.toml and single PluginRegistration. Storm Sewer refactored as reference consumer with dispatch.rs, catchments, LandXML, headless tests (43 passing). Core update.rs decoupled from storm_sewer via CadCommand object-pick hooks. Docs: plugin-architecture.md, plugin-template, PR and issue-78 reply drafts.
This commit is contained in:
Michael Flynn 2026-06-09 13:41:21 -04:00
commit e46701456f
66 changed files with 4538 additions and 141 deletions

View file

@ -7,6 +7,7 @@
// Rules for a directory to be picked up:
// • Located directly in src/modules/
// • Contains a mod.rs file
// • Does NOT contain plugin.toml (add-ons register via BuiltinPlugin::ribbon)
// • Defines a pub struct {PascalCase}Module implementing CadModule
// (unit struct — no ::new() needed)
//
@ -38,7 +39,8 @@ fn main() {
}
let name = entry.file_name().into_string().ok()?;
let mod_file = mods_dir.join(&name).join("mod.rs");
if mod_file.exists() {
let plugin_toml = mods_dir.join(&name).join("plugin.toml");
if mod_file.exists() && !plugin_toml.exists() {
Some(name)
} else {
None