Analise argumentos CLI com uma especificação
Transforme uma lista bruta de argumentos de linha de comando em um objeto previsível sem espalhar regras de análise por toda a aplicação.
Executar grátis
Roda direto no seu navegador. Grátis, sem cadastro — seus dados não são enviados para lugar nenhum.
Forneça os elementos e uma especificação compacta que nomeie cada sinalizador booleano ou opção que recebe valor. O analisador converte aliases em nomes canônicos, preserva argumentos posicionais, identifica sinalizadores desconhecidos, aceita opções longas com sinal de igual e encerra a interpretação de opções depois do marcador convencional de dois hífens. Especificações malformadas, argumentos repetidos e opções sem o valor obrigatório geram erros de entrada claros.
Descreva a interface de comando como dados
Comece com os elementos de argumento exatamente como o ambiente de execução os fornece, depois de remover os nomes do executável e do script. Em seguida, defina na especificação cada argumento aceito. Toda entrada possui um nome canônico, um ou mais aliases e um tipo. Use flag para um sinalizador cuja presença signifique verdadeiro, como <code>--verbose</code>. Use option quando a forma precisar ser seguida de um valor, como <code>--output result.json</code>. Os aliases permitem que as formas curta e longa preencham a mesma propriedade canônica; assim, <code>-o</code> e <code>--output</code> podem gerar <code>output</code>. Os nomes canônicos usam letras minúsculas, números e sublinhados, deixando o objeto pronto para consumo sem outra etapa de renomeação. Os aliases devem começar com um ou dois hífens. O analisador rejeita nomes canônicos e aliases duplicados, pois essas colisões tornariam o resultado dependente da ordem da declaração. Defina <code>multiple</code> apenas quando a repetição fizer parte da interface; os valores serão retornados na ordem em que aparecerem.
Entenda a análise dos elementos e a saída
A saída separa três aspectos: valores reconhecidos, elementos posicionais e sinalizadores desconhecidos. Sinalizadores reconhecidos se tornam verdadeiros sob seus nomes canônicos, enquanto as opções armazenam o elemento seguinte. Uma opção longa também pode trazer o valor no mesmo elemento, como em <code>--format=json</code>. A correspondência precisa ser exata; grupos curtos como <code>-abc</code> não são expandidos, a menos que a forma inteira esteja declarada como alias. Todo elemento desconhecido iniciado por hífen é acrescentado a <code>unknown_flags</code>, permitindo que você o rejeite, mostre um aviso ou o encaminhe deliberadamente. Os demais elementos desconhecidos viram valores posicionais. Um <code>--</code> isolado encerra o processamento de opções, e tudo o que vier depois será posicional, mesmo que comece com hífen. Essa saída convencional elimina ambiguidades em nomes como <code>-draft.txt</code>. O analisador não cria padrões nem converte textos em números, pois essas políticas pertencem à aplicação e podem ocultar enganos. A saída é determinística e preserva a ordem dos itens.
Trate valores ausentes e repetições com segurança
Toda entrada do tipo option exige um valor não vazio sempre que um alias aparece. Se o alias for o último elemento, vier antes do marcador de fim das opções ou for seguido por outro elemento com formato de sinalizador, a análise falhará com um erro de entrada que cita o alias responsável. A mesma regra vale para uma forma anexada vazia, como <code>--output=</code>. Esse comportamento rigoroso impede que um sinalizador posterior seja consumido silenciosamente como dado e resolve diretamente uma das falhas mais perigosas da análise de comandos. Um hífen isolado ainda pode ser usado como valor, o que ajuda programas que representam a entrada ou saída padrão por <code>-</code>. Por padrão, repetir o mesmo argumento reconhecido também gera erro. Declare <code>multiple: true</code> quando a repetição for válida, por exemplo para vários caminhos de inclusão ou rótulos; o nome canônico sempre conterá uma lista. Sinalizadores desconhecidos são apenas informados, sem falha, para que você mantenha o controle sobre compatibilidade e encaminhamento.
Casos de uso
Valide um wrapper de CLI
Analise as opções próprias do wrapper e informe sinalizadores incompatíveis antes de iniciar o processo encapsulado.
Normalize opções curtas e longas
Converta aliases como -o e --output em uma única propriedade estável para simplificar a lógica da aplicação.
Crie prévias e testes de comandos
Converta listas de elementos em fixtures estruturados e determinísticos sem executar comandos nem acessar um shell.
Perguntas frequentes
Quanto custa?
Cada solicitação de API custa US$ 0,002. A versão no navegador executa localmente a mesma lógica determinística.
Os sinalizadores desconhecidos são rejeitados?
Não. Eles são retornados em unknown_flags para que você possa rejeitá-los, emitir um aviso ou encaminhá-los.
A sintaxe --name=value é aceita?
Sim, para opções longas que recebem valor. Um valor vazio depois do sinal de igual gera erro.
O analisador combina sinalizadores curtos como -abc?
Não. Os aliases correspondem a elementos inteiros; -abc só será reconhecido se a especificação declarar exatamente esse alias.
O que acontece depois de dois hífens isolados?
A análise de opções termina, e todos os elementos restantes são retornados como argumentos posicionais.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/dev2/cli-arg-parse-spec \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"args":["--verbose","--output=result.json","input.txt"],"spec":[{"name":"verbose","aliases":["--verbose","-v"],"kind":"flag"},{"name":"output","aliases":["--output","-o"],"kind":"option"}]}'const res = await fetch("https://api.kit.forhosting.com/dev2/cli-arg-parse-spec", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"args": [
"--verbose",
"--output=result.json",
"input.txt"
],
"spec": [
{
"name": "verbose",
"aliases": [
"--verbose",
"-v"
],
"kind": "flag"
},
{
"name": "output",
"aliases": [
"--output",
"-o"
],
"kind": "option"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev2/cli-arg-parse-spec",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"args": [
"--verbose",
"--output=result.json",
"input.txt"
],
"spec": [
{
"name": "verbose",
"aliases": [
"--verbose",
"-v"
],
"kind": "flag"
},
{
"name": "output",
"aliases": [
"--output",
"-o"
],
"kind": "option"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev2/cli-arg-parse-spec", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"args":["--verbose","--output=result.json","input.txt"],"spec":[{"name":"verbose","aliases":["--verbose","-v"],"kind":"flag"},{"name":"output","aliases":["--output","-o"],"kind":"option"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"args":["--verbose","--output=result.json","input.txt"],"spec":[{"name":"verbose","aliases":["--verbose","-v"],"kind":"flag"},{"name":"output","aliases":["--output","-o"],"kind":"option"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev2/cli-arg-parse-spec", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"args": [
"--verbose",
"--output=result.json",
"input.txt"
],
"spec": [
{
"name": "verbose",
"aliases": [
"--verbose",
"-v"
],
"kind": "flag"
},
{
"name": "output",
"aliases": [
"--output",
"-o"
],
"kind": "option"
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.cli_arg_parse_spec",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |