Documentação

Aplicativos: comandos da CLI

Empacote, envie, atualize e exclua aplicativos web e leia ou grave o armazenamento de chave/valor deles e os webhooks.

Cada comando funciona como descrito na referência da CLI: flags globais, saída JSON, códigos de saída, revisões e tentativas.

Aplicativos

Uma aplicação é um diretório estático já construído com uma raiz index.html. O empacotador injeta o SDK do navegador em _screenrig/runtime.js e adiciona sua tag de script, então o app alcança window.screenrig sem etapa de build e nada a adicionar às suas dependências. Nada no diretório é construído ou executado durante o empacotamento.

app pack#

Empacote um diretório estático em um arquivo determinístico sem enviá-lo.

app pack <directory> [--output FILE]
ParâmetroTipoObrigatórioPadrãoNotas
<directory>caminhosimnenhumO diretório estático construído. Precisa de uma raiz index.html.
--output FILEcaminhonãonada está escritoTambém escreva o arquivo neste caminho. Sem ele, o comando relata o arquivo e o mantém na memória.
screenrig app pack ./lobby-board --output ./lobby-board.tgz

O envelope informa sha256, compressed_bytes, expanded_bytes, file_count, a lista de entradas, e se o tempo de execução do SDK foi injetado. app upload empacota o diretório em si, então use este comando apenas quando quiser inspecionar o arquivo primeiro. Ele roda localmente e não exige login.

Um pacote tem no máximo 5000 arquivos, 250 MiB descompactados e 100 MiB compactados, cada arquivo com no máximo 32 MiB, com caminhos de no máximo 16 níveis e 255 bytes. O empacotamento deixa de fora nomes que começam com ., node_modules/, bower_components/, jspm_packages/, vendor/, venv/, __pycache__/, CVS/, source maps *.map, arquivos de chaves e credenciais (*.pem, *.key, *.p12, *.pfx, *.crt, *.cer, id_rsa, id_dsa, id_ecdsa, id_ed25519, credentials.json, secrets.json), arquivos temporários e de backup de editores, Thumbs.db e desktop.ini. Um arquivo .screenrigignore na raiz do diretório acrescenta padrões no estilo gitignore, um por linha, e não pode restaurar uma exclusão embutida. Links simbólicos, hardlinks, arquivos esparsos, dispositivos, caminhos duplicados (comparados também sem diferenciar maiúsculas de minúsculas), arquivos que mudam durante o empacotamento e um diretório sem index.html na raiz são recusados com o caminho indicado: o comando termina com o código 2 e não envia nada.

Aplicativos rodam sob política de segurança de conteúdo que bloqueia código inline. Empacotamento move blocos de estilo e script inline para arquivos _screenrig-inline-* ao lado de cada documento HTML e os vincula. Handlers de evento inline como onclick= e URLs javascript: não podem ser movidos; empacotamento os recusa e nomeia arquivo e linha.

app types#

Grave os tipos TypeScript de window.screenrig em um diretório.

app types [directory]
ParâmetroTipoObrigatórioPadrãoNotas
[directory]caminhonãoo diretório atualO diretório em que screenrig.d.ts é gravado. Ele precisa existir.
screenrig app types ./src

O envelope informa path, bytes, sha256 e written, que é false quando o arquivo já continha os tipos atuais. O arquivo corresponde ao tempo de execução que app pack e app upload injetam, então execute o comando de novo depois de atualizar a CLI. Um screenrig.d.ts existente é substituído por inteiro; um diretório ou um link simbólico nesse caminho é recusado, e o comando termina com o código 2. Ele roda localmente e não exige login. TypeScript descreve o que os tipos declaram.

app dev#

Sirva um diretório em um ambiente de teste local do Player para experimentar um aplicativo antes de enviá-lo.

app dev <directory> [--port PORT] [--open] [--no-reload] [--kv FILE | --kv-from APP_ID]
ParâmetroTipoObrigatórioPadrãoNotas
<directory>caminhosimnenhumO diretório estático construído. Precisa de uma raiz index.html.
--port PORTintegernão18890A porta em que o ambiente de teste escuta. O runtime confia no ambiente de teste apenas em 18890, por isso qualquer outra porta é recusada.
--openbooleannãodesligadoAbra o ambiente de teste no navegador.
--no-reloadbooleannãodesligadoMantenha a página como está quando um arquivo muda. Sem isso, a página recarrega a cada mudança.
--kv FILEcaminhonão.screenrig-dev/kv.jsonO arquivo JSON que contém o armazenamento de chave/valor da execução.
--kv-from APP_IDstringnãonenhumLeia o armazenamento de chave/valor deste aplicativo enviado, somente leitura, em vez de um arquivo.
screenrig app dev ./lobby-board --open

