defmodule Mix.Tasks.Mob.Install do use Mix.Task @shortdoc "First-run setup for a new Mob project" @moduledoc """ Runs first-time setup for a Mob project generated by `mix mob.new`. Must be run from inside the project directory (the one containing `mix.exs`). mix mob.install [--no-icon] [--icon PATH] ## What it does 1. Generates app icons (random robot avatar, or a provided source image) ## Options * `--no-icon` — skip icon generation * `--icon PATH` — use an existing image instead of generating a random robot ## Icon output - `android/app/src/main/res/mipmap-*/ic_launcher.png` - `ios/Assets.xcassets/AppIcon.appiconset/icon_*.png` + `Contents.json` - `icon_source.png` (1024×1024 master, when generating) Run at any time to regenerate icons: mix mob.install --no-icon # skip icons, re-run other setup steps mix mob.icon # icon only, any time after install """ @switches [no_icon: :boolean, icon: :string] @impl Mix.Task def run(argv) do {opts, _args, _} = OptionParser.parse(argv, strict: @switches) project_dir = File.cwd!() unless File.exists?(Path.join(project_dir, "mix.exs")) do Mix.raise("No mix.exs found. Run mix mob.install from your project root.") end unless opts[:no_icon] do generate_icons(project_dir, opts[:icon]) end Mix.shell().info(""" Mob project ready! mix mob.deploy # build APK + push BEAMs + launch on devices mix mob.watch # auto-push changes while developing mix mob.connect # connect IEx to running device nodes """) end defp generate_icons(project_dir, nil) do Mix.shell().info("Generating app icon (random robot)...") MobDev.IconGenerator.generate_random(project_dir) Mix.shell().info([:green, "* icons written", :reset]) end defp generate_icons(project_dir, source) do unless File.exists?(source) do Mix.raise("Source file not found: #{source}") end Mix.shell().info("Generating app icon from #{source}...") MobDev.IconGenerator.generate_from_source(source, project_dir) Mix.shell().info([:green, "* icons written", :reset]) end end