Files
Oleg Isonen d440e02990 feat: Add safer MCP authoring and draft-page verification (#5905)
- **Restore points for agent work**: Create named restore points before
major edits, review changes with a dry run, and safely revert project
content if needed.

- **Shared Slot authoring**: Agents can turn existing sections into
shared Slots and insert linked copies across pages, including valid
nested Slots.

- **DTCG and Figma token imports**: Import design tokens and CSS
variables through CLI, MCP, or direct paste, with aliases, modes,
composite values, and mappings supported.

- **Consistent token conflict handling**: Every paste workflow now
offers the same preserve, rename, or merge choices instead of silently
overwriting existing design tokens.

- **Draft-page previews**: Agents can generate and inspect previews of
draft pages without publishing them or exposing drafts in production
builds.

- **Safer MCP mutations**: Destructive operations require explicit
confirmation, invalid raw patches and invented record IDs are rejected,
and restore operations commit atomically.

- **More dependable agent contracts**: New tools have complete runtime
schemas, clearer validation errors, and consistent behavior across CLI,
MCP, Builder, and server APIs.
2026-07-17 23:16:39 +02:00

44 lines
1.2 KiB
TypeScript

import { nativeClient } from "../trpc/trpc-client";
import { $project } from "../sync/data-stores";
import { isLikelyWebstudioJsxFragment } from "@webstudio-is/project-build/transfer";
import { pasteHandled, pasteIgnored, type Plugin } from "./copy-paste";
import { insertFragmentWithBreakpointWarning } from "./fragment-utils";
export const isLikelyWebstudioJsx = isLikelyWebstudioJsxFragment;
const handlePasteJsx = async (source: string) => {
if (isLikelyWebstudioJsx(source) === false) {
return pasteIgnored;
}
const project = $project.get();
if (project === undefined) {
return pasteIgnored;
}
try {
const fragment = await nativeClient.build.createJsxFragment.query({
projectId: project.id,
source,
});
await insertFragmentWithBreakpointWarning(fragment);
return pasteHandled;
} catch (error) {
return {
success: false,
error:
error instanceof Error
? error.message
: "Could not paste Webstudio JSX fragment.",
} as const;
}
};
export const jsx: Plugin = {
name: "jsx",
mimeType: "text/plain",
onPaste: handlePasteJsx,
};
export const __testing__ = {
handlePasteJsx,
};