O comando serve o ambiente de teste em http://play.screenrig.localhost:18890 e roda até você interrompê-lo. Ele injeta o runtime como app pack faz e informa o que o empacotamento recusa, indicando o arquivo e a linha, conforme você edita. O ambiente de teste simula as capacidades, a viewport, o nome da tela, o fuso horário e os params, o temporizador da página, a pausa, a tela e a saída, os eventos do dispositivo, e portas seriais, linhas GPIO, periféricos Bluetooth LE e impressoras. As linhas emit e log são impressas no terminal. Desenvolver localmente descreve os controles.

app upload#

Empacote um diretório, publique-o como uma nova versão do aplicativo e aguarde a publicação ser bem-sucedida.

app upload <directory> [--name NAME] [--no-wait] [--poll-ms MS] [--timeout MS]
ParâmetroTipoObrigatórioPadrãoNotas
<directory>caminhosimnenhumO diretório estático construído.
--name NAMEstringnãoum nome geradoNome do aplicativo, de 1 a 120 caracteres após remover espaços nas extremidades, sem caracteres de controle.
--no-waitbooleannãodesligadoRetornar antes que a operação de publicação termine. Execute operations wait antes de fixar a versão em uma playlist.
--poll-ms MSintegernão1000Intervalo entre pesquisas de operação enquanto aguarda.
--timeout MSintegernão120000Prazo para a espera. Também limita cada solicitação subjacente.
screenrig app upload ./lobby-board --name "Lobby board"

Ler três campos: data.operation.state é succeeded, data.application.release_id é o id rel_ um primitivo application fixa, e data.application.id é o id app_ que os comandos kv usam. Uma operação bem-sucedida, não um id de release sozinho, significa que a release é utilizável.

Cada app upload cria um novo aplicativo e uma primeira versão imutável. Para publicar uma versão posterior do mesmo app, use app update. Uma playlist continua servindo a versão que já fixa até você editar esse primitivo.

Uma transferência para o armazenamento que for interrompida é tentada até 4 vezes enquanto a URL de upload for válida. Se ainda falhar, execute o mesmo comando novamente para retomar o mesmo upload.

app update#

Publicar uma nova versão de um aplicativo existente, preservando identidade, nome e K/V do aplicativo.

app update <id> <directory> [--expect-rev REVISION] [--no-wait] [--poll-ms MS] [--timeout MS]
ParâmetroTipoObrigatórioPadrãoNotas
<id>stringsimnenhumO id da aplicação app_.
<directory>caminhosimnenhumO diretório estático construído.
--expect-rev REVISIONstringnãonenhumPré-condição opcional de revisão. Omitir para escrever o recurso atual. Um valor obsoleto fornecido é revision_conflict: buscar novamente, reaplicar, tentar novamente.
--no-waitbooleannãodesligadoRetornar antes que a operação de publicação termine. Execute operations wait antes de fixar a versão em uma playlist.
--poll-ms MSintegernão1000Intervalo entre pesquisas de operação enquanto aguarda.
--timeout MSintegernão120000Prazo para a espera. Também limita cada solicitação subjacente.
screenrig app update app_01EXAMPLEAPP00000000000 ./lobby-board

O nome permanece; altere-o com app rename. Aguarde data.operation.state: "succeeded", depois use playlist replace-release para revisar a página exata, primitivo, nova versão e telas afetadas. Aplique com o token de impacto retornado e um controle de revisão opcional conforme descrito no fluxo de trabalho da playlist. Os pins existentes da playlist permanecem inalterados até a aplicação. Em caso de conflito de revisão, leia o app novamente antes de decidir se deve tentar novamente; não crie um aplicativo substituto apenas para contornar o conflito.

app list#

Listar os aplicativos do projeto.

app list

Sem parâmetros.

screenrig app list

app rename#

Alterar o nome de exibição de um aplicativo.

app rename <id> --name NAME [--expect-rev REVISION]
ParâmetroTipoObrigatórioPadrãoNotas
<id>stringsimnenhumO id da aplicação app_.
--name NAMEstringsimnenhumO novo nome, de 1 a 120 caracteres após remover espaços nas extremidades, sem caracteres de controle.
--expect-rev REVISIONstringnãonenhumPré-condição opcional de revisão. Omitir para escrever o recurso atual. Um valor obsoleto fornecido é revision_conflict: buscar novamente, reaplicar, tentar novamente.
screenrig app rename app_01EXAMPLEAPP00000000000 --name "Lobby welcome"

