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

Referência de Schema do Invowkfile

:::warning Alpha — Schema Pode Mudar O schema do invowkfile ainda está evoluindo. Campos, tipos e regras de validação podem mudar entre releases enquanto estabilizamos o formato. Sempre verifique o changelog ao fazer upgrade. :::

Referência completa para o schema do invowkfile. Invowkfiles usam formato CUE para definir comandos. Invowkfiles são validados como structs fechadas, então campos desconhecidos geram erro de validação.

Estrutura Raiz​

Todo invowkfile deve definir ao menos um comando em cmds:

#Invowkfile: {
default_shell?: string // Optional - override default shell
workdir?: string // Optional - default working directory
env?: #EnvConfig // Optional - global environment
depends_on?: #DependsOn // Optional - global dependencies
cmds: [...#Command] // Required - at least one command
}

:::note Metadados do Módulo Ficam em invowkmod.cue Campos como module, version, description e requires pertencem a invowkmod.cue e são rejeitados em invowkfile.cue. :::

default_shell​

Tipo: string
Obrigatório: Não
Padrão: Padrão do sistema

Sobrescreve o shell padrão para execução no runtime native.

default_shell: "/bin/bash"
default_shell: "pwsh"

workdir​

Tipo: string
Obrigatório: Não
Padrão: Diretório do invowkfile

Diretório de trabalho padrão para todos os comandos. Pode ser absoluto ou relativo à localização do invowkfile.

workdir: "./src"
workdir: "/opt/app"

env​

Tipo: #EnvConfig
Obrigatório: Não

Configuração de environment global aplicada a todos os comandos. Veja EnvConfig.

depends_on​

Tipo: #DependsOn
Obrigatório: Não

Dependências globais que se aplicam a todos os comandos. Veja DependsOn.

cmds​

