@mindstudio-ai/remy 0.1.83 → 0.1.84

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.
@@ -6,7 +6,9 @@ This is an automated action triggered by the user pressing "Build" in the editor
6
6
 
7
7
  The user has reviewed the spec and is ready to build.
8
8
 
9
- Think about your approach and then get a quick sanity check from `codeSanityCheck` to make sure you aren't missing anything. If you are building a web frontend, consult `visualDesignExpert` for guidance and ideas on specific components, UI patterns, and interactions - it has access to a deep repository of design inspiration and will be able to give you great ideas to work with while building.
9
+ Think about your approach and then get a quick sanity check from `codeSanityCheck` to make sure you aren't missing anything.
10
+
11
+ If you are building a web frontend, consult `visualDesignExpert` for guidance and ideas on specific component design, UI patterns, and interactions - it has access to a deep repository of design inspiration and will be able to give you great ideas to work with while building. Don't ask it to design full screens - focus on specific components, moments, and concepts where its ideas can be additive and transformative, you already have the basic design and layout guidance from the spec.
10
12
 
11
13
  Then, build everything in one turn: methods, tables, interfaces, manifest updates, and scenarios, using the spec as the master plan. Be sure to delete any unnecessary files from the "Hello World" scaffold that already exist in the project.
12
14
 
package/dist/headless.js CHANGED
@@ -3123,15 +3123,6 @@ var BROWSER_TOOLS = [
3123
3123
  }
3124
3124
  }
3125
3125
  }
3126
- },
3127
- {
3128
- clearable: false,
3129
- name: "resetBrowser",
3130
- description: "Reset the browser to a clean state. Call this once after all tests are complete to restore the preview for the user. Fire and forget \u2014 does not wait for the reload to finish.",
3131
- inputSchema: {
3132
- type: "object",
3133
- properties: {}
3134
- }
3135
3126
  }
3136
3127
  ];
3137
3128
  var BROWSER_EXTERNAL_TOOLS = /* @__PURE__ */ new Set(["browserCommand"]);
@@ -3160,7 +3151,7 @@ var browserAutomationTool = {
3160
3151
  clearable: true,
3161
3152
  definition: {
3162
3153
  name: "runAutomatedBrowserTest",
3163
- description: "Run an automated browser test against the live preview. Describe what to test \u2014 the agent figures out how. Use after meaningful changes frontend code, to reproduce user-reported issues, or to test end-to-end flows.",
3154
+ description: "Run an automated browser test against the live preview. Describe what to test \u2014 the agent figures out how. Use after meaningful changes frontend code, to reproduce user-reported issues, or to test end-to-end flows. Never give it explicit values to use when filling out forms or creating accounts - it will use its own judgement (often it needs to use specific values to trigger dev-mode bypasses of things like login verification codes).",
3164
3155
  inputSchema: {
3165
3156
  type: "object",
3166
3157
  properties: {
@@ -3188,6 +3179,10 @@ var browserAutomationTool = {
3188
3179
  } catch {
3189
3180
  return "Error: could not check browser status. The dev environment may not be running.";
3190
3181
  }
3182
+ try {
3183
+ await sidecarRequest("/reset-browser", {}, { timeout: 5e3 });
3184
+ } catch {
3185
+ }
3191
3186
  const result = await runSubAgent({
3192
3187
  system: getBrowserAutomationPrompt(),
3193
3188
  task: input.task,
@@ -3204,14 +3199,6 @@ var browserAutomationTool = {
3204
3199
  return `Error taking screenshot: ${err.message}`;
3205
3200
  }
3206
3201
  }
3207
- if (name === "resetBrowser") {
3208
- try {
3209
- await sidecarRequest("/reset-browser", {}, { timeout: 5e3 });
3210
- return "Browser reset triggered.";
3211
- } catch {
3212
- return "Error: could not reset browser.";
3213
- }
3214
- }
3215
3202
  return `Error: unknown local tool "${name}"`;
3216
3203
  },
3217
3204
  apiConfig: context.apiConfig,
@@ -3267,6 +3254,10 @@ var browserAutomationTool = {
3267
3254
  },
3268
3255
  toolRegistry: context.toolRegistry
3269
3256
  });
3257
+ try {
3258
+ await sidecarRequest("/reset-browser", {}, { timeout: 5e3 });
3259
+ } catch {
3260
+ }
3270
3261
  context.subAgentMessages?.set(context.toolCallId, result.messages);
3271
3262
  return result.text;
3272
3263
  }
package/dist/index.js CHANGED
@@ -2856,15 +2856,6 @@ var init_tools = __esm({
2856
2856
  }
2857
2857
  }
2858
2858
  }
