// Command devtools — оснастка разработчика: то, что нужно для локального // прогона и никогда не едет в боевой образ. // // Пакет один на все такие инструменты, а не по пакету на инструмент. Причина // счётная: каждый отдельный пакет стоит четырёх мест — строка сборки образа, // «Деплой» в устройстве, «Команды» в памятке, README, — и забытая строка сборки // тихо кладёт инструмент разработчика в боевой образ. Один пакет платит эти // четыре места **однажды**, сколько бы подкоманд в нём ни завелось. // // Подкоманда одна — `resume`, возврат остановленной записи в работу. Она встала // на место панели владельца: панели у сервиса больше нет, а экраны правки // записи приносят отдельные задачи. Подставной обратный прокси жил здесь второй // подкомандой и убран 2026-08-23 задачей `config-test-headers-login`: заголовки // входа локального прогона подставляет сам сервис по своим настройкам. // // Вывод идёт stdlib-логом в поток ошибок, а не `slog`: его читает человек в // терминале, в сбор он не едет. Изъятие названо строкой в конвенции журнала. // // В образ пакет не едет: ступень сборки называет `./cmd/transcriber` поимённо. package main import ( "fmt" "log" "os" ) func main() { log.SetFlags(0) if len(os.Args) < 2 { usage() os.Exit(2) } switch os.Args[1] { case "resume": runResume(os.Args[2:]) default: fmt.Fprintf(os.Stderr, "неизвестная подкоманда: %s\n\n", os.Args[1]) usage() os.Exit(2) } } func usage() { fmt.Fprint(os.Stderr, `Оснастка разработчика. Подкоманды: resume вернуть остановленную запись в работу `) }