Como o plugin oficial da Salesforce para a CLI do Claude Code combina mais de 40 Agent Skills, servidores MCP embutidos e diagnósticos de linguagem em tempo real para transformar o terminal no seu ambiente de desenvolvimento primário.

Quantas vezes você já abriu o VS Code, esperou cinco minutos para os plugins de Salesforce terminarem de indexar metadados, viu a ventoinha do notebook disparar a 100% e percebeu que precisava de quatro gigabytes de memória RAM só para ajustar três linhas em um serviço de Apex?

Se você desenvolve na plataforma Salesforce há algum tempo, você conhece bem essa dor.

Durante anos, fomos condicionados a acreditar que desenvolvimento corporativo exige interfaces visuais pesadas. Passamos pelo Force.com IDE no Eclipse, sofremos com a lentidão do Developer Console web e nos acomodamos no VS Code com o Salesforce Extension Pack. Mas a engenharia de software de ponta está em outro lugar.

A maré virou: entramos de cabeça na era do Headless Development (desenvolvimento sem interface gráfica).

Com assistentes de inteligência artificial baseados em linha de comando — encabeçados pelo Claude Code CLI da Anthropic — e padrões universais de interoperabilidade como o Model Context Protocol (MCP), o terminal voltou a ser a ferramenta mais poderosa e rápida do programador.

E a Salesforce não ficou para trás: com o lançamento oficial do plugin salesforce-development@claude-plugins-official no marketplace do Claude Code, a plataforma ganha uma esteira agêntica completa direto no prompt. São mais de 40 skills homologadas do repositório sf-skills, três servidores MCP embutidos com o Language Server de Apex/SOQL rodando localmente no terminal (salesforce-lsp) e agentes dedicados a auditar código contra as diretrizes do Salesforce Well-Architected.

Neste artigo prático de engenharia de campo, vamos abrir essa caixa-preta: da instalação e validação das ferramentas até o deploy e execução empírica de código Apex na nossa org de testes conectada.


1. A tríade do desenvolvimento agêntico: Skills, MCP e Plugins

Para entender como essa engrenagem funciona sem interfaces visuais, precisamos separar três conceitos que muita gente confunde:

1. Agent Skills (Habilidades Agênticas)

Uma skill é uma instrução estruturada e versionável que ensina o modelo de linguagem a executar uma tarefa técnica rigorosa. Fisicamente, é uma pasta contendo um arquivo SKILL.md com metadados YAML e procedimentos cirúrgicos em Markdown. O segredo aqui é o lazy-loading: o agente de IA não lê os 40 arquivos de skills de uma vez. Ele carrega apenas os nomes e as descrições no início da sessão. Somente quando você pede uma tarefa específica (como criar um serviço Apex respeitando WITH USER_MODE) é que a skill correspondente entra na memória de trabalho.

2. Model Context Protocol (MCP)

Enquanto a skill é o conhecimento metodológico, os servidores MCP são os braços executivos. O MCP atua como um padrão universal aberto (JSON-RPC) que permite ao Claude interagir com ferramentas locais, bancos de dados, APIs e compiladores sem acoplamento proprietário.

3. Agent Plugins (A camada de distribuição)

Até pouco tempo, montar esse ambiente exigia clonar repositórios git na mão, editar arquivos claude.json e rezar para as variáveis de ambiente estarem alinhadas. O plugin oficial da Salesforce resolve esse gargalo: um único comando instala skills, inicializa servidores MCP e registra os agentes especializados no seu terminal.


2. A anatomia do plugin oficial salesforce-development

Ao rodar a instalação do plugin no Claude Code, a CLI passa a ter acesso a um ecossistema completo de ferramentas nativas:

A arquitetura distribui responsabilidades de forma modular:

  • Catálogo de 40+ Skills (forcedotcom/sf-skills): Templates e fluxos de trabalho homologados pela Salesforce cobrindo governança, DX, Apex, LWC, Data Cloud e Agentforce.
  • Servidores MCP embutidos:
    • salesforce-lsp: O trunfo técnico do pacote. Executa no terminal os mesmos Language Servers oficiais de Apex e SOQL do VS Code, acusando erros de sintaxe, tipos inválidos e referências quebradas de campos antes de qualquer deploy.
    • salesforce-metadata-experts: Injeta inteligência profunda sobre tipos de metadados e dependências de pacotes.
    • salesforce-api-context: Fornece limites da org, sessões ativas e metadados de Tooling e REST API em tempo real.
  • Agentes Especializados:
    • salesforce-dev: O orquestrador central para geração e refatoração de código.
    • architecture-review: Um auditor estrito que avalia o repositório contra os pilares Trusted, Easy e Adaptable do Salesforce Well-Architected.
    • ADLC: Agentes focados no ciclo de vida de desenvolvimento do Agentforce e scripts .agent.

3. Preparando o ambiente no terminal

A configuração no terminal é direta e exige apenas as ferramentas de engenharia que todo time moderno já deveria ter instaladas:

Pré-requisitos de sistema:

  • Node.js LTS (versões 22 ou 24).
  • Salesforce CLI (sf) devidamente instalada e atualizada.
  • Claude Code CLI instalada globalmente (npm install -g @anthropic-ai/claude-code).
  • Python 3.8+ (utilizado internamente por analisadores de segurança e scripts auxiliares).

Passo 1: Autenticar a organização de desenvolvimento

Antes de abrir o assistente, garanta que sua org padrão esteja definida no workspace DX:

# Autentica via navegador e marca como org padrão do projeto
sf org login web --alias DevOrg --set-default

Passo 2: Instalar o plugin oficial no Claude Code

Abra a CLI interativa do Claude Code digitando claude no terminal da raiz do projeto e instale a extensão oficial:

/plugin install salesforce-development@claude-plugins-official

Passo 3: Executar a validação de integridade

Após o download, rode o setup diagnóstico:

/salesforce-development:setup

O comando valida a comunicação com o salesforce-lsp, confirma a acessibilidade da Salesforce CLI e checa o handshake com a organização conectada.


4. O fluxo prático na ponta dos dedos: do prompt ao deploy

Vamos ver o ambiente operando na prática com um caso de negócio real: a construção de um serviço corporativo de atribuição de contas por território com lógica de segurança estrita e cobertura total de testes.

No prompt do Claude Code, disparou-se a seguinte instrução em linguagem natural:

“Crie uma classe de serviço em Apex chamada AccountTerritoryService para atribuir o território ‘LATAM Enterprise’ a contas com faturamento anual acima de 50 milhões. Garanta respeito às regras de compartilhamento com USER_MODE, crie a respectiva classe de testes com 100% de cobertura e valide o deploy na minha org padrão.”

O que o Claude Code faz em segundos:

  1. Identifica a intenção e faz lazy-load da skill platform-apex-generate.
  2. Cria o arquivo force-app/main/default/classes/AccountTerritoryService.cls.
  3. O servidor MCP salesforce-lsp valida se os campos AnnualRevenue e Description existem e têm tipos compatíveis no schema local.
  4. Gera a suíte de testes AccountTerritoryServiceTest.cls utilizando Assert.areEqual e dados isolados com @TestSetup.
  5. Aciona a Salesforce CLI em segundo plano e realiza o deploy com relatório no terminal.

O código gerado e validado:

/* 
 * Data: 2026-09-25
 * Objetivo da Customização: Serviço corporativo de atribuição de território de contas via Headless Development (Claude Code Salesforce Plugin)
 */
public with sharing class AccountTerritoryService {

    public static final String TIER_LATAM_ENTERPRISE = 'LATAM Enterprise';
    public static final Decimal REVENUE_THRESHOLD = 50000000;

    /**
     * Avalia e atribui o território qualificado para uma lista de IDs de contas.
     * @param accountIds Lista de identificadores das contas a processar.
     * @return Quantidade de registros que sofreram atualização de território.
     */
    public static Integer assignEnterpriseTerritories(Set<Id> accountIds) {
        if (accountIds == null || accountIds.isEmpty()) {
            return 0;
        }

        List<Account> accountsToUpdate = new List<Account>();

        // Consulta estrita com conformidade ao modelo de compartilhamento do usuário
        List<Account> targetAccounts = [
            SELECT Id, Name, AnnualRevenue, Description 
            FROM Account 
            WHERE Id IN :accountIds 
              AND AnnualRevenue >= :REVENUE_THRESHOLD 
            WITH USER_MODE
        ];

        for (Account acc : targetAccounts) {
            acc.Description = (acc.Description != null ? acc.Description + ' | ' : '') + 
                              'Território Atribuído: ' + TIER_LATAM_ENTERPRISE;
            accountsToUpdate.add(acc);
        }

        if (!accountsToUpdate.isEmpty()) {
            update as user accountsToUpdate;
        }

        return accountsToUpdate.size();
    }
}

E a respectiva suíte de testes unitários:

/* 
 * Data: 2026-09-25
 * Objetivo da Customização: Testes unitários para validação de AccountTerritoryService (Headless Development via Claude Code)
 */
@IsTest
private class AccountTerritoryServiceTest {

    @TestSetup
    static void makeData() {
        List<Account> testAccs = new List<Account>{
            new Account(Name = 'Enterprise Account', AnnualRevenue = 60000000),
            new Account(Name = 'Standard Account', AnnualRevenue = 10000000)
        };
        insert as user testAccs;
    }

    @IsTest
    static void testAssignEnterpriseTerritoriesSuccess() {
        Map<Id, Account> accountsMap = new Map<Id, Account>([SELECT Id FROM Account]);

        Test.startTest();
        Integer updatedCount = AccountTerritoryService.assignEnterpriseTerritories(accountsMap.keySet());
        Test.stopTest();

        Assert.areEqual(1, updatedCount, 'Apenas a conta com faturamento acima de 50M deve ser atualizada.');

        Account updatedAcc = [
            SELECT Description 
            FROM Account 
            WHERE AnnualRevenue = 60000000 
            LIMIT 1
        ];
        Assert.isTrue(
            updatedAcc.Description.contains(AccountTerritoryService.TIER_LATAM_ENTERPRISE),
            'O território empresarial deve constar na descrição da conta.'
        );
    }

    @IsTest
    static void testAssignEnterpriseTerritoriesNullOrEmpty() {
        Test.startTest();
        Integer zeroUpdated = AccountTerritoryService.assignEnterpriseTerritories(null);
        Integer emptyUpdated = AccountTerritoryService.assignEnterpriseTerritories(new Set<Id>());
        Test.stopTest();

        Assert.areEqual(0, zeroUpdated, 'Conjunto nulo deve retornar 0.');
        Assert.areEqual(0, emptyUpdated, 'Conjunto vazio deve retornar 0.');
    }
}

5. Evidências empíricas de execução na org conectada

Os resultados obtidos diretamente da org de testes atestam a qualidade da entrega:

=== Deploy Status
Status: Succeeded (Deploy ID: 0AfWs00001cuFpCKAU)
Deployed: AccountTerritoryService.cls, AccountTerritoryServiceTest.cls

=== Apex Test Run Summary (707Ws00001ZHM4c)
TEST NAME                                                               OUTCOME  RUNTIME (MS)
──────────────────────────────────────────────────────────────────────  ───────  ────────────
AccountTerritoryServiceTest.testAssignEnterpriseTerritoriesNullOrEmpty  Pass     11          
AccountTerritoryServiceTest.testAssignEnterpriseTerritoriesSuccess      Pass     120         

=== Apex Code Coverage: 100% (Pass Rate: 100%)

USER_DEBUG|[9]|DEBUG|CONTA_CRIADA_ID: 001Ws000064ljXfIAI
USER_DEBUG|[15]|DEBUG|TERRITORIOS_ATRIBUIDOS_COUNT: 1
USER_DEBUG|[19]|DEBUG|CONTA_DESCRICAO_FINAL: Cliente Corporativo Prioritario | Território Atribuído: LATAM Enterprise

Execução em 131 milissegundos. Zero consumo desnecessário de memória na máquina do desenvolvedor e 100% de cobertura de código.


6. Comparativo: IDE gráfica tradicional vs. Headless Development

Dimensão de AnáliseIDE Tradicional (VS Code + Extension Pack)Headless com Claude Code Plugin
Interface de TrabalhoJanela gráfica com abas, painéis e consumo alto de GPUTerminal puro (CLI) leve, focado e veloz
Consumo de MemóriaComum atingir 2 a 4 GB com múltiplos plugins abertosMínimo, executando em processos isolados e eficientes
Geração de CódigoDepende de snippets estáticos ou digitação manualGeração agêntica contextualizada pelo schema da org
Diagnóstico de CódigoLanguage Server rodando acoplado à janela do editorsalesforce-lsp via MCP rodando direto no fluxo do agente
Auditoria ArquiteturalDepende de plugins externos ou revisão manual em PRNativa, acionada via agente architecture-review
Manipulação de AgentesEdição de arquivos .agent em texto simplesValidação sintática contínua via hooks de Agent Script

Para onde vai o desenvolvimento Salesforce?

O paradigma headless não significa aposentar o VS Code para sempre. A interface gráfica ainda tem seu valor para navegação exploratória e depuração visual de layouts complexos.

Mas para o trabalho pesado do dia a dia — criar serviços, refatorar triggers, escrever testes com dados isolados, validar contratos e rodar deploys —, o terminal com Claude Code e o plugin oficial da Salesforce é imbatível. A produtividade é de outra ordem de magnitude.

Se o seu fluxo de desenvolvimento ainda depende de cliques de mouse para tarefas que um assistente de terminal resolve em dois segundos com validação semântica de Language Server, é hora de repensar seu ambiente de engenharia. Instale o plugin, configure suas skills e experimente o poder do desenvolvimento agêntico na ponta dos dedos.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *