diff --git a/packages/frontend-shared/build.js b/packages/frontend-shared/build.js
index 17b6da8d30a2ab847aef0181ffcf82db83057f27..9941114757928c4058d92d2c1f523d1554f47029 100644
--- a/packages/frontend-shared/build.js
+++ b/packages/frontend-shared/build.js
@@ -23,10 +23,14 @@ const options = {
 	sourcemap: 'linked',
 };
 
+const args = process.argv.slice(2).map(arg => arg.toLowerCase());
+
 // js-built配下をすべて削除する
-fs.rmSync('./js-built', { recursive: true, force: true });
+if (!args.includes('--no-clean')) {
+	fs.rmSync('./js-built', { recursive: true, force: true });
+}
 
-if (process.argv.map(arg => arg.toLowerCase()).includes('--watch')) {
+if (args.includes('--watch')) {
 	await watchSrc();
 } else {
 	await buildSrc();
diff --git a/packages/misskey-bubble-game/build.js b/packages/misskey-bubble-game/build.js
index a80b71646f43800c48d502dc828142c4e0bd367c..5d534cc6fdd7110bfda76d6da67ed9f8abd7417c 100644
--- a/packages/misskey-bubble-game/build.js
+++ b/packages/misskey-bubble-game/build.js
@@ -23,10 +23,14 @@ const options = {
 	sourcemap: 'linked',
 };
 
+const args = process.argv.slice(2).map(arg => arg.toLowerCase());
+
 // built配下をすべて削除する
-fs.rmSync('./built', { recursive: true, force: true });
+if (!args.includes('--no-clean')) {
+	fs.rmSync('./built', { recursive: true, force: true });
+}
 
-if (process.argv.map(arg => arg.toLowerCase()).includes('--watch')) {
+if (args.includes('--watch')) {
 	await watchSrc();
 } else {
 	await buildSrc();
diff --git a/packages/misskey-js/build.js b/packages/misskey-js/build.js
index a80b71646f43800c48d502dc828142c4e0bd367c..b794592815b0e9c9a17ed537869a735552c945f5 100644
--- a/packages/misskey-js/build.js
+++ b/packages/misskey-js/build.js
@@ -24,9 +24,14 @@ const options = {
 };
 
 // built配下をすべて削除する
-fs.rmSync('./built', { recursive: true, force: true });
+const args = process.argv.slice(2).map(arg => arg.toLowerCase());
 
-if (process.argv.map(arg => arg.toLowerCase()).includes('--watch')) {
+// built配下をすべて削除する
+if (!args.includes('--no-clean')) {
+	fs.rmSync('./built', { recursive: true, force: true });
+}
+
+if (args.includes('--watch')) {
 	await watchSrc();
 } else {
 	await buildSrc();
diff --git a/packages/misskey-reversi/build.js b/packages/misskey-reversi/build.js
index a80b71646f43800c48d502dc828142c4e0bd367c..5d534cc6fdd7110bfda76d6da67ed9f8abd7417c 100644
--- a/packages/misskey-reversi/build.js
+++ b/packages/misskey-reversi/build.js
@@ -23,10 +23,14 @@ const options = {
 	sourcemap: 'linked',
 };
 
+const args = process.argv.slice(2).map(arg => arg.toLowerCase());
+
 // built配下をすべて削除する
-fs.rmSync('./built', { recursive: true, force: true });
+if (!args.includes('--no-clean')) {
+	fs.rmSync('./built', { recursive: true, force: true });
+}
 
-if (process.argv.map(arg => arg.toLowerCase()).includes('--watch')) {
+if (args.includes('--watch')) {
 	await watchSrc();
 } else {
 	await buildSrc();
diff --git a/scripts/dev.mjs b/scripts/dev.mjs
index ede77554d2a05f998d2cbb1ae0a6ff6a6b8154a0..3f66028bee17db37e17b7000964e0b8b2c898303 100644
--- a/scripts/dev.mjs
+++ b/scripts/dev.mjs
@@ -27,20 +27,7 @@ await Promise.all([
 		stdout: process.stdout,
 		stderr: process.stderr,
 	}),
-	execa('pnpm', ['--filter', 'misskey-js', 'build'], {
-		cwd: _dirname + '/../',
-		stdout: process.stdout,
-		stderr: process.stderr,
-	}),
-]);
-
-await Promise.all([
-	execa('pnpm', ['--filter', 'misskey-reversi', 'build'], {
-		cwd: _dirname + '/../',
-		stdout: process.stdout,
-		stderr: process.stderr,
-	}),
-	execa('pnpm', ['--filter', 'misskey-bubble-game', 'build'], {
+	execa('pnpm', ['--filter', 'backend...', 'build'], {
 		cwd: _dirname + '/../',
 		stdout: process.stdout,
 		stderr: process.stderr,
@@ -65,7 +52,7 @@ execa('pnpm', ['--filter', 'backend', 'dev'], {
 	stderr: process.stderr,
 });
 
-execa('pnpm', ['--filter', 'frontend-shared', 'watch'], {
+execa('pnpm', ['--filter', 'frontend-shared', 'watch', '--no-clean'], {
 	cwd: _dirname + '/../',
 	stdout: process.stdout,
 	stderr: process.stderr,
@@ -89,19 +76,19 @@ execa('pnpm', ['--filter', 'sw', 'watch'], {
 	stderr: process.stderr,
 });
 
-execa('pnpm', ['--filter', 'misskey-js', 'watch'], {
+execa('pnpm', ['--filter', 'misskey-js', 'watch', '--no-clean'], {
 	cwd: _dirname + '/../',
 	stdout: process.stdout,
 	stderr: process.stderr,
 });
 
-execa('pnpm', ['--filter', 'misskey-reversi', 'watch'], {
+execa('pnpm', ['--filter', 'misskey-reversi', 'watch', '--no-clean'], {
 	cwd: _dirname + '/../',
 	stdout: process.stdout,
 	stderr: process.stderr,
 });
 
-execa('pnpm', ['--filter', 'misskey-bubble-game', 'watch'], {
+execa('pnpm', ['--filter', 'misskey-bubble-game', 'watch', '--no-clean'], {
 	cwd: _dirname + '/../',
 	stdout: process.stdout,
 	stderr: process.stderr,