Migrate remaining installable first-party plugins to the official registry #185

Closed
opened 2026-05-31 22:17:39 +00:00 by steve · 0 comments
Owner

Problem

Full Registry V1 can install the Docs pilot, but the registry repository and
app-side distribution contract have drifted: the app verifies inline metadata
signatures while the registry currently publishes sidecar signatures, the
default registry host is inconsistent, and the remaining optional first-party
plugins are still bundled instead of installable through the official registry.

Goal

Make PDF, Slides, Canvas, Graph, Notebook, and Telemetry official installable
plugins using the same verified registry path as Docs. Keep Bases bundled for
this phase.

Scope

  • Align registry metadata signing with the app by using inline signatures on
    generated index, detail, and revocation JSON while preserving sidecars as
    optional audit artifacts.
  • Embed app-compatible official registry and release public keys in
    @lapis-notes/api.
  • Standardize the official registry host on https://registry.lapis.md.
  • Migrate plugin IDs and data aliases:
    • pdf -> lapis-pdf
    • slides -> lapis-slides
    • canvas -> lapis-canvas
    • graph -> lapis-graph
    • notebook -> lapis-notebook
    • telemetry -> lapis-telemetry
  • Keep Bases bundled and non-installable through the registry in this batch.
  • Add app-side registry integration coverage that verifies local generated
    registry metadata and dry-installs at least one non-Docs plugin artifact.

Non-goals

  • Moving Bases out of the bundled workspace bootstrap.
  • Moving Markdown, Markdown Lint, Notifications, Search, Tasks, CSV, Fmode,
    History, file explorer, tags, word count, language-code support, or app/settings
    shell out of the bundle.
  • Adding arbitrary user-defined registry sources.
  • Implementing production secret management beyond the existing registry and
    release signing roles.

Acceptance Criteria

  • The app can refresh and verify the official registry from
    https://registry.lapis.md/v1/index.json using embedded trusted keys.
  • Registry metadata generated by lapis-plugin-registry verifies through the
    same inline signature path the app uses.
  • PDF, Slides, Canvas, Graph, Notebook, and Telemetry manifests use lapis-*
    IDs, ship standalone plugin artifacts, and have old-ID plugin data alias
    migrations.
  • The migrated plugins are removed from workspaceCorePlugins only after their
    verified install path works.
  • Canvas, Graph, PDF, Slides, and Telemetry are no longer imported, CSS-scanned,
    or dependency-bundled by the workspace app after they are active official
    registry entries.
  • Installed official records with provenance: "official" load from
    /.obsidian/plugins/<id> but are classified and displayed as external core
    plugins rather than community plugins.
  • Safe Mode treats installed official plugins like optional core plugins:
    optional-core Safe Mode disables them, while community-plugin Safe Mode does
    not.
  • Workspace and e2e fixtures install official plugins explicitly from local
    generated registry metadata and release artifacts when feature tests require
    those plugins.
  • lapis-bases is not promoted to an active installable registry entry.
  • Specs and package-local spec.md files reflect the new installable/bundled
    ownership split.

Implementation Notes

  • Prefer a single coordinated batch so registry contract, embedded keys, and
    package IDs do not temporarily disagree.
  • Use Docs as the reference implementation for standalone style artifacts and
    registry-installed plugin behavior.
  • Preserve user data keyed by old bundled plugin IDs by copying to the new ID
    when the target has no data yet.
  • If production asset upload is not available locally, generate deterministic
    signed local release artifacts and leave the registry entries pending until
    immutable HTTPS assets are published.
  • For this implementation pass the active official registry is authoritative:
    lapis-canvas, lapis-graph, lapis-notebook, lapis-pdf, lapis-slides,
    and lapis-telemetry are treated as external official plugins.
  • Keep bundled-only plugins in workspaceCorePlugins: Markdown, CSV, Fmode,
    History, File Explorer, Tags, Notifications, Search, Tasks, Bases, Word Count,
    Lang Code, and AppPlugin.
  • Keep enable/disable persistence compatible with the current external plugin
    enablement file; do not introduce a new enablement file for this cleanup.
  • Update plugin list/detail data with provenance so bundled, official, manual,
    and community plugin rows remain distinguishable in settings surfaces.
  • Coordinate with #190 so Markdown Lint leaves the bundled system-extension
    list in the same cleanup once its lapis-markdown-lint plugin wrapper is in
    place.

Suggested Files or Specs To Inspect

  • spec/src/50-roadmap/full-registry-v1.md
  • spec/src/30-cross-package-contracts/plugin-registry.md
  • packages/workspace/src/lib/components/app/bootstrap.ts
  • packages/api/src/lib/plugin-distribution/
  • /Users/stevejuma/code/lapis-plugin-registry

Validation Commands

  • pnpm --filter @lapis-notes/api check:all
  • pnpm --filter @lapis-notes/workspace check:all
  • Per migrated plugin package check:all
  • pnpm check:all
  • pnpm test:smoke
  • make spec-lint
  • mdbook build spec
  • In lapis-plugin-registry: pnpm check and pnpm registry:validate:remote

Follow-up Tasks

Implementation Summary

Removed active official first-party plugins from workspace bootstrap, classified installed official plugins as external core plugins, updated fixtures/specs/tests, and preserved external enablement compatibility.

