The repeated internal contract every plugin in this submodule workspace should follow.
Every production plugin keeps the same internal structure:
src/
├── main.ts
├── domain/
├── ui/
├── types/
├── utils/
└── shared/
This is the correct level of reuse for the workspace. claude-code-style subsystem sprawl should not be copied into plugins.
| Layer | Owns | Must not do |
|---|---|---|
main.ts |
composition root, registration, lifecycle wiring | business logic |
domain/ |
pure business logic and state transitions | obsidian imports |
ui/ |
Obsidian views, modals, settings, adapters | hidden business policy |
types/ |
shared type surface | runtime behavior |
utils/ |
pure helpers | app state or Obsidian APIs |
shared/ |
deterministic code synced from boiler-template | plugin-specific logic |
- explicit architecture docs
- discoverable entrypoints
- clear subsystem responsibility
- build/release as first-class engineering surfaces
- giant registries for commands/tools/features
- global runtime state patterns
- feature-flag matrices
- a single in-process platform architecture inside each plugin
Cross-plugin reuse must happen by:
- deterministic shared code in
obsidian-boiler-template - generated workflow/lint contracts
- root control-plane metadata
It must not happen by direct plugin-to-plugin imports.
When a plugin starts looking like a platform:
- remove pass-through wrappers
- split oversized files
- keep abstractions feature-local
- only then consider promoting a pattern into the template
Current highest-risk simplification targets:
open-connectionsobsidian-qmdMetadata-Auto-Classifier