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:
swift build
.build/debug/ploy versionO 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:
# 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.htmlploy 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:
printf '%s\n' '{"id":1,"method":"hello"}' | .build/debug/ploy serve{"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:
{"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.