npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@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.

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 --json

O 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 version

Flags de deploy: --name, --app, --path, --wait/--no-wait, --json, --timeout, --message, --yes, --resolves-action.

Contrato com agentes

  • --json escreve 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:

  1. MALHA_API_KEY — apenas para CI e automação;
  2. credencial do dispositivo, no credential store do sistema;
  3. 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.