@kvasar/google-stitch 0.1.13 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "openclaw-google-stitch",
3
3
  "name": "Google Stitch MCP",
4
- "version": "0.1.13",
4
+ "version": "0.1.15",
5
5
  "description": "Integrates Google Stitch MCP services into OpenClaw",
6
6
  "skills": ["skills"],
7
7
  "configSchema": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kvasar/google-stitch",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "OpenClaw plugin for Google Stitch UI generation, screen design, variants, and design systems",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
package/skills/SKILL.md CHANGED
@@ -135,6 +135,33 @@ Always structure the tool call as:
135
135
 
136
136
  Never call the tool with only a string prompt.
137
137
 
138
+ ### List screens
139
+
140
+ Lists all screens within a given Stitch project.
141
+
142
+ - `list_screens`
143
+
144
+ Required parameters:
145
+ - `projectId`: the Stitch project ID (without the `projects/` prefix)
146
+
147
+ Use this tool when the user wants to:
148
+ - see all generated screens in a project
149
+ - review existing designs
150
+ - inspect project screens before updating or exporting
151
+
152
+ Example prompts:
153
+ - List all screens in project 12345
154
+ - Show me all screens for project 4044680601076201931
155
+ - What screens are in project 12345?
156
+ - Show me the designs in this project
157
+ - List the generated UI screens for project 12345
158
+
159
+ Returns:
160
+ - Array of `Screen` objects
161
+ - Includes fields such as `name`, `title`, `prompt`, `deviceType`, `width`, `height`, and grouping metadata
162
+
163
+ ---
164
+
138
165
  ### Screen editing
139
166
 
140
167
  For modifying existing screens:
@@ -93,22 +93,32 @@ export function generateScreenFromTextTool(client: StitchMCPClient) {
93
93
  const screen = result.screen;
94
94
  const firstComponent = result.output_components?.[0];
95
95
 
96
+ // Extract model's conversational text and suggestion
97
+ const modelText = firstComponent?.text;
98
+ const suggestion = firstComponent?.suggestion;
99
+
100
+ // Try image URL response
96
101
  const imageUrl =
97
102
  screen?.screenshot?.url ||
98
103
  firstComponent?.design?.screenshot?.url;
99
104
 
100
105
  if (imageUrl) {
101
- return {
102
- content: [
103
- {
104
- type: "image",
105
- url: imageUrl,
106
- caption: screen?.title || "Generated by Google Stitch"
107
- }
108
- ]
109
- };
106
+ const content: Array<{ type: string; [key: string]: any }> = [];
107
+ if (modelText) {
108
+ content.push({ type: "text", text: modelText });
109
+ }
110
+ content.push({
111
+ type: "image",
112
+ url: imageUrl,
113
+ caption: screen?.title || "Generated by Google Stitch"
114
+ });
115
+ if (suggestion) {
116
+ content.push({ type: "text", text: suggestion });
117
+ }
118
+ return { content };
110
119
  }
111
120
 
121
+ // Try image bytes response
112
122
  const imageBytes =
113
123
  screen?.screenshot?.bytes ||
114
124
  firstComponent?.design?.screenshot?.bytes;
@@ -124,33 +134,41 @@ export function generateScreenFromTextTool(client: StitchMCPClient) {
124
134
  Buffer.from(imageBytes, "base64")
125
135
  );
126
136
 
127
- return {
128
- content: [
129
- {
130
- type: "image",
131
- path: tempFilePath,
132
- caption: screen?.title || "Generated by Google Stitch"
133
- }
134
- ]
135
- };
137
+ const content: Array<{ type: string; [key: string]: any }> = [];
138
+ if (modelText) {
139
+ content.push({ type: "text", text: modelText });
140
+ }
141
+ content.push({
142
+ type: "image",
143
+ path: tempFilePath,
144
+ caption: screen?.title || "Generated by Google Stitch"
145
+ });
146
+ if (suggestion) {
147
+ content.push({ type: "text", text: suggestion });
148
+ }
149
+ return { content };
136
150
  }
137
151
 
138
- const html =
152
+ // HTML fallback (either provided or minimal placeholder)
153
+ let html =
139
154
  screen?.htmlCode?.content ||
140
- firstComponent?.design?.htmlCode?.content ||
141
- `<div style="padding:16px">
155
+ firstComponent?.design?.htmlCode?.content;
156
+
157
+ if (!html) {
158
+ html = `<div style="padding:16px">
142
159
  <h3>${escapeHtml(screen?.title || "Generated screen")}</h3>
143
- <p>${escapeHtml(firstComponent?.text || "")}</p>
144
160
  </div>`;
161
+ }
145
162
 
146
- return {
147
- content: [
148
- {
149
- type: "html",
150
- html
151
- }
152
- ]
153
- };
163
+ const content: Array<{ type: string; [key: string]: any }> = [];
164
+ if (modelText) {
165
+ content.push({ type: "text", text: modelText });
166
+ }
167
+ content.push({ type: "html", html });
168
+ if (suggestion) {
169
+ content.push({ type: "text", text: suggestion });
170
+ }
171
+ return { content };
154
172
  }
155
173
  };
156
174
  }
@@ -1,7 +1,20 @@
1
- export const listScreensTool = (client:any) => ({
1
+ import { StitchMCPClient } from "../services/stitch-mcp-client.js";
2
+
3
+ interface ListScreensParams {
4
+ projectId: string;
5
+ }
6
+
7
+ export const listScreensTool = (client: StitchMCPClient) => ({
2
8
  name: "list_screens",
3
- description: "list screens",
4
- async execute(_: string, params: any) {
5
- return await client.request?.("list_screens", params);
9
+ description: "Lists all screens within a given Stitch project",
10
+
11
+ async execute(_: string, params: ListScreensParams) {
12
+ if (!params?.projectId) {
13
+ throw new Error("projectId is required");
14
+ }
15
+
16
+ return client.request("list_screens", {
17
+ projectId: params.projectId,
18
+ });
6
19
  },
7
- });
20
+ });