feat(cli): drop default proxy in flow folders, open browser, add --no-browser

Manual `wmill dev` in a flow folder should not implicitly enable the
reverse proxy. Both proxy and legacy modes now open the browser; the
new --no-browser flag opts out. Claude Code launch.json templates pass
--no-browser so the IDE preview doesn't fight a system browser window.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Guilhem Lemouel
2026-04-23 12:59:28 +02:00
co-authored by Claude Opus 4.7
parent c36e6a002d
commit b57ec80fd1
7 changed files with 29 additions and 15 deletions
+23 -13
View File
@@ -108,6 +108,7 @@ function restorePathScripts(flowValue: any) {
export interface DevOpts {
proxyPort?: number;
path?: string;
noBrowser?: boolean;
}
export async function dev(opts: GlobalOptions & SyncOptions & DevOpts) {
@@ -146,7 +147,6 @@ export async function dev(opts: GlobalOptions & SyncOptions & DevOpts) {
} else {
opts.path = relPath;
}
opts.proxyPort = opts.proxyPort ?? 3100;
log.info(`Detected flow folder, path: ${opts.path}`);
process.chdir(workspaceRoot);
}
@@ -515,6 +515,22 @@ export async function dev(opts: GlobalOptions & SyncOptions & DevOpts) {
});
}
function maybeOpenBrowser(url: string) {
if (opts.noBrowser) return;
try {
open.default(url).catch((error) => {
console.error(
`Failed to open browser, please navigate to ${url}, error: ${error}`
);
});
console.log(`Opened browser at ${url}`);
} catch (error) {
console.error(
`Failed to open browser, please navigate to ${url}, ${error}`
);
}
}
// --- Reverse proxy (when --proxy-port is set) ---
async function startProxyServer(proxyPort: number) {
@@ -629,6 +645,7 @@ export async function dev(opts: GlobalOptions & SyncOptions & DevOpts) {
return new Promise<void>((resolve) => {
proxyServer.listen(proxyPort, () => {
console.log(`Dev proxy listening on http://localhost:${proxyPort}`);
maybeOpenBrowser(`http://localhost:${proxyPort}/`);
resolve();
});
});
@@ -651,18 +668,7 @@ export async function dev(opts: GlobalOptions & SyncOptions & DevOpts) {
(opts.path ? `&path=${opts.path}` : "");
console.log(`Go to ${url}`);
try {
open.default(url).catch((error) => {
console.error(
`Failed to open browser, please navigate to ${url}, error: ${error}`
);
});
console.log("Opened browser for you");
} catch (error) {
console.error(
`Failed to open browser, please navigate to ${url}, ${error}`
);
}
maybeOpenBrowser(url);
console.log(
"Dev server will automatically point to the last script edited locally"
@@ -702,6 +708,10 @@ const command = new Command()
"--path <path:string>",
"Watch a specific windmill path (e.g., u/admin/my_script or f/my_flow)"
)
.option(
"--no-browser",
"Do not open the browser automatically"
)
.action(dev as any);
export default command;
+1 -1
View File
@@ -744,7 +744,7 @@ export async function bootstrap(
configurations: [{
name: "windmill",
runtimeExecutable: "bash",
runtimeArgs: ["-c", "wmill dev --proxy-port ${PORT:-4000}"],
runtimeArgs: ["-c", "wmill dev --proxy-port ${PORT:-4000} --no-browser"],
port: 4000,
autoPort: true,
}],
+1 -1
View File
@@ -282,7 +282,7 @@ async function initAction(opts: InitOptions) {
configurations: [{
name: "windmill",
runtimeExecutable: "bash",
runtimeArgs: ["-c", "wmill dev --proxy-port ${PORT:-4000}"],
runtimeArgs: ["-c", "wmill dev --proxy-port ${PORT:-4000} --no-browser"],
port: 4000,
autoPort: true,
}],
+1
View File
@@ -5335,6 +5335,7 @@ Launch a dev server that watches for local file changes and auto-pushes them to
- \`--includes <pattern...:string>\` - Filter paths givena glob pattern or path
- \`--proxy-port <port:number>\` - Port for a localhost reverse proxy to the remote Windmill server
- \`--path <path:string>\` - Watch a specific windmill path (e.g., u/admin/my_script or f/my_flow)
- \`--no-browser\` - Do not open the browser automatically
### docs