Tipo: [...#Command]
Obrigatório: Sim (pelo menos um)

Lista de comandos definidos neste invowkfile. Veja Command.

:::caution Nota de Migração O nome do campo é cmds, não commands. Usar commands causará um erro de validação CUE porque o schema define commands?: _|_ (valor bottom) para impor o nome correto. :::


Command​

Define um comando executável:

#Command: {
name: string // Required
description?: string // Optional
category?: string // Optional - groups in listing
implementations: [...#Implementation] // Required - at least one
env?: #EnvConfig // Optional
workdir?: string // Optional
depends_on?: #DependsOn // Optional
flags?: [...#Flag] // Optional
args?: [...#Argument] // Optional
watch?: #WatchConfig // Optional - file-watching
}

name​

Tipo: string (padrão: ^[a-zA-Z][a-zA-Z0-9_ -]*$)
Obrigatório: Sim

O identificador do comando. Deve começar com uma letra.

name: "build"
name: "test unit" // Spaces allowed for subcommand-like behavior
name: "deploy-prod"

description​

Tipo: string Obrigatório: Não

Texto de ajuda para o comando. Quando fornecido, deve ser não-vazio (validado pelo padrão regex ^\s*\S.*$ -- strings contendo apenas espaços são rejeitadas).

description: "Build the application for production"

category​

Tipo: string Obrigatório: Não

Agrupa este comando sob um título na saída de invowk cmd. Quando fornecido, deve ser não-vazio (validado pelo padrão regex ^\s*\S.*$ — strings contendo apenas espaços são rejeitadas).

cmds: [
{
name: "build"
category: "Development"
implementations: [...]
},
{
name: "test unit"
category: "Development"
implementations: [...]
},
{
name: "deploy"
category: "Operations"
implementations: [...]
},
]

implementations​

Tipo: [...#Implementation] Obrigatório: Sim (pelo menos um)

As implementations executáveis. Veja Implementation.

env​

Tipo: #EnvConfig Obrigatório: Não

Configuração de environment para este comando. O env no nível de comando é aplicado antes do env no nível de implementation. Veja EnvConfig.

workdir​

Tipo: string Obrigatório: Não

Diretório de trabalho para execução do comando. Sobrescreve o workdir do nível raiz, mas pode ser sobrescrito pelo workdir no nível de implementation. Pode ser absoluto ou relativo à localização do invowkfile.

depends_on​

Tipo: #DependsOn Obrigatório: Não

Dependências que devem ser satisfeitas antes de executar este comando. Veja DependsOn.

flags​

Tipo: [...#Flag]
Obrigatório: Não

Flags de linha de comando para este comando. Veja Flag.

:::warning Flags Reservadas As seguintes flags são reservadas pelo invowk e não podem ser usadas em comandos definidos pelo usuário:

  • ivk-env-file (-e), ivk-env-var (-E)
  • ivk-env-inherit-mode, ivk-env-inherit-allow, ivk-env-inherit-deny
  • ivk-workdir (-w), ivk-runtime (-r), ivk-from (-f)
  • ivk-force-rebuild, ivk-dry-run
  • ivk-watch (-W)
  • ivk-verbose (-v), ivk-config (-c), ivk-interactive (-i)
  • help (-h), version

Além disso, qualquer flag que comece com o prefixo ivk-, invowk- ou i- é reservada para flags do sistema. :::

args​

Tipo: [...#Argument]
Obrigatório: Não

Argumentos posicionais para este comando. Veja Argument.

watch​

Tipo: #WatchConfig Obrigatório: Não

Configuração de file-watching para este comando. Quando definido, patterns controla quais arquivos são monitorados. Quando --ivk-watch é passado sem uma configuração watch, o invowk monitora todos os arquivos (**/*) no diretório de trabalho. Veja WatchConfig.

{
name: "dev"
description: "Run development server with auto-reload"
watch: {
patterns: ["src/**/*.go", "*.go"]
debounce: "1s"
clear_screen: true
ignore: ["vendor/**"]
}
implementations: [{
script: "go run ./cmd/server"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}]
}]
}

Implementation​

Define como um comando é executado:

#Implementation: {
script: string // Required - inline script or file path
runtimes: [...#RuntimeConfig] & [_, ...] // Required - runtime configurations
platforms: [...#PlatformConfig] & [_, ...] // Required - at least one platform
env?: #EnvConfig // Optional
workdir?: string // Optional
depends_on?: #DependsOn // Optional
timeout?: #DurationString // Optional - max execution time
}

script​

Tipo: string (não vazio)
Obrigatório: Sim

Os comandos de shell a executar OU um caminho para um arquivo de script.

// Inline script
script: "echo 'Hello, World!'"

// Multi-line script
script: """
echo "Building..."
go build -o app .
echo "Done!"
"""

// Script file reference
script: "./scripts/build.sh"
script: "deploy.py"

Extensões reconhecidas: .sh, .bash, .ps1, .bat, .cmd, .py, .rb, .pl, .zsh, .fish

runtimes​

Tipo: [...#RuntimeConfig]
Obrigatório: Sim (pelo menos um)

Os runtimes que podem executar esta implementation. O primeiro runtime é o padrão.

// Native only
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}]

// Multiple runtimes
runtimes: [
{name: "native"},
{name: "virtual"},
]
platforms: [{name: "linux"}, {name: "macos"}]

// Container with options
runtimes: [{
name: "container"
image: "golang:1.26"
volumes: ["./:/app"]
}]
platforms: [{name: "linux"}]

platforms​

Tipo: [...#PlatformConfig] Obrigatório: Sim (pelo menos um)

Especifique quais sistemas operacionais esta implementation suporta.

// Linux and macOS only
platforms: [
{name: "linux"},
{name: "macos"},
]

env​

Tipo: #EnvConfig Obrigatório: Não

Configuração de environment para esta implementation. Mesclado com o env no nível de comando: arquivos da implementation são carregados depois dos arquivos do comando, e variáveis da implementation sobrescrevem as do comando. Veja EnvConfig.

workdir​

Tipo: string Obrigatório: Não

Diretório de trabalho para esta implementation. Sobrescreve as configurações de workdir tanto do nível raiz quanto do nível de comando. Pode ser absoluto ou relativo à localização do invowkfile.

depends_on​

Tipo: #DependsOn Obrigatório: Não

Dependências que devem ser satisfeitas antes de executar esta implementation. Combinado com o depends_on no nível raiz e de comando. Sempre validado no sistema host, independentemente do runtime selecionado. Para validar dependências dentro do ambiente do runtime (ex: dentro de um container), use depends_on dentro do bloco de runtime. Veja DependsOn.

timeout​

Tipo: #DurationString Obrigatório: Não

Duração máxima de execução. Deve ser uma string de duração Go válida (ex: "30s", "5m", "1h30m"). Quando excedido, o comando é cancelado e retorna um erro de timeout. O valor de timeout é validado cedo (antes das verificações de dependência) para falhar rapidamente em valores inválidos. Veja DurationString.

{
name: "build"
implementations: [{
script: "make build"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}]
timeout: "5m"
}]
}

RuntimeConfig​

Configuração para um runtime específico:

// Shared base fields (all runtimes)
#RuntimeConfigBase: {
name: #RuntimeType
env_inherit_mode?: "none" | "allow" | "all"
env_inherit_allow?: [...string]
env_inherit_deny?: [...string]
}

// Native runtime: supports interpreter
#RuntimeConfigNative: close({
#RuntimeConfigBase
name: "native"
interpreter?: string // "auto", "python3", "/usr/bin/env perl -w", etc.
})

// Virtual runtime: no additional fields
#RuntimeConfigVirtual: close({
#RuntimeConfigBase
name: "virtual"
// NOTE: interpreter is NOT allowed here (CUE validation error)
})

// Container runtime: image/containerfile + extras
#RuntimeConfigContainer: close({
#RuntimeConfigBase
name: "container"
interpreter?: string
enable_host_ssh?: bool
containerfile?: string // mutually exclusive with image
image?: string // mutually exclusive with containerfile
volumes?: [...string]
ports?: [...string]
depends_on?: #DependsOn // validated inside the container environment
})

// Discriminated union of all runtime types
#RuntimeConfig: #RuntimeConfigNative | #RuntimeConfigVirtual | #RuntimeConfigContainer

name​

Tipo: "native" | "virtual" | "container"
Obrigatório: Sim

O tipo de runtime.

interpreter​

Tipo: string
Disponível para: native, container
Padrão: "auto" (detectar do shebang)

Especifica como executar o script.

// Auto-detect from shebang
interpreter: "auto"

// Specific interpreter
interpreter: "python3"
interpreter: "node"
interpreter: "/usr/bin/ruby"

// With arguments
interpreter: "python3 -u"
interpreter: "/usr/bin/env perl -w"
observação

O runtime virtual usa mvdan/sh e não consegue executar interpretadores não-shell.

env_inherit_mode​

Tipo: "none" | "allow" | "all"
Disponível para: native, virtual, container
Padrão: all para native/virtual, none para container

Controla se o ambiente do host é herdado pelo runtime.

env_inherit_allow​

Tipo: [...string]
Disponível para: native, virtual, container

Lista de variáveis de ambiente permitidas quando env_inherit_mode é "allow".

env_inherit_deny​

Tipo: [...string]
Disponível para: native, virtual, container

Lista de variáveis de ambiente negadas (aplica-se a qualquer modo).

runtimes: [{
name: "container"
image: "debian:stable-slim"
env_inherit_mode: "allow"
env_inherit_allow: ["TERM", "LANG"]
env_inherit_deny: ["AWS_SECRET_ACCESS_KEY"]
}]
platforms: [{name: "linux"}]

enable_host_ssh​

Tipo: bool
Disponível para: container
Padrão: false

Habilita acesso SSH do container de volta para o host. Quando habilitado, o Invowk inicia um servidor SSH e fornece credenciais via variáveis de ambiente:

  • INVOWK_SSH_ENABLED
  • INVOWK_SSH_HOST
  • INVOWK_SSH_PORT
  • INVOWK_SSH_USER
  • INVOWK_SSH_TOKEN
runtimes: [{
name: "container"
image: "debian:stable-slim"
enable_host_ssh: true
}]
platforms: [{name: "linux"}]

containerfile / image​

Tipo: string
Disponível para: container

