@malha-ai/cli
v0.1.1
Published
CLI oficial da Malha.ai. Publica um diretório de projeto sem exigir Git nem credenciais de infraestrutura.
Maintainers
Readme
@malha-ai/cli
Publica um diretório de projeto na Malha.ai e devolve uma
URL funcionando. Sem Git, sem Dockerfile, sem registro de DNS, sem
certificado, sem credencial de infraestrutura.
Feito para ser chamado por agentes de programação — Claude Code, Codex, Gemini CLI e afins.
npx -y @malha-ai/cli@latest deploy --jsonO que acontece
A CLI empacota o diretório, envia direto ao storage e acompanha a publicação. Do outro lado, a Malha analisa o projeto, descreve o que ele é, prepara o ambiente e publica.
Saída, com --json:
{
"result_type": "succeeded",
"deployment_id": "dep_01J...",
"app_id": "app_01J...",
"status": "active",
"url": "https://agenda-pessoal-a1b2.apps.malha.ai",
"source_sha256": "..."
}Um projeto novo leva cerca de 100 segundos; um redeploy, cerca de 70.
Primeira vez
Se não houver credencial, a CLI inicia a autorização sozinha: ela imprime em stderr uma URL e um código curto. A pessoa abre no navegador, entra por um link enviado ao e-mail e aprova o dispositivo.
Nenhum token aparece na saída. Isso é deliberado: a credencial vai direto para o processo da CLI, sem passar pelo contexto do agente.
Comandos
malha deploy publica o diretório atual
malha deployments get <id> estado e linha do tempo
malha actions list [deployment] o que a Malha perguntou
malha actions answer <id> <valor> responde
malha apps list aplicativos do workspace
malha auth login|status|logout credencial deste dispositivo
malha versionFlags de deploy: --name, --app, --path, --wait/--no-wait, --json,
--timeout, --message, --yes, --resolves-action.
Contrato com agentes
--jsonescreve somente JSON em stdout; o progresso vai para stderr;- códigos de saída são estáveis;
- tokens, URIs de sessão e segredos nunca aparecem na saída;
- a CLI não altera o código do projeto.
Códigos de saída
| Código | Significado |
|---:|---|
| 0 | publicado |
| 2 | uso incorreto |
| 10 | falta credencial — rode auth login |
| 11 | autenticação falhou |
| 12 | a API não respondeu |
| 20 | o diretório não pôde ser empacotado |
| 21 | falha no envio |
| 22 | o deployment falhou (leia error_code e next_step) |
| 40 | a Malha precisa de uma resposta |
| 41 | resposta fora do schema da ação |
| 42 | a ação não está mais aberta |
O 40 não é erro. Significa que a publicação parou para perguntar algo, e o JSON traz a pergunta e o próximo passo:
{
"result_type": "input_required",
"action": { "id": "act_01J...", "kind": "source_fix_required", "summary": "..." },
"next_step": "Corrija o projeto no diretório local e publique de novo com …"
}Quando houver falha, o JSON também traz next_step — uma frase no imperativo.
Prefira-a a interpretar error_code por conta própria.
O que a Malha publica
Next.js, Vite/React e sites estáticos sem package.json. O gerenciador de
pacotes precisa ser npm ou bun.
O que nunca é enviado
Arquivos com cara de credencial são bloqueados, mesmo que o .gitignore os
inclua e mesmo que alguém tente reincluí-los:
.env, .env.*, *.pem, *.key, *.p12, *.pfx, id_rsa*A CLI avisa em stderr quais foram bloqueados. Não é erro, é proteção.
Também ficam de fora, por tamanho: node_modules/, .git/, dist/,
.venv/, __pycache__/, coverage/.
Credenciais
Ordem de resolução:
MALHA_API_KEY— apenas para CI e automação;- credencial do dispositivo, no credential store do sistema;
- arquivo local em modo
0600, gravado depois que você aprova o dispositivo no navegador. A CLI diz onde gravou. Para recusar,MALHA_CREDENTIALS_NO_FILE=1— aí cada comando exige nova autorização.
O access token fica apenas em memória e é renovado de forma rotativa.
Documentação
Instruções completas para agentes: https://malha.ai/skills.md
Beta fechado. Este é o único pacote oficial — desconfie de nomes parecidos.
