feat(plugins): hosted Tabularium registry + connection catalogue (fully BC)#299
feat(plugins): hosted Tabularium registry + connection catalogue (fully BC)#299NewtTheWolf wants to merge 11 commits into
Conversation
tabularium-sdk 0.2 exposes verified/extensions fields used by the registry integration. semver is used for version-aware install classification (install vs update vs already-installed).
…C layer
Integrate the hosted Tabularium registry (registry.tabularis.dev) alongside
the legacy static registry.json, with version-aware deep-link install.
- Merge new HTTP API catalogue with legacy registry.json (union, API wins
on id conflict) so old plugins (duckdb, ...) stay visible.
- Semver-aware install classification: install / update / already-installed.
- Tracked asset downloads via the registry redirect endpoint:
/api/plugins/{slug}/latest for unpinned, /releases/{version} for pinned.
- Host manifest parser migrated to .tabularium (JSON), legacy manifest.json
read as fallback.
All backwards-compat code lives in plugins/compat.rs and is marked with
`COMPAT(registry-ga):` at every call site, so it can be removed mechanically
once all plugins have migrated to the hosted registry.
Redesign the New Connection flow around a searchable driver catalogue that merges built-in drivers with registry plugins. - EngineCard, ConnectionCatalogue (search + paradigm facets + grid), DriverVersionPicker, InstallBanner, InstallGate components. - useConnectionCatalogue hook + connectionCatalogue normalization model. - Catalogue is step 1 of the New Connection wizard; uninstalled drivers are install-gated with inline driver install.
PluginInstallConfirmModal now renders the install action returned by the preview command: Install, Update (when a newer version exists), or an already-installed banner for an up-to-date plugin. - useDeepLinkInstall hook drives the tabularis://install flow. - PluginsTab consumes the registry base URL per plugin for its registry link.
Add registry/catalogue and deepLink (updateConfirm, alreadyInstalled) strings across all 7 locales.
…tion # Conflicts: # tests/setup.ts
- NewConnectionModal: remove unused PluginManifest import. - PluginInstallConfirmModal: key the modal by request in App.tsx so each request remounts with fresh state, replacing the synchronous state reset inside the effect (react-hooks/set-state-in-effect). Loading state now initialises from the keyed mount; the effect only sets state in its async callbacks.
Code Review SummaryStatus: No Issues Found | Recommendation: Merge All 4 previously identified issues have been resolved in commit Resolved Issues
Files Reviewed (4 files)
Reviewed by kimi-k2.6-20260420 · 4,340,194 tokens |
…y version) - commands.rs: only set registry_base_url for a real Tabularium API, not a legacy `.json` base (avoids broken `…/registry.json/plugins/<id>` links). - registry.rs: fetch plugin details concurrently via join_all instead of N sequential round-trips. - useConnectionCatalogue: use hasOwnProperty instead of `in` so plugin ids like "constructor"/"toString" aren't matched against Object.prototype. - PluginInstallConfirmModal: treat empty `?version=` as no pin (|| null) for both the preview fetch and the displayed target version.
…catalogue sort Addresses PR review (debba): - Restore plugins/registry.json instead of deleting it. LEGACY_REGISTRY_URL points at this file on main; deleting it would 404 after merge, silently dropping un-migrated plugins from resolve_registry's merge and breaking already-shipped app versions that use it as their only registry source. Prune only when the whole COMPAT(registry-ga) layer is removed. - Sort engine groups builtins-first then other-last (then alphabetical), so the catalogue leads with the SQL section and pushes the metadata-less 'Other' section to the end instead of opening on a wall of legacy plugins.
…-ready CI - scaffold emits .tabularium (was manifest.json); keep id=slug/name=display so the host identity/display split is preserved - add `migrate [path]` to convert legacy manifest.json plugins to .tabularium; drops a redundant id (id===name), refuses without a semver version - `migrate --ci` regenerates release.yml from the registry-ready template (BIN_NAME from manifest.executable); without --ci the workflow is left as-is, only its manifest.json reference is renamed - release.yml template: stash artifacts + single release job publishing .tabularium as a standalone asset (Tabularium registry resolves the manifest from release assets); assets/ dir support; action version bumps - plugin-api: doc comments reference .tabularium - bump @tabularis/create-plugin 0.1.1 -> 0.2.0
|
@debba small follow-up on this branch (2cbb015) — I aligned
Registry-ready release workflow (template)
Tests: 32 green (8 new for |
|
That's awesome! Thanks @NewtTheWolf ! |
What
Wires up the hosted Tabularium registry (registry.tabularis.dev) and rebuilds
the New Connection flow around a driver catalogue — without breaking the old
registry format.
45 files · +4578 / −523
Backend
registry (union, API wins on id conflict), so old plugins (duckdb, …) stay
visible. (
registry.rs,commands.rs)tabularis://installhandler, version-aware viasemver: Install / Update / already-installed. (
deep_link.rs)(
/latestunpinned,/releases/{version}pinned) so installs get counted.(
tabularium.rs)compat.rs, taggedCOMPAT(registry-ga):at every call site. Legacyregistry.jsoninstall +listing and legacy
manifest.jsonstill work; deletable once all pluginshave migrated.
Frontend
facets, engine cards, version picker, install-gated uninstalled drivers with
inline install. (
ConnectionCatalogue,EngineCard,InstallGate, …)already-installed).
Compatibility
Fully backwards-compatible: the legacy registry format and
manifest.jsonarestill consumed. The in-repo
plugins/registry.jsonseed is replaced bytabularium-extensions.schema.json; the legacy format is read from the hostedsource via the BC layer.
Tests
Backend 688 ✓ · Frontend 2535 ✓