doc/plans/2026-03-13-plugin-kitchen-sink-example.md
Add a new first-party example plugin, Kitchen Sink (Example), that demonstrates every currently implemented Paperclip plugin API surface in one place.
This plugin is meant to be:
It is not meant to be a polished end-user product plugin.
The current plugin system has a real API surface, but it is spread across:
That makes it hard to answer basic questions like:
The kitchen-sink plugin should answer those questions by example.
The plugin is successful if a contributor can install it and, without reading the SDK first, discover and exercise the current plugin runtime surface area from inside Paperclip.
Concretely:
This plan is based on the currently implemented SDK/types/runtime, not only the long-horizon spec.
Primary references:
packages/plugins/sdk/README.mdpackages/plugins/sdk/src/types.tspackages/plugins/sdk/src/ui/types.tspackages/shared/src/constants.tspackages/shared/src/types/plugin.tsThese are the concrete ctx clients currently exposed by the SDK:
ctx.configctx.eventsctx.jobsctx.launchersctx.httpctx.secretsctx.assetsctx.activityctx.statectx.entitiesctx.projectsctx.companiesctx.issuesctx.agentsctx.goalsctx.datactx.actionsctx.streamsctx.toolsctx.metricsctx.loggerSurfaces defined in the SDK:
pagesettingsPagedashboardWidgetsidebarsidebarPaneldetailTabtaskDetailViewprojectSidebarItemtoolbarButtoncontextMenuItemcommentAnnotationcommentContextMenuItemConfirmed or strongly indicated as mounted in the current app:
pagesettingsPagedashboardWidgetdetailTabprojectSidebarItemNeed explicit validation before claiming full demo coverage:
sidebarsidebarPaneltaskDetailViewtoolbarButton as direct slot, distinct from launcher placementcontextMenuItem as direct slot, distinct from comment menu and launcher placementThe implementation should keep a small validation checklist for these before we call the plugin "complete".
The plugin should be named:
Kitchen Sink (Example)@paperclipai/plugin-kitchen-sink-examplepaperclip.kitchen-sink-example or paperclip-kitchen-sink-exampleRecommendation: use paperclip-kitchen-sink-example to match current in-repo example naming style.
Category mix:
uiautomationworkspaceconnectorThat is intentionally broad because the point is coverage.
The plugin should have one main full-page demo console plus smaller satellites on other surfaces.
Primary route: the plugin page surface should be the central dashboard for all demos.
Recommended page sections:
Overview
UI Surfaces
Data + Actions
Events + Streams
Paperclip Domain APIs
Local Workspace + Process
Jobs + Webhooks + Tools
State + Entities + Assets
Observability
A compact widget on the main dashboard should show:
Add a Kitchen Sink link under each project that deep-links into a project-scoped plugin tab.
Use detail tabs to demonstrate entity-context rendering on:
projectissueagentgoalEach tab should show:
Use issue comment demos to prove comment-specific extension points:
commentAnnotation
commentContextMenuItem
Copy Context To Kitchen SinkCustom settingsPage should be intentionally simple and operational:
AboutDanger / Trust ModelThis plugin should also keep the generic plugin settings Status tab useful by writing health, logs, and metrics.
Each implemented worker API should have a visible demo.
ctx.configDemo:
ctx.eventsDemos:
issue.createdctx.jobsDemos:
ctx.launchersDemos:
ctx.httpDemo:
Recommendation: default to a Paperclip-local endpoint or a stable public echo endpoint to avoid flaky docs.
ctx.secretsDemo:
ctx.assetsDemos:
ctx.activityDemo:
ctx.stateDemos:
Use a small state inspector/editor on the plugin page.
ctx.entitiesDemos:
ctx.projectsDemos:
ctx.companiesDemo:
ctx.issuesDemos:
ctx.agentsDemos:
Agent mutation controls should be behind an explicit warning.
ctx.agents.sessionsDemos:
This is a strong candidate for the best "wow" demo on the plugin page.
ctx.goalsDemos:
ctx.dataUse throughout the plugin for all read-side bridge demos.
ctx.actionsUse throughout the plugin for all mutation-side bridge demos.
ctx.streamsDemos:
ctx.toolsDemos:
The plugin page should list declared tools and show example input payloads.
ctx.metricsDemo:
ctx.loggerDemo:
Status page then doubles as the log viewerThe plugin SDK intentionally leaves file/process operations to the plugin itself once it has workspace metadata.
The kitchen-sink plugin should demonstrate that explicitly.
rg if availablepwd, ls, or git statusImportant safeguards:
The plugin should aim to declare:
pagesettingsPagedashboardWidgetdetailTab for project, issue, agent, goalprojectSidebarItemcommentAnnotationcommentContextMenuItemThen, after host validation, add if supported:
sidebarsidebarPaneltaskDetailViewtoolbarButtoncontextMenuItemIt should also declare one or more ui.launchers entries to exercise launcher behavior independently of slot rendering.
New package:
packages/plugins/examples/plugin-kitchen-sink-example/Expected files:
package.jsonREADME.mdtsconfig.jsonsrc/index.tssrc/manifest.tssrc/worker.tssrc/ui/index.tsxsrc/ui/components/...src/ui/hooks/...src/lib/...scripts/build-ui.mjs if UI bundling needs esbuildRecommended split:
src/worker.ts
src/worker/data.ts
ctx.data.register(...)src/worker/actions.ts
ctx.actions.register(...)src/worker/events.ts
src/worker/jobs.ts
src/worker/tools.ts
src/worker/local-runtime.ts
src/worker/demo-store.ts
Recommended split:
src/ui/index.tsx
src/ui/page/KitchenSinkPage.tsxsrc/ui/settings/KitchenSinkSettingsPage.tsxsrc/ui/widgets/KitchenSinkDashboardWidget.tsxsrc/ui/tabs/ProjectKitchenSinkTab.tsxsrc/ui/tabs/IssueKitchenSinkTab.tsxsrc/ui/tabs/AgentKitchenSinkTab.tsxsrc/ui/tabs/GoalKitchenSinkTab.tsxsrc/ui/comments/KitchenSinkCommentAnnotation.tsxsrc/ui/comments/KitchenSinkCommentMenuItem.tsxsrc/ui/shared/...The plugin should have a substantial but understandable instanceConfigSchema.
Recommended config fields:
enableDangerousDemosenableWorkspaceDemosenableProcessDemosshowSidebarEntryshowSidebarPanelshowProjectSidebarItemshowCommentAnnotationshowCommentContextMenuItemshowToolbarLauncherdefaultDemoCompanyId optionalsecretRefExamplehttpDemoUrlprocessAllowedCommandsworkspaceScratchSubdirDefaults should keep risky behavior off.
Default posture:
Validate whether the current host truly mounts:
sidebarsidebarPaneltaskDetailViewtoolbarButtoncontextMenuItemIf mounted, add demos. If not mounted, document them as SDK-defined but host-pending.
The plugin should ship with a README that includes:
It should also be referenced from plugin docs as the "reference everything plugin".
Minimum verification:
Recommended manual checklist:
Should the process demo remain curated-command-only in the first pass? Recommendation: yes.
Should the plugin create throwaway "kitchen sink demo" issues/goals automatically? Recommendation: no. Make creation explicit.
Should we expose unsupported-but-typed surfaces in the UI even if host mounting is not wired?
Recommendation: yes, but label them as SDK-defined / host validation pending.
Should agent mutation demos include pause/resume by default? Recommendation: probably yes, but behind a warning block.
Should this plugin be treated as a supported regression harness in CI later? Recommendation: yes. Long term, this should be the plugin-runtime smoke test package.
If this plan looks right, the next implementation pass should start by building only:
That is enough to lock the architecture before filling in every demo surface.