Linha de comando

Escaneie onde o código está.

A CLI lê os seus repositórios em um notebook ou no CI, encontra as rotas, as chamadas, as filas e os modelos e envia só o grafo resultante para o seu workspace. É o mesmo scanner que o nosso runner hospedado usa, então os dois chegam ao mesmo resultado. Em um pull request, ela diz o que a mudança quebra.

$ npm install -g kuuhaku
$ kuuhaku login --token <token from the app>
$ kuuhaku scan ~/work/company --push
$ kuuhaku check ~/work/company

Instalação

O npm é o melhor caminho: um comando em qualquer sistema com Node 18 ou mais recente, e as atualizações vêm com npm update -g.

npm Recomendado

Depois de uma instalação, o comando funciona em qualquer pasta.

npm install -g kuuhaku
npx Sem instalar

O npm baixa o pacote a cada execução; bom para CI e para um primeiro teste.

npx kuuhaku scan . --push
Executável Em breve

Um arquivo para Windows, macOS ou Linux. Sem precisar de Node: baixe, coloque no PATH e rode.

kuuhaku.exe scan C:\work --push
Docker Em breve

Para sistemas de CI que só rodam contêineres. A pasta é montada como somente leitura.

docker run --rm -v "$PWD:/code:ro" \
  -e KUUHAKU_TOKEN kuuhaku/cli \
  scan /code --push
Homebrew e Scoop Em breve

Pelo gerenciador de pacotes do sistema, atualizado junto com o resto da máquina.

brew install kuuhaku
scoop install kuuhaku

Conecte uma máquina

  1. Pegue o token de push do workspace.

    No app, na página da CLI ou em Configurações, Varredura. O token só pode enviar grafos para esse workspace e aparece uma única vez.

  2. Faça login pelo terminal.

    Uma vez por máquina. O token fica guardado em ~/.kuuhaku, legível só pelo seu usuário.

    $ kuuhaku login --token <token> --api https://api.your-domain
  3. Escaneie e envie.

    Aponte para uma pasta de repositórios ou para um architecture.yaml. A máquina aparece na página da CLI do workspace com o sistema, a versão e o último envio.

    $ kuuhaku scan ~/work/company --push

Comandos

kuuhaku scan [folder | architecture.yaml]

Escaneia e grava o graph.json. Com uma pasta de repositórios, escaneia cada repositório git dentro dela, até três níveis abaixo; com um repositório, escaneia os serviços dele.

kuuhaku check [folder | architecture.yaml]

O que as mudanças nos seus repositórios quebram: rotas que somem para quem as chama, chamadas que nenhuma rota atende, filas que ficam sem publicador. Cada repositório é comparado com a sua branch base, nada é enviado, e o comando sai com código 1 quando algo quebra.

kuuhaku login --token <token> [--api <url>]

Conecta esta máquina a um workspace e já confere o token.

kuuhaku push [graph.json]

Envia um grafo gravado antes; a última varredura quando nenhum arquivo é informado.

kuuhaku status

Esta máquina, a API e se o token ainda abre o workspace.

kuuhaku init [folder]

Grava um architecture.yaml com os repositórios encontrados, para você acrescentar hosts, pastas de documentação e conexões que o código não consegue mostrar.

kuuhaku logout

Esquece o token. A máquina mantém o seu id, então continua sendo uma única entrada no workspace.

--push

Envia o grafo quando a varredura termina.

--network

Versões mais recentes e alertas de segurança do registro do npm e do OSV. Os nomes dos pacotes saem da máquina; nada mais sai.

--out <dir>

Para onde vai o graph.json; ~/.kuuhaku/out/<name> por padrão.

--base <ref>

check: a branch ou o commit com que comparar. Quando não informado, a branch padrão do remoto.

--markdown <file>

check: também grava o relatório como comentário de pull request, com cada arquivo e linha ligados ao host do repositório.

KUUHAKU_TOKEN

Envia sem login, para CI.

KUUHAKU_HOME

Onde a CLI guarda a pasta dela, para runners com a home somente leitura.

KUUHAKU_MACHINE_NAME

O nome que esta máquina recebe no workspace.

No CI

Escaneie a cada push na main. Salve o token como o secret KUUHAKU_TOKEN do repositório; o job aparece como uma máquina, com o nome do repositório.

name: Kuuhaku
on:
  push:
    branches: [main]
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 400
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - run: npx kuuhaku scan . --push --api https://api.your-domain
        env:
          KUUHAKU_TOKEN: ${{ secrets.KUUHAKU_TOKEN }}

Verifique cada pull request. O job falha quando a mudança quebra quem chama, e o relatório vai para o pull request como um comentário que a próxima execução atualiza. Nada é enviado, então nenhum token é necessário.

name: Kuuhaku check
on: pull_request
permissions:
  contents: read
  pull-requests: write
jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - run: npx kuuhaku check . --base origin/${{ github.base_ref }} --markdown check.md
      - if: always() && hashFiles('check.md') != ''
        run: gh pr comment ${{ github.event.pull_request.number }} --edit-last --body-file check.md || gh pr comment ${{ github.event.pull_request.number }} --body-file check.md
        env:
          GH_TOKEN: ${{ github.token }}

No Bitbucket Pipelines, busque antes a branch de destino, já que um pipeline só clona a própria: git fetch origin "+refs/heads/$BITBUCKET_PR_DESTINATION_BRANCH:refs/remotes/origin/$BITBUCKET_PR_DESTINATION_BRANCH", depois npx kuuhaku check . --base origin/$BITBUCKET_PR_DESTINATION_BRANCH. Um workspace com vários repositórios precisa dos outros clonados ao lado do que mudou; eles só são lidos.

O que sai da máquina

O graph.json e mais nada. Você pode abri-lo antes de enviar: kuuhaku scan sem --push grava o arquivo e para.

No grafo
  • Caminhos e métodos das rotas, com arquivo e linha
  • Pontos de chamada, nomes de filas e de sockets, campos dos modelos
  • Três linhas de código em volta de cada item deixado para revisão
  • Nomes das chaves de ambiente, nunca os valores
  • Nomes e versões das dependências
  • Contagem de commits e nomes dos autores por repositório
Nunca
  • Arquivos de código-fonte inteiros
  • Valores de variáveis de ambiente e segredos
  • Conteúdo dos bancos de dados

O runner hospedado é a outra forma de escanear: ele clona com a sua chave somente leitura numa pasta temporária, escaneia, guarda o grafo e apaga o checkout. Com a CLI, só o grafo chega até nós. Mais na página de segurança.