PrumoGrid
InícioPlugins

EXTENSÍVEL POR VOCÊ

Seu primeiro plugin.
Do arquivo ao botão.

Um exemplo completo: consultar os projetos e abrir um terminal de diagnóstico na pasta certa. Funciona com o aplicativo instalado, sem acesso aos fontes do PrumoGrid.

  1. 01 / DECLARE

    extension.json

    Dê um ID ao plugin e declare os comandos que vão aparecer como botões.

  2. 02 / LIGUE AO CÓDIGO

    activate(api)

    Use commands.register com os mesmos IDs para definir o que cada botão faz.

  3. 03 / INSTALE

    Ferramentas → Extensões

    Instale o .prumoplugin, confira os recursos solicitados e habilite. Os botões ficam no cartão da extensão.

PrumoGrid 0.5.4+ · API 1 · Apache 2.0 · Sem agente ou serviço externo. O exemplo e seu código podem ser baixados; os fontes do aplicativo continuam indisponíveis.

Como criar, registrar e testar seu plugin

Seu plugin vive no seu repositório.

Assim como você pode desenvolver uma extensão sem contribuir com o repositório do VS Code, seu plugin do PrumoGrid nasce em uma pasta ou repositório seu. Não precisa de commit, PR, aprovação ou acesso aos fontes do aplicativo. O formato .prumoplugin e a API são próprios do PrumoGrid; não há compatibilidade com VSIX.

O registro acontece dentro do plugin: você declara no manifesto e associa os IDs às funções no JavaScript. Quem recebe instala e habilita pela interface. Não há cadastro em servidor ou no Registro do Windows. Criar uma pasta de desenvolvimento não faz o PrumoGrid descobri-la automaticamente.

01 / PREPARE A PASTA

Três arquivos. Nenhum checkout do aplicativo.

Crie uma pasta chamada meu-plugin. Salve os arquivos abaixo nela, com os nomes exatos e em UTF-8. Node.js 22 ou superior é necessário para executar este empacotador; para instalar o pacote pronto, o PrumoGrid já inclui o ambiente de execução.

meu-plugin/
├── extension.json
├── index.cjs
└── empacotar.mjs

02 / DECLARE O PLUGIN

O manifesto descreve o que aparece no PrumoGrid.

extension.json
{
  "id": "exemplo.diagnostico",
  "name": "Diagnóstico do projeto",
  "publisher": "Exemplo PrumoGrid",
  "version": "1.0.0",
  "apiVersion": 1,
  "description": "Lista projetos e abre um PowerShell de diagnóstico no Projeto-demo.",
  "permissions": ["code.execute", "projects.read", "terminal.create"],
  "commands": [
    { "id": "listar-projetos", "title": "1. Mostrar projetos" },
    { "id": "abrir-diagnostico", "title": "2. Abrir diagnóstico" }
  ]
}

CampoPara que serve
idIdentidade do plugin: exemplo.diagnostico. Para distribuir o seu, escolha algo como suaempresa.ferramentas. Mantenha o ID nas atualizações.
version / apiVersion1.0.0 é a versão do seu plugin; 1 é a versão da API que ele utiliza.
permissionscode.execute é obrigatória. projects.read permite consultar projetos; terminal.create permite abrir um PowerShell.
commands[].idChave técnica local do comando. listar-projetos precisa ser exatamente o mesmo texto usado em commands.register.
commands[].titleTexto do botão: 1. Mostrar projetos. Trocar o título não exige trocar o ID.

03 / REGISTRE O COMPORTAMENTO

Cada ID declarado ganha uma função.

O PrumoGrid fornece api e chama activate quando você executa o primeiro comando. Dentro dela, commands.register liga cada ID ao seu callback. Registre os dois comandos do manifesto. Não acrescente o ID do plugin ao nome do comando.

index.cjs
'use strict';
// SPDX-License-Identifier: Apache-2.0
// Troque pelo nome EXATO do projeto cadastrado no PrumoGrid.
const PROJECT_NAME = 'Projeto-demo';

exports.activate = (api) => {
  // Mesmo ID declarado em extension.json → commands[].id.
  api.commands.register('listar-projetos', async () => {
    const projects = await api.projects.list();
    const names = projects.map(project => project.name).join(', ');
    await api.window.showMessage(
      `Projetos: ${names || 'nenhum cadastrado'}`.slice(0, 900)
    );
  });

  api.commands.register('abrir-diagnostico', async () => {
    const projects = await api.projects.list();
    const matches = projects.filter(project => project.name === PROJECT_NAME);

    // Não escolhe outro projeto silenciosamente.
    if (matches.length !== 1) {
      await api.window.showMessage(
        `Cadastre exatamente um projeto chamado ${PROJECT_NAME}. ` +
        'Use Mostrar projetos para conferir os nomes.'
      );
      return;
    }

    // Abre um NOVO terminal, sem escrever nos que já estão em uso.
    await api.terminal.create({
      projectId: matches[0].id,
      title: 'Diagnóstico por plugin',
      command: "Write-Output 'PrumoGrid plugin OK'; Get-Location; $PSVersionTable.PSVersion"
    });
  });
};

