");
+ foreach (var (file, caption) in shots)
+ sb.Append($"
{System.Net.WebUtility.HtmlEncode(caption)}");
+ sb.Append("
");
+ File.WriteAllText(Path.Combine(dir, "index.html"), sb.ToString());
+ }
+
+ private static string FindRepoRoot()
+ {
+ var d = new DirectoryInfo(AppContext.BaseDirectory);
+ while (d is not null && !File.Exists(Path.Combine(d.FullName, "food-market.sln"))) d = d.Parent;
+ return d?.FullName ?? Directory.GetCurrentDirectory();
+ }
+}
diff --git a/src/food-market.pos/Tooling/SmokeRunner.cs b/src/food-market.pos/Tooling/SmokeRunner.cs
new file mode 100644
index 0000000..3bd1d39
--- /dev/null
+++ b/src/food-market.pos/Tooling/SmokeRunner.cs
@@ -0,0 +1,104 @@
+using System.Diagnostics;
+using foodmarket.Pos.Core.Data;
+using foodmarket.Pos.Core.Logic;
+using foodmarket.Pos.Core.Models;
+using foodmarket.Pos.Core.Sync;
+using foodmarket.Shared.Pos.V1;
+
+namespace foodmarket.Pos.Tooling;
+
+///