Especifique a origem do container. São mutuamente exclusivos.

// Use a pre-built image
image: "debian:stable-slim"
image: "golang:1.26"

// Build from a Containerfile
containerfile: "./Containerfile"
containerfile: "./docker/Dockerfile.build"

volumes​

Tipo: [...string]
Disponível para: container

Montagens de volume no formato host:container[:options].

volumes: [
"./src:/app/src",
"/tmp:/tmp:ro",
"${HOME}/.cache:/cache",
]

ports​

Tipo: [...string]
Disponível para: container

Mapeamentos de portas no formato host:container.

ports: [
"8080:80",
"3000:3000",
]

depends_on​

Tipo: #DependsOn Disponível para: container Obrigatório: Não

Dependências validadas dentro do ambiente do container. Diferentemente do depends_on no nível raiz/comando/implementação (que sempre verificam o host), o depends_on no nível de runtime container valida contra o próprio ambiente do container — útil para verificar que a imagem do container possui as ferramentas, arquivos e configuração necessários.

Verificado apenas quando o runtime container é selecionado no momento da execução.


PlatformConfig​

#PlatformConfig: {
name: "linux" | "macos" | "windows"
}

EnvConfig​

Configuração de environment:

#EnvConfig: {
files?: [...string] // Dotenv files to load
vars?: [string]: string // Environment variables
}

files​

Arquivos dotenv para carregar. Arquivos são carregados em ordem; os últimos sobrescrevem os anteriores.

env: {
files: [
".env",
".env.local",
".env.${ENVIRONMENT}?", // '?' means optional
]
}

vars​

Variáveis de ambiente como pares chave-valor.

env: {
vars: {
NODE_ENV: "production"
DEBUG: "false"
}
}

DependsOn​

Especificação de dependências:

#DependsOn: {
tools?: [...#ToolDependency]
cmds?: [...#CommandDependency]
filepaths?: [...#FilepathDependency]
capabilities?: [...#CapabilityDependency]
custom_checks?: [...#CustomCheckDependency]
env_vars?: [...#EnvVarDependency]
}

ToolDependency​

#ToolDependency: {
alternatives: [...string] // At least one - tool names
}
depends_on: {
tools: [
{alternatives: ["go"]},
{alternatives: ["podman", "docker"]}, // Either works
]
}

CommandDependency​

:::caution Nome do Campo O nome do campo para dependências de comandos é cmds, não commands. Usar commands causará um erro de validação CUE porque o schema define commands?: _|_ (valor bottom) para impor o nome correto do campo. :::

#CommandDependency: {
alternatives: [...string] // Command names
}

FilepathDependency​

#FilepathDependency: {
alternatives: [...string] // File/directory paths
readable?: bool
writable?: bool
executable?: bool
}

CapabilityDependency​

#CapabilityDependency: {
alternatives: [...("local-area-network" | "internet" | "containers" | "tty")]
}

EnvVarDependency​

#EnvVarDependency: {
alternatives: [...#EnvVarCheck]
}

#EnvVarCheck: {
name: string // Environment variable name
validation?: string // Regex pattern
}

CustomCheckDependency​

#CustomCheckDependency: #CustomCheck | #CustomCheckAlternatives

#CustomCheck: {
name: string // Check identifier
check_script: string // Script to run
expected_code?: int // Expected exit code (default: 0)
expected_output?: string // Regex to match output
}

#CustomCheckAlternatives: {
alternatives: [...#CustomCheck]
}

Flag​

Definição de flag de linha de comando:

#Flag: {
name: string // POSIX-compliant name
description: string // Help text
default_value?: string // Default value
type?: "string" | "bool" | "int" | "float"
required?: bool
short?: string // Single character alias
validation?: string // Regex pattern
}
PropriedadeObrigatórioDescrição
nameSimNome da flag (alfanumérico, hífens, underscores)
descriptionSimTexto de ajuda (deve ser não-vazio)
typeNãostring, bool, int, float (padrão: string)
default_valueNãoPadrão se não fornecido (não combina com required)
requiredNãoDeve ser fornecido (não combina com default_value)
shortNãoAlias de uma letra (a-z ou A-Z)
validationNãoPadrão regex para validação de valor
flags: [
{
name: "output"
short: "o"
description: "Output file path"
default_value: "./build"
},
{
name: "verbose"
short: "v"
description: "Enable verbose output"
type: "bool"
},
]

