TypeScript/React SDK for building Paca plugin micro-frontends.
npm install @paca-ai/plugin-sdk-react
react,react-dom, and@tanstack/react-queryare peer dependencies and must already be installed in your plugin.
import { usePlugin, usePluginQuery } from "@paca-ai/plugin-sdk-react";
export function ChecklistSection() {
const { api, ui, meta } = usePlugin();
const { data: items = [] } = usePluginQuery(
meta.pluginId,
["items"],
() => api.pluginGet(meta.pluginId, "/items"),
);
async function handleDelete(id: string) {
const ok = await ui.confirm({ title: "Delete item?", variant: "destructive" });
if (!ok) return;
await api.pluginDelete(meta.pluginId, `/items/${id}`);
ui.toast({ title: "Deleted", variant: "success" });
}
return (
<ul>
{items.map((item) => (
<li key={item.id}>
{item.title}
<button onClick={() => handleDelete(item.id)}>Delete</button>
</li>
))}
</ul>
);
}Returns { api, ui, meta } from the nearest <PluginProvider>.
Scoped HTTP client. Methods:
listTasks(filters?)— list tasks in current projectgetTask(taskId)— fetch a single taskgetProject()— fetch current project summarylistMembers()— list project memberspluginGet(pluginId, path)— GET a plugin routepluginPost(pluginId, path, body)— POST to a plugin routepluginPatch(pluginId, path, body)— PATCH a plugin routepluginDelete(pluginId, path)— DELETE a plugin route
Host-provided UI utilities available via ui:
ui.toast(opts)— show a toast notificationui.confirm(opts)— show a confirmation dialog (returnsPromise<boolean>)ui.navigate(path)— navigate to a host-app path
Wrapper around useQuery that namespaces cache keys under ["plugin", pluginId, ...].
Import the prop interface matching your registered extension point:
TaskDetailSectionProps—task.detail.sectionSidebarProjectSectionProps—sidebar.project.sectionSidebarGeneralSectionProps—sidebar.general.sectionProjectSettingsTabProps—project.settings.tabViewExtensionProps—view