Este exemplo procura exatamente Projeto-demo; não usa automaticamente o projeto selecionado na tela. Se faltar esse nome ou houver duplicatas, ele avisa. Para usar outro projeto, altere PROJECT_NAME, gere um novo pacote e instale-o.

04 / GERE O PACOTE

Junte manifesto e código em um .prumoplugin.

Salve também o empacotador abaixo. Ele usa apenas módulos que vêm com o Node, confere campos básicos, sintaxe e tamanho, e gera um arquivo novo. A validação do pacote pelo PrumoGrid acontece na instalação.

empacotar.mjs
// SPDX-License-Identifier: Apache-2.0
// Node.js 22+. Sem dependências e sem acesso aos fontes do PrumoGrid.
import { readFileSync, writeFileSync } from 'node:fs';
import { join, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
import { Script } from 'node:vm';

export function createPackage(directory = import.meta.dirname) {
  const manifest = JSON.parse(readFileSync(join(directory, 'extension.json'), 'utf8'));
  const source = readFileSync(join(directory, 'index.cjs'), 'utf8');
  if (manifest.apiVersion !== 1 || !/^[a-z][a-z0-9-]{0,39}\.[a-z][a-z0-9-]{0,39}$/.test(manifest.id || '')
    || !/^\d+\.\d+\.\d+$/.test(manifest.version || '')) {
    throw new Error('Confira id, version e apiVersion no extension.json.');
  }
  // Apenas verifica sintaxe. Não executa nem atesta a segurança do plugin.
  new Script(source, { filename: 'index.cjs' });
  const json = JSON.stringify({ manifest, source }, null, 2) + '\n';
  if (Buffer.byteLength(json, 'utf8') > 2 * 1024 * 1024) {
    throw new Error('O pacote excede o limite de 2 MiB.');
  }
  return { manifest, json };
}

if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
  const { manifest, json } = createPackage();
  const filename = `${manifest.id.split('.')[1]}-${manifest.version}.prumoplugin`;
  const output = join(import.meta.dirname, filename);
  writeFileSync(output, json, { flag: 'wx' });
  console.log(`Pacote criado: ${output}`);
}

No PowerShell, entre na pasta meu-plugin e execute:

node .empacotar.mjs

Resultado: diagnostico-1.0.0.prumoplugin, na mesma pasta. Não precisa de npm install, token ou chave de API. O pacote é JSON com manifest e source, até 2 MiB; renomear um ZIP não funciona.

05 / INSTALE E TESTE

Agora o aplicativo reconhece seu plugin.

  1. Crie uma pasta Projeto-demo e adicione-a ao PrumoGrid em + adicionar projetos…; confira o nome no painel de projetos.
  2. Abra Ferramentas → Extensões → Instalar pacote… e selecione diagnostico-1.0.0.prumoplugin.
  3. O cartão Diagnóstico do projeto começa desabilitado. Clique em Habilitar, confira os recursos solicitados e confirme se confia no código.
  4. Clique em 1. Mostrar projetos. A mensagem deve incluir Projeto-demo.
  5. Clique em 2. Abrir diagnóstico. Feche Extensões, selecione Projeto-demo e confira o novo terminal Diagnóstico por plugin.

RESULTADO ESPERADO

O PowerShell mostra PrumoGrid plugin OK, o caminho da pasta e sua versão. Cada clique abre um terminal novo. A mensagem Comando concluído confirma o retorno do plugin; confira a saída no terminal para verificar o diagnóstico.

O plugin habilitado, com os dois botões declarados no manifesto. Captura real 0.5.4, projeto de demonstração.
O novo PowerShell com a saída do diagnóstico. Captura real 0.5.4, projeto de demonstração.

06 / ALTERE E DISTRIBUA

Mesmo ID. Nova versão. Nova instalação.

Edite os arquivos, mantenha exemplo.diagnostico e aumente version para 1.0.1. Execute o empacotador, instale diagnostico-1.0.1.prumoplugin e habilite novamente. Editar index.cjs não altera a cópia instalada. Atualizar lista apenas relê os pacotes instalados; não recompila seu plugin.

A instalação fica no perfil atual. Você não precisa copiar arquivos para a pasta do aplicativo nem editar o armazenamento interno. Para distribuir seu próprio plugin, escolha um ID próprio e envie o .prumoplugin com instruções, licença e código para revisão. A API 1 não oferece marketplace ou atualização automática.

Se não aparecer ou não executar

  • Não há Extensões: confira se a janela está usando PrumoGrid 0.5.4 ou posterior.
  • Botões desativados: habilite o pacote, inclusive depois de atualizar.
  • Comando não registrado: compare commands[].id com commands.register, letra por letra, e confira exports.activate.
  • Permissão negada: declare a permissão da API utilizada em permissions e instale o novo pacote.
  • EEXIST ao empacotar: a saída já existe. Aumente a versão para gerar outro arquivo.

Plugins executam código Node com os direitos da sua conta. As permissões do manifesto controlam as APIs do PrumoGrid, não as capacidades nativas do Node. Instale somente código em que confia. Não coloque credenciais no pacote.

Ver também as informações de plugins na FAQ ↗