Só o nome de exibição muda. O ID do aplicativo, seus lançamentos, seus dados chave/valor e as playlists que fixam seus lançamentos permanecem como estão, e nenhum diretório é enviado. Renomear para o nome atual deixa a revisão inalterada. Os nomes podem se repetir; identifique um aplicativo pelo ID.

app show#

Leia um aplicativo.

app show <id>
ParâmetroTipoObrigatórioPadrãoNotas
<id>stringsimnenhumO id da aplicação app_.
screenrig app show app_01EXAMPLEAPP00000000000

latest_ready_release está ausente até que uma primeira publicação fique pronta. O estado da publicação vive na operação e no lançamento, não no aplicativo. last_used_at está ausente até que uma tela reproduza o aplicativo pela primeira vez.

app delete#

Excluir um aplicativo e todas as suas versões.

app delete <id> [--expect-rev REVISION]
ParâmetroTipoObrigatórioPadrãoNotas
<id>stringsimnenhumO id da aplicação app_.
--expect-rev REVISIONstringnãonenhumPré-condição opcional de revisão. Omitir para escrever o recurso atual. Um valor obsoleto fornecido é revision_conflict: buscar novamente, reaplicar, tentar novamente.
screenrig app delete app_01EXAMPLEAPP00000000000

Não há exclusão por lançamento. Enquanto uma tela mostra um dos lançamentos da aplicação, a exclusão responde application_in_use: dê a essas telas outro conteúdo primeiro. A exclusão não verifica playlists que fixam um lançamento sem mostrá-lo, então atualize ou exclua essas playlists também.

Chave/valor do aplicativo

O armazenamento chave/valor pertence a um aplicativo e é seguro para binários. Cada comando usa --app-id com o ID app_ de app upload, nunca um ID de lançamento. Use exatamente um modo de valor por gravação.

kv list#

Listar as chaves armazenadas para um aplicativo.

kv list --app-id ID
ParâmetroTipoObrigatórioPadrãoNotas
--app-id IDstringsimnenhumO id da aplicação app_.
screenrig kv list --app-id app_01EXAMPLEAPP00000000000

kv get#

Leia uma chave.

kv get --app-id ID <key>
ParâmetroTipoObrigatórioPadrãoNotas
--app-id IDstringsimnenhumO id da aplicação app_.
<key>stringsimnenhumA chave para ler.
screenrig kv get --app-id app_01EXAMPLEAPP00000000000 menu

A resposta traz o valor em data.value_base64, inclusive valores JSON: decodifique-o e interprete JSON somente quando data.content_type indicar JSON. kv list omite os valores.

kv set#

Escreva uma chave do JSON, um arquivo ou bytes base64.

kv set --app-id ID <key> --json-value JSON [--expect-rev REVISION]
kv set --app-id ID <key> --file FILE [--content-type TYPE] [--expect-rev REVISION]
kv set --app-id ID <key> --value-base64 BASE64 [--content-type TYPE] [--expect-rev REVISION]
ParâmetroTipoObrigatórioPadrãoNotas
--app-id IDstringsimnenhumO id da aplicação app_.
<key>stringsimnenhumA chave para escrever.
--json-value JSONstringum modonenhumUm valor JSON, canonizado antes de ser enviado, sempre armazenado como application/json. Um tipo de conteúdo application/json explícito também é aceito.
--file FILEcaminhoum modonenhumLê os bytes do valor de um arquivo, no máximo 1 MiB, ou de stdin com -. Padrão é application/octet-stream.
--value-base64 BASE64stringum modonenhumBase64 padrão canônica preenchida sem espaços em branco, no máximo 1.398.104 caracteres; um valor vazio é válido. Padrão é application/octet-stream.
--content-type TYPEstringnãoapplication/octet-stream para bytesDe um a 127 caracteres.
--expect-rev REVISIONstringnãonenhumEscreva somente se a entrada armazenada ainda estiver nesta revisão.
screenrig kv set --app-id app_01EXAMPLEAPP00000000000 menu --json-value '{"soup":"lentil"}'

kv delete#

Excluir uma chave.