Argument​

Definição de argumento posicional:

#Argument: {
name: string // POSIX-compliant name
description: string // Help text
required?: bool // Must be provided
default_value?: string // Default if not provided
type?: "string" | "int" | "float"
validation?: string // Regex pattern
variadic?: bool // Accepts multiple values (last arg only)
}
PropriedadeObrigatórioDescrição
nameSimNome do argumento (alfanumérico, hífens, underscores)
descriptionSimTexto de ajuda (deve ser não-vazio)
typeNãostring, int, float (padrão: string; bool não suportado)
default_valueNãoPadrão se não fornecido (não combina com required)
requiredNãoDeve ser fornecido (não combina com default_value)
variadicNãoAceitar múltiplos valores (apenas permitido no último argumento)
validationNãoPadrão regex para validação de valor
args: [
{
name: "target"
description: "Build target"
required: true
},
{
name: "files"
description: "Files to process"
variadic: true
},
]

Variáveis de ambiente para argumentos:

  • INVOWK_ARG_<NAME> - O valor do argumento
  • Para variádicos: INVOWK_ARG_<NAME>_COUNT, INVOWK_ARG_<NAME>_1, INVOWK_ARG_<NAME>_2, etc.

WatchConfig​

Configuração de file-watching para reexecução automática de comandos:

#WatchConfig: {
patterns: [...string] & [_, ...] // Required - glob patterns to watch
debounce?: #DurationString // Optional - default "500ms"
clear_screen?: bool // Optional - default false
ignore?: [...string] // Optional - merged with built-in defaults
}

patterns​

Tipo: [...string] (pelo menos um) Obrigatório: Sim

Padrões glob para arquivos a monitorar. Padrões suportam ** para correspondência recursiva (ex: "src/**/*.go", "*.ts"). Caminhos são relativos ao diretório de trabalho efetivo do comando.

debounce​

Tipo: #DurationString Obrigatório: Não Padrão: "500ms"

Atraso antes de reexecutar após detectar uma mudança de arquivo. Veja DurationString.

clear_screen​

Tipo: bool Obrigatório: Não Padrão: false

Quando true, limpa o terminal antes de cada reexecução.

ignore​

Tipo: [...string] Obrigatório: Não

Padrões glob adicionais para arquivos/diretórios a excluir do monitoramento. Mesclados com padrões padrão embutidos (**/.git/**, **/node_modules/**, **/__pycache__/**, **/*.swp, **/*.swo, **/*~, **/.DS_Store).


DurationString​

// #DurationString — shared by timeout and debounce
// Valid examples: "500ms", "30s", "5m", "1h30m", "2.5s"
#DurationString: string & =~"^([0-9]+(\\.[0-9]+)?(ns|us|µs|ms|s|m|h))+$"

Tipo compartilhado usado por #Implementation.timeout e #WatchConfig.debounce. Exemplos válidos: "500ms", "30s", "5m", "1h30m", "2.5s".


Exemplo Completo​

env: {
files: [".env"]
vars: {
APP_NAME: "myapp"
}
}

cmds: [
{
name: "build"
description: "Build the application"

flags: [
{
name: "release"
short: "r"
description: "Build for release"
type: "bool"
},
]

implementations: [
{
script: """
if [ "$INVOWK_FLAG_RELEASE" = "true" ]; then
go build -ldflags="-s -w" -o app .
else
go build -o app .
fi
"""
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}]
},
{
script: """
$flags = if ($env:INVOWK_FLAG_RELEASE -eq "true") { "-ldflags=-s -w" } else { "" }
go build $flags -o app.exe .
"""
runtimes: [{name: "native", interpreter: "pwsh"}]
platforms: [{name: "windows"}]
},
]

depends_on: {
tools: [{alternatives: ["go"]}]
}
},
]