@mindstudio-ai/remy 0.1.267 → 0.1.268
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.
- package/dist/automatedActions/publish.md +2 -2
- package/dist/headless.js +0 -46
- package/dist/index.js +0 -46
- package/package.json +1 -1
|
@@ -12,9 +12,9 @@ If approved:
|
|
|
12
12
|
- Stage and commit any uncommitted changes with a clean, descriptive commit message. If the committed work resolves any open issues (`mindstudio-prod issues`), reference them in the commit message with a closing keyword — `fixes #42`, `closes #7` — so the deploy closes them automatically once it goes live.
|
|
13
13
|
- Push to main
|
|
14
14
|
- Use `mindstudio-prod releases wait` to poll the build until it completes. Let the user know it's deploying, then report back when it's live.
|
|
15
|
-
- Once the deploy is live,
|
|
15
|
+
- Once the deploy is live, scale the close-out to what shipped — the changelog you just wrote is the measure. For a meaningful release (new features, interfaces, real behavior changes): dispatch `specSync` with a brief batching everything that changed this session and `refreshBuildOverview: true` (it reconciles the spec, then re-authors the Build Overview from it), and notify `productVision` about what shipped so the roadmap and pitch deck stay current — both run in the background, so hand off and move on without waiting. For a hotfix or small tweak, skip the ceremony: a plain `specSync` (no flag) only if documented behavior actually changed.
|
|
16
16
|
- Once deployed, offer to help with next steps. This includes technical steps likesetting up a custom domain (`mindstudio-prod domains`), checking for errors (`mindstudio-prod requests stats`), seeding production data (`mindstudio-prod db`), managing env vars/secrets, or anything else they need for launch. It also includes going above and beyond and helping holistically. If it's the initial deploy, offer to help create collateral to announce the launch (e.g., an image for sharing on social media, text copy for a post, etc); if it's a meaningful incremental update, an annoucement post or something similar - go above and beyond here to help the user see that you care about the product from end-to-end, not just writing code! They will be appreciative, grateful, and pleased with your creativity here. Refer to the design guidance in the spec for how to talk about the product, and consider consulting the design expert to generate images or other marketing collateral.
|
|
17
17
|
|
|
18
|
-
After everything is done, call `compactConversation` to summarize the
|
|
18
|
+
After everything is done, if this was a meaningful release, call `compactConversation` to summarize the session and free up context for the next phase of work. After a hotfix, don't bother.
|
|
19
19
|
|
|
20
20
|
If dismissed, acknowledge and do nothing.
|
package/dist/headless.js
CHANGED
|
@@ -1043,7 +1043,6 @@ function extractFrontmatter(content) {
|
|
|
1043
1043
|
var DEFAULT_MAX_LINES = 500;
|
|
1044
1044
|
var readSpecTool = {
|
|
1045
1045
|
definition: {
|
|
1046
|
-
clearable: true,
|
|
1047
1046
|
name: "readSpec",
|
|
1048
1047
|
description: "Read a spec file from src/ with line numbers. Always read a spec file before editing it. Paths are relative to the project root and must start with src/ (e.g., src/app.md, src/interfaces/web.md).",
|
|
1049
1048
|
inputSchema: {
|
|
@@ -1157,7 +1156,6 @@ function acquireFileLock(filePath) {
|
|
|
1157
1156
|
// src/tools/spec/writeSpec.ts
|
|
1158
1157
|
var writeSpecTool = {
|
|
1159
1158
|
definition: {
|
|
1160
|
-
clearable: true,
|
|
1161
1159
|
name: "writeSpec",
|
|
1162
1160
|
description: "Create a new spec file or completely overwrite an existing one in src/. Parent directories are created automatically. Use this for new spec files or full rewrites. For targeted changes to existing specs, use editSpec instead.",
|
|
1163
1161
|
inputSchema: {
|
|
@@ -1295,7 +1293,6 @@ function formatOccurrenceError(count, lines, filePath) {
|
|
|
1295
1293
|
// src/tools/spec/editSpec.ts
|
|
1296
1294
|
var editSpecTool = {
|
|
1297
1295
|
definition: {
|
|
1298
|
-
clearable: true,
|
|
1299
1296
|
name: "editSpec",
|
|
1300
1297
|
description: "Make a targeted find/replace edit to a spec file (src/*.md). old_string must appear exactly once (minor indentation differences are handled automatically); set replace_all to true to replace every occurrence. Read the file with readSpec first so you match the exact text, and include the full enclosing structure rather than an inner fragment. The file's YAML frontmatter (the leading --- \u2026 --- block, which holds required fields like name) is protected \u2014 an edit that would remove or malform it is refused. For a full rewrite, use writeSpec.",
|
|
1301
1298
|
inputSchema: {
|
|
@@ -1400,7 +1397,6 @@ import fs9 from "fs/promises";
|
|
|
1400
1397
|
import path6 from "path";
|
|
1401
1398
|
var listSpecFilesTool = {
|
|
1402
1399
|
definition: {
|
|
1403
|
-
clearable: false,
|
|
1404
1400
|
name: "listSpecFiles",
|
|
1405
1401
|
description: "List all files in the src/ directory (spec files, brand guidelines, interface specs, references). Use this to understand what spec files exist before reading or editing them.",
|
|
1406
1402
|
inputSchema: {
|
|
@@ -1451,7 +1447,6 @@ async function listRecursive(dir) {
|
|
|
1451
1447
|
// src/tools/spec/presentPublishPlan.ts
|
|
1452
1448
|
var presentPublishPlanTool = {
|
|
1453
1449
|
definition: {
|
|
1454
|
-
clearable: false,
|
|
1455
1450
|
name: "presentPublishPlan",
|
|
1456
1451
|
description: "Present a publish changelog to the user for approval. Write a clear markdown summary of what changed since the last deploy. The user will see this in a full-screen view and can approve or dismiss. Call this BEFORE committing or pushing.",
|
|
1457
1452
|
inputSchema: {
|
|
@@ -1476,7 +1471,6 @@ import fs10 from "fs/promises";
|
|
|
1476
1471
|
var PLAN_FILE = ".remy-plan.md";
|
|
1477
1472
|
var writePlanTool = {
|
|
1478
1473
|
definition: {
|
|
1479
|
-
clearable: false,
|
|
1480
1474
|
name: "writePlan",
|
|
1481
1475
|
description: "Write an implementation plan for user approval before making changes. Use this only for large, multi-step changes like new features, new interface types, or when the user explicitly asks to see a plan. Most work should be done autonomously without a plan. Write a clear markdown summary of what you intend to do in plain language \u2014 describe the changes from the user's perspective, not as a list of files and code paths. The plan is displayed standalone in the UI with approve/reject buttons attached. The plan body ends with its last substantive section \u2014 do not write any closing line addressed to the reader. No 'If this lands, I'll start building,' no 'Let me know what to adjust,' no 'Approve when ready,' no trailing horizontal rule with a sign-off. Wrap-up text belongs in your chat message alongside the plan, not in the plan file. If the user asks for revisions, call this tool again with updated content to overwrite the plan.",
|
|
1482
1476
|
inputSchema: {
|
|
@@ -1507,7 +1501,6 @@ import fs11 from "fs/promises";
|
|
|
1507
1501
|
var PLAN_FILE2 = ".remy-plan.md";
|
|
1508
1502
|
var updatePlanStatusTool = {
|
|
1509
1503
|
definition: {
|
|
1510
|
-
clearable: false,
|
|
1511
1504
|
name: "updatePlanStatus",
|
|
1512
1505
|
description: 'Update the status of the current implementation plan. Use when the user approves or rejects the plan via chat (e.g. "looks good, go ahead" or "scrap it"). Approving sets the plan to active so you can begin implementation. Rejecting deletes the plan.',
|
|
1513
1506
|
inputSchema: {
|
|
@@ -1549,7 +1542,6 @@ var updatePlanStatusTool = {
|
|
|
1549
1542
|
// src/tools/common/setProjectOnboardingState.ts
|
|
1550
1543
|
var setProjectOnboardingStateTool = {
|
|
1551
1544
|
definition: {
|
|
1552
|
-
clearable: false,
|
|
1553
1545
|
name: "setProjectOnboardingState",
|
|
1554
1546
|
description: "Advance the project onboarding state. Forward-only: building \u2192 buildComplete \u2192 onboardingFinished. Normally driven by automated actions \u2014 don't call this out of order during a normal build, or you'll skip stages the user hasn't experienced. Exception: if the project has been in `building` for a while, the build is clearly done (the user is iterating on a working app, deploying, etc.), and the user reports the editor seems stuck \u2014 disabled Preview/Spec/Code tabs, no reveal, etc. \u2014 call `setProjectOnboardingState({ state: 'buildComplete' })` to unstick them. `onboardingFinished` is always set by the frontend after the user dismisses the reveal; never call it yourself.",
|
|
1555
1547
|
inputSchema: {
|
|
@@ -1572,7 +1564,6 @@ var setProjectOnboardingStateTool = {
|
|
|
1572
1564
|
// src/tools/common/promptUser.ts
|
|
1573
1565
|
var promptUserTool = {
|
|
1574
1566
|
definition: {
|
|
1575
|
-
clearable: false,
|
|
1576
1567
|
name: "promptUser",
|
|
1577
1568
|
description: 'Ask the user structured questions. Choose type first: "form" for structured intake (5+ questions, takes over screen), "inline" for quick clarifications or confirmations. Blocks until the user responds. Result contains `_dismissed: true` if the user dismisses without answering.',
|
|
1578
1569
|
inputSchema: {
|
|
@@ -1704,7 +1695,6 @@ ${lines.join("\n")}`;
|
|
|
1704
1695
|
// src/tools/common/confirmDestructiveAction.ts
|
|
1705
1696
|
var confirmDestructiveActionTool = {
|
|
1706
1697
|
definition: {
|
|
1707
|
-
clearable: false,
|
|
1708
1698
|
name: "confirmDestructiveAction",
|
|
1709
1699
|
description: "Confirm a destructive or irreversible action with the user. Use for things like deleting data, resetting the database, or discarding draft work. Do not use after presentPublishPlan or writePlan (those already include approval). Do not use before onboarding state transitions.",
|
|
1710
1700
|
inputSchema: {
|
|
@@ -1878,7 +1868,6 @@ function runCli(command, args, options) {
|
|
|
1878
1868
|
// src/subagents/sdkConsultant/index.ts
|
|
1879
1869
|
var askMindStudioSdkTool = {
|
|
1880
1870
|
definition: {
|
|
1881
|
-
clearable: false,
|
|
1882
1871
|
name: "askMindStudioSdk",
|
|
1883
1872
|
description: "@mindstudio-ai/agent backend SDK expert. Knows every backend action, AI model, connector, and configuration option. Returns architectural guidance and working code. Only covers the backend SDK (@mindstudio-ai/agent) \u2014 do NOT use for frontend/interface SDK questions (@mindstudio-ai/interface) like file uploads, auth, or client-side APIs. Describe what you want to build, not just what API method you need. Batch related questions into a single query.",
|
|
1884
1873
|
inputSchema: {
|
|
@@ -2019,7 +2008,6 @@ function stripDollarKeys(envelope) {
|
|
|
2019
2008
|
// src/tools/common/searchGoogle.ts
|
|
2020
2009
|
var searchGoogleTool = {
|
|
2021
2010
|
definition: {
|
|
2022
|
-
clearable: false,
|
|
2023
2011
|
name: "searchGoogle",
|
|
2024
2012
|
description: "Search Google and return results. Use for research, finding documentation, looking up APIs, or any task where web search would help.",
|
|
2025
2013
|
inputSchema: {
|
|
@@ -2050,7 +2038,6 @@ var searchGoogleTool = {
|
|
|
2050
2038
|
// src/tools/common/setProjectMetadata.ts
|
|
2051
2039
|
var setProjectMetadataTool = {
|
|
2052
2040
|
definition: {
|
|
2053
|
-
clearable: false,
|
|
2054
2041
|
name: "setProjectMetadata",
|
|
2055
2042
|
description: "Set project metadata. Can update any combination of: display name, short description, app icon, and Open Graph share image. Provide only the fields you want to change.",
|
|
2056
2043
|
inputSchema: {
|
|
@@ -2089,7 +2076,6 @@ var compactConversationTool = {
|
|
|
2089
2076
|
// call (cleanMessagesForApi).
|
|
2090
2077
|
backgroundNotify: "silent",
|
|
2091
2078
|
definition: {
|
|
2092
|
-
clearable: false,
|
|
2093
2079
|
name: "compactConversation",
|
|
2094
2080
|
description: "Compact the conversation history by summarizing older messages into a checkpoint. The summary preserves key decisions, what was built, and the current state of the project, but drops the verbose tool results, diffs, and intermediate steps that are no longer useful. Runs in the background.",
|
|
2095
2081
|
inputSchema: {
|
|
@@ -2135,7 +2121,6 @@ var compactConversationTool = {
|
|
|
2135
2121
|
// src/tools/common/loadSkill.ts
|
|
2136
2122
|
var loadSkillTool = {
|
|
2137
2123
|
definition: {
|
|
2138
|
-
clearable: true,
|
|
2139
2124
|
name: "loadSkill",
|
|
2140
2125
|
description: "Load the full reference for a platform capability that isn't in your system prompt \u2014 task agents, agent interfaces, voice interfaces, MCP interfaces, data sources. The available skills and the trigger for each are listed in <available_skills>. Load one before writing code in its area, not after: these are APIs where a plausible-looking guess is usually wrong. Calling this is cheap and expected \u2014 if you're unsure whether you need it, load it. Only covers the capabilities listed in the catalog; for backend SDK actions and model IDs use askMindStudioSdk.",
|
|
2141
2126
|
inputSchema: {
|
|
@@ -2186,7 +2171,6 @@ function isBinary(buffer) {
|
|
|
2186
2171
|
}
|
|
2187
2172
|
var readFileTool = {
|
|
2188
2173
|
definition: {
|
|
2189
|
-
clearable: true,
|
|
2190
2174
|
name: "readFile",
|
|
2191
2175
|
description: "Read a file's contents with line numbers. Always read a file before editing it \u2014 never guess at contents. By default returns the first 500 lines, and at most 64KB \u2014 a file with very wide lines (a CSV, a minified bundle) comes back short of 500 lines, so read a narrower range or grep rather than paging through it. To read a specific range, pass startLine and endLine (1-indexed, inclusive) \u2014 e.g. to read lines 253\u2013343, pass startLine: 253, endLine: 343. To read the end of a file or log, pass tail (the number of lines from the end). Line numbers in the output correspond to what editFile expects. For a large file, locate the relevant section first (symbols or grep), then read just that range.",
|
|
2192
2176
|
inputSchema: {
|
|
@@ -2290,7 +2274,6 @@ import fs14 from "fs/promises";
|
|
|
2290
2274
|
import path7 from "path";
|
|
2291
2275
|
var writeFileTool = {
|
|
2292
2276
|
definition: {
|
|
2293
|
-
clearable: true,
|
|
2294
2277
|
name: "writeFile",
|
|
2295
2278
|
description: "Create a new file or completely overwrite an existing one. Parent directories are created automatically. Use this for new files or full rewrites. For targeted changes to existing files, use editFile instead \u2014 it preserves the parts you don't want to change and avoids errors from forgetting to include unchanged code.",
|
|
2296
2279
|
inputSchema: {
|
|
@@ -2356,7 +2339,6 @@ ${unifiedDiff(input.path, oldContent ?? "", input.content)}`;
|
|
|
2356
2339
|
import fs15 from "fs/promises";
|
|
2357
2340
|
var editFileTool = {
|
|
2358
2341
|
definition: {
|
|
2359
|
-
clearable: true,
|
|
2360
2342
|
name: "editFile",
|
|
2361
2343
|
description: "Replace a string in a file. old_string must appear exactly once (minor indentation differences are handled automatically). Set replace_all to true to replace every occurrence at once. For bulk mechanical substitutions (renaming a variable, swapping colors), prefer replace_all. Always read the file first so you know the exact text to match. When editing nested structures (objects, function bodies, arrays, template literals), always include the full enclosing structure in old_string rather than just an inner fragment. Replacing a partial slice from the middle of nested code is the most common source of syntax errors.",
|
|
2362
2344
|
inputSchema: {
|
|
@@ -2449,7 +2431,6 @@ var DEFAULT_MAX_LINES2 = 500;
|
|
|
2449
2431
|
var MAX_OUTPUT_BYTES = 3e4;
|
|
2450
2432
|
var bashTool = {
|
|
2451
2433
|
definition: {
|
|
2452
|
-
clearable: true,
|
|
2453
2434
|
name: "bash",
|
|
2454
2435
|
description: "Run a shell command and return stdout + stderr. 120-second timeout by default (configurable). Use for: npm install/build/test, git operations, tsc --noEmit, or any CLI tool. Prefer dedicated tools over bash when available (use grep instead of bash + rg, readFile instead of bash + cat). Output is truncated to 500 lines or 30KB, whichever comes first. If a command would emit a lot of data, narrow it down (grep, head/tail, --short flags) rather than reading everything.",
|
|
2455
2436
|
inputSchema: {
|
|
@@ -2571,7 +2552,6 @@ function formatResults(stdout, max, mode) {
|
|
|
2571
2552
|
}
|
|
2572
2553
|
var grepTool = {
|
|
2573
2554
|
definition: {
|
|
2574
|
-
clearable: true,
|
|
2575
2555
|
name: "grep",
|
|
2576
2556
|
description: "Search file contents for a regex pattern. Returns matching lines with file paths and line numbers (default 50 results). Use this to find where something is used, locate function definitions, or search for patterns across the codebase. Set outputMode to 'count' for per-file match counts (like grep -c) or 'filesWithMatches' for just the file paths (like grep -l). Add context (like grep -C), or contextBefore/contextAfter (like grep -B/-A), to include surrounding lines. Set caseInsensitive (like grep -i) for a case-insensitive search. For finding a symbol's definition precisely, prefer the definition tool if LSP is available. Automatically excludes node_modules and .git.",
|
|
2577
2557
|
inputSchema: {
|
|
@@ -2683,7 +2663,6 @@ import fg from "fast-glob";
|
|
|
2683
2663
|
var DEFAULT_MAX2 = 200;
|
|
2684
2664
|
var globTool = {
|
|
2685
2665
|
definition: {
|
|
2686
|
-
clearable: true,
|
|
2687
2666
|
name: "glob",
|
|
2688
2667
|
description: 'Find files matching a glob pattern. Returns matching file paths sorted alphabetically (default 200 results). Use this to discover project structure, find files by name or extension, or check if a file exists. Common patterns: "**/*.ts" (all TypeScript files), "src/**/*.tsx" (React components in src), "*.json" (root-level JSON files). Automatically excludes node_modules and .git.',
|
|
2689
2668
|
inputSchema: {
|
|
@@ -2781,7 +2760,6 @@ async function formatFile(dirPath, name, indent) {
|
|
|
2781
2760
|
}
|
|
2782
2761
|
var listDirTool = {
|
|
2783
2762
|
definition: {
|
|
2784
|
-
clearable: true,
|
|
2785
2763
|
name: "listDir",
|
|
2786
2764
|
description: "List the contents of a directory with one level of subdirectory expansion. Shows file sizes and collapses single-child directory chains (a/b/c/ shown as one entry). Use this for a quick overview of a directory's structure. For finding files across the whole project, use glob instead.",
|
|
2787
2765
|
inputSchema: {
|
|
@@ -2858,7 +2836,6 @@ var listDirTool = {
|
|
|
2858
2836
|
// src/tools/code/editsFinished.ts
|
|
2859
2837
|
var editsFinishedTool = {
|
|
2860
2838
|
definition: {
|
|
2861
|
-
clearable: false,
|
|
2862
2839
|
name: "editsFinished",
|
|
2863
2840
|
description: "Signal that file edits are complete. Call this after you finish writing/editing files so the live preview updates cleanly. The preview is paused while you edit to avoid showing broken intermediate states \u2014 this unpauses it. If you forget to call this, the preview updates when your turn ends.",
|
|
2864
2841
|
inputSchema: {
|
|
@@ -2925,7 +2902,6 @@ async function lspRequest(endpoint, body) {
|
|
|
2925
2902
|
// src/tools/code/lspDiagnostics.ts
|
|
2926
2903
|
var lspDiagnosticsTool = {
|
|
2927
2904
|
definition: {
|
|
2928
|
-
clearable: true,
|
|
2929
2905
|
name: "lspDiagnostics",
|
|
2930
2906
|
description: "Get TypeScript diagnostics (type errors, warnings) for a file, with suggested fixes when available. Use this after editing a file to check for errors.",
|
|
2931
2907
|
inputSchema: {
|
|
@@ -2974,7 +2950,6 @@ var lspDiagnosticsTool = {
|
|
|
2974
2950
|
// src/tools/code/restartProcess.ts
|
|
2975
2951
|
var restartProcessTool = {
|
|
2976
2952
|
definition: {
|
|
2977
|
-
clearable: false,
|
|
2978
2953
|
name: "restartProcess",
|
|
2979
2954
|
description: "Restart a managed sandbox process. Use this after running npm install or changing package.json to restart the dev server so it picks up new dependencies.",
|
|
2980
2955
|
inputSchema: {
|
|
@@ -3001,7 +2976,6 @@ var restartProcessTool = {
|
|
|
3001
2976
|
// src/tools/code/runScenario.ts
|
|
3002
2977
|
var runScenarioTool = {
|
|
3003
2978
|
definition: {
|
|
3004
|
-
clearable: true,
|
|
3005
2979
|
name: "runScenario",
|
|
3006
2980
|
description: "Run a scenario to seed the dev database with test data. By default truncates all tables first, then executes the seed function and impersonates the scenario roles. Use skipTruncate to run the seed function against existing data without resetting. Blocks until complete. Scenario IDs are defined in mindstudio.json. If it fails, check .logs/tunnel.log or .logs/requests.ndjson for details. Return synchronously - no need to sleep before checking results.",
|
|
3007
2981
|
inputSchema: {
|
|
@@ -3027,7 +3001,6 @@ var runScenarioTool = {
|
|
|
3027
3001
|
// src/tools/code/runMethod.ts
|
|
3028
3002
|
var runMethodTool = {
|
|
3029
3003
|
definition: {
|
|
3030
|
-
clearable: true,
|
|
3031
3004
|
name: "runMethod",
|
|
3032
3005
|
description: 'Run a method in the dev environment and return the result. Use for testing methods after writing or modifying them. Returns output, captured console output, errors with stack traces, and duration. If it fails, check .logs/tunnel.log or .logs/requests.ndjson for more details. Returns synchronously \u2014 no need to sleep before checking results.\n\nBy default methods run unauthenticated. If the method is auth-gated (calls `auth.requireRole()`, filters on `auth.userId`, etc.), pass `userId: "testUser"` to run as the default test user \u2014 no scenario setup required, no userId lookup.',
|
|
3033
3006
|
inputSchema: {
|
|
@@ -3062,7 +3035,6 @@ var runMethodTool = {
|
|
|
3062
3035
|
// src/tools/code/queryDatabase.ts
|
|
3063
3036
|
var queryDatabaseTool = {
|
|
3064
3037
|
definition: {
|
|
3065
|
-
clearable: true,
|
|
3066
3038
|
name: "queryDatabase",
|
|
3067
3039
|
description: "Execute a raw SQL query against the dev database and return the results. Use for inspecting data and debugging issues.",
|
|
3068
3040
|
inputSchema: {
|
|
@@ -4134,7 +4106,6 @@ var COMMON_READ_TOOL_NAMES = new Set(
|
|
|
4134
4106
|
// src/subagents/browserAutomation/tools.ts
|
|
4135
4107
|
var BROWSER_TOOLS = [
|
|
4136
4108
|
{
|
|
4137
|
-
clearable: false,
|
|
4138
4109
|
name: "setupBrowser",
|
|
4139
4110
|
description: "Pre-authenticate the browser and optionally navigate to a starting page. Call this before interacting with authenticated content instead of manually logging in. Auth is optional \u2014 omit to just navigate without authenticating.",
|
|
4140
4111
|
inputSchema: {
|
|
@@ -4167,7 +4138,6 @@ var BROWSER_TOOLS = [
|
|
|
4167
4138
|
}
|
|
4168
4139
|
},
|
|
4169
4140
|
{
|
|
4170
|
-
clearable: true,
|
|
4171
4141
|
name: "browserCommand",
|
|
4172
4142
|
description: "Interact with the app's live preview by sending browser commands. Commands execute sequentially with an animated cursor. Always start with a snapshot to see the current state and get ref identifiers. The result includes a snapshot field with the final page state after all steps complete. On error, the failing step has an error field and execution stops. Batches that contain an interactive step (click, type, select) also return a `recording` object \u2014 one chunk of a continuous per-session rrweb recording that the viewer stitches into a single replay (not a standalone per-call clip). Timeout: 120s.",
|
|
4173
4143
|
inputSchema: {
|
|
@@ -4584,7 +4554,6 @@ async function runBrowserAutomation(task, context, opts) {
|
|
|
4584
4554
|
}
|
|
4585
4555
|
var browserAutomationTool = {
|
|
4586
4556
|
definition: {
|
|
4587
|
-
clearable: true,
|
|
4588
4557
|
name: "runAutomatedBrowserTest",
|
|
4589
4558
|
description: "Run an automated browser test against the live preview. Describe what to test \u2014 the agent figures out how. Use after meaningful changes to 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 \u2014 it will use its own judgement (often it needs specific values to trigger dev-mode bypasses of things like login verification codes).",
|
|
4590
4559
|
inputSchema: {
|
|
@@ -4614,7 +4583,6 @@ var browserAutomationTool = {
|
|
|
4614
4583
|
|
|
4615
4584
|
// src/tools/code/screenshot.ts
|
|
4616
4585
|
var screenshotDefinition = {
|
|
4617
|
-
clearable: true,
|
|
4618
4586
|
name: "screenshot",
|
|
4619
4587
|
description: "Capture a screenshot of the app preview and get a description of what's on screen. Choose `fullPage`: `false` captures just the visible viewport (fast \u2014 for a specific section the page is scrolled to), `true` captures the entire page top-to-bottom (slower \u2014 for overall composition or content past the fold). Captures the settled page state \u2014 it cannot catch animations, transitions, or transient state. The analysis is not precise about every detail \u2014 for example it cannot reliably identify specific fonts by name, only describe what the letterforms look like. Optionally provide specific questions about what you're looking for. Use a bulleted list to ask many questions at once. To ask additional questions about a screenshot you have already captured, pass its URL as `imageUrl` to skip recapture; `imageUrl` also accepts the disk path of an image file (a user upload, a saved asset) to analyze that instead of the preview. If the screenshot requires interaction first (logging in, clicking a tab, dismissing a modal, scrolling to a section), use the instructions param to describe the steps. To render a fixed-size image such as an Open Graph share card, set `width` and `height` (e.g. 1200 \xD7 630) and `format: 'png'`: the tool navigates to `path`, clips to exactly those pixel dimensions, and returns the image URL.",
|
|
4620
4588
|
inputSchema: {
|
|
@@ -4720,7 +4688,6 @@ __export(searchGoogle_exports, {
|
|
|
4720
4688
|
execute: () => execute
|
|
4721
4689
|
});
|
|
4722
4690
|
var definition = {
|
|
4723
|
-
clearable: false,
|
|
4724
4691
|
name: "searchGoogle",
|
|
4725
4692
|
description: 'Search Google for web results. Reserch modern design trends in industries or verticals, "best [domain] apps 2026", ui patterns, or find something specific if the the user has an explicit reference. Searching for and reading case studies is a great way to get information and context about a project\'s domain. Prioritize authoritative sources like Figma and other design leaders, avoid random blog spam. Pick one or more URLs from the results and then use `scrapeWebUrl` to get their text content.',
|
|
4726
4693
|
inputSchema: {
|
|
@@ -4753,7 +4720,6 @@ __export(scrapeWebUrl_exports, {
|
|
|
4753
4720
|
execute: () => execute2
|
|
4754
4721
|
});
|
|
4755
4722
|
var definition2 = {
|
|
4756
|
-
clearable: false,
|
|
4757
4723
|
name: "scrapeWebUrl",
|
|
4758
4724
|
description: "Fetch the content of a web page as markdown. Use when reading sites from search results or specific things the user wants to incorporate.",
|
|
4759
4725
|
inputSchema: {
|
|
@@ -4811,7 +4777,6 @@ Identify the specific design moves that make this page interesting and unique, d
|
|
|
4811
4777
|
Respond only with your analysis as Markdown and absolutely no other text. Do not use emojis - use unicode if you need symbols.
|
|
4812
4778
|
`;
|
|
4813
4779
|
var definition3 = {
|
|
4814
|
-
clearable: false,
|
|
4815
4780
|
name: "analyzeDesign",
|
|
4816
4781
|
description: "Analyze the visual design of a website, an image URL, or an image file on disk. Websites are automatically screenshotted first. Provides static image analysis only, will not capture animations or video. If no prompt is provided, performs a full design reference analysis (mood, color, typography, layout, distinctiveness). Provide a custom prompt to ask a specific design question instead. Use a bulleted list to ask many questions at once.",
|
|
4817
4782
|
inputSchema: {
|
|
@@ -4876,7 +4841,6 @@ __export(analyzeImage_exports, {
|
|
|
4876
4841
|
execute: () => execute4
|
|
4877
4842
|
});
|
|
4878
4843
|
var definition4 = {
|
|
4879
|
-
clearable: true,
|
|
4880
4844
|
name: "analyzeImage",
|
|
4881
4845
|
description: "Analyze an image using a vision model. Provides static image analysis only, will not capture animations or video. Returns an objective description of what is visible \u2014 shapes, colors, layout, text, artifacts. Use for factual inventory of image contents, not for subjective design judgment - the vision model providing the analysis has no sense of design. You are the design expert - use the analysis tool for factual inventory, then apply your own expertise for quality and suitability assessments. Optionally provide specific questions about what you're looking for. Use a bulleted list to ask many questions at once. If you are analyzing a screenshot of the app preview, you can reuse the same screenshot URL multiple times to ask multiple questions.",
|
|
4882
4846
|
inputSchema: {
|
|
@@ -5110,7 +5074,6 @@ async function generateImageAssets(opts) {
|
|
|
5110
5074
|
|
|
5111
5075
|
// src/subagents/designExpert/tools/images/generateImages.ts
|
|
5112
5076
|
var definition5 = {
|
|
5113
|
-
clearable: false,
|
|
5114
5077
|
name: "generateImages",
|
|
5115
5078
|
description: "Generate images. Returns CDN URLs with a quality analysis for each image. Produces high-quality results for everything from photorealistic images and abstract/creative visuals. Pass multiple prompts to generate in parallel. No need to analyze images separately after generating \u2014 the analysis is included.",
|
|
5116
5079
|
inputSchema: {
|
|
@@ -5178,7 +5141,6 @@ __export(editImages_exports, {
|
|
|
5178
5141
|
execute: () => execute6
|
|
5179
5142
|
});
|
|
5180
5143
|
var definition6 = {
|
|
5181
|
-
clearable: false,
|
|
5182
5144
|
name: "editImages",
|
|
5183
5145
|
description: "Edit or transform existing images. Provide one or more source image URLs as reference and a prompt describing the desired edit. Use for compositing, style transfer, subject transformation, blending multiple references, or incorporating one or more references into something new. Returns CDN URLs with analysis.",
|
|
5184
5146
|
inputSchema: {
|
|
@@ -5256,7 +5218,6 @@ var COPY_EDITOR_TOOLS = [...COMMON_READ_TOOLS];
|
|
|
5256
5218
|
var BASE_PROMPT2 = readAsset("subagents/copyEditor", "prompt.md");
|
|
5257
5219
|
var copyEditorTool = {
|
|
5258
5220
|
definition: {
|
|
5259
|
-
clearable: false,
|
|
5260
5221
|
name: "copyEditor",
|
|
5261
5222
|
description: "Hand it user-facing copy and it hands back a sharper version \u2014 better structured for its audience and free of the overused words, telltale constructions, and rhythms that make text read as AI-generated. Think of it as a design expert for words: it elevates how the copy communicates and strips the AI fingerprints, but it never invents facts or claims you didn't give it. Use it on anything users will read: in-app strings, empty states, errors, the Build Overview, deck copy, launch posts, Slack announcements. Readonly.",
|
|
5262
5223
|
inputSchema: {
|
|
@@ -5304,7 +5265,6 @@ var copyEditorTool = {
|
|
|
5304
5265
|
|
|
5305
5266
|
// src/subagents/designExpert/tools/polishCopy.ts
|
|
5306
5267
|
var definition7 = {
|
|
5307
|
-
clearable: false,
|
|
5308
5268
|
name: "polishCopy",
|
|
5309
5269
|
description: "Hand off any user-facing copy you've written \u2014 headlines, captions, labels, body text \u2014 and get back a sharper version: better built for its audience and free of the fingerprints that make writing read as AI. It elevates how the copy communicates without inventing facts or claims you didn't give it. Give it the text plus what it's for (where it appears, the audience).",
|
|
5310
5270
|
inputSchema: {
|
|
@@ -5656,7 +5616,6 @@ async function runDesignExpert(opts, context) {
|
|
|
5656
5616
|
}
|
|
5657
5617
|
var designExpertTool = {
|
|
5658
5618
|
definition: {
|
|
5659
|
-
clearable: false,
|
|
5660
5619
|
name: "visualDesignExpert",
|
|
5661
5620
|
description: DESCRIPTION,
|
|
5662
5621
|
inputSchema: {
|
|
@@ -5864,7 +5823,6 @@ function getProductVisionPrompt() {
|
|
|
5864
5823
|
// src/subagents/productVision/index.ts
|
|
5865
5824
|
var productVisionTool = {
|
|
5866
5825
|
definition: {
|
|
5867
|
-
clearable: false,
|
|
5868
5826
|
name: "productVision",
|
|
5869
5827
|
description: "Owns the product roadmap. Reads spec and roadmap files automatically. Creates, updates, and deletes roadmap items in src/roadmap/. Describe the situation and what needs to happen.",
|
|
5870
5828
|
inputSchema: {
|
|
@@ -5977,7 +5935,6 @@ var SANITY_CHECK_TOOLS = [
|
|
|
5977
5935
|
var BASE_PROMPT4 = readAsset("subagents/codeSanityCheck", "prompt.md");
|
|
5978
5936
|
var codeSanityCheckTool = {
|
|
5979
5937
|
definition: {
|
|
5980
|
-
clearable: false,
|
|
5981
5938
|
name: "codeSanityCheck",
|
|
5982
5939
|
description: 'Quick sanity check on an approach before building. Reviews architecture, package choices, and flags potential issues. Usually responds with "looks good." Occasionally catches something important. Readonly \u2014 can search the web and read code but cannot modify anything.',
|
|
5983
5940
|
inputSchema: {
|
|
@@ -6112,7 +6069,6 @@ ${result.text}`;
|
|
|
6112
6069
|
}
|
|
6113
6070
|
var buildOverviewTool = {
|
|
6114
6071
|
definition: {
|
|
6115
|
-
clearable: false,
|
|
6116
6072
|
name: "writeBuildOverview",
|
|
6117
6073
|
description: "Generate or refresh the Build Overview \u2014 the project's home page in the Spec tab: a single-page, plain-language reference of everything the app actually contains, including the parts the user can't see (data stores, backend operations, access and roles, background jobs, seeded scenarios, the design system). You author the full copy: read the manifest and spec and state, plainly and exactly, what genuinely exists \u2014 real names and accurate counts \u2014 in calm, declarative, present-tense outcome language, with no persuasion or hype. Describe only what exists. Pass the complete copy as `content`; the design expert lays it out and skins it to the app's brand using your copy verbatim \u2014 it typesets your words, it does not rewrite them, so polish the copy before you pass it. Generate it at the end of a build; routine refreshes ride specSync's `refreshBuildOverview` flag instead, so call this directly only for the initial generation or when the user explicitly asks.",
|
|
6118
6074
|
inputSchema: {
|
|
@@ -6173,7 +6129,6 @@ var specSyncTool = {
|
|
|
6173
6129
|
// next real turn as a hidden background_results note instead.
|
|
6174
6130
|
backgroundNotify: "passive",
|
|
6175
6131
|
definition: {
|
|
6176
|
-
clearable: false,
|
|
6177
6132
|
name: "specSync",
|
|
6178
6133
|
description: "Reconcile the spec to bring it in line with code changes you have made. Provide a brief, bulleted list of what changed and why; it finds the affected spec sections and updates them to match. Set `refreshBuildOverview` after a deploy or a large milestone to also re-author the Build Overview from the updated spec. Always runs in the background and completes silently \u2014 do not wait for it; its outcome appears as an automated note at the start of a later turn.",
|
|
6179
6134
|
inputSchema: {
|
|
@@ -6260,7 +6215,6 @@ After reconciling the spec, refresh the Build Overview: author the complete upda
|
|
|
6260
6215
|
// src/tools/common/scrapeWebUrl.ts
|
|
6261
6216
|
var scrapeWebUrlTool = {
|
|
6262
6217
|
definition: {
|
|
6263
|
-
clearable: false,
|
|
6264
6218
|
name: "scrapeWebUrl",
|
|
6265
6219
|
description: "Scrape the content of a web page. Returns the HTML of the page as markdown text. Optionally capture a screenshot if you need see the visual design. Use this when you need to fetch or analyze content from a website",
|
|
6266
6220
|
inputSchema: {
|
package/dist/index.js
CHANGED
|
@@ -403,7 +403,6 @@ var init_readSpec = __esm({
|
|
|
403
403
|
DEFAULT_MAX_LINES = 500;
|
|
404
404
|
readSpecTool = {
|
|
405
405
|
definition: {
|
|
406
|
-
clearable: true,
|
|
407
406
|
name: "readSpec",
|
|
408
407
|
description: "Read a spec file from src/ with line numbers. Always read a spec file before editing it. Paths are relative to the project root and must start with src/ (e.g., src/app.md, src/interfaces/web.md).",
|
|
409
408
|
inputSchema: {
|
|
@@ -536,7 +535,6 @@ var init_writeSpec = __esm({
|
|
|
536
535
|
init_fileLock();
|
|
537
536
|
writeSpecTool = {
|
|
538
537
|
definition: {
|
|
539
|
-
clearable: true,
|
|
540
538
|
name: "writeSpec",
|
|
541
539
|
description: "Create a new spec file or completely overwrite an existing one in src/. Parent directories are created automatically. Use this for new spec files or full rewrites. For targeted changes to existing specs, use editSpec instead.",
|
|
542
540
|
inputSchema: {
|
|
@@ -687,7 +685,6 @@ var init_editSpec = __esm({
|
|
|
687
685
|
init_fileLock();
|
|
688
686
|
editSpecTool = {
|
|
689
687
|
definition: {
|
|
690
|
-
clearable: true,
|
|
691
688
|
name: "editSpec",
|
|
692
689
|
description: "Make a targeted find/replace edit to a spec file (src/*.md). old_string must appear exactly once (minor indentation differences are handled automatically); set replace_all to true to replace every occurrence. Read the file with readSpec first so you match the exact text, and include the full enclosing structure rather than an inner fragment. The file's YAML frontmatter (the leading --- \u2026 --- block, which holds required fields like name) is protected \u2014 an edit that would remove or malform it is refused. For a full rewrite, use writeSpec.",
|
|
693
690
|
inputSchema: {
|
|
@@ -821,7 +818,6 @@ var init_listSpecFiles = __esm({
|
|
|
821
818
|
"use strict";
|
|
822
819
|
listSpecFilesTool = {
|
|
823
820
|
definition: {
|
|
824
|
-
clearable: false,
|
|
825
821
|
name: "listSpecFiles",
|
|
826
822
|
description: "List all files in the src/ directory (spec files, brand guidelines, interface specs, references). Use this to understand what spec files exist before reading or editing them.",
|
|
827
823
|
inputSchema: {
|
|
@@ -855,7 +851,6 @@ var init_presentPublishPlan = __esm({
|
|
|
855
851
|
"use strict";
|
|
856
852
|
presentPublishPlanTool = {
|
|
857
853
|
definition: {
|
|
858
|
-
clearable: false,
|
|
859
854
|
name: "presentPublishPlan",
|
|
860
855
|
description: "Present a publish changelog to the user for approval. Write a clear markdown summary of what changed since the last deploy. The user will see this in a full-screen view and can approve or dismiss. Call this BEFORE committing or pushing.",
|
|
861
856
|
inputSchema: {
|
|
@@ -886,7 +881,6 @@ var init_writePlan = __esm({
|
|
|
886
881
|
PLAN_FILE = ".remy-plan.md";
|
|
887
882
|
writePlanTool = {
|
|
888
883
|
definition: {
|
|
889
|
-
clearable: false,
|
|
890
884
|
name: "writePlan",
|
|
891
885
|
description: "Write an implementation plan for user approval before making changes. Use this only for large, multi-step changes like new features, new interface types, or when the user explicitly asks to see a plan. Most work should be done autonomously without a plan. Write a clear markdown summary of what you intend to do in plain language \u2014 describe the changes from the user's perspective, not as a list of files and code paths. The plan is displayed standalone in the UI with approve/reject buttons attached. The plan body ends with its last substantive section \u2014 do not write any closing line addressed to the reader. No 'If this lands, I'll start building,' no 'Let me know what to adjust,' no 'Approve when ready,' no trailing horizontal rule with a sign-off. Wrap-up text belongs in your chat message alongside the plan, not in the plan file. If the user asks for revisions, call this tool again with updated content to overwrite the plan.",
|
|
892
886
|
inputSchema: {
|
|
@@ -923,7 +917,6 @@ var init_updatePlanStatus = __esm({
|
|
|
923
917
|
PLAN_FILE2 = ".remy-plan.md";
|
|
924
918
|
updatePlanStatusTool = {
|
|
925
919
|
definition: {
|
|
926
|
-
clearable: false,
|
|
927
920
|
name: "updatePlanStatus",
|
|
928
921
|
description: 'Update the status of the current implementation plan. Use when the user approves or rejects the plan via chat (e.g. "looks good, go ahead" or "scrap it"). Approving sets the plan to active so you can begin implementation. Rejecting deletes the plan.',
|
|
929
922
|
inputSchema: {
|
|
@@ -971,7 +964,6 @@ var init_setProjectOnboardingState = __esm({
|
|
|
971
964
|
"use strict";
|
|
972
965
|
setProjectOnboardingStateTool = {
|
|
973
966
|
definition: {
|
|
974
|
-
clearable: false,
|
|
975
967
|
name: "setProjectOnboardingState",
|
|
976
968
|
description: "Advance the project onboarding state. Forward-only: building \u2192 buildComplete \u2192 onboardingFinished. Normally driven by automated actions \u2014 don't call this out of order during a normal build, or you'll skip stages the user hasn't experienced. Exception: if the project has been in `building` for a while, the build is clearly done (the user is iterating on a working app, deploying, etc.), and the user reports the editor seems stuck \u2014 disabled Preview/Spec/Code tabs, no reveal, etc. \u2014 call `setProjectOnboardingState({ state: 'buildComplete' })` to unstick them. `onboardingFinished` is always set by the frontend after the user dismisses the reveal; never call it yourself.",
|
|
977
969
|
inputSchema: {
|
|
@@ -1000,7 +992,6 @@ var init_promptUser = __esm({
|
|
|
1000
992
|
"use strict";
|
|
1001
993
|
promptUserTool = {
|
|
1002
994
|
definition: {
|
|
1003
|
-
clearable: false,
|
|
1004
995
|
name: "promptUser",
|
|
1005
996
|
description: 'Ask the user structured questions. Choose type first: "form" for structured intake (5+ questions, takes over screen), "inline" for quick clarifications or confirmations. Blocks until the user responds. Result contains `_dismissed: true` if the user dismisses without answering.',
|
|
1006
997
|
inputSchema: {
|
|
@@ -1138,7 +1129,6 @@ var init_confirmDestructiveAction = __esm({
|
|
|
1138
1129
|
"use strict";
|
|
1139
1130
|
confirmDestructiveActionTool = {
|
|
1140
1131
|
definition: {
|
|
1141
|
-
clearable: false,
|
|
1142
1132
|
name: "confirmDestructiveAction",
|
|
1143
1133
|
description: "Confirm a destructive or irreversible action with the user. Use for things like deleting data, resetting the database, or discarding draft work. Do not use after presentPublishPlan or writePlan (those already include approval). Do not use before onboarding state transitions.",
|
|
1144
1134
|
inputSchema: {
|
|
@@ -1325,7 +1315,6 @@ var init_sdkConsultant = __esm({
|
|
|
1325
1315
|
init_runCli();
|
|
1326
1316
|
askMindStudioSdkTool = {
|
|
1327
1317
|
definition: {
|
|
1328
|
-
clearable: false,
|
|
1329
1318
|
name: "askMindStudioSdk",
|
|
1330
1319
|
description: "@mindstudio-ai/agent backend SDK expert. Knows every backend action, AI model, connector, and configuration option. Returns architectural guidance and working code. Only covers the backend SDK (@mindstudio-ai/agent) \u2014 do NOT use for frontend/interface SDK questions (@mindstudio-ai/interface) like file uploads, auth, or client-side APIs. Describe what you want to build, not just what API method you need. Batch related questions into a single query.",
|
|
1331
1320
|
inputSchema: {
|
|
@@ -1487,7 +1476,6 @@ var init_searchGoogle = __esm({
|
|
|
1487
1476
|
init_runCli();
|
|
1488
1477
|
searchGoogleTool = {
|
|
1489
1478
|
definition: {
|
|
1490
|
-
clearable: false,
|
|
1491
1479
|
name: "searchGoogle",
|
|
1492
1480
|
description: "Search Google and return results. Use for research, finding documentation, looking up APIs, or any task where web search would help.",
|
|
1493
1481
|
inputSchema: {
|
|
@@ -1524,7 +1512,6 @@ var init_setProjectMetadata = __esm({
|
|
|
1524
1512
|
"use strict";
|
|
1525
1513
|
setProjectMetadataTool = {
|
|
1526
1514
|
definition: {
|
|
1527
|
-
clearable: false,
|
|
1528
1515
|
name: "setProjectMetadata",
|
|
1529
1516
|
description: "Set project metadata. Can update any combination of: display name, short description, app icon, and Open Graph share image. Provide only the fields you want to change.",
|
|
1530
1517
|
inputSchema: {
|
|
@@ -2878,7 +2865,6 @@ var init_compactConversation = __esm({
|
|
|
2878
2865
|
// call (cleanMessagesForApi).
|
|
2879
2866
|
backgroundNotify: "silent",
|
|
2880
2867
|
definition: {
|
|
2881
|
-
clearable: false,
|
|
2882
2868
|
name: "compactConversation",
|
|
2883
2869
|
description: "Compact the conversation history by summarizing older messages into a checkpoint. The summary preserves key decisions, what was built, and the current state of the project, but drops the verbose tool results, diffs, and intermediate steps that are no longer useful. Runs in the background.",
|
|
2884
2870
|
inputSchema: {
|
|
@@ -3013,7 +2999,6 @@ var init_loadSkill = __esm({
|
|
|
3013
2999
|
init_catalog();
|
|
3014
3000
|
loadSkillTool = {
|
|
3015
3001
|
definition: {
|
|
3016
|
-
clearable: true,
|
|
3017
3002
|
name: "loadSkill",
|
|
3018
3003
|
description: "Load the full reference for a platform capability that isn't in your system prompt \u2014 task agents, agent interfaces, voice interfaces, MCP interfaces, data sources. The available skills and the trigger for each are listed in <available_skills>. Load one before writing code in its area, not after: these are APIs where a plausible-looking guess is usually wrong. Calling this is cheap and expected \u2014 if you're unsure whether you need it, load it. Only covers the capabilities listed in the catalog; for backend SDK actions and model IDs use askMindStudioSdk.",
|
|
3019
3004
|
inputSchema: {
|
|
@@ -3070,7 +3055,6 @@ var init_readFile = __esm({
|
|
|
3070
3055
|
MAX_BYTES = 64 * 1024;
|
|
3071
3056
|
readFileTool = {
|
|
3072
3057
|
definition: {
|
|
3073
|
-
clearable: true,
|
|
3074
3058
|
name: "readFile",
|
|
3075
3059
|
description: "Read a file's contents with line numbers. Always read a file before editing it \u2014 never guess at contents. By default returns the first 500 lines, and at most 64KB \u2014 a file with very wide lines (a CSV, a minified bundle) comes back short of 500 lines, so read a narrower range or grep rather than paging through it. To read a specific range, pass startLine and endLine (1-indexed, inclusive) \u2014 e.g. to read lines 253\u2013343, pass startLine: 253, endLine: 343. To read the end of a file or log, pass tail (the number of lines from the end). Line numbers in the output correspond to what editFile expects. For a large file, locate the relevant section first (symbols or grep), then read just that range.",
|
|
3076
3060
|
inputSchema: {
|
|
@@ -3182,7 +3166,6 @@ var init_writeFile = __esm({
|
|
|
3182
3166
|
init_fileLock();
|
|
3183
3167
|
writeFileTool = {
|
|
3184
3168
|
definition: {
|
|
3185
|
-
clearable: true,
|
|
3186
3169
|
name: "writeFile",
|
|
3187
3170
|
description: "Create a new file or completely overwrite an existing one. Parent directories are created automatically. Use this for new files or full rewrites. For targeted changes to existing files, use editFile instead \u2014 it preserves the parts you don't want to change and avoids errors from forgetting to include unchanged code.",
|
|
3188
3171
|
inputSchema: {
|
|
@@ -3257,7 +3240,6 @@ var init_editFile = __esm({
|
|
|
3257
3240
|
init_helpers2();
|
|
3258
3241
|
editFileTool = {
|
|
3259
3242
|
definition: {
|
|
3260
|
-
clearable: true,
|
|
3261
3243
|
name: "editFile",
|
|
3262
3244
|
description: "Replace a string in a file. old_string must appear exactly once (minor indentation differences are handled automatically). Set replace_all to true to replace every occurrence at once. For bulk mechanical substitutions (renaming a variable, swapping colors), prefer replace_all. Always read the file first so you know the exact text to match. When editing nested structures (objects, function bodies, arrays, template literals), always include the full enclosing structure in old_string rather than just an inner fragment. Replacing a partial slice from the middle of nested code is the most common source of syntax errors.",
|
|
3263
3245
|
inputSchema: {
|
|
@@ -3366,7 +3348,6 @@ var init_bash = __esm({
|
|
|
3366
3348
|
MAX_OUTPUT_BYTES = 3e4;
|
|
3367
3349
|
bashTool = {
|
|
3368
3350
|
definition: {
|
|
3369
|
-
clearable: true,
|
|
3370
3351
|
name: "bash",
|
|
3371
3352
|
description: "Run a shell command and return stdout + stderr. 120-second timeout by default (configurable). Use for: npm install/build/test, git operations, tsc --noEmit, or any CLI tool. Prefer dedicated tools over bash when available (use grep instead of bash + rg, readFile instead of bash + cat). Output is truncated to 500 lines or 30KB, whichever comes first. If a command would emit a lot of data, narrow it down (grep, head/tail, --short flags) rather than reading everything.",
|
|
3372
3353
|
inputSchema: {
|
|
@@ -3494,7 +3475,6 @@ var init_grep = __esm({
|
|
|
3494
3475
|
DEFAULT_MAX = 50;
|
|
3495
3476
|
grepTool = {
|
|
3496
3477
|
definition: {
|
|
3497
|
-
clearable: true,
|
|
3498
3478
|
name: "grep",
|
|
3499
3479
|
description: "Search file contents for a regex pattern. Returns matching lines with file paths and line numbers (default 50 results). Use this to find where something is used, locate function definitions, or search for patterns across the codebase. Set outputMode to 'count' for per-file match counts (like grep -c) or 'filesWithMatches' for just the file paths (like grep -l). Add context (like grep -C), or contextBefore/contextAfter (like grep -B/-A), to include surrounding lines. Set caseInsensitive (like grep -i) for a case-insensitive search. For finding a symbol's definition precisely, prefer the definition tool if LSP is available. Automatically excludes node_modules and .git.",
|
|
3500
3480
|
inputSchema: {
|
|
@@ -3612,7 +3592,6 @@ var init_glob = __esm({
|
|
|
3612
3592
|
DEFAULT_MAX2 = 200;
|
|
3613
3593
|
globTool = {
|
|
3614
3594
|
definition: {
|
|
3615
|
-
clearable: true,
|
|
3616
3595
|
name: "glob",
|
|
3617
3596
|
description: 'Find files matching a glob pattern. Returns matching file paths sorted alphabetically (default 200 results). Use this to discover project structure, find files by name or extension, or check if a file exists. Common patterns: "**/*.ts" (all TypeScript files), "src/**/*.tsx" (React components in src), "*.json" (root-level JSON files). Automatically excludes node_modules and .git.',
|
|
3618
3597
|
inputSchema: {
|
|
@@ -3716,7 +3695,6 @@ var init_listDir = __esm({
|
|
|
3716
3695
|
MAX_CHILDREN = 15;
|
|
3717
3696
|
listDirTool = {
|
|
3718
3697
|
definition: {
|
|
3719
|
-
clearable: true,
|
|
3720
3698
|
name: "listDir",
|
|
3721
3699
|
description: "List the contents of a directory with one level of subdirectory expansion. Shows file sizes and collapses single-child directory chains (a/b/c/ shown as one entry). Use this for a quick overview of a directory's structure. For finding files across the whole project, use glob instead.",
|
|
3722
3700
|
inputSchema: {
|
|
@@ -3799,7 +3777,6 @@ var init_editsFinished = __esm({
|
|
|
3799
3777
|
"use strict";
|
|
3800
3778
|
editsFinishedTool = {
|
|
3801
3779
|
definition: {
|
|
3802
|
-
clearable: false,
|
|
3803
3780
|
name: "editsFinished",
|
|
3804
3781
|
description: "Signal that file edits are complete. Call this after you finish writing/editing files so the live preview updates cleanly. The preview is paused while you edit to avoid showing broken intermediate states \u2014 this unpauses it. If you forget to call this, the preview updates when your turn ends.",
|
|
3805
3782
|
inputSchema: {
|
|
@@ -3887,7 +3864,6 @@ var init_lspDiagnostics = __esm({
|
|
|
3887
3864
|
init_lsp();
|
|
3888
3865
|
lspDiagnosticsTool = {
|
|
3889
3866
|
definition: {
|
|
3890
|
-
clearable: true,
|
|
3891
3867
|
name: "lspDiagnostics",
|
|
3892
3868
|
description: "Get TypeScript diagnostics (type errors, warnings) for a file, with suggested fixes when available. Use this after editing a file to check for errors.",
|
|
3893
3869
|
inputSchema: {
|
|
@@ -3943,7 +3919,6 @@ var init_restartProcess = __esm({
|
|
|
3943
3919
|
init_lsp();
|
|
3944
3920
|
restartProcessTool = {
|
|
3945
3921
|
definition: {
|
|
3946
|
-
clearable: false,
|
|
3947
3922
|
name: "restartProcess",
|
|
3948
3923
|
description: "Restart a managed sandbox process. Use this after running npm install or changing package.json to restart the dev server so it picks up new dependencies.",
|
|
3949
3924
|
inputSchema: {
|
|
@@ -3976,7 +3951,6 @@ var init_runScenario = __esm({
|
|
|
3976
3951
|
"use strict";
|
|
3977
3952
|
runScenarioTool = {
|
|
3978
3953
|
definition: {
|
|
3979
|
-
clearable: true,
|
|
3980
3954
|
name: "runScenario",
|
|
3981
3955
|
description: "Run a scenario to seed the dev database with test data. By default truncates all tables first, then executes the seed function and impersonates the scenario roles. Use skipTruncate to run the seed function against existing data without resetting. Blocks until complete. Scenario IDs are defined in mindstudio.json. If it fails, check .logs/tunnel.log or .logs/requests.ndjson for details. Return synchronously - no need to sleep before checking results.",
|
|
3982
3956
|
inputSchema: {
|
|
@@ -4008,7 +3982,6 @@ var init_runMethod = __esm({
|
|
|
4008
3982
|
"use strict";
|
|
4009
3983
|
runMethodTool = {
|
|
4010
3984
|
definition: {
|
|
4011
|
-
clearable: true,
|
|
4012
3985
|
name: "runMethod",
|
|
4013
3986
|
description: 'Run a method in the dev environment and return the result. Use for testing methods after writing or modifying them. Returns output, captured console output, errors with stack traces, and duration. If it fails, check .logs/tunnel.log or .logs/requests.ndjson for more details. Returns synchronously \u2014 no need to sleep before checking results.\n\nBy default methods run unauthenticated. If the method is auth-gated (calls `auth.requireRole()`, filters on `auth.userId`, etc.), pass `userId: "testUser"` to run as the default test user \u2014 no scenario setup required, no userId lookup.',
|
|
4014
3987
|
inputSchema: {
|
|
@@ -4049,7 +4022,6 @@ var init_queryDatabase = __esm({
|
|
|
4049
4022
|
"use strict";
|
|
4050
4023
|
queryDatabaseTool = {
|
|
4051
4024
|
definition: {
|
|
4052
|
-
clearable: true,
|
|
4053
4025
|
name: "queryDatabase",
|
|
4054
4026
|
description: "Execute a raw SQL query against the dev database and return the results. Use for inspecting data and debugging issues.",
|
|
4055
4027
|
inputSchema: {
|
|
@@ -5026,7 +4998,6 @@ var init_tools2 = __esm({
|
|
|
5026
4998
|
init_readSpec();
|
|
5027
4999
|
BROWSER_TOOLS = [
|
|
5028
5000
|
{
|
|
5029
|
-
clearable: false,
|
|
5030
5001
|
name: "setupBrowser",
|
|
5031
5002
|
description: "Pre-authenticate the browser and optionally navigate to a starting page. Call this before interacting with authenticated content instead of manually logging in. Auth is optional \u2014 omit to just navigate without authenticating.",
|
|
5032
5003
|
inputSchema: {
|
|
@@ -5059,7 +5030,6 @@ var init_tools2 = __esm({
|
|
|
5059
5030
|
}
|
|
5060
5031
|
},
|
|
5061
5032
|
{
|
|
5062
|
-
clearable: true,
|
|
5063
5033
|
name: "browserCommand",
|
|
5064
5034
|
description: "Interact with the app's live preview by sending browser commands. Commands execute sequentially with an animated cursor. Always start with a snapshot to see the current state and get ref identifiers. The result includes a snapshot field with the final page state after all steps complete. On error, the failing step has an error field and execution stops. Batches that contain an interactive step (click, type, select) also return a `recording` object \u2014 one chunk of a continuous per-session rrweb recording that the viewer stitches into a single replay (not a standalone per-call clip). Timeout: 120s.",
|
|
5065
5035
|
inputSchema: {
|
|
@@ -5507,7 +5477,6 @@ var init_browserAutomation = __esm({
|
|
|
5507
5477
|
CAPTURE_COMMANDS = /* @__PURE__ */ new Set(["screenshotViewport", "screenshotFullPage"]);
|
|
5508
5478
|
browserAutomationTool = {
|
|
5509
5479
|
definition: {
|
|
5510
|
-
clearable: true,
|
|
5511
5480
|
name: "runAutomatedBrowserTest",
|
|
5512
5481
|
description: "Run an automated browser test against the live preview. Describe what to test \u2014 the agent figures out how. Use after meaningful changes to 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 \u2014 it will use its own judgement (often it needs specific values to trigger dev-mode bypasses of things like login verification codes).",
|
|
5513
5482
|
inputSchema: {
|
|
@@ -5598,7 +5567,6 @@ var init_screenshot2 = __esm({
|
|
|
5598
5567
|
init_browserAutomation();
|
|
5599
5568
|
init_surfaces();
|
|
5600
5569
|
screenshotDefinition = {
|
|
5601
|
-
clearable: true,
|
|
5602
5570
|
name: "screenshot",
|
|
5603
5571
|
description: "Capture a screenshot of the app preview and get a description of what's on screen. Choose `fullPage`: `false` captures just the visible viewport (fast \u2014 for a specific section the page is scrolled to), `true` captures the entire page top-to-bottom (slower \u2014 for overall composition or content past the fold). Captures the settled page state \u2014 it cannot catch animations, transitions, or transient state. The analysis is not precise about every detail \u2014 for example it cannot reliably identify specific fonts by name, only describe what the letterforms look like. Optionally provide specific questions about what you're looking for. Use a bulleted list to ask many questions at once. To ask additional questions about a screenshot you have already captured, pass its URL as `imageUrl` to skip recapture; `imageUrl` also accepts the disk path of an image file (a user upload, a saved asset) to analyze that instead of the preview. If the screenshot requires interaction first (logging in, clicking a tab, dismissing a modal, scrolling to a section), use the instructions param to describe the steps. To render a fixed-size image such as an Open Graph share card, set `width` and `height` (e.g. 1200 \xD7 630) and `format: 'png'`: the tool navigates to `path`, clips to exactly those pixel dimensions, and returns the image URL.",
|
|
5604
5572
|
inputSchema: {
|
|
@@ -5672,7 +5640,6 @@ var init_searchGoogle2 = __esm({
|
|
|
5672
5640
|
init_runMindstudioCli();
|
|
5673
5641
|
init_runCli();
|
|
5674
5642
|
definition = {
|
|
5675
|
-
clearable: false,
|
|
5676
5643
|
name: "searchGoogle",
|
|
5677
5644
|
description: 'Search Google for web results. Reserch modern design trends in industries or verticals, "best [domain] apps 2026", ui patterns, or find something specific if the the user has an explicit reference. Searching for and reading case studies is a great way to get information and context about a project\'s domain. Prioritize authoritative sources like Figma and other design leaders, avoid random blog spam. Pick one or more URLs from the results and then use `scrapeWebUrl` to get their text content.',
|
|
5678
5645
|
inputSchema: {
|
|
@@ -5715,7 +5682,6 @@ var init_scrapeWebUrl = __esm({
|
|
|
5715
5682
|
init_runMindstudioCli();
|
|
5716
5683
|
init_runCli();
|
|
5717
5684
|
definition2 = {
|
|
5718
|
-
clearable: false,
|
|
5719
5685
|
name: "scrapeWebUrl",
|
|
5720
5686
|
description: "Fetch the content of a web page as markdown. Use when reading sites from search results or specific things the user wants to incorporate.",
|
|
5721
5687
|
inputSchema: {
|
|
@@ -5808,7 +5774,6 @@ Identify the specific design moves that make this page interesting and unique, d
|
|
|
5808
5774
|
Respond only with your analysis as Markdown and absolutely no other text. Do not use emojis - use unicode if you need symbols.
|
|
5809
5775
|
`;
|
|
5810
5776
|
definition3 = {
|
|
5811
|
-
clearable: false,
|
|
5812
5777
|
name: "analyzeDesign",
|
|
5813
5778
|
description: "Analyze the visual design of a website, an image URL, or an image file on disk. Websites are automatically screenshotted first. Provides static image analysis only, will not capture animations or video. If no prompt is provided, performs a full design reference analysis (mood, color, typography, layout, distinctiveness). Provide a custom prompt to ask a specific design question instead. Use a bulleted list to ask many questions at once.",
|
|
5814
5779
|
inputSchema: {
|
|
@@ -5856,7 +5821,6 @@ var init_analyzeImage2 = __esm({
|
|
|
5856
5821
|
init_screenshot();
|
|
5857
5822
|
init_surfaces();
|
|
5858
5823
|
definition4 = {
|
|
5859
|
-
clearable: true,
|
|
5860
5824
|
name: "analyzeImage",
|
|
5861
5825
|
description: "Analyze an image using a vision model. Provides static image analysis only, will not capture animations or video. Returns an objective description of what is visible \u2014 shapes, colors, layout, text, artifacts. Use for factual inventory of image contents, not for subjective design judgment - the vision model providing the analysis has no sense of design. You are the design expert - use the analysis tool for factual inventory, then apply your own expertise for quality and suitability assessments. Optionally provide specific questions about what you're looking for. Use a bulleted list to ask many questions at once. If you are analyzing a screenshot of the app preview, you can reuse the same screenshot URL multiple times to ask multiple questions.",
|
|
5862
5826
|
inputSchema: {
|
|
@@ -6128,7 +6092,6 @@ var init_generateImages = __esm({
|
|
|
6128
6092
|
init_imageGenerator();
|
|
6129
6093
|
init_surfaces();
|
|
6130
6094
|
definition5 = {
|
|
6131
|
-
clearable: false,
|
|
6132
6095
|
name: "generateImages",
|
|
6133
6096
|
description: "Generate images. Returns CDN URLs with a quality analysis for each image. Produces high-quality results for everything from photorealistic images and abstract/creative visuals. Pass multiple prompts to generate in parallel. No need to analyze images separately after generating \u2014 the analysis is included.",
|
|
6134
6097
|
inputSchema: {
|
|
@@ -6204,7 +6167,6 @@ var init_editImages = __esm({
|
|
|
6204
6167
|
init_imageGenerator();
|
|
6205
6168
|
init_surfaces();
|
|
6206
6169
|
definition6 = {
|
|
6207
|
-
clearable: false,
|
|
6208
6170
|
name: "editImages",
|
|
6209
6171
|
description: "Edit or transform existing images. Provide one or more source image URLs as reference and a prompt describing the desired edit. Use for compositing, style transfer, subject transformation, blending multiple references, or incorporating one or more references into something new. Returns CDN URLs with analysis.",
|
|
6210
6172
|
inputSchema: {
|
|
@@ -6267,7 +6229,6 @@ var init_copyEditor = __esm({
|
|
|
6267
6229
|
BASE_PROMPT2 = readAsset("subagents/copyEditor", "prompt.md");
|
|
6268
6230
|
copyEditorTool = {
|
|
6269
6231
|
definition: {
|
|
6270
|
-
clearable: false,
|
|
6271
6232
|
name: "copyEditor",
|
|
6272
6233
|
description: "Hand it user-facing copy and it hands back a sharper version \u2014 better structured for its audience and free of the overused words, telltale constructions, and rhythms that make text read as AI-generated. Think of it as a design expert for words: it elevates how the copy communicates and strips the AI fingerprints, but it never invents facts or claims you didn't give it. Use it on anything users will read: in-app strings, empty states, errors, the Build Overview, deck copy, launch posts, Slack announcements. Readonly.",
|
|
6273
6234
|
inputSchema: {
|
|
@@ -6330,7 +6291,6 @@ var init_polishCopy = __esm({
|
|
|
6330
6291
|
"use strict";
|
|
6331
6292
|
init_copyEditor();
|
|
6332
6293
|
definition7 = {
|
|
6333
|
-
clearable: false,
|
|
6334
6294
|
name: "polishCopy",
|
|
6335
6295
|
description: "Hand off any user-facing copy you've written \u2014 headlines, captions, labels, body text \u2014 and get back a sharper version: better built for its audience and free of the fingerprints that make writing read as AI. It elevates how the copy communicates without inventing facts or claims you didn't give it. Give it the text plus what it's for (where it appears, the audience).",
|
|
6336
6296
|
inputSchema: {
|
|
@@ -6824,7 +6784,6 @@ Visual design expert. Describe the situation and what you need \u2014 the agent
|
|
|
6824
6784
|
];
|
|
6825
6785
|
designExpertTool = {
|
|
6826
6786
|
definition: {
|
|
6827
|
-
clearable: false,
|
|
6828
6787
|
name: "visualDesignExpert",
|
|
6829
6788
|
description: DESCRIPTION,
|
|
6830
6789
|
inputSchema: {
|
|
@@ -7067,7 +7026,6 @@ var init_productVision = __esm({
|
|
|
7067
7026
|
init_surfaces();
|
|
7068
7027
|
productVisionTool = {
|
|
7069
7028
|
definition: {
|
|
7070
|
-
clearable: false,
|
|
7071
7029
|
name: "productVision",
|
|
7072
7030
|
description: "Owns the product roadmap. Reads spec and roadmap files automatically. Creates, updates, and deletes roadmap items in src/roadmap/. Describe the situation and what needs to happen.",
|
|
7073
7031
|
inputSchema: {
|
|
@@ -7199,7 +7157,6 @@ var init_codeSanityCheck = __esm({
|
|
|
7199
7157
|
BASE_PROMPT4 = readAsset("subagents/codeSanityCheck", "prompt.md");
|
|
7200
7158
|
codeSanityCheckTool = {
|
|
7201
7159
|
definition: {
|
|
7202
|
-
clearable: false,
|
|
7203
7160
|
name: "codeSanityCheck",
|
|
7204
7161
|
description: 'Quick sanity check on an approach before building. Reviews architecture, package choices, and flags potential issues. Usually responds with "looks good." Occasionally catches something important. Readonly \u2014 can search the web and read code but cannot modify anything.',
|
|
7205
7162
|
inputSchema: {
|
|
@@ -7341,7 +7298,6 @@ The copy in <overview_copy> is final \u2014 it was authored and edited before it
|
|
|
7341
7298
|
</html>`;
|
|
7342
7299
|
buildOverviewTool = {
|
|
7343
7300
|
definition: {
|
|
7344
|
-
clearable: false,
|
|
7345
7301
|
name: "writeBuildOverview",
|
|
7346
7302
|
description: "Generate or refresh the Build Overview \u2014 the project's home page in the Spec tab: a single-page, plain-language reference of everything the app actually contains, including the parts the user can't see (data stores, backend operations, access and roles, background jobs, seeded scenarios, the design system). You author the full copy: read the manifest and spec and state, plainly and exactly, what genuinely exists \u2014 real names and accurate counts \u2014 in calm, declarative, present-tense outcome language, with no persuasion or hype. Describe only what exists. Pass the complete copy as `content`; the design expert lays it out and skins it to the app's brand using your copy verbatim \u2014 it typesets your words, it does not rewrite them, so polish the copy before you pass it. Generate it at the end of a build; routine refreshes ride specSync's `refreshBuildOverview` flag instead, so call this directly only for the initial generation or when the user explicitly asks.",
|
|
7347
7303
|
inputSchema: {
|
|
@@ -7432,7 +7388,6 @@ ${readAsset(
|
|
|
7432
7388
|
// next real turn as a hidden background_results note instead.
|
|
7433
7389
|
backgroundNotify: "passive",
|
|
7434
7390
|
definition: {
|
|
7435
|
-
clearable: false,
|
|
7436
7391
|
name: "specSync",
|
|
7437
7392
|
description: "Reconcile the spec to bring it in line with code changes you have made. Provide a brief, bulleted list of what changed and why; it finds the affected spec sections and updates them to match. Set `refreshBuildOverview` after a deploy or a large milestone to also re-author the Build Overview from the updated spec. Always runs in the background and completes silently \u2014 do not wait for it; its outcome appears as an automated note at the start of a later turn.",
|
|
7438
7393
|
inputSchema: {
|
|
@@ -7527,7 +7482,6 @@ var init_scrapeWebUrl2 = __esm({
|
|
|
7527
7482
|
init_runCli();
|
|
7528
7483
|
scrapeWebUrlTool = {
|
|
7529
7484
|
definition: {
|
|
7530
|
-
clearable: false,
|
|
7531
7485
|
name: "scrapeWebUrl",
|
|
7532
7486
|
description: "Scrape the content of a web page. Returns the HTML of the page as markdown text. Optionally capture a screenshot if you need see the visual design. Use this when you need to fetch or analyze content from a website",
|
|
7533
7487
|
inputSchema: {
|