kv delete --app-id ID <key> [--expect-rev REVISION]
ParâmetroTipoObrigatórioPadrãoNotas
--app-id IDstringsimnenhumO id da aplicação app_.
<key>stringsimnenhumA chave para excluir.
--expect-rev REVISIONstringnãonenhumPré-condição opcional de revisão. Omitir para escrever o recurso atual. Um valor obsoleto fornecido é revision_conflict: buscar novamente, reaplicar, tentar novamente.
screenrig kv delete --app-id app_01EXAMPLEAPP00000000000 menu

Webhooks chave/valor

Um webhook chave/valor é uma URL que grava uma chave de um aplicativo, então qualquer sistema externo, como um ponto de venda, um script de planilha ou um cron job, envia dados para telas com um único POST HTTP. Um aplicativo que se inscreve com kv.onChange atualiza em segundos em todas as telas que o executam. Um aplicativo tem no máximo 20 webhooks.

O remetente se autentica com o segredo do webhook, srkw_…, como Authorization: Bearer <secret>, ou com HTTP Basic usando o ID do webhook como nome de usuário e o segredo como senha; um segredo na URL ou na query string nunca é aceito. O corpo bruto, de no máximo 1 MiB, vira o valor da chave e Content-Type o tipo de conteúdo dela. Cada envio não conta no limite de solicitações de agente, conta no armazenamento como kv set, aumenta a revisão e responde com os novos metadados da chave, nunca com o valor. Um cabeçalho Idempotency-Key opcional deduplica as novas tentativas de um remetente por 24 horas. Um webhook aceita no máximo 120 envios por minuto, e um segredo ausente ou errado ou um webhook desconhecido recebe 401. Enviar dados de outro sistema tem exemplos de curl.

O segredo é mostrado apenas por kv webhook create e kv webhook rotate-secret. A URL não é secreta. Criar, rotacionar e excluir um webhook adiciona kv_webhook.created, kv_webhook.secret_rotated e kv_webhook.deleted ao log de eventos do projeto, e cada post adiciona kv.updated como qualquer escrita.

Código do problemaSairSignificado
kv_webhook_limit_reached5O aplicativo ou o cartão já tem 20 webhooks. Nada foi criado. Exclua um primeiro.
not_found4O aplicativo não está neste projeto, ou nenhum webhook tem esse id nele.
card_not_found4O cartão não está neste projeto.

kv webhook create#

Criar um webhook que grava uma chave de uma aplicação ou, com --card, o documento de dados de um cartão, e receber sua URL e segredo uma vez.

kv webhook create <key> --app-id ID [--description TEXT]
kv webhook create --card CARD_ID [--description TEXT] [--map FILE|-] [--key-template TEMPLATE] [--signing]
                  [--verify VENDOR [--verify-secret-file FILE|-] [--verify-header NAME] [--verify-encoding hex|base64]
                   [--verify-timestamp-header NAME] [--verify-tolerance SECONDS]] [--handshake VENDOR]
ParâmetroTipoObrigatórioPadrãoNotas
<key>stringcom --app-idnenhumA chave que cada postagem grava, de 1 a 256 caracteres: uma letra ou dígito primeiro, depois letras, dígitos, ., _, :, / ou -. A chave pode ainda não existir. Um webhook de cartão não usa chave.
--app-id IDstringum denenhumO id da aplicação app_. Informe exatamente um entre --app-id e --card.
--card CARD_IDstringum denenhumO id de cartão crd_: o webhook grava o documento de dados do cartão. Veja Webhooks de cartão.
--description TEXTstringnãonenhumO que envia para ele, no máximo 200 bytes. Não deve conter credenciais.
--map FILEcaminhonãonenhumO mapeamento que monta o documento a partir do corpo postado: um objeto JSON de no máximo 64 KiB lido de um arquivo, ou - para stdin. Sem ele, o objeto postado é o documento.
--key-template TEMPLATEstringnãonenhumGrava documentos por chave sob uma chave preenchida com tokens {screen.field.NAME}, como room-{screen.field.room}.
--signingbooleannãodesligadoExige também ScreenRig-Signature em cada postagem e mostra o segredo de assinatura uma só vez. Não se combina com --verify.
--verify VENDORstringnãonenhumAceita postagens que trazem a assinatura própria deste fornecedor no lugar do segredo srkw_ do webhook, que continua funcionando ao lado: github, stripe, shopify, slack, linear, vercel, asana ou generic_hmac.
--verify-secret-file FILEcaminhocom --verifynenhumLê o segredo do fornecedor de um arquivo, ou - para stdin (nunca como argumento): o segredo que GitHub, Stripe, Shopify, Slack, Linear ou Vercel mostra, ou o de um remetente generic_hmac. asana não aceita nenhum: o handshake o entrega. Apenas uma opção lê stdin.
--verify-header NAMEstringcom generic_hmacnenhumO cabeçalho que carrega a assinatura, de 1 a 100 letras, dígitos, - ou _.
--verify-encoding ENCODINGstringnãohexCom generic_hmac: como a assinatura é escrita, hex ou base64; pode começar com sha256=.
--verify-timestamp-header NAMEstringnãonenhumCom generic_hmac: um cabeçalho que carrega a hora Unix em segundos ou em milissegundos com 13 dígitos. O texto assinado é então o carimbo de data e hora, um ponto e o corpo.
--verify-tolerance SECONDSintegernão300Com --verify-timestamp-header: o quanto o carimbo de data e hora pode se afastar do relógio do servidor, de 1 a 86400.
--handshake VENDORstringnãonenhumResponde ao desafio de configuração de microsoft_graph, monday, trello ou azure_event_grid. O Slack e o Asana respondem aos seus por --verify.
screenrig kv webhook create menu --app-id app_01EXAMPLEAPP00000000000 --description "Point of sale menu feed"
screenrig kv webhook create --card crd_01EXAMPLEBOARD0000000000 --map alert-map.json --description "CMS alerts"