## Problem Full Registry V1 can install the Docs pilot, but the registry repository and app-side distribution contract have drifted: the app verifies inline metadata signatures while the registry currently publishes sidecar signatures, the default registry host is inconsistent, and the remaining optional first-party plugins are still bundled instead of installable through the official registry. ## Goal Make PDF, Slides, Canvas, Graph, Notebook, and Telemetry official installable plugins using the same verified registry path as Docs. Keep Bases bundled for this phase. ## Scope - Align registry metadata signing with the app by using inline `signatures` on generated index, detail, and revocation JSON while preserving sidecars as optional audit artifacts. - Embed app-compatible official registry and release public keys in `@lapis-notes/api`. - Standardize the official registry host on `https://registry.lapis.md`. - Migrate plugin IDs and data aliases: - `pdf` -> `lapis-pdf` - `slides` -> `lapis-slides` - `canvas` -> `lapis-canvas` - `graph` -> `lapis-graph` - `notebook` -> `lapis-notebook` - `telemetry` -> `lapis-telemetry` - Keep Bases bundled and non-installable through the registry in this batch. - Add app-side registry integration coverage that verifies local generated registry metadata and dry-installs at least one non-Docs plugin artifact. ## Non-goals - Moving Bases out of the bundled workspace bootstrap. - Moving Markdown, Markdown Lint, Notifications, Search, Tasks, CSV, Fmode, History, file explorer, tags, word count, language-code support, or app/settings shell out of the bundle. - Adding arbitrary user-defined registry sources. - Implementing production secret management beyond the existing registry and release signing roles. ## Acceptance Criteria - The app can refresh and verify the official registry from `https://registry.lapis.md/v1/index.json` using embedded trusted keys. - Registry metadata generated by `lapis-plugin-registry` verifies through the same inline signature path the app uses. - PDF, Slides, Canvas, Graph, Notebook, and Telemetry manifests use `lapis-*` IDs, ship standalone plugin artifacts, and have old-ID plugin data alias migrations. - The migrated plugins are removed from `workspaceCorePlugins` only after their verified install path works. - Canvas, Graph, PDF, Slides, and Telemetry are no longer imported, CSS-scanned, or dependency-bundled by the workspace app after they are active official registry entries. - Installed official records with `provenance: "official"` load from `/.obsidian/plugins/<id>` but are classified and displayed as external core plugins rather than community plugins. - Safe Mode treats installed official plugins like optional core plugins: optional-core Safe Mode disables them, while community-plugin Safe Mode does not. - Workspace and e2e fixtures install official plugins explicitly from local generated registry metadata and release artifacts when feature tests require those plugins. - `lapis-bases` is not promoted to an active installable registry entry. - Specs and package-local `spec.md` files reflect the new installable/bundled ownership split. ## Implementation Notes - Prefer a single coordinated batch so registry contract, embedded keys, and package IDs do not temporarily disagree. - Use Docs as the reference implementation for standalone style artifacts and registry-installed plugin behavior. - Preserve user data keyed by old bundled plugin IDs by copying to the new ID when the target has no data yet. - If production asset upload is not available locally, generate deterministic signed local release artifacts and leave the registry entries pending until immutable HTTPS assets are published. - For this implementation pass the active official registry is authoritative: `lapis-canvas`, `lapis-graph`, `lapis-notebook`, `lapis-pdf`, `lapis-slides`, and `lapis-telemetry` are treated as external official plugins. - Keep bundled-only plugins in `workspaceCorePlugins`: Markdown, CSV, Fmode, History, File Explorer, Tags, Notifications, Search, Tasks, Bases, Word Count, Lang Code, and AppPlugin. - Keep enable/disable persistence compatible with the current external plugin enablement file; do not introduce a new enablement file for this cleanup. - Update plugin list/detail data with provenance so bundled, official, manual, and community plugin rows remain distinguishable in settings surfaces. - Coordinate with #190 so Markdown Lint leaves the bundled system-extension list in the same cleanup once its `lapis-markdown-lint` plugin wrapper is in place. ## Suggested Files or Specs To Inspect - `spec/src/50-roadmap/full-registry-v1.md` - `spec/src/30-cross-package-contracts/plugin-registry.md` - `packages/workspace/src/lib/components/app/bootstrap.ts` - `packages/api/src/lib/plugin-distribution/` - `/Users/stevejuma/code/lapis-plugin-registry` ## Validation Commands - `pnpm --filter @lapis-notes/api check:all` - `pnpm --filter @lapis-notes/workspace check:all` - Per migrated plugin package `check:all` - `pnpm check:all` - `pnpm test:smoke` - `make spec-lint` - `mdbook build spec` - In `lapis-plugin-registry`: `pnpm check` and `pnpm registry:validate:remote` ## Related Issues - Follow-up to #181 — [Add update and revocation handling for installed official plugins](../closed/181-add-update-and-revocation-handling-for-installed-official-plugins.md) ## Follow-up Tasks ## Implementation Summary Removed active official first-party plugins from workspace bootstrap, classified installed official plugins as external core plugins, updated fixtures/specs/tests, and preserved external enablement compatibility. <!-- backlog:task_id=TASK-PLUGIN-REGISTRY-REMAINING-FIRST-PARTY source_spec=spec/src/50-roadmap/full-registry-v1.md related_issue=181 -->
steve added this to the Full Registry V1 milestone 2026-05-31 22:17:39 +00:00
steve 2026-06-02 15:55:02 +00:00
  • closed this issue
  • added
    done
    and removed
    open
    labels
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lapis-notes/lapis#185
No description provided.