mirror of
https://github.com/webstudio-is/webstudio.git
synced 2026-10-30 00:27:43 +09:00
- **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.
44 lines
1.2 KiB
TypeScript
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,
|
|
};
|