--map, --key-template, --signing, --verify com suas opções e --handshake se aplicam apenas a um webhook de cartão.

O envelope é o webhook: data.id (kvw_…), data.key ou, para um cartão, data.card_id, data.url (https://api.screenrig.ai/api/applications/<app_id>/kv-webhooks/<id>/write ou https://api.screenrig.ai/api/cards/<card_id>/kv-webhooks/<id>/write) e data.secret (srkw_…). Um webhook de cartão que assina também traz data.signing_secret (whsec_…). Informe agora a URL e os segredos no sistema remetente. Nenhum comando posterior os mostra de novo. Após uma criação interrompida ou ambígua, execute novamente o comando idêntico dentro de 24 horas: ele reutiliza a chave de idempotência salva, e o servidor retorna o mesmo webhook e os mesmos segredos em vez de criar outro.

kv webhook list#

Listar os webhooks de uma aplicação ou de um cartão, os mais antigos primeiro.

kv webhook list (--app-id ID | --card CARD_ID)
ParâmetroTipoObrigatórioPadrãoNotas
--app-id IDstringum denenhumO id da aplicação app_. Informe exatamente um entre --app-id e --card.
--card CARD_IDstringum denenhumO ID de cartão crd_.
screenrig kv webhook list --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook list --card crd_01EXAMPLEBOARD0000000000

Cada item possui id, key, description, url, created_at e, após ser gravado, last_used_at. O item de um webhook de cartão tem card_id no lugar de key, mais mapping (null quando o objeto postado é o documento), enabled, signing e, quando definidos, key_template, verify e handshake. Uma lista nunca carrega um segredo.

kv webhook delete#

Excluir um webhook. Sua URL para de funcionar imediatamente, e a chave ou o documento do cartão mantém seu valor.

kv webhook delete <webhook_id> (--app-id ID | --card CARD_ID)
ParâmetroTipoObrigatórioPadrãoNotas
<webhook_id>stringsimnenhumO id do webhook kvw_.
--app-id IDstringum denenhumO id da aplicação app_. Informe exatamente um entre --app-id e --card.
--card CARD_IDstringum denenhumO ID de cartão crd_.
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000

kv webhook rotate-secret#

Substituir o segredo de um webhook e receber o novo uma vez.

kv webhook rotate-secret <webhook_id> (--app-id ID | --card CARD_ID) [--signing]
ParâmetroTipoObrigatórioPadrãoNotas
<webhook_id>stringsimnenhumO id do webhook kvw_.
--app-id IDstringum denenhumO id da aplicação app_. Informe exatamente um entre --app-id e --card.
--card CARD_IDstringum denenhumO ID de cartão crd_.
--signingbooleannãodesligadoCom --card: substitui o segredo de assinatura em vez do segredo do webhook.
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --signing

O envelope traz o novo segredo em data.secret. O segredo antigo para de funcionar imediatamente, então informe o novo no sistema remetente. Com --signing, o envelope traz no lugar o novo segredo de assinatura em data.signing_secret, e o segredo srkw_ do webhook permanece. Após uma rotação interrompida ou ambígua, execute novamente o comando idêntico: ele reutiliza a chave de idempotência salva, e o servidor retorna a rotação que já aconteceu em vez de rotacionar de novo.

Outros grupos de comandos