2859
- },
2860
- {
2861
- clearable: false,
2862
- name: "resetBrowser",
2863
- description: "Reset the browser to a clean state. Call this once after all tests are complete to restore the preview for the user. Fire and forget \u2014 does not wait for the reload to finish.",
2864
- inputSchema: {
2865
- type: "object",
2866
- properties: {}
2867
- }
2868
2859
  }
2869
2860
  ];
2870
2861
  BROWSER_EXTERNAL_TOOLS = /* @__PURE__ */ new Set(["browserCommand"]);
@@ -2956,7 +2947,7 @@ var init_browserAutomation = __esm({
2956
2947
  clearable: true,
2957
2948
  definition: {
2958
2949
  name: "runAutomatedBrowserTest",
2959
- description: "Run an automated browser test against the live preview. Describe what to test \u2014 the agent figures out how. Use after meaningful changes frontend code, to reproduce user-reported issues, or to test end-to-end flows.",
2950
+ description: "Run an automated browser test against the live preview. Describe what to test \u2014 the agent figures out how. Use after meaningful changes frontend code, to reproduce user-reported issues, or to test end-to-end flows. Never give it explicit values to use when filling out forms or creating accounts - it will use its own judgement (often it needs to use specific values to trigger dev-mode bypasses of things like login verification codes).",
2960
2951
  inputSchema: {
2961
2952
  type: "object",
2962
2953
  properties: {
@@ -2984,6 +2975,10 @@ var init_browserAutomation = __esm({
2984
2975
  } catch {
2985
2976
  return "Error: could not check browser status. The dev environment may not be running.";
2986
2977
  }
2978
+ try {
2979
+ await sidecarRequest("/reset-browser", {}, { timeout: 5e3 });
2980
+ } catch {
2981
+ }
2987
2982
  const result = await runSubAgent({
2988
2983
  system: getBrowserAutomationPrompt(),
2989
2984
  task: input.task,
@@ -3000,14 +2995,6 @@ var init_browserAutomation = __esm({
3000
2995
  return `Error taking screenshot: ${err.message}`;
3001
2996
  }
3002
2997
  }
3003
- if (name === "resetBrowser") {
3004
- try {
3005
- await sidecarRequest("/reset-browser", {}, { timeout: 5e3 });
3006
- return "Browser reset triggered.";
3007
- } catch {
3008
- return "Error: could not reset browser.";
3009
- }
3010
- }
3011
2998
  return `Error: unknown local tool "${name}"`;
3012
2999
  },
3013
3000
  apiConfig: context.apiConfig,
@@ -3063,6 +3050,10 @@ var init_browserAutomation = __esm({
3063
3050
  },
3064
3051
  toolRegistry: context.toolRegistry
3065
3052
  });
3053
+ try {
3054
+ await sidecarRequest("/reset-browser", {}, { timeout: 5e3 });
3055
+ } catch {
3056
+ }
3066
3057
  context.subAgentMessages?.set(context.toolCallId, result.messages);
3067
3058
  return result.text;
3068
3059
  }
@@ -80,6 +80,10 @@ The UI should feel instant. Never make the user wait for a server round-trip to
80
80
  - **Mutate after actions.** After a successful create/update/delete, call `mutate()` to revalidate the relevant SWR cache rather than manually updating local state.
81
81
  - **Skeleton loading.** Show subtle, simple skeletons (light pulse - no shimmer) that mirror the layout on initial load. Never show a blank page or centered spinner while data is loading.
82
82
 
83
+ ### Errors
84
+
85
+ Handle errors gracefully. You don't need to design for every error case, but if remote API requests fail, make sure to show them nicely in a toast or some other appropriate view with a human-friendly label - don't just drop "Error 500 XYZ" inline in a form.
86
+
83
87
  ## Auth
84
88
 
85
89
  Login and signup screens set the tone for the user's entire experience with the app and are important to get right - they should feel like exciting entry points into the next level of the user journy. A janky login form with misaligned inputs and no feedback dminishes excitement and undermines trust before the user even gets in.
@@ -19,7 +19,7 @@ Aim for confidence that the core happy paths work. If the 80% case is solid, the
19
19
 
20
20
  Process logs are available at .logs/ in NDJSON format (one JSON object per line) for debugging. Each line has at minimum ts (unix millis) and msg fields, plus structured context like level, module, requestId, toolCallId where available. You can use `jq` to examine logs and debug failures. Tools like run method or run scenario execute synchronously, so log data will be available by the time those tools return their results to you, there is no need to `sleep` before querying logfiles.
21
21
  - `.logs/tunnel.ndjson`: method execution, schema sync, session lifecycle, platform connection
22
- - `.logs/devServer.ndjson`: frontend build errors, HMR, module resolution failures
22
+ - `.logs/devServer.ndjson`: frontend build errors, HMR, module resolution failures - check this to see if compilation is broken on web frontends.
23
23
  - `.logs/system.ndjson`: sandbox server logs — agent lifecycle, tool dispatch, file watching, process management
24
24
  - `.logs/agent.ndjson`: coding agent protocol events and errors
25
25
  - `.logs/requests.ndjson`: structured log of every method and scenario execution with full input, output, errors (including stack traces), console output, and duration
@@ -40,7 +40,9 @@ Always consult the code sanity check before writing code in initialCodegen with
40
40
 
41
41
  For verifying complex stateful interactions: multi-step form submissions, auth flows, real-time updates, flows that require specific data/role setup. This spins up a full chrome browser automation — it's heavyweight and takes minutes to complete a full test. Do not use it for basic rendering or navigation checks. If you can verify something with a screenshot or by reading the code, do that instead. Don't run it constantly after making small changes - save it for meaningful work. Run a scenario first to seed test data and set user roles. The user is able to watch QA work on their screen via a live browser preview - the cursor will move, type, etc - so you can also use this to demo functionality to the user and help them understand how to use their app.
42
42
 
43
- The QA agent can see the screen. Describe what to test, not how — it will figure out what to click, what to check, and what values to use. Never give it explicit values to use when filling out forms or creating accounts - it will use its own judgement (and sometimes it needs to use specific values to trigger dev-mode bypasses of things like login verification codes).
43
+ The QA agent can see the screen. Describe what to test, not how — it will figure out what to click, what to check, and what values to use. It always starts its tests logged out/unauthenticated on "/" root. After every test session, the browser is reset to / and any authentication used or created by the tester is cleared and reset.
44
+
45
+ Never tell QA what names to use when testing or what values to input - it will use its own judgment.
44
46
 
45
47
  ### Background Execution
46
48
 
@@ -11,6 +11,9 @@ The user is watching the automation happen on their screen in real-time. When ty
11
11
  When the app has a login or signup flow, you must use `remy@mindstudio.ai` for email and `+15551234567` for phone number. In the dev environment, verification codes are bypassed for this email address only and any 555-prefixed phone number — enter any 6-digit code (e.g., `123456`) and it will be accepted. If the content you are trying to test is gated behind auth, always use these credentials to login and continue testing.
12
12
 
13
13
  ## Browser Commands
14
+
15
+ Your session always starts on the app root / in a logged out/unauthenticated state.
16
+
14
17
  ### Snapshot format
15
18
 
16
19
  The snapshot command returns a compact accessibility tree:
@@ -143,7 +146,6 @@ You can use the `screenshotFullPage` tool to take a full-height screenshot of th
143
146
  - evaluate auto-returns simple expressions. `"script": "document.title"` works directly. For multi-statement scripts, use explicit return.
144
147
  - The snapshot in the response is always the most current page state. Even if a wait times out, check the snapshot field; the content you were waiting for may have appeared by then.
145
148
  - Execution stops on first error. If step 2 of 5 fails, steps 3-5 don't run. The response will contain results for steps 0-2 (with step 2 having an error field) plus the current snapshot. Adjust and retry from the failed step.
146
- - Always call `resetBrowser` as your final action after all tests are complete. This restores the preview to a clean state for the user.
147
149
  - If something fails, bail early. Do not attempt to diagnose why; do not do things like attempt different inputs to try to work around an error - just report the failure and early return.
148
150
  </rules>
149
151
 
@@ -69,9 +69,9 @@ The developer should never need to source their own imagery. Always provide URLs
69
69
 
70
70
  ### Icons and logos
71
71
 
72
- App icons and logos require work and thinking to get right. They need to be simple, clean, and legible at small sizes, which is the opposite of what unconstrained generation tends to produce.
72
+ App icons and logos require work and thinking to get right.
73
73
 
74
- **What works:** Smooth 3D rendering in the style of current macOS/iOS app icons. One clear object or symbol — rounded, immediately recognizable, emoji/toy-like proportions. Clean surfaces with soft lighting and gentle shadows. Two or three accent colors, not a rainbow. Always generate with `transparentBackground: true`.
74
+ **What works:** Smooth 3D rendering in the style of 2026-era macOS/iOS app icons. One clear object or symbol — rounded, immediately recognizable, emoji/toy-like proportions. Clean surfaces with soft lighting and gentle shadows. Two or three accent colors, not a rainbow. Always full bleed.
75
75
 
76
76
  **What doesn't work:** Flat illustration looks dated, photorealistic rendering is too noisy at small sizes, overly detailed scenes become illegible.
77
77
 
@@ -29,3 +29,87 @@ Authentication moments must feel natural and intuitive - they should not feel ja
29
29
  If the app includes an AI chat interface, take care to make it beautiful and intentional. A good chat interface feels like magic, a bad one feels like a broken customer service bot that will leave the user frustrated and annoyed.
30
30
 
31
31
  Pay close attention to text streaming when the AI replies - it should feel natural, smooth, and beautiful. There must never be any abrupt layout shift for tool use or new messages, and scrolling should feel natural - like you are in a well-designed iOS chat app. Make sure to specify styles, layouts, animations, and remind the developer of things to watch out for. Reference chat apps you know are well-designed, this is not the place to re-invent the wheel. Users have expectations about how chat works and we should meet them and surpass them.
32
+
33
+ ### Wireframes
34
+
35
+ When a pattern or interaction is hard to convey in words alone — an animation sequence, a swipe gesture, a layout grid — you can include a small interactive wireframe to demonstrate it. Use a markdown code fence with `wireframe` as the type. Start with a YAML frontmatter block (`name` and `description`) to identify the component, then the self-contained HTML+CSS prototype.
36
+
37
+ Wireframes replace the ASCII art and code-block diagrams you might otherwise reach for when trying to show a layout or interaction. They're better — the developer can actually see and interact with the result. Like those diagrams, they isolate one small piece: a single card component, a button animation, a transition, a grid layout. Each wireframe should be around 60-80 lines of HTML+CSS — if you're past 100 lines, you're building too much. These are not screens, flows, or multi-step prototypes. They render in a small iframe and should look complete at that scale. Most of your communication should be in words - wireframes are simply another tool when you need them. Never build out full screens or pages in wireframes, even if you are asked to - this is critically important.
38
+
39
+ The wireframe code will be rendered in a transparent iframe. Don't fill the viewport or add a background color to the body. Place the component at a natural size in a card with a background color that is centered vertically and horizontally in the viewport. Keep the component tight and self-contained. The iframe is for the component only — no annotations, labels, or explanatory text inside it. Put your notes and implementation guidance in the markdown around the wireframe. Wireframes can be interactive and are especially useful for demonstrating states, animations, effects, and transitions. If your wireframe has triggers or states, include a small "play" control button within the frame. No images - these are functional prototypes meant to demonstrate feel and behavior, not visual comps.
40
+
41
+ ```wireframe
42
+ ---
43
+ name: Feed Post Card
44
+ description: Photo post card with header, image frame, action row (like/comment/share/bookmark), like count, and caption. Shows spacing, typography hierarchy, and icon placement.
45
+ ---
46
+ <html lang="en"><head>
47
+ <meta charset="utf-8"/>
48
+ <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
49
+ <link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600&display=swap" rel="stylesheet"/>
50
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap" rel="stylesheet"/>
51
+ <style>
52
+ * { margin: 0; padding: 0; box-sizing: border-box; }
53
+ body {
54
+ font-family: 'Plus Jakarta Sans', sans-serif; background: transparent;
55
+ display: flex; align-items: center; justify-content: center;
56
+ }
57
+ .material-symbols-outlined { font-variation-settings: 'FILL' 0, 'wght' 300; }
58
+
59
+ .card {
60
+ width: 340px;
61
+ background: #fff; border-radius: 20px; overflow: hidden;
62
+ box-shadow: 0 8px 32px rgba(0,0,0,0.06);
63
+ }
64
+ .card-header {
65
+ padding: 20px 24px; display: flex; align-items: center; gap: 12px;
66
+ }
67
+ .avatar {
68
+ width: 40px; height: 40px; border-radius: 50%;
69
+ background: linear-gradient(135deg, #98a68e, #55624d);
70
+ }
71
+ .card-header .name { font-weight: 600; font-size: 14px; color: #191c18; }
72
+ .card-header .meta { font-size: 12px; color: #757870; margin-top: 2px; }
73
+ .card-image {
74
+ width: 100%; aspect-ratio: 4/5; background: linear-gradient(180deg, #d9e7cd 0%, #fed7d2 100%);
75
+ }
76
+ .card-actions {
77
+ padding: 16px 24px; display: flex; gap: 16px; align-items: center;
78
+ }
79
+ .card-actions button {
80
+ background: none; border: none; cursor: pointer; color: #444841;
81
+ display: flex; align-items: center; transition: color 0.15s;
82
+ }
83
+ .card-actions button:hover { color: #55624d; }
84
+ .card-actions .spacer { flex: 1; }
85
+ .card-body { padding: 0 24px 20px; }
86
+ .card-body .likes { font-weight: 600; font-size: 13px; color: #191c18; margin-bottom: 6px; }
87
+ .card-body .caption { font-size: 13px; color: #444841; line-height: 1.5; }
88
+ .card-body .caption strong { font-weight: 600; color: #191c18; }
89
+ </style>
90
+ </head>
91
+ <body>
92
+ <div class="card">
93
+ <div class="card-header">
94
+ <div class="avatar"></div>
95
+ <div>
96
+ <div class="name">sarah.chen</div>
97
+ <div class="meta">Golden Gate Park · 2h</div>
98
+ </div>
99
+ </div>
100
+ <div class="card-image"></div>
101
+ <div class="card-actions">
102
+ <button><span class="material-symbols-outlined">favorite</span></button>
103
+ <button><span class="material-symbols-outlined">chat_bubble</span></button>
104
+ <button><span class="material-symbols-outlined">send</span></button>
105
+ <span class="spacer"></span>
106
+ <button><span class="material-symbols-outlined">bookmark</span></button>
107
+ </div>
108
+ <div class="card-body">
109
+ <div class="likes">2,847 likes</div>
110
+ <div class="caption"><strong>sarah.chen</strong> Morning light through the eucalyptus grove</div>
111
+ </div>
112
+ </div>
113
+ </body>
114
+ </html>
115
+ ```
@@ -50,12 +50,12 @@ For photorealistic images, be specific about:
50
50
 
51
51
  For app icons and logos, the goal is something that reads clearly at small sizes and feels polished enough to sit on a home screen or in an app header.
52
52
 
53
- - Frame as "A 3D icon against a white background:" followed by the subject. Do NOT use the phrase "app icon" — it triggers mockup framing (the model renders an icon inset on a phone screen or mounted on a wall). "3D icon" works.
53
+ - Frame as "A 3D icon against a XYZ background" followed by the subject. Do NOT use the phrase "app icon" — it triggers mockup framing (the model renders an icon inset on a phone screen or mounted on a wall). "3D icon" works.
54
54
  - Describe smooth, rounded emoji-type 3D objects — think current macOS/iOS app icon design language. Clean surfaces, soft lighting, gentle shadows. Not flat illustration, not photorealistic, not clay/matte.
55
55
  - Subjects should be simplified and immediately recognizable. Prefer one clear object or symbol, not a scene.
56
56
  - Specify "reads well at small sizes" as an explicit constraint.
57
57
  - Keep color intentional and limited — two or three accent colors plus the object's base tone. Colors should complement the app's brand if known.
58
- - Always use transparent background for icons and logos.
58
+ - Make sure to specify full bleed - never say anything about rounded corners or there is a high likelihood that the image will come back as a rounded rectangle on a white background!
59
59
 
60
60
  ## Output
61
61
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindstudio-ai/remy",
3
- "version": "0.1.83",
3
+ "version": "0.1.84",
4
4
  "description": "MindStudio coding agent",
5
5
  "repository": {
6
6
  "type": "git",