feat(plugins): hosted Tabularium registry + connection catalogue (fully BC)#299
feat(plugins): hosted Tabularium registry + connection catalogue (fully BC)#299NewtTheWolf wants to merge 14 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)
Previous Review Summary (commit 2cbb015)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 2cbb015)Status: No Issues Found | Recommendation: Merge All 4 previously identified issues have been resolved in commit Resolved Issues
Files Reviewed (4 files)
Reviewed by nemotron-3-ultra-550b-a55b-20260604:free · Input: 168.2K · Output: 2.5K · Cached: 2.2K |
…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 ! |
The published dist called copyTemplate('ui-extension-locales', ...) but that
template dir never existed, so --with-ui crashed; source had dropped the call,
so no locales were emitted at all. Restore the feature properly:
- add templates/ui-extension-locales/locales/en.json.tmpl (plugin-root locales)
- scaffold copies it under --with-ui
- ui template uses usePluginTranslation instead of a hardcoded string
- smoke asserts locales/en.json exists for --with-ui
…tion # Conflicts: # src/components/modals/NewConnectionModal.tsx
…iver support Surface registry engine/paradigms on manifests so locally-installed (not yet published) plugin drivers appear in the connection picker instead of loading invisibly. Add single_database capability to skip the database tab/field for flat stores (e.g. Meilisearch).
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 ✓