Replace plugin list diagnostics with VS Code-style Features panel #91
Labels
No labels
abandoned
active
audit
blocked
data-safety
difficulty:easy
difficulty:hard
difficulty:high
difficulty:medium
docs
done
duplicate
notebook-v0
open
priority:high
ready
release-critical
safe-mode
spec
spec-backlog
subsystem:api
subsystem:backlog
subsystem:bases
subsystem:ci
subsystem:command
subsystem:configuration
subsystem:consolidate
subsystem:dependencies
subsystem:desktop-electron
subsystem:diffmerge
subsystem:docker
subsystem:docs
subsystem:fuzzy
subsystem:graph
subsystem:hotkeys
subsystem:lapis
subsystem:maint
subsystem:maintenance
subsystem:markdown
subsystem:markdown-lint
subsystem:md018
subsystem:notebook
subsystem:notifications
subsystem:opfs
subsystem:package
subsystem:plugin-markdown
subsystem:plugin-tasks
subsystem:plugins
subsystem:registry
subsystem:release
subsystem:renovate
subsystem:restore
subsystem:scripts
subsystem:search
subsystem:settings
subsystem:spec
subsystem:tasks
subsystem:testing
subsystem:ui
subsystem:web
subsystem:workspace
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
lapis-notes/lapis#91
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Replace the cluttered imperative diagnostics dump in Community/Core plugin list
rows with a shared Svelte panel: Details | Features tabs and a VS Code
Marketplace–style resizable master-detail Features view built from existing
@lapis-notes/uiprimitives.Problem
Community and core plugin rows render 10–15 plain
\n-separated<div>blocksvia
appendDiagnosticsandappendIndexedContributionsinpackages/workspace/src/lib/components/configuration/community-plugins.ts.Permissions, capabilities, and privileges overlap visually; activation events and
indexed contributions are hard to scan; there is no progressive disclosure.
Users need a VS Code Marketplace Features-style layout: top-level tabs, then
a resizable two-column nav + detail pane with scrollable lists and monospace
"code pill" entries for activation events, permissions, and contributions.
Goal
Make plugin permissions, activations, and indexed contributions understandable
at a glance in the Settings → Core plugins and Community plugins tabs, using a
shared inline panel that matches the settings shell and VS Code extension
Features presentation.
Scope
First iteration: replace description clutter only in Community/Core plugin
list rows — not in the dedicated plugin settings nav.
VS Code reference model
state)
code-style pills
Map Lapis data to equivalent sections (hide empty sections from the left nav):
CommunityPluginDiagnostics/ runtime plugin state: classification, host, activation mode, activation trigger, runtime entry, indexed count, state, last failure, contribution diagnostics, trusted-desktop warningLapisIndexedExtension.activationEvents+ liveactivationTriggerwhen presentpermissions+requestedCapabilities/grantedCapabilitiesinto one section (dedupe overlapping vault/settings/metadata labels); showprivilegesas a sub-block when non-emptycontributionswherekind === "commands"kind === "configuration"kind === "languages"views+editorViewskind === "services"Architecture
Component plan
1. Pure section builder (workspace, testable)
Add
packages/workspace/src/lib/components/configuration/plugin-feature-sections.ts:PluginFeatureSectiontype:{ id, label, items: PluginFeatureItem[] }where items are
{ kind: 'code' | 'text' | 'warning' | 'error', value, meta? }buildPluginFeatureSections({ diagnostics, extension, manifest, pluginState })— consolidates today's
appendDiagnostics+appendIndexedContributionslogic(reuse
grantedPermissions,formatCapabilitieshelpers moved here)plugin-feature-sections.test.tscovering: empty extension,activation events only, permission/capability merge, invalid contribution
diagnostics
2. Shared Svelte panel (workspace)
Add under
packages/workspace/src/lib/components/configuration/:plugin-extension-panel.sveltesections,detailssummary objectplugin-extension-features.svelteResizable.PaneGroup: left nav (~25%), handle, right detail (~75%); both panes wrapped inScrollAreaplugin-feature-nav-item.svelteSidebar.MenuButtonpattern or plainButton variant="ghost")plugin-feature-detail.svelteBadge variant="outline"code pills (activation events) orItemrows (commands with title/id)Layout constraints for inline use inside
.setting-item-description:min-h-48 max-h-72or similar) so rows stay scannableResizable.Handle withHandlefor drag resize within the panel3. UI primitives (existing
@lapis-notes/ui)@lapis-notes/ui/resizabletabs-split.svelte)@lapis-notes/ui/scroll-area@lapis-notes/ui/badge@lapis-notes/ui/separator@lapis-notes/ui/button@lapis-notes/ui/item@lapis-notes/ui/alertTabs prerequisite: Add a minimal shadcn-style
tabs/wrapper inpackages/uiaroundbits-uiTabs(mirrors howscroll-areaandresizablewrap bits-ui/paneforge). Export@lapis-notes/ui/tabs. (~4 files:root, list, trigger, content + index export).
4. Integrate into plugin list tabs
community-plugins.ts:appendDiagnostics/appendIndexedContributionsfromsetDescfragments
PluginExtensionPanelviamountComponentinto a dedicated host divinside
setDescprivate panelMounts: MountComponent[]array;destroy all in
display()beforecontainerEl.empty()and inhide()toavoid leaks on re-render
core-plugins.ts:Privileges); builder accepts a
variant: 'community' | 'core'flag to omitpermissions/contribution sections when data is absent
CSS: Add scoped hooks in
workspace-shell.cssfor.plugin-extension-panel— full width inside description, border, rounded-md, subtle background so it
reads as an embedded card distinct from action buttons.
Non-goals
configuration.svelte)SettingTabrewritemanifest summary)
today)
Acceptance Criteria
diagnostic
<div>stacks.summary.
scrollable detail pane.
Badge variant="outline").metadata exists.
via
Alertwhen applicable.panels.
buildPluginFeatureSectionsfor empty extension, activationevents, permission/capability merge, and invalid contribution diagnostics.
spec/src/20-packages/workspace/index.mdandpackages/workspace/spec.mddescribe the tabbed inline Features panel.make spec-lint, packagecheck, and rootpnpm test:smokepass.Implementation Notes
VS Code parity notes (document in spec, do not over-implement)
Badge variant="outline" font-mono.since README rendering is out of scope.
Implementation todos
packages/uiand export@lapis-notes/ui/tabsplugin-feature-sections.ts+ unit tests; migrate diagnostics/formathelpers from
community-plugins.tsPluginExtensionPanel+PluginExtensionFeatureswith Resizable,ScrollArea, Badge, Item, Alert
mountComponentintocommunity-plugins.tsandcore-plugins.tswithproper destroy lifecycle; add workspace-shell CSS
Suggested Files or Specs To Inspect
packages/workspace/src/lib/components/configuration/community-plugins.tspackages/workspace/src/lib/components/configuration/core-plugins.tspackages/workspace/src/lib/components/configuration/configuration.svelte(settings shell reference for nav styling)
packages/workspace/src/lib/components/tabs/tabs-split.svelte(Resizableusage reference)
packages/api/src/lib/lapis-extension.ts(LapisIndexedExtension,LapisContributionIndexEntry)packages/api/src/lib/plugin-manager.ts(CommunityPluginDiagnostics)spec/src/20-packages/workspace/index.md(Community Plugins Tab section)spec/src/50-roadmap/complete-daily-use-app.mdValidation Commands
Manual: open Settings → Community plugins with
plugin-test/ indexed Lapisfixtures; verify Features tab sections, resize handle, scroll, and that
re-render (toggle enable, restart) does not leak or duplicate panels.
Follow-up Tasks
from the gear button
Implementation Summary
Replaced flat plugin diagnostics with expandable inline features panels, added full-width feature expansion with Show Features fallback, and made command entries executable from the plugin features view.