Pular para o conteúdo principal
Versão: 0.8.0

Diagrama de Sequência de Execução de Comandos

Este diagrama mostra o fluxo temporal desde a invocação do CLI através da descoberta, seleção de runtime e execução. Entender este fluxo ajuda com debugging e extensão do Invowk.

Fluxo Principal de Execução

Diagram: architecture/execution-main

Fluxo do Runtime Container (Detalhado)

Quando o runtime container é selecionado, etapas adicionais ocorrem:

Diagram: architecture/execution-container

Fluxo do Runtime Virtual

O runtime virtual usa o interpretador mvdan/sh embutido:

Diagram: architecture/execution-virtual

Descrições das Fases

1. Fase de Inicialização

EtapaComponenteAção
1CLIReceber comando do usuário
2-4Config + CUECarregar e fazer parsing de ~/.config/invowk/config.cue

Decisões-chave tomadas:

  • Preferência de engine de container (docker vs podman)
  • Includes configurados para invowkfiles/módulos
  • Runtime padrão se não especificado

2. Fase de Descoberta

EtapaComponenteAção
5DiscoveryIniciar descoberta de comandos
6-7CUE ParserFazer parsing de todos os arquivos invowkfile.cue
8-9DiscoveryEscanear diretórios *.invowkmod e invowk_modules/ vendorizados
10DiscoveryConstruir árvore unificada de comandos

Ordem de precedência (maior para menor):

  1. invowkfile.cue do diretório atual
  2. *.invowkmod do diretório atual
  3. Includes configurados
  4. Diretório de comandos do usuário ~/.invowk/cmds/ (apenas módulos, não recursivo)

3. Fase de Resolução

EtapaComponenteAção
11CLICorresponder nome do comando aos comandos descobertos
12CLISelecionar implementação específica da plataforma
13-14RegistryObter instância apropriada do runtime
15-16RuntimeValidar contexto de execução

Correspondência de plataforma:

  • Verificar platforms: [{name: "linux"}], [{name: "macos"}], [{name: "windows"}]
  • Erro se nenhuma implementação corresponder à plataforma atual

4. Fase de Execução

EtapaComponenteAção
17RuntimeIniciar execução
18-19Runtime SelecionadoExecutar o script/comando real
20RuntimeRetornar resultado
21CLISaída para usuário

Comportamento específico do runtime:

  • Native: Spawns processo do shell do host
  • Virtual: Interpreta via mvdan/sh
  • Container: Provisiona imagem, executa container

5. Interceptação Dry-Run

Quando --ivk-dry-run é passado, o pipeline é interrompido após a resolução:

EtapaComponenteAção
1CLIDetectar flag --ivk-dry-run
2CLIExecutar descoberta + resolução normalmente (etapas 1-16)
3CLIImprimir plano de execução resolvido (Comando, Fonte, Runtime, Plataforma, WorkDir, Timeout, Script, Ambiente)
4CLISair com código 0 (validação de dependências é ignorada)

6. Loop do Modo Watch

Quando --ivk-watch é passado, a execução é envolvida em um loop de watch:

EtapaComponenteAção
1CLIDetectar flag --ivk-watch (mutuamente exclusivo com --ivk-dry-run)
2CLIExecutar comando inicial normalmente
3Watch EngineConfigurar watchers de arquivo a partir de watch.patterns (ou fallback **/*)
4Watch EngineAguardar mudanças em arquivos, debounce (padrão 500ms)
5CLIRe-executar comando
6Watch EngineRepetir a partir da etapa 4 até Ctrl+C

Tratamento de erros: Códigos de saída diferentes de zero do comando continuam o loop de watch. Erros de infraestrutura (não ExitError) abortam o loop após 3 falhas consecutivas.

Pontos de Tratamento de Erros

Diagram: architecture/execution-errors

Considerações de Performance

FaseDuração TípicaOtimização
Inicialização< 10msConfig em cache após primeiro carregamento
Descoberta10-100msCache por requisição elimina varreduras duplicadas do sistema de arquivos
Resolução< 1msLookup simples
ExecuçãoVariávelDepende do comando

Otimizações principais:

  • Cache de descoberta por requisição: Um discoveryRequestCache anexado ao contexto da requisição memoriza resultados de DiscoverCommandSet, DiscoverAndValidateCommandSet e GetCommand. A cross-population garante que uma chamada DiscoverAndValidateCommandSet também satisfaz lookups downstream de DiscoverCommandSet, eliminando travessias redundantes do sistema de arquivos dentro de uma única invocação CLI.

Gargalos a observar:

  • Muitos módulos nos includes configurados → descoberta mais lenta
  • Invowkfiles grandes → parsing mais lento
  • Pulls de imagem de container → pode levar minutos

Diagramas Relacionados