Sobre o projeto

go-schedule é um agendador de tarefas multiplataforma implementado em Go para Linux, macOS e Windows. Ele foi projetado para tornar os cronogramas recorrentes compreensíveis: os usuários podem escrever expressões em linguagem simples, como 'every 15 minutes' ou 'weekdays at 09:00', ou usar um subconjunto documentado de cron, incluindo as formas convencionais de cinco campos e de seis campos limitados para segundos. Os cronogramas aceitos são devolvidos com a interpretação do agendador e os próximos horários de execução, ajudando a detectar erros de leitura antes que sejam disparados. O projeto fornece três interfaces principais: uma CLI (gosched), uma GUI desktop baseada em Wails e um daemon de fundo (goschedd). O daemon detém o mecanismo de agendamento, o armazenamento SQLite e o executor, enquanto a CLI e a GUI são clientes leves sobre um endpoint IPC local (Unix domain socket no Linux/macOS, named pipe no Windows). Este design significa que fechar a GUI não interrompe os cronogramas, e a CLI e a GUI operam sobre o mesmo estado. O daemon pode ser registrado como um serviço do sistema via systemd, launchd ou Windows Service, para que os cronogramas iniciem na inicialização e possam rodar sem um login interativo. O comportamento de agendamento inclui suporte a fuso horário IANA, manipulação explícita de transições de horário de verão, armazenamento baseado em UTC e semântica de recorrência baseada na RFC 5545. Após um período de inatividade, cada tarefa que perdeu execuções recebe uma execução de recuperação (catch-up) e depois retoma normalmente. Políticas de sobreposição por tarefa podem enfileirar uma execução pendente (padrão), pular a nova execução ou permitir execuções simultâneas. Casos extremos de calendário — como tarefas agendadas para o dia 31, 29 de fevereiro ou a quinta sexta-feira — são tratados por uma política declarada: pular o período, retroceder para a última data válida ou rolar para o próximo período. Capacidades adicionais incluem grupos aninhados com ativação/desativação em cascata, tarefas em rascunho que podem ser salvas antes que todos os detalhes sejam conhecidos, tarefas apenas manuais e encadeamento, onde a conclusão de uma tarefa com sucesso, falha ou qualquer resultado terminal pode disparar uma tarefa alvo. Os encadeamentos são descritos como entrega durável de 'pelo menos uma vez', e o trabalho pendente sobrevive ao reinício do daemon. Gatilhos externos locais e conjuntos de gatilhos permitem que outros processos solicitem execuções normais do agendador usando chaves opacas; os conjuntos de gatilhos suportam de 1 a 99 chaves utilizáveis independentemente por tarefa. Observadores de sistema de arquivos (filesystem watchers) podem solicitar a execução de uma tarefa quando um arquivo selecionado é criado, escrito ou substituído atomicamente e torna-se estável; observadores de diretório usam um glob de nome base e podem opcionalmente incluir subdiretórios reais. A interoperabilidade com cron inclui importação, explicação e exportação de cron via gosched. A importação lê um crontab existente, mostra cada linha em linguagem simples e sua próxima execução, e cria as tarefas; o comando --dry-run pré-visualiza as alterações. Construções não suportadas ou ambíguas são recusadas em vez de aproximadas. A forma @reboot e a forma legível 'at scheduler startup' criam uma tarefa de inicialização multiplataforma que roda uma vez por início do processo do daemon. O projeto possui licença Apache-2.0. Os lançamentos incluem um instalador MSI para Windows, bundle desktop para macOS, bundle desktop para Linux e arquivos de daemon e CLI headless. A documentação abrange instalação, referência da CLI, campos da GUI, interoperabilidade de cron, segurança e scripts de teste do mantenedor. O desenvolvimento é orientado por especificações, localizadas em specs/001-task-scheduler, e utiliza padrões de ferramentas Go, incluindo gofmt, go vet, golangci-lint, go test -race e metas de cobertura em pacotes principais.