From 832e553a261eda33d267ddabe5bf554b5aeb953f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Vitor=20Ribeiro=20Santos?= <60783014+tbc-joaovitor@users.noreply.github.com> Date: Fri, 7 Aug 2026 10:19:09 -0300 Subject: [PATCH] =?UTF-8?q?ci:=20valida=20consist=C3=AAncia=20plugin.json?= =?UTF-8?q?=20=E2=86=94=20marketplace.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A CI daqui só rodava a suíte de testes. Sem checagem de versão, drift entre o plugin.json e o marketplace.json passa batido: foi o que aconteceu com o protheus (plugin.json=2.14.0 vs marketplace=2.13.0), que ficou uma semana divergente até ser corrigido a mão no PR #13. Passo portado do tbc-knowledge-plugins (texto do `run:` idêntico), incluindo o guard `typeof p.source !== "string"`: plugin de source externo é declarado com source em OBJETO (github/repo/sha) — o andrej-karpathy-skills, aqui. Sem o guard, `p.source.replace(...)` estoura com `TypeError: p.source.replace is not a function` antes mesmo de tentar ler arquivo, e a CI falha com stack trace bruto em vez de mensagem de drift. Validado local rodando o bloco `run:` extraído do próprio YAML por parser (não uma cópia redigitada): - estado atual do repo: exit 0, com os 4 plugins locais conferidos (fluig 2.1.1, protheus 2.14.1, po-ui 1.0.0, playwright 1.0.0) e o externo pulado; - com drift artificial: exit 1 e "DRIFT: plugin.json=X marketplace=Y"; - restaurado: exit 0 de novo. O passo roda antes da suíte: é uma checagem de menos de 1s contra ~17s de testes, então falha barato primeiro. Limitação herdada do repo-fonte, não introduzida aqui: o script itera as entradas do marketplace.json, nunca varre o disco — plugin novo com plugin.json que ninguém registrou no marketplace continua passando despercebido. YAML validado e tests/run-all.sh verde. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/ci.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f81f5a..b6ddd56 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,5 +12,24 @@ jobs: - uses: actions/setup-node@v4 with: node-version: '22' + - name: JSONs válidos + versões plugin.json ↔ marketplace.json + run: | + node -e ' + const fs = require("fs"); + const mp = JSON.parse(fs.readFileSync(".claude-plugin/marketplace.json", "utf8")); + let fail = 0; + for (const p of mp.plugins) { + // source em objeto = plugin externo (github/url), versionado upstream: + // não existe plugin.json local para comparar. + if (typeof p.source !== "string") continue; + const pj = JSON.parse(fs.readFileSync(`${p.source.replace(/^\.\//,"")}/.claude-plugin/plugin.json`, "utf8")); + if (pj.version !== p.version) { + console.error(`DRIFT: ${p.name} plugin.json=${pj.version} marketplace=${p.version}`); + fail = 1; + } + } + process.exit(fail); + ' + - name: Suíte de testes run: tests/run-all.sh