Skip to content

Add initial plugin support to Tendril#555

Draft
zachwolfe wants to merge 150 commits into
Ivy-Interactive:developmentfrom
zachwolfe:feat/plugins
Draft

Add initial plugin support to Tendril#555
zachwolfe wants to merge 150 commits into
Ivy-Interactive:developmentfrom
zachwolfe:feat/plugins

Conversation

@zachwolfe

@zachwolfe zachwolfe commented May 9, 2026

Copy link
Copy Markdown
Contributor

Adds initial plugin support to Tendril, building on top of the plugin system in Ivy-Framework.

@zachwolfe zachwolfe changed the title Add initial plugin support to Tendril (draft) Add initial plugin support to Tendril May 9, 2026
zachwolfe added 18 commits May 9, 2026 00:49
ITendrilPluginContext now extends IIvyPluginContext (renamed from
IPluginContext). SlackPlugin.Configure takes IIvyPluginContext.
- Remove ConfigureServices from SlackPlugin (removed from IIvyPlugin interface)
- Update PluginsSetupView to show Active, Unconfigured, and Unloaded sections
- Use GetActivePluginIds/GetUnconfiguredPlugins/ReconfigurePlugin from new API
Stores plugin config in plugin-config.yaml under the plugins directory.
Passes factory to UsePlugins to satisfy new required parameter.
Shows custom or schema-driven config forms for active and unconfigured
plugins, wrapped in Cards for visual separation.
zachwolfe and others added 9 commits May 16, 2026 01:41
Requires a secret ApiKey field (lin_api_ prefix).
Introduce Ivy.Tendril.Plugin.Extended.Abstractions with ITendrilExtendedPluginContext
and FooterMenuPosition enum. Plugins can now contribute settings menu items at
predefined positions (Top, Bottom, ImportIssues) with stable ordering by tag.
Uses the new AddSettingsMenuItem API to insert at the ImportIssues position.
Plugins can now register dialogs via RegisterDialog() and receive an
opener Action to use in OnSelect or anywhere else. A single
PluginDialogHost view in the app shell renders the active dialog.

Also replaces ISettingsMenuItemsProvider with ITendrilPluginContributions
for the internal read-side interface.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
# Conflicts:
#	src/Ivy.Tendril/Apps/SettingsApp.cs
#	src/Ivy.Tendril/Ivy.Tendril.csproj
#	src/Ivy.Tendril/Ivy.Tendril.slnx
Plugins can now access the Tendril home directory without relying on
environment variables directly. The property is populated from
IConfigService.TendrilHome in the main Tendril context.
The UsePlugins signature now requires an IIvyPluginConfigFactory.
Add a minimal YAML-based config factory and implement TendrilHome
on the MessagingPluginContext.
zachwolfe and others added 22 commits June 26, 2026 01:40
Replace the Import of Ivy.ExternalWidget.targets (which requires
Ivy-Framework on disk) with self-contained build targets so the plugin
builds independently in any environment.
…shing

Renumber SourceIdentifier migration to 017 to avoid conflict with
upstream migrations 015/016. Add Linear plugin to the release workflow
and add NuGet package metadata. Fix nullable type warnings in Linear
UseQuery calls.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace all hardcoded tendril-api.ivy.app references with the
configurable URL from TendrilArgs. Supports TENDRIL_API_SERVER
env var for detached child inheritance.
Fetches approved plugins from Tendril Services API and shows them in
the plugin config UI. Install downloads the .nupkg and extracts DLLs
directly into the plugins directory.
# Conflicts:
#	src/Ivy.Tendril/AppShell/TendrilAppShell.cs
#	src/Ivy.Tendril/Apps/Drafts/Dialogs/CreatePlanDialog.cs
#	src/Ivy.Tendril/TendrilServer.cs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
# Conflicts:
#	src/Ivy.Tendril/AppShell/TendrilAppShell.cs
#	src/Ivy.Tendril/Apps/Settings/SettingsApp.cs
#	src/Ivy.Tendril/Services/BugReportService.cs
This API was removed from the plugin interface in the Ivy-Framework
plugin-system-fixes branch.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts:
#	src/Ivy.Tendril/Apps/Settings/SettingsApp.cs
#	src/Ivy.Tendril/Services/BugReportService.cs
zachwolfe and others added 6 commits July 17, 2026 23:15
Ship a .targets file in Ivy.Tendril.Plugin.Abstractions that auto-generates
tendril.json at pack time from TendrilIconKind/TendrilIconValue csproj properties.
The client now uses a single PluginIconHelper.ToWidget() path for all plugin icons,
with FromApiResponse() to construct PluginIcon from the services API response.
Ensures the Tendril Services admin panel shows proper display names
instead of raw PackageId values when plugins are registered from NuGet.
- Ivy: 1.3.9 → 1.3.10
- Ivy.Plugin.Abstractions: 1.3.9 → 1.3.10
- Ivy.Desktop: 1.3.8 → 1.3.10
- Ivy.Hooks.Pty: 1.3.8 → 1.3.10
- Ivy.Widgets.*: 1.3.8 → 1.3.10
- Ivy.Docs.Helpers: 1.3.8 → 1.3.10
- docs: update plugin-developer-guide versions to 1.1.12

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Allow users to uninstall plugins directly from the settings view with a
confirmation dialog that explains what will happen based on plugin type
(NuGet package deletion vs reference removal).
The MSBuild auto-generation approach didn't work for ProjectReference
consumers. Manual JSON files are simpler, explicit, and work in all
contexts including third-party repos. Also adds CopyLocalLockFileAssemblies
to plugins that were missing it and documents the pattern in the developer guide.
@artem-ivy-ai

Copy link
Copy Markdown

Staging deploy failed

Branch does not exist

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants