Referência

Linha de comandos

O comando ploy: como se compila, cada subcomando e opção, exemplos, e o protocolo de linhas JSON do ploy serve.

ploy é o cliente de linha de comandos do núcleo do Ploy. Corre o mesmo orquestrador que a app, com os mesmos modelos e as mesmas ferramentas, para automatizar, testar e medir. Não vem dentro da app nem tem descarga própria: compila-se a partir do código-fonte do Ploy.

Compilar

Precisas de macOS 26 e das ferramentas de Swift (o pacote pede a versão 6.2 ou posterior). Na raiz do código:

bash
swift build
.build/debug/ploy version

O ploy procura o motor dos modelos em vendor/llama/llama-server, a partir da pasta do executável e subindo até seis níveis, ou usa o caminho que puseres em PLOY_LLAMA_SERVER. Se vendor/llama/ estiver vazio, scripts/fetch-runtime.sh descarrega o llama.cpp b11879 e verifica o SHA-256.

Os modelos são os mesmos da app, em ~/Library/Application Support/Ploy/Models/. Se não houver nenhum modelo do Ploy instalado, ploy run usa o ficheiro GGUF que passares com --model ou o caminho em PLOY_MODEL.

Subcomandos

Subcomando O que faz
run "<pedido>" Corre uma tarefa com o agente. Opções abaixo.
models ou models list Lista o catálogo: id, tamanho, estado (instalado, parcial, não instalado) e descrição, e no fim o espaço usado e o livre.
models pull <id> Descarrega um modelo do catálogo, com progresso, e verifica-o por SHA-256.
models remove <id> Remove um modelo.
serve O núcleo por linhas JSON na entrada e na saída padrão. Ver abaixo.
platform O que este sistema dá ao Ploy, serviço a serviço («Abrir aplicações», «Rato e teclado», «Navegador do agente» e os outros).
platform probe Também usa os serviços: lê a janela da frente, faz uma captura se houver permissão e lê uma combinação de teclas.
version Imprime a versão e o aviso de copyright.
notices Imprime os avisos legais: o software de terceiros incluído e os modelos, com os autores, as licenças e de onde vêm.
help A ajuda curta.

Só no macOS:

Subcomando O que faz
inspect <página.html> Abre uma página local no WebKit, carrega nos botões e imprime em JSON o que correu mal. Sai com 0 se a página carregou sem problemas.
apps "<nome>" Mostra o que o Ploy faria com o nome de uma aplicação: a aplicação encontrada, ou as alternativas instaladas e porquê.
observe [aplicação] Mostra o que o Ploy vê de uma aplicação: a lista numerada dos seus elementos. Sem nome, a aplicação da frente.
selftest-ax Conduz uma janela de teste noutro processo pela acessibilidade e confirma cada efeito.
selftest-window A janela de teste que o selftest-ax conduz.
selftest-app <Ploy.app> "<pedido>" Conduz a app como uma pessoa, numa segunda instância com histórico e pasta de projetos temporários, sem tocar nos teus.

Há ainda selftest-orphan, que só os testes do Ploy usam. A ajuda curta mostra apenas run, models, platform, notices, serve e version.

ploy run

Opção O que faz
--dir PASTA A pasta de trabalho, criada se não existir. Sem ela, um pedido de código cria uma pasta em ~/Projetos Ploy.
--model NOME saturn, veta, kant ou auto (o Automático, por omissão).
--model base:ID Um modelo adicional do catálogo, pelo id, por exemplo base:mimo-v2.6-9b.
--model FICHEIRO.gguf Corre um ficheiro GGUF tal como está, fora do catálogo.
--context N O contexto de um ficheiro GGUF (16 384 por omissão). Os modelos do Ploy escolhem o seu.
--mode MODO Força o modo de trabalho: chat, code, vision, documents, computer ou research.
--attach FICHEIRO Anexa um ficheiro; repete a opção para vários. As imagens vão para o modelo de visão, o resto como documentos.
--json Imprime cada evento da tarefa numa linha JSON.
--allow NÍVEL O risco mais alto que corre: read, write, execute, external ou sensitive. Por omissão execute.

A linha de comandos não tem a quem perguntar. O que passa do nível de --allow é recusado, e a linha dessa ação diz «Não autorizado». Depois de a tarefa ler conteúdo de terceiros, os comandos e a leitura fora da pasta são recusados, a não ser com --allow sensitive, que deixa correr tudo, incluindo o que é sensível e incluindo depois de conteúdo de terceiros. Não uses sensitive com pedidos que leiam a web. Os níveis estão em Segurança.

Sem --json, cada linha diz um passo: o modo e o modelo escolhidos, as ações (- A ler …), o resultado de cada uma ([ok], [falhou]), os ficheiros escritos ([ficheiro]), as verificações ([a verificar], [verificado], [problema]), as correções ([a corrigir]) e as notas ([nota]), e no fim «Verificado» ou «Não verificado» com o que ficou por confirmar e a pasta usada. Com --json, cada linha é um evento da tarefa, com a hora (time) e o tipo de passo (kind), como routed, toolStarted, fileWritten ou finished.

Os pedidos da linha de comandos não usam nem guardam memórias e não aparecem no histórico da app.

O código de saída de ploy run é 0 quando a tarefa ficou verificada, 1 quando não ficou ou falhou, e 2 quando falta o pedido ou não há modelo.

Exemplos:

bash
# Corrigir um projeto com o Saturn
.build/debug/ploy run "Os testes deste projeto falham. Corrige o código, não os testes." --dir ~/projetos/loja --model saturn

# Uma pergunta de raciocínio para o Kant, sem pasta
.build/debug/ploy run "Um empréstimo de 200 000 euros a 30 anos com taxa fixa de 3% ao ano: quanto é a prestação mensal?" --model kant

# Uma imagem anexada, com os eventos em JSON
.build/debug/ploy run "Que número de encomenda está nesta imagem?" --attach ~/Desktop/encomenda.png --json

# Modelos
.build/debug/ploy models
.build/debug/ploy models pull qwen3.5-4b

# Ver o que o Ploy faria com uma aplicação, e verificar uma página
.build/debug/ploy apps "Bloco de Notas"
.build/debug/ploy inspect ~/projetos/calculadora/index.html

ploy serve

ploy serve põe o núcleo à disposição de outra interface ou de um script, um objeto JSON por linha em cada sentido. É o protocolo pensado para uma interface de Windows, que ainda não existe.

  • Pedido: {"id": 1, "method": "...", "params": {...}}.
  • Resposta: {"id": 1, "result": ...} ou {"id": 1, "error": "..."}.
  • Enquanto uma tarefa corre: {"id": 1, "event": ...}, um evento por linha, até à resposta final.
Método Parâmetros Resposta
hello nenhum nome, versão, sistema e serviços disponíveis
models nenhum Saturn, Veta e Kant, com papel, resumo, modelo-base e se estão instalados
run text; opcionais folder, model (saturn, veta, kant, auto ou base:ID), mode (o modo de permissões: confirm, automatic ou custom), categories (commands, web, apps, outside) e tools os eventos da tarefa, e no fim answer, verified, summary, files e folder
approve approval (o id do pedido de autorização), approved; opcionais forRun, always, choice true
policy mode, categories, tools o número de tarefas em curso a que a nova política se aplicou, a partir da ação seguinte de cada uma
stop run (o id do pedido run; sem ele, o próprio id) true se havia essa tarefa

Um evento de autorização diz se «Nesta tarefa» e «Sempre» fariam alguma diferença (offersForRun, offersAlways), para que a interface esconda o que não teria efeito. Um método desconhecido recebe "Unknown method …", e uma linha que não é um objeto JSON com id e method recebe um erro sem id. Quando a entrada padrão fecha, as tarefas em curso param e o motor liberta o modelo. As tarefas do serve também não usam memórias.

Um exemplo, com a resposta real do hello neste Mac:

bash
printf '%s\n' '{"id":1,"method":"hello"}' | .build/debug/ploy serve
json
{"id":1,"result":{"name":"Ploy","platform":"macOS","services":[{"available":true,"name":"Abrir aplicações"},{"available":true,"name":"Ler e controlar janelas"},{"available":true,"name":"Rato e teclado"},{"available":true,"name":"Capturas de ecrã"},{"available":true,"name":"Imagens"},{"available":true,"name":"Transcrição de voz"},{"available":true,"name":"Vídeo"},{"available":true,"name":"Navegador do agente"},{"available":true,"name":"Verificação de páginas"},{"available":true,"name":"Lixo recuperável"},{"available":true,"name":"Notificações"}],"version":"2.0"}}

E uma tarefa com uma autorização e uma paragem:

json
{"id": 3, "method": "run", "params": {"text": "Cria uma página com um relógio", "folder": "~/projetos/relogio", "model": "saturn", "mode": "confirm"}}
{"id": 4, "method": "approve", "params": {"approval": "<id do pedido de autorização>", "approved": true, "forRun": true}}
{"id": 5, "method": "stop", "params": {"run": 3}}

Os testes do Ploy exercitam este protocolo com o executável real.