[{"data":1,"prerenderedAt":1977},["ShallowReactive",2],{"blog-marketplace-de-plugins-claude-code":3},{"id":4,"title":5,"about":6,"author":7,"body":8,"date":1943,"description":1944,"extension":1945,"faq":1946,"image":1962,"mentions":6,"meta":1963,"navigation":121,"path":1964,"seo":1965,"seoDescription":1966,"seoTitle":1967,"stem":1968,"tags":1969,"updated":6,"__hash__":1976},"blog\u002Fblog\u002Fmarketplace-de-plugins-claude-code.md","Como criar um marketplace de plugins do Claude Code: da skill ao catálogo publicado",null,"Larissa Santos",{"type":9,"value":10,"toc":1919},"minimark",[11,20,23,28,31,36,43,47,50,56,60,71,78,82,85,177,192,195,203,212,219,226,420,458,479,829,902,919,935,939,948,954,976,1078,1108,1133,1136,1176,1180,1183,1187,1225,1229,1239,1295,1299,1307,1405,1409,1421,1577,1581,1584,1590,1608,1612,1628,1631,1660,1670,1674,1691,1704,1708,1714,1734,1738,1741,1756,1780,1788,1792,1883,1893,1897,1915],[12,13,14,15,19],"p",{},"Se você usa Claude Code todo dia, já viu ele agir sozinho: resolver uma etapa do trabalho sem você digitar nenhum comando, porque encontrou uma instrução salva em algum lugar que batia com o pedido. Mas provavelmente nunca parou para estruturar essa instrução de um jeito que sobrevive fora daquele projeto, versiona e se instala com um comando só. Foi estruturando o ",[16,17,18],"code",{},"claude-vue-marketplace",", meu catálogo de plugins para Vue, Nuxt e Quasar, que aprendi cada peça deste mecanismo na prática.",[12,21,22],{},"Neste artigo vamos abrir esse mecanismo por dentro: o que é um marketplace, por que criar um, e como skill e plugin se encaixam nele. Depois, montamos um mini-marketplace juntos, arquivo por arquivo, até deixá-lo pronto para testar e publicar.",[24,25,27],"h2",{"id":26},"o-que-é-um-marketplace-e-por-que-criar-um","O que é um marketplace, e por que criar um",[12,29,30],{},"Um marketplace de plugins do Claude Code é um catálogo: um arquivo que lista onde cada plugin está, para o Claude Code saber de onde buscar cada um no momento em que você roda o comando de instalação. Por trás desse catálogo existem duas peças menores:",[32,33,35],"h3",{"id":34},"_1-skill-o-arquivo-que-o-claude-carrega-sozinho","1. Skill: o arquivo que o Claude carrega sozinho",[12,37,38,39,42],{},"Uma skill é uma instrução escrita em linguagem natural, guardada num arquivo ",[16,40,41],{},"SKILL.md",". O Claude Code lê uma descrição curta dentro desse arquivo e decide sozinho quando aplicar a instrução, sem esperar um comando explícito.",[32,44,46],{"id":45},"_2-plugin-a-mesma-skill-empacotada","2. Plugin: a mesma skill, empacotada",[12,48,49],{},"Um plugin é uma pasta com formato fixo, contendo uma ou mais skills e, quando precisar, também agentes, hooks e servidores MCP. Essa estrutura permite que sejam organizadas regras de execução como acionar uma regra interna, chamar um agente e até mesmo dividir o trabalho realizado em etapas (como rodar uma skill de pesquisa, outra de escrita e outra de revisão ). É o pacote que dá versão e nome de instalação a um conjunto de skills.",[12,51,52],{},[53,54,55],"strong",{},"O Marketplace é um catálogo centralizado que aponta pra varios plugins",[32,57,59],{"id":58},"por-que-montar-um-marketplace","Por que montar um marketplace",[12,61,62,63,66,67,70],{},"A primeira razão é parar de repetir configuração entre repositórios. Toda convenção que hoje vive solta em ",[16,64,65],{},".claude\u002Fcommands"," ou ",[16,68,69],{},".claude\u002Fskills"," de um projeto fica presa àquele projeto. Outro repositório da mesma pessoa, ou um colega no mesmo time, só herda essas regras copiando arquivo por arquivo. Empacotado como plugin e distribuído por marketplace, o mesmo conjunto de regras passa a se instalar com um comando e a atualizar com outro, sem fazer a cópia manual a cada projeto novo.",[12,72,73,74,77],{},"A segunda razão é versionamento. Cada entrada de plugin pode fixar uma versão; quando ela muda, quem instalou recebe a atualização na próxima sincronização, e quem não quer a mudança ainda pode ficar na versão anterior. Esse controle não existe para arquivos soltos dentro de ",[16,75,76],{},".claude\u002F",", que só têm o histórico do git do próprio projeto.",[24,79,81],{"id":80},"o-que-é-uma-skill-por-dentro","O que é uma skill, por dentro",[12,83,84],{},"Uma skill de verdade se parece com isto:",[86,87,92],"pre",{"className":88,"code":89,"language":90,"meta":91,"style":91},"language-markdown shiki shiki-themes material-theme-lighter github-dark github-dark","---\ndescription: Revisa o diff atual em busca de bugs óbvios, tratamento de erro ausente e nomes que não dizem o que fazem. Use antes de abrir um commit ou um PR.\n---\n\nLeia o diff das mudanças ainda não commitadas e aponte, por arquivo e linha:\n1. Erros de lógica ou casos de borda esquecidos\n2. Tratamento de erro ausente ou silencioso\n3. Nomes de variável ou função que exigem ler o corpo para entender\n4. Qualquer coisa que pareça código morto ou comentado\n\nSeja direto: liste o achado, o arquivo, a linha e a correção sugerida.\n","markdown","",[16,93,94,103,110,116,123,129,139,148,157,166,171],{"__ignoreMap":91},[95,96,99],"span",{"class":97,"line":98},"line",1,[95,100,102],{"class":101},"sLXsH","---\n",[95,104,106],{"class":97,"line":105},2,[95,107,109],{"class":108},"sMo7A","description: Revisa o diff atual em busca de bugs óbvios, tratamento de erro ausente e nomes que não dizem o que fazem. Use antes de abrir um commit ou um PR.\n",[95,111,113],{"class":97,"line":112},3,[95,114,102],{"class":115},"sSElE",[95,117,119],{"class":97,"line":118},4,[95,120,122],{"emptyLinePlaceholder":121},true,"\n",[95,124,126],{"class":97,"line":125},5,[95,127,128],{"class":108},"Leia o diff das mudanças ainda não commitadas e aponte, por arquivo e linha:\n",[95,130,132,136],{"class":97,"line":131},6,[95,133,135],{"class":134},"sUVGp","1.",[95,137,138],{"class":108}," Erros de lógica ou casos de borda esquecidos\n",[95,140,142,145],{"class":97,"line":141},7,[95,143,144],{"class":134},"2.",[95,146,147],{"class":108}," Tratamento de erro ausente ou silencioso\n",[95,149,151,154],{"class":97,"line":150},8,[95,152,153],{"class":134},"3.",[95,155,156],{"class":108}," Nomes de variável ou função que exigem ler o corpo para entender\n",[95,158,160,163],{"class":97,"line":159},9,[95,161,162],{"class":134},"4.",[95,164,165],{"class":108}," Qualquer coisa que pareça código morto ou comentado\n",[95,167,169],{"class":97,"line":168},10,[95,170,122],{"emptyLinePlaceholder":121},[95,172,174],{"class":97,"line":173},11,[95,175,176],{"class":108},"Seja direto: liste o achado, o arquivo, a linha e a correção sugerida.\n",[12,178,179,180,183,184,187,188,191],{},"O bloco entre ",[16,181,182],{},"---",", chamado frontmatter e escrito no formato YAML, é a parte de acionamento automatico. O ",[16,185,186],{},"description"," ali dentro descreve quando essa instrução se aplica, e é esse texto que o Claude Code lê para decidir sozinho quando carregar a skill, sem esperar você digitar nenhum comando. Quanto mais específico esse texto, menor a chance de a skill disparar fora de contexto ou de nunca disparar. Um frontmatter com ",[16,189,190],{},"disable-model-invocation: true"," desliga esse gatilho automático e deixa a skill só acessível por comando explícito, opção útil para instruções que você prefere chamar por vontade própria em vez de deixar o Claude decidir o momento. O resto do arquivo, abaixo do frontmatter, é a instrução em si, em texto simples: é isso que o Claude segue quando a skill carrega.",[12,193,194],{},"Onde esse arquivo mora muda o alcance dele:",[86,196,201],{"className":197,"code":199,"language":200},[198],"language-text","# solto no projeto (configuração standalone tradicional)\nmeu-projeto\u002F\n└── .claude\u002F\n    └── skills\u002F\n        └── revisar-pr\u002F\n            └── SKILL.md      # chamada como \u002Frevisar-pr\n\n# empacotado num plugin\nmeu-marketplace\u002F\n└── plugins\u002F\n    └── revisor\u002F\n        └── skills\u002F\n            └── revisar-pr\u002F\n                └── SKILL.md  # chamada como \u002Frevisor:revisar-pr\n","text",[16,202,199],{"__ignoreMap":91},[12,204,205,206,208,209,211],{},"Solto em ",[16,207,76],{},", o arquivo só existe naquele projeto: a documentação chama isso de configuração standalone, boa para experimento rápido ou ajuste pessoal. Empacotado dentro de um plugin, o mesmo arquivo ganha versão, instalação e atualização, e o pacote inteiro fica pronto para instalar em outro projeto ou repassar a um colega. Repare que o conteúdo do ",[16,210,41],{},", o mesmo mostrado acima, é idêntico nos dois casos: o que muda é só a arquitetura em volta dele.",[24,213,215,216],{"id":214},"a-anatomia-do-marketplacejson","A anatomia do ",[16,217,218],{},"marketplace.json",[12,220,221,222,225],{},"Todo marketplace tem um único arquivo obrigatório: ",[16,223,224],{},".claude-plugin\u002Fmarketplace.json",", na raiz do repositório. É um arquivo JSON comum, lido pelo Claude Code para saber três coisas: o nome do catálogo, quem mantém ele, e a lista de plugins disponíveis.",[86,227,231],{"className":228,"code":229,"language":230,"meta":91,"style":91},"language-json shiki shiki-themes material-theme-lighter github-dark github-dark","{\n  \"name\": \"meu-marketplace\",\n  \"owner\": {\n    \"name\": \"Seu Nome\"\n  },\n  \"description\": \"Plugins que uso nos meus projetos\",\n  \"plugins\": [\n    {\n      \"name\": \"revisor\",\n      \"source\": \".\u002Fplugins\u002Frevisor\",\n      \"description\": \"Skill de revisão de diff antes do commit\"\n    }\n  ]\n}\n","json",[16,232,233,239,268,282,302,307,326,340,345,365,385,402,408,414],{"__ignoreMap":91},[95,234,235],{"class":97,"line":98},[95,236,238],{"class":237},"sG-J9","{\n",[95,240,241,245,249,252,255,259,263,265],{"class":97,"line":105},[95,242,244],{"class":243},"swu5b","  \"",[95,246,248],{"class":247},"sod2m","name",[95,250,251],{"class":243},"\"",[95,253,254],{"class":237},":",[95,256,258],{"class":257},"sF_wb"," \"",[95,260,262],{"class":261},"s0vBq","meu-marketplace",[95,264,251],{"class":257},[95,266,267],{"class":237},",\n",[95,269,270,272,275,277,279],{"class":97,"line":112},[95,271,244],{"class":243},[95,273,274],{"class":247},"owner",[95,276,251],{"class":243},[95,278,254],{"class":237},[95,280,281],{"class":237}," {\n",[95,283,284,287,290,292,294,296,299],{"class":97,"line":118},[95,285,286],{"class":243},"    \"",[95,288,248],{"class":289},"s3afY",[95,291,251],{"class":243},[95,293,254],{"class":237},[95,295,258],{"class":257},[95,297,298],{"class":261},"Seu Nome",[95,300,301],{"class":257},"\"\n",[95,303,304],{"class":97,"line":125},[95,305,306],{"class":237},"  },\n",[95,308,309,311,313,315,317,319,322,324],{"class":97,"line":131},[95,310,244],{"class":243},[95,312,186],{"class":247},[95,314,251],{"class":243},[95,316,254],{"class":237},[95,318,258],{"class":257},[95,320,321],{"class":261},"Plugins que uso nos meus projetos",[95,323,251],{"class":257},[95,325,267],{"class":237},[95,327,328,330,333,335,337],{"class":97,"line":141},[95,329,244],{"class":243},[95,331,332],{"class":247},"plugins",[95,334,251],{"class":243},[95,336,254],{"class":237},[95,338,339],{"class":237}," [\n",[95,341,342],{"class":97,"line":150},[95,343,344],{"class":237},"    {\n",[95,346,347,350,352,354,356,358,361,363],{"class":97,"line":159},[95,348,349],{"class":243},"      \"",[95,351,248],{"class":289},[95,353,251],{"class":243},[95,355,254],{"class":237},[95,357,258],{"class":257},[95,359,360],{"class":261},"revisor",[95,362,251],{"class":257},[95,364,267],{"class":237},[95,366,367,369,372,374,376,378,381,383],{"class":97,"line":168},[95,368,349],{"class":243},[95,370,371],{"class":289},"source",[95,373,251],{"class":243},[95,375,254],{"class":237},[95,377,258],{"class":257},[95,379,380],{"class":261},".\u002Fplugins\u002Frevisor",[95,382,251],{"class":257},[95,384,267],{"class":237},[95,386,387,389,391,393,395,397,400],{"class":97,"line":173},[95,388,349],{"class":243},[95,390,186],{"class":289},[95,392,251],{"class":243},[95,394,254],{"class":237},[95,396,258],{"class":257},[95,398,399],{"class":261},"Skill de revisão de diff antes do commit",[95,401,301],{"class":257},[95,403,405],{"class":97,"line":404},12,[95,406,407],{"class":237},"    }\n",[95,409,411],{"class":97,"line":410},13,[95,412,413],{"class":237},"  ]\n",[95,415,417],{"class":97,"line":416},14,[95,418,419],{"class":237},"}\n",[421,422,423,435,445],"ul",{},[424,425,426,430,431,434],"li",{},[53,427,428,254],{},[16,429,248],{}," identificador público do catálogo, sempre em letras minúsculas separadas por hífen. É esse texto que aparece depois do arroba na instalação, como em ",[16,432,433],{},"\u002Fplugin install revisor@meu-marketplace",".",[424,436,437,441,442,444],{},[53,438,439,254],{},[16,440,274],{}," objeto simples, só precisa do campo ",[16,443,248],{}," dizendo quem mantém aquilo.",[424,446,447,451,452,454,455,457],{},[53,448,449,254],{},[16,450,332],{}," a lista de entradas do catálogo. Cada entrada, no mínimo, também tem um ",[16,453,248],{}," e um ",[16,456,371],{}," dizendo onde o Claude Code vai buscar aquele plugin.",[12,459,460,461,463,464,467,468,471,472,475,476,478],{},"Esse ",[16,462,371],{}," é o campo que muda mais entre um marketplace e outro, porque aceita sete formatos diferentes. O exemplo acima já usa o mais simples, um caminho relativo (",[16,465,466],{},"\".\u002Fplugins\u002Frevisor\"",", sempre começando com ",[16,469,470],{},".\u002F","), que serve quando o plugin mora dentro do próprio repositório do catálogo; a referência é sempre a pasta que contém ",[16,473,474],{},".claude-plugin\u002F",", e o conteúdo dessa pasta em si nunca entra na conta. Quando o plugin mora em outro lugar, o ",[16,477,371],{}," vira um objeto:",[86,480,482],{"className":228,"code":481,"language":230,"meta":91,"style":91},"{ \"source\": { \"source\": \"github\", \"repo\": \"sua-conta\u002Frevisor-plugin\" } }\n\n{ \"source\": { \"source\": \"url\", \"url\": \"https:\u002F\u002Fgitlab.com\u002Fsua-conta\u002Frevisor-plugin.git\" } }\n\n{ \"source\": { \"source\": \"git-subdir\", \"url\": \"https:\u002F\u002Fgithub.com\u002Fsua-conta\u002Fmonorepo.git\", \"path\": \"tools\u002Frevisor\" } }\n\n{ \"source\": { \"source\": \"npm\", \"package\": \"@sua-conta\u002Frevisor-plugin\" } }\n\n{ \"source\": { \"source\": \"archive\", \"url\": \"https:\u002F\u002Fartefatos.example.com\u002Frevisor-1.0.0.zip\" } }\n\n{ \"source\": { \"source\": \"command\", \"command\": \"meu-cli caminho-do-plugin\" } }\n",[16,483,484,540,544,594,598,666,670,721,725,775,779],{"__ignoreMap":91},[95,485,486,489,491,493,495,497,500,502,504,506,508,510,513,515,518,520,523,525,527,529,532,534,537],{"class":97,"line":98},[95,487,488],{"class":237},"{",[95,490,258],{"class":243},[95,492,371],{"class":247},[95,494,251],{"class":243},[95,496,254],{"class":237},[95,498,499],{"class":237}," {",[95,501,258],{"class":243},[95,503,371],{"class":289},[95,505,251],{"class":243},[95,507,254],{"class":237},[95,509,258],{"class":257},[95,511,512],{"class":261},"github",[95,514,251],{"class":257},[95,516,517],{"class":237},",",[95,519,258],{"class":243},[95,521,522],{"class":289},"repo",[95,524,251],{"class":243},[95,526,254],{"class":237},[95,528,258],{"class":257},[95,530,531],{"class":261},"sua-conta\u002Frevisor-plugin",[95,533,251],{"class":257},[95,535,536],{"class":237}," }",[95,538,539],{"class":237}," }\n",[95,541,542],{"class":97,"line":105},[95,543,122],{"emptyLinePlaceholder":121},[95,545,546,548,550,552,554,556,558,560,562,564,566,568,571,573,575,577,579,581,583,585,588,590,592],{"class":97,"line":112},[95,547,488],{"class":237},[95,549,258],{"class":243},[95,551,371],{"class":247},[95,553,251],{"class":243},[95,555,254],{"class":237},[95,557,499],{"class":237},[95,559,258],{"class":243},[95,561,371],{"class":289},[95,563,251],{"class":243},[95,565,254],{"class":237},[95,567,258],{"class":257},[95,569,570],{"class":261},"url",[95,572,251],{"class":257},[95,574,517],{"class":237},[95,576,258],{"class":243},[95,578,570],{"class":289},[95,580,251],{"class":243},[95,582,254],{"class":237},[95,584,258],{"class":257},[95,586,587],{"class":261},"https:\u002F\u002Fgitlab.com\u002Fsua-conta\u002Frevisor-plugin.git",[95,589,251],{"class":257},[95,591,536],{"class":237},[95,593,539],{"class":237},[95,595,596],{"class":97,"line":118},[95,597,122],{"emptyLinePlaceholder":121},[95,599,600,602,604,606,608,610,612,614,616,618,620,622,625,627,629,631,633,635,637,639,642,644,646,648,651,653,655,657,660,662,664],{"class":97,"line":125},[95,601,488],{"class":237},[95,603,258],{"class":243},[95,605,371],{"class":247},[95,607,251],{"class":243},[95,609,254],{"class":237},[95,611,499],{"class":237},[95,613,258],{"class":243},[95,615,371],{"class":289},[95,617,251],{"class":243},[95,619,254],{"class":237},[95,621,258],{"class":257},[95,623,624],{"class":261},"git-subdir",[95,626,251],{"class":257},[95,628,517],{"class":237},[95,630,258],{"class":243},[95,632,570],{"class":289},[95,634,251],{"class":243},[95,636,254],{"class":237},[95,638,258],{"class":257},[95,640,641],{"class":261},"https:\u002F\u002Fgithub.com\u002Fsua-conta\u002Fmonorepo.git",[95,643,251],{"class":257},[95,645,517],{"class":237},[95,647,258],{"class":243},[95,649,650],{"class":289},"path",[95,652,251],{"class":243},[95,654,254],{"class":237},[95,656,258],{"class":257},[95,658,659],{"class":261},"tools\u002Frevisor",[95,661,251],{"class":257},[95,663,536],{"class":237},[95,665,539],{"class":237},[95,667,668],{"class":97,"line":131},[95,669,122],{"emptyLinePlaceholder":121},[95,671,672,674,676,678,680,682,684,686,688,690,692,694,697,699,701,703,706,708,710,712,715,717,719],{"class":97,"line":141},[95,673,488],{"class":237},[95,675,258],{"class":243},[95,677,371],{"class":247},[95,679,251],{"class":243},[95,681,254],{"class":237},[95,683,499],{"class":237},[95,685,258],{"class":243},[95,687,371],{"class":289},[95,689,251],{"class":243},[95,691,254],{"class":237},[95,693,258],{"class":257},[95,695,696],{"class":261},"npm",[95,698,251],{"class":257},[95,700,517],{"class":237},[95,702,258],{"class":243},[95,704,705],{"class":289},"package",[95,707,251],{"class":243},[95,709,254],{"class":237},[95,711,258],{"class":257},[95,713,714],{"class":261},"@sua-conta\u002Frevisor-plugin",[95,716,251],{"class":257},[95,718,536],{"class":237},[95,720,539],{"class":237},[95,722,723],{"class":97,"line":150},[95,724,122],{"emptyLinePlaceholder":121},[95,726,727,729,731,733,735,737,739,741,743,745,747,749,752,754,756,758,760,762,764,766,769,771,773],{"class":97,"line":159},[95,728,488],{"class":237},[95,730,258],{"class":243},[95,732,371],{"class":247},[95,734,251],{"class":243},[95,736,254],{"class":237},[95,738,499],{"class":237},[95,740,258],{"class":243},[95,742,371],{"class":289},[95,744,251],{"class":243},[95,746,254],{"class":237},[95,748,258],{"class":257},[95,750,751],{"class":261},"archive",[95,753,251],{"class":257},[95,755,517],{"class":237},[95,757,258],{"class":243},[95,759,570],{"class":289},[95,761,251],{"class":243},[95,763,254],{"class":237},[95,765,258],{"class":257},[95,767,768],{"class":261},"https:\u002F\u002Fartefatos.example.com\u002Frevisor-1.0.0.zip",[95,770,251],{"class":257},[95,772,536],{"class":237},[95,774,539],{"class":237},[95,776,777],{"class":97,"line":168},[95,778,122],{"emptyLinePlaceholder":121},[95,780,781,783,785,787,789,791,793,795,797,799,801,803,806,808,810,812,814,816,818,820,823,825,827],{"class":97,"line":173},[95,782,488],{"class":237},[95,784,258],{"class":243},[95,786,371],{"class":247},[95,788,251],{"class":243},[95,790,254],{"class":237},[95,792,499],{"class":237},[95,794,258],{"class":243},[95,796,371],{"class":289},[95,798,251],{"class":243},[95,800,254],{"class":237},[95,802,258],{"class":257},[95,804,805],{"class":261},"command",[95,807,251],{"class":257},[95,809,517],{"class":237},[95,811,258],{"class":243},[95,813,805],{"class":289},[95,815,251],{"class":243},[95,817,254],{"class":237},[95,819,258],{"class":257},[95,821,822],{"class":261},"meu-cli caminho-do-plugin",[95,824,251],{"class":257},[95,826,536],{"class":237},[95,828,539],{"class":237},[421,830,831,846,853,866,880,895],{},[424,832,833,837,838,841,842,845],{},[53,834,835,254],{},[16,836,512],{}," busca de outro repositório GitHub e aceita ",[16,839,840],{},"ref"," e ",[16,843,844],{},"sha"," opcionais, para fixar uma branch, tag ou commit específico.",[424,847,848,852],{},[53,849,850,254],{},[16,851,570],{}," faz o mesmo para qualquer repositório git acessível por HTTPS ou SSH, com os mesmos dois campos opcionais.",[424,854,855,859,860,862,863,865],{},[53,856,857,254],{},[16,858,624],{}," aponta para uma subpasta dentro de um repositório git maior, com ",[16,861,650],{}," como campo obrigatório além de ",[16,864,570],{},". Existe para quando vários plugins vivem dentro de um monorepo só.",[424,867,868,872,873,841,876,879],{},[53,869,870,254],{},[16,871,696],{}," instala o plugin como um pacote do registro npm, com ",[16,874,875],{},"version",[16,877,878],{},"registry"," opcionais.",[424,881,882,886,887,890,891,894],{},[53,883,884,254],{},[16,885,751],{}," baixa um ",[16,888,889],{},".zip"," hospedado em qualquer servidor HTTPS, com ",[16,892,893],{},"sha256"," opcional para conferir se o arquivo baixado é exatamente o esperado.",[424,896,897,901],{},[53,898,899,254],{},[16,900,805],{}," gera o diretório do plugin rodando um comando local que precisa imprimir o caminho do resultado. Pensado para ferramentas que exportam configuração dinamicamente.",[12,903,904,905,907,908,910,911,913,914,913,916,918],{},"Um detalhe evita um erro só descoberto depois de publicado: marketplace adicionado por uma URL que aponta direto para o arquivo ",[16,906,218],{},", sem repositório git por trás, baixa só aquele arquivo. Uma entrada com caminho relativo falha nesse formato de instalação, porque os arquivos do plugin em si nunca chegam a ser baixados; cada ",[16,909,371],{}," precisa ser ",[16,912,512],{},", ",[16,915,570],{},[16,917,624],{}," ou outro tipo remoto.",[12,920,921,922,913,925,913,928,913,931,934],{},"Existe também uma lista curta de nomes bloqueados: ",[16,923,924],{},"claude-code-marketplace",[16,926,927],{},"claude-plugins-official",[16,929,930],{},"claude-community",[16,932,933],{},"anthropic-plugins",", entre alguns outros, ficam reservados ao uso oficial da Anthropic, junto com qualquer variação que imite esses nomes. A checagem roda toda vez que o marketplace carrega, então escolher um nome parecido com um nome oficial é o tipo de erro que só aparece depois de publicado.",[24,936,938],{"id":937},"a-anatomia-de-um-plugin","A anatomia de um plugin",[12,940,941,942,944,945,947],{},"Cada entrada de ",[16,943,332],{}," no ",[16,946,218],{}," aponta para uma pasta com este formato:",[86,949,952],{"className":950,"code":951,"language":200},[198],"revisor\u002F\n├── .claude-plugin\u002F\n│   └── plugin.json\n├── skills\u002F\n│   └── revisar-pr\u002F\n│       └── SKILL.md\n├── agents\u002F\n├── hooks\u002F\n│   └── hooks.json\n└── .mcp.json\n",[16,953,951],{"__ignoreMap":91},[12,955,956,959,960,962,963,913,966,66,969,972,973,975],{},[16,957,958],{},".claude-plugin\u002Fplugin.json"," é o manifesto do plugin: um arquivo JSON pequeno, que descreve a identidade dele, e o único arquivo que fica dentro dessa pasta com ponto na frente. Todo o resto do plugin mora solto na raiz, ao lado de ",[16,961,474],{},", e essa vizinhança é a regra que mais se erra: colocar ",[16,964,965],{},"skills\u002F",[16,967,968],{},"agents\u002F",[16,970,971],{},"hooks\u002F"," dentro de ",[16,974,474],{}," é o erro de estrutura mais comum de quem monta o primeiro plugin.",[86,977,979],{"className":228,"code":978,"language":230,"meta":91,"style":91},"{\n  \"name\": \"revisor\",\n  \"description\": \"Skill de revisão de diff antes do commit\",\n  \"version\": \"1.0.0\",\n  \"author\": {\n    \"name\": \"Seu Nome\"\n  }\n}\n",[16,980,981,985,1003,1021,1040,1053,1069,1074],{"__ignoreMap":91},[95,982,983],{"class":97,"line":98},[95,984,238],{"class":237},[95,986,987,989,991,993,995,997,999,1001],{"class":97,"line":105},[95,988,244],{"class":243},[95,990,248],{"class":247},[95,992,251],{"class":243},[95,994,254],{"class":237},[95,996,258],{"class":257},[95,998,360],{"class":261},[95,1000,251],{"class":257},[95,1002,267],{"class":237},[95,1004,1005,1007,1009,1011,1013,1015,1017,1019],{"class":97,"line":112},[95,1006,244],{"class":243},[95,1008,186],{"class":247},[95,1010,251],{"class":243},[95,1012,254],{"class":237},[95,1014,258],{"class":257},[95,1016,399],{"class":261},[95,1018,251],{"class":257},[95,1020,267],{"class":237},[95,1022,1023,1025,1027,1029,1031,1033,1036,1038],{"class":97,"line":118},[95,1024,244],{"class":243},[95,1026,875],{"class":247},[95,1028,251],{"class":243},[95,1030,254],{"class":237},[95,1032,258],{"class":257},[95,1034,1035],{"class":261},"1.0.0",[95,1037,251],{"class":257},[95,1039,267],{"class":237},[95,1041,1042,1044,1047,1049,1051],{"class":97,"line":125},[95,1043,244],{"class":243},[95,1045,1046],{"class":247},"author",[95,1048,251],{"class":243},[95,1050,254],{"class":237},[95,1052,281],{"class":237},[95,1054,1055,1057,1059,1061,1063,1065,1067],{"class":97,"line":131},[95,1056,286],{"class":243},[95,1058,248],{"class":289},[95,1060,251],{"class":243},[95,1062,254],{"class":237},[95,1064,258],{"class":257},[95,1066,298],{"class":261},[95,1068,301],{"class":257},[95,1070,1071],{"class":97,"line":141},[95,1072,1073],{"class":237},"  }\n",[95,1075,1076],{"class":97,"line":150},[95,1077,419],{"class":237},[421,1079,1080,1087,1094,1101],{},[424,1081,1082,1086],{},[53,1083,1084,254],{},[16,1085,248],{}," o identificador do plugin, que também vira o prefixo de cada skill dele.",[424,1088,1089,1093],{},[53,1090,1091,254],{},[16,1092,186],{}," o texto que aparece no gerenciador de plugins.",[424,1095,1096,1100],{},[53,1097,1098,254],{},[16,1099,875],{}," opcional, mas necessário se você quiser controlar quando cada pessoa recebe atualização.",[424,1102,1103,1107],{},[53,1104,1105,254],{},[16,1106,1046],{}," opcional, identifica quem mantém o plugin.",[12,1109,1110,1112,1113,1115,1116,1118,1119,1121,1122,1125,1126,1128,1129,1132],{},[16,1111,965],{}," é onde mora o comportamento que o Claude carrega sozinho, o mesmo mecanismo do ",[16,1114,41],{}," mostrado no começo deste artigo. Cada subpasta dentro de ",[16,1117,965],{}," vira uma skill, nomeada como o nome da pasta e prefixada pelo ",[16,1120,248],{}," do plugin: a pasta ",[16,1123,1124],{},"revisar-pr"," dentro do plugin ",[16,1127,360],{}," fica disponível como ",[16,1130,1131],{},"\u002Frevisor:revisar-pr",", exatamente o comando que apareceu na árvore de pastas mais acima. O prefixo existe para dois plugins diferentes poderem ter uma skill chamada do mesmo jeito sem conflito.",[12,1134,1135],{},"As demais pastas completam o plugin conforme a necessidade de cada um, e nenhuma delas é obrigatória:",[421,1137,1138,1153,1160,1168],{},[424,1139,1140,1145,1146,1149,1150,1152],{},[53,1141,1142,254],{},[16,1143,1144],{},"commands\u002F"," formato anterior de skill, um arquivo ",[16,1147,1148],{},".md"," solto sem subpasta própria. O Claude Code ainda o lê, mas a documentação recomenda ",[16,1151,965],{}," para todo plugin novo.",[424,1154,1155,1159],{},[53,1156,1157,254],{},[16,1158,968],{}," guarda definições de agente customizado, cada arquivo virando um agente disponível dentro do plugin.",[424,1161,1162,1167],{},[53,1163,1164,254],{},[16,1165,1166],{},"hooks\u002Fhooks.json"," liga eventos do Claude Code, como a gravação de um arquivo, a comandos de shell que rodam sozinhos quando aquele evento acontece.",[424,1169,1170,1175],{},[53,1171,1172,254],{},[16,1173,1174],{},".mcp.json"," na raiz do plugin, declara servidores MCP que o plugin já traz configurados, poupando cada pessoa que instala de montar a integração à mão.",[24,1177,1179],{"id":1178},"montando-o-mini-marketplace","Montando o mini-marketplace",[12,1181,1182],{},"Com a anatomia registrada, o resto é criar cada peça na ordem certa.",[32,1184,1186],{"id":1185},"_1-criar-as-pastas","1. Criar as pastas",[86,1188,1192],{"className":1189,"code":1190,"language":1191,"meta":91,"style":91},"language-bash shiki shiki-themes material-theme-lighter github-dark github-dark","mkdir -p meu-marketplace\u002F.claude-plugin\nmkdir -p meu-marketplace\u002Fplugins\u002Frevisor\u002F.claude-plugin\nmkdir -p meu-marketplace\u002Fplugins\u002Frevisor\u002Fskills\u002Frevisar-pr\n","bash",[16,1193,1194,1207,1216],{"__ignoreMap":91},[95,1195,1196,1200,1204],{"class":97,"line":98},[95,1197,1199],{"class":1198},"soiBB","mkdir",[95,1201,1203],{"class":1202},"sSJ72"," -p",[95,1205,1206],{"class":261}," meu-marketplace\u002F.claude-plugin\n",[95,1208,1209,1211,1213],{"class":97,"line":105},[95,1210,1199],{"class":1198},[95,1212,1203],{"class":1202},[95,1214,1215],{"class":261}," meu-marketplace\u002Fplugins\u002Frevisor\u002F.claude-plugin\n",[95,1217,1218,1220,1222],{"class":97,"line":112},[95,1219,1199],{"class":1198},[95,1221,1203],{"class":1202},[95,1223,1224],{"class":261}," meu-marketplace\u002Fplugins\u002Frevisor\u002Fskills\u002Frevisar-pr\n",[32,1226,1228],{"id":1227},"_2-criar-a-skill","2. Criar a skill",[12,1230,1231,1232,1235,1236,1238],{},"Dentro de ",[16,1233,1234],{},"meu-marketplace\u002Fplugins\u002Frevisor\u002Fskills\u002Frevisar-pr\u002F",", crie ",[16,1237,41],{}," com o mesmo conteúdo mostrado no início deste artigo:",[86,1240,1241],{"className":88,"code":89,"language":90,"meta":91,"style":91},[16,1242,1243,1247,1251,1255,1259,1263,1269,1275,1281,1287,1291],{"__ignoreMap":91},[95,1244,1245],{"class":97,"line":98},[95,1246,102],{"class":101},[95,1248,1249],{"class":97,"line":105},[95,1250,109],{"class":108},[95,1252,1253],{"class":97,"line":112},[95,1254,102],{"class":115},[95,1256,1257],{"class":97,"line":118},[95,1258,122],{"emptyLinePlaceholder":121},[95,1260,1261],{"class":97,"line":125},[95,1262,128],{"class":108},[95,1264,1265,1267],{"class":97,"line":131},[95,1266,135],{"class":134},[95,1268,138],{"class":108},[95,1270,1271,1273],{"class":97,"line":141},[95,1272,144],{"class":134},[95,1274,147],{"class":108},[95,1276,1277,1279],{"class":97,"line":150},[95,1278,153],{"class":134},[95,1280,156],{"class":108},[95,1282,1283,1285],{"class":97,"line":159},[95,1284,162],{"class":134},[95,1286,165],{"class":108},[95,1288,1289],{"class":97,"line":168},[95,1290,122],{"emptyLinePlaceholder":121},[95,1292,1293],{"class":97,"line":173},[95,1294,176],{"class":108},[32,1296,1298],{"id":1297},"_3-criar-o-manifesto-do-plugin","3. Criar o manifesto do plugin",[12,1300,1231,1301,1235,1304,254],{},[16,1302,1303],{},"meu-marketplace\u002Fplugins\u002Frevisor\u002F.claude-plugin\u002F",[16,1305,1306],{},"plugin.json",[86,1308,1309],{"className":228,"code":978,"language":230,"meta":91,"style":91},[16,1310,1311,1315,1333,1351,1369,1381,1397,1401],{"__ignoreMap":91},[95,1312,1313],{"class":97,"line":98},[95,1314,238],{"class":237},[95,1316,1317,1319,1321,1323,1325,1327,1329,1331],{"class":97,"line":105},[95,1318,244],{"class":243},[95,1320,248],{"class":247},[95,1322,251],{"class":243},[95,1324,254],{"class":237},[95,1326,258],{"class":257},[95,1328,360],{"class":261},[95,1330,251],{"class":257},[95,1332,267],{"class":237},[95,1334,1335,1337,1339,1341,1343,1345,1347,1349],{"class":97,"line":112},[95,1336,244],{"class":243},[95,1338,186],{"class":247},[95,1340,251],{"class":243},[95,1342,254],{"class":237},[95,1344,258],{"class":257},[95,1346,399],{"class":261},[95,1348,251],{"class":257},[95,1350,267],{"class":237},[95,1352,1353,1355,1357,1359,1361,1363,1365,1367],{"class":97,"line":118},[95,1354,244],{"class":243},[95,1356,875],{"class":247},[95,1358,251],{"class":243},[95,1360,254],{"class":237},[95,1362,258],{"class":257},[95,1364,1035],{"class":261},[95,1366,251],{"class":257},[95,1368,267],{"class":237},[95,1370,1371,1373,1375,1377,1379],{"class":97,"line":125},[95,1372,244],{"class":243},[95,1374,1046],{"class":247},[95,1376,251],{"class":243},[95,1378,254],{"class":237},[95,1380,281],{"class":237},[95,1382,1383,1385,1387,1389,1391,1393,1395],{"class":97,"line":131},[95,1384,286],{"class":243},[95,1386,248],{"class":289},[95,1388,251],{"class":243},[95,1390,254],{"class":237},[95,1392,258],{"class":257},[95,1394,298],{"class":261},[95,1396,301],{"class":257},[95,1398,1399],{"class":97,"line":141},[95,1400,1073],{"class":237},[95,1402,1403],{"class":97,"line":150},[95,1404,419],{"class":237},[32,1406,1408],{"id":1407},"_4-criar-o-catálogo","4. Criar o catálogo",[12,1410,1411,1412,1415,1416,1418,1419,254],{},"Na raiz do repositório, crie ",[16,1413,1414],{},"meu-marketplace\u002F.claude-plugin\u002Fmarketplace.json",", apontando ",[16,1417,371],{}," para ",[16,1420,380],{},[86,1422,1423],{"className":228,"code":229,"language":230,"meta":91,"style":91},[16,1424,1425,1429,1447,1459,1475,1479,1497,1509,1513,1531,1549,1565,1569,1573],{"__ignoreMap":91},[95,1426,1427],{"class":97,"line":98},[95,1428,238],{"class":237},[95,1430,1431,1433,1435,1437,1439,1441,1443,1445],{"class":97,"line":105},[95,1432,244],{"class":243},[95,1434,248],{"class":247},[95,1436,251],{"class":243},[95,1438,254],{"class":237},[95,1440,258],{"class":257},[95,1442,262],{"class":261},[95,1444,251],{"class":257},[95,1446,267],{"class":237},[95,1448,1449,1451,1453,1455,1457],{"class":97,"line":112},[95,1450,244],{"class":243},[95,1452,274],{"class":247},[95,1454,251],{"class":243},[95,1456,254],{"class":237},[95,1458,281],{"class":237},[95,1460,1461,1463,1465,1467,1469,1471,1473],{"class":97,"line":118},[95,1462,286],{"class":243},[95,1464,248],{"class":289},[95,1466,251],{"class":243},[95,1468,254],{"class":237},[95,1470,258],{"class":257},[95,1472,298],{"class":261},[95,1474,301],{"class":257},[95,1476,1477],{"class":97,"line":125},[95,1478,306],{"class":237},[95,1480,1481,1483,1485,1487,1489,1491,1493,1495],{"class":97,"line":131},[95,1482,244],{"class":243},[95,1484,186],{"class":247},[95,1486,251],{"class":243},[95,1488,254],{"class":237},[95,1490,258],{"class":257},[95,1492,321],{"class":261},[95,1494,251],{"class":257},[95,1496,267],{"class":237},[95,1498,1499,1501,1503,1505,1507],{"class":97,"line":141},[95,1500,244],{"class":243},[95,1502,332],{"class":247},[95,1504,251],{"class":243},[95,1506,254],{"class":237},[95,1508,339],{"class":237},[95,1510,1511],{"class":97,"line":150},[95,1512,344],{"class":237},[95,1514,1515,1517,1519,1521,1523,1525,1527,1529],{"class":97,"line":159},[95,1516,349],{"class":243},[95,1518,248],{"class":289},[95,1520,251],{"class":243},[95,1522,254],{"class":237},[95,1524,258],{"class":257},[95,1526,360],{"class":261},[95,1528,251],{"class":257},[95,1530,267],{"class":237},[95,1532,1533,1535,1537,1539,1541,1543,1545,1547],{"class":97,"line":168},[95,1534,349],{"class":243},[95,1536,371],{"class":289},[95,1538,251],{"class":243},[95,1540,254],{"class":237},[95,1542,258],{"class":257},[95,1544,380],{"class":261},[95,1546,251],{"class":257},[95,1548,267],{"class":237},[95,1550,1551,1553,1555,1557,1559,1561,1563],{"class":97,"line":173},[95,1552,349],{"class":243},[95,1554,186],{"class":289},[95,1556,251],{"class":243},[95,1558,254],{"class":237},[95,1560,258],{"class":257},[95,1562,399],{"class":261},[95,1564,301],{"class":257},[95,1566,1567],{"class":97,"line":404},[95,1568,407],{"class":237},[95,1570,1571],{"class":97,"line":410},[95,1572,413],{"class":237},[95,1574,1575],{"class":97,"line":416},[95,1576,419],{"class":237},[32,1578,1580],{"id":1579},"_5-conferir-a-estrutura-final","5. Conferir a estrutura final",[12,1582,1583],{},"Com os quatro arquivos no lugar, o mini-marketplace fica assim:",[86,1585,1588],{"className":1586,"code":1587,"language":200},[198],"meu-marketplace\u002F\n├── .claude-plugin\u002F\n│   └── marketplace.json\n└── plugins\u002F\n    └── revisor\u002F\n        ├── .claude-plugin\u002F\n        │   └── plugin.json\n        └── skills\u002F\n            └── revisar-pr\u002F\n                └── SKILL.md\n",[16,1589,1587],{"__ignoreMap":91},[12,1591,1592,1593,1595,1596,1595,1598,1600,1601,1604,1605,1607],{},"Esse é o marketplace inteiro: um ",[16,1594,218],{},", um ",[16,1597,1306],{},[16,1599,41],{},", e as pastas que os organizam. Cada plugin novo que você quiser somar repete apenas os passos dois a quatro dentro de ",[16,1602,1603],{},"plugins\u002F",", mais uma linha nova no array ",[16,1606,332],{}," do catálogo.",[24,1609,1611],{"id":1610},"testando-localmente","Testando localmente",[12,1613,1614,1615,1618,1619,1621,1622,1624,1625,1627],{},"Antes de publicar qualquer coisa, teste o plugin isolado com ",[16,1616,1617],{},"claude --plugin-dir .\u002Fmeu-marketplace\u002Fplugins\u002Frevisor",". Essa flag carrega o plugin direto da pasta, sem precisar de marketplace nenhum ainda, e também aceita um ",[16,1620,889],{}," do plugin quando o teste precisar simular a distribuição por arquivo. Dentro da sessão que abrir, rode a skill como ",[16,1623,1131],{}," e confirme que ela responde do jeito que o ",[16,1626,41],{}," descreve.",[12,1629,1630],{},"Depois de confirmar o plugin isolado, teste o caminho completo, o mesmo que qualquer outra pessoa vai seguir para instalar o seu: registre o catálogo local e instale o plugin a partir dele.",[86,1632,1634],{"className":1189,"code":1633,"language":1191,"meta":91,"style":91},"\u002Fplugin marketplace add .\u002Fmeu-marketplace\n\u002Fplugin install revisor@meu-marketplace\n",[16,1635,1636,1650],{"__ignoreMap":91},[95,1637,1638,1641,1644,1647],{"class":97,"line":98},[95,1639,1640],{"class":1198},"\u002Fplugin",[95,1642,1643],{"class":261}," marketplace",[95,1645,1646],{"class":261}," add",[95,1648,1649],{"class":261}," .\u002Fmeu-marketplace\n",[95,1651,1652,1654,1657],{"class":97,"line":105},[95,1653,1640],{"class":1198},[95,1655,1656],{"class":261}," install",[95,1658,1659],{"class":261}," revisor@meu-marketplace\n",[12,1661,1662,1663,1666,1667,1669],{},"Se o resumo da instalação disser para rodar ",[16,1664,1665],{},"\u002Freload-plugins",", rode: esse comando recarrega plugins, skills, agentes, hooks e servidores MCP sem reiniciar a sessão inteira, e é o mesmo comando que você vai usar toda vez que editar um ",[16,1668,41],{}," de um plugin já instalado.",[24,1671,1673],{"id":1672},"publicando-e-instalando","Publicando e instalando",[12,1675,1676,1677,1680,1681,1684,1685,1687,1688,1690],{},"Publicar é subir o repositório para um host git, GitHub incluído, porque é o caminho mais direto: quem quiser o seu marketplace roda ",[16,1678,1679],{},"\u002Fplugin marketplace add sua-conta\u002Fmeu-marketplace",", e o Claude Code resolve o resto sozinho. Antes de subir, rode ",[16,1682,1683],{},"claude plugin validate ."," na raiz do marketplace: esse comando confere a sintaxe do ",[16,1686,218],{},", nomes de plugin duplicados e caminhos que tentem escapar da raiz do catálogo. Rodado dentro da pasta de um plugin específico, o mesmo comando valida o ",[16,1689,1306],{}," daquele plugin e o frontmatter de cada skill, agente, comando e hook.",[12,1692,1693,1694,1697,1698,1700,1701,1703],{},"Um dos erros mais comuns que essa validação pega é ",[16,1695,1696],{},"Duplicate plugin name"," (dois plugins com o mesmo ",[16,1699,248],{}," dentro do mesmo ",[16,1702,218],{},"), e o conserto é sempre o mesmo: renomear um deles para um identificador único.",[24,1705,1707],{"id":1706},"antes-de-instalar-um-marketplace-que-não-é-seu","Antes de instalar um marketplace que não é seu",[12,1709,1710,1711,1713],{},"Fica um aviso, e ele vem direto da anatomia que abrimos aqui. Um plugin não é só texto: junto das skills, ele pode trazer hooks, que rodam comandos de shell na sua máquina quando um evento acontece, e um ",[16,1712,1174],{},", que conecta servidores externos à sua sessão. Some a isso o fato de a skill entrar sozinha no contexto, sem você pedir, e fica claro que instalar um marketplace desconhecido é dar a alguém um canal aberto para influenciar o que o Claude faz no seu projeto, com suas credenciais e seus arquivos.",[12,1715,1716,1717,1720,1721,1723,1724,1726,1727,66,1729,944,1731,1733],{},"Não existem só pessoas bem intencionadas publicando catálogo, e um repositório com README caprichado não prova nada sobre o que está nas pastas. A única procedência que já vem com alguma garantia é a oficial, os plugins e marketplaces mantidos pela própria Anthropic, e essa garantia é sobre a origem: o que aquele plugin faz na sua máquina você ainda precisa conferir. Fora dessa lista, a confiança é caso a caso, e você é quem decide. Antes de rodar ",[16,1718,1719],{},"\u002Fplugin marketplace add"," em algo de terceiros, abra o repositório e leia: o que tem em ",[16,1722,971],{},", o que o ",[16,1725,1174],{}," conecta, e o que as skills mandam o Claude fazer. Se não der para revisar, prefira não instalar. O mesmo cuidado se aplica a uma atualização: um plugin que você revisou uma vez pode mudar na versão seguinte, então fixar ",[16,1728,840],{},[16,1730,844],{},[16,1732,371],{}," de uma fonte de terceiros é uma proteção barata.",[24,1735,1737],{"id":1736},"boas-práticas","Boas práticas",[12,1739,1740],{},"Um marketplace real, com vários plugins, ganha em legibilidade quando cada plugin documenta a própria função numa tabela no README, mais fácil de escanear do que um parágrafo solto por plugin: uma linha por plugin, dizendo o que ele entrega e qual condição faz o Claude carregá-lo sozinho. Marcar um deles como base obrigatória, quando os outros dependem das convenções dele, poupa a pergunta de por onde começar.",[12,1742,1743,1744,1747,1748,1751,1752,1755],{},"Outro padrão que compensa é uma pasta ",[16,1745,1746],{},"templates\u002F"," no catálogo, com pontos de partida de ",[16,1749,1750],{},"CLAUDE.md",", um por variação de projeto, cada um com marcadores como ",[16,1753,1754],{},"[FILL]"," para o que só existe naquele repositório específico: comando de build, porta, alias. Assim o plugin carrega a convenção que vale para todo mundo, e o template cuida do que muda de projeto para projeto.",[12,1757,1758,1759,1762,1763,1765,1766,1769,1770,1772,1773,1776,1777,1779],{},"O campo ",[16,1760,1761],{},"strict"," de cada entrada do ",[16,1764,218],{}," decide quem manda na definição de um plugin. Com o valor padrão, ",[16,1767,1768],{},"true",", o ",[16,1771,1306],{}," do próprio plugin é a autoridade sobre skills, agentes e hooks, e o marketplace só pode somar componentes extras por cima. Com ",[16,1774,1775],{},"strict: false",", a entrada do marketplace vira a definição inteira, e o plugin sequer precisa de ",[16,1778,1306],{}," próprio; use esse modo quando o catálogo quiser reorganizar ou curar os componentes de um repositório de terceiros de um jeito diferente do que o autor original pretendia.",[12,1781,1782,1783,944,1785,1787],{},"Versão pede uma disciplina simples: se você declarar ",[16,1784,875],{},[16,1786,1306],{},", precisa incrementá-la a cada mudança publicada, porque é essa string que sinaliza atualização para quem já instalou. Omitir o campo também é válido; nesse caso, o Claude Code usa o commit resolvido da fonte como sinal de versão, o que funciona bem para um plugin em desenvolvimento ativo dentro de um time só seu.",[24,1789,1791],{"id":1790},"onde-cada-arquivo-mora","Onde cada arquivo mora",[1793,1794,1795,1811],"table",{},[1796,1797,1798],"thead",{},[1799,1800,1801,1805,1808],"tr",{},[1802,1803,1804],"th",{},"Arquivo",[1802,1806,1807],{},"Local",[1802,1809,1810],{},"Função",[1812,1813,1814,1829,1843,1857,1871],"tbody",{},[1799,1815,1816,1821,1826],{},[1817,1818,1819],"td",{},[16,1820,218],{},[1817,1822,1823,1825],{},[16,1824,474],{}," na raiz do catálogo",[1817,1827,1828],{},"lista os plugins e onde buscar cada um",[1799,1830,1831,1835,1840],{},[1817,1832,1833],{},[16,1834,1306],{},[1817,1836,1837,1839],{},[16,1838,474],{}," na raiz do plugin",[1817,1841,1842],{},"identifica o plugin: nome, versão, autor",[1799,1844,1845,1849,1854],{},[1817,1846,1847],{},[16,1848,41],{},[1817,1850,1851,1839],{},[16,1852,1853],{},"skills\u002F\u003Cnome>\u002F",[1817,1855,1856],{},"a instrução que o Claude carrega sozinho",[1799,1858,1859,1864,1868],{},[1817,1860,1861],{},[16,1862,1863],{},"hooks.json",[1817,1865,1866,1839],{},[16,1867,971],{},[1817,1869,1870],{},"liga eventos do Claude Code a comandos de shell",[1799,1872,1873,1877,1880],{},[1817,1874,1875],{},[16,1876,1174],{},[1817,1878,1879],{},"raiz do plugin",[1817,1881,1882],{},"declara servidores MCP que o plugin traz consigo",[12,1884,1885,1886,1888,1889,1892],{},"O marketplace que ficou pronto neste artigo instala com dois comandos e cresce a cada plugin novo somado ao array ",[16,1887,332],{},". A partir daqui, o trabalho que falta é sempre o mesmo, para qualquer plugin que você queira empacotar: escrever a descrição de cada skill específica o bastante para disparar na hora certa, e testar cada uma isolada, com ",[16,1890,1891],{},"--plugin-dir",", antes de somá-la ao catálogo.",[24,1894,1896],{"id":1895},"leituras-relacionadas","Leituras relacionadas",[421,1898,1899,1908],{},[424,1900,1901],{},[1902,1903,1907],"a",{"href":1904,"rel":1905},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fplugin-marketplaces",[1906],"nofollow","Plugin marketplaces, documentação oficial do Claude Code",[424,1909,1910],{},[1902,1911,1914],{"href":1912,"rel":1913},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fplugins",[1906],"Create plugins, documentação oficial do Claude Code",[1916,1917,1918],"style",{},"html pre.shiki code .sLXsH, html code.shiki .sLXsH{--shiki-light:#90A4AE;--shiki-light-font-weight:inherit;--shiki-default:#79B8FF;--shiki-default-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold}html pre.shiki code .sMo7A, html code.shiki .sMo7A{--shiki-light:#90A4AE;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sSElE, html code.shiki .sSElE{--shiki-light:#39ADB5;--shiki-light-font-weight:inherit;--shiki-default:#79B8FF;--shiki-default-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold}html pre.shiki code .sUVGp, html code.shiki .sUVGp{--shiki-light:#39ADB5;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sG-J9, html code.shiki .sG-J9{--shiki-light:#39ADB5;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .swu5b, html code.shiki .swu5b{--shiki-light:#39ADB5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sod2m, html code.shiki .sod2m{--shiki-light:#9C3EDA;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sF_wb, html code.shiki .sF_wb{--shiki-light:#39ADB5;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .s0vBq, html code.shiki .s0vBq{--shiki-light:#91B859;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .s3afY, html code.shiki .s3afY{--shiki-light:#E2931D;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .soiBB, html code.shiki .soiBB{--shiki-light:#E2931D;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sSJ72, html code.shiki .sSJ72{--shiki-light:#91B859;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}",{"title":91,"searchDepth":105,"depth":105,"links":1920},[1921,1926,1927,1929,1930,1937,1938,1939,1940,1941,1942],{"id":26,"depth":105,"text":27,"children":1922},[1923,1924,1925],{"id":34,"depth":112,"text":35},{"id":45,"depth":112,"text":46},{"id":58,"depth":112,"text":59},{"id":80,"depth":105,"text":81},{"id":214,"depth":105,"text":1928},"A anatomia do marketplace.json",{"id":937,"depth":105,"text":938},{"id":1178,"depth":105,"text":1179,"children":1931},[1932,1933,1934,1935,1936],{"id":1185,"depth":112,"text":1186},{"id":1227,"depth":112,"text":1228},{"id":1297,"depth":112,"text":1298},{"id":1407,"depth":112,"text":1408},{"id":1579,"depth":112,"text":1580},{"id":1610,"depth":105,"text":1611},{"id":1672,"depth":105,"text":1673},{"id":1706,"depth":105,"text":1707},{"id":1736,"depth":105,"text":1737},{"id":1790,"depth":105,"text":1791},{"id":1895,"depth":105,"text":1896},"2026-08-15T16:33:00-03:00","Um marketplace de plugins do Claude Code é só um catálogo com um arquivo marketplace.json, mas entender a peça por trás dele muda como você reaproveita as próprias skills entre projetos. Este guia mostra o que é uma skill por dentro, como ela vira plugin, e como montar e publicar um catálogo completo, arquivo por arquivo, a partir do que aprendi montando o meu.","md",[1947,1950,1953,1956,1959],{"question":1948,"answer":1949},"Qual a diferença entre skill, plugin e marketplace?","Skill é o arquivo SKILL.md que o Claude carrega sozinho quando o pedido bate com a descrição do frontmatter. Plugin é o pacote que empacota uma ou mais skills, junto com agentes, hooks e servidores MCP quando precisar, dando a elas versão e nome de instalação. Marketplace é o catálogo, um marketplace.json que lista onde cada plugin está para o Claude Code saber de onde buscar cada um no momento da instalação.",{"question":1951,"answer":1952},"Preciso de um marketplace para usar um plugin sozinho?","Não. Um plugin em desenvolvimento roda direto com claude --plugin-dir seguido do caminho da pasta, sem passar por catálogo nenhum. O marketplace entra quando o plugin precisa ser instalado por outras pessoas ou em outros projetos, com o comando \u002Fplugin install.",{"question":1954,"answer":1955},"Como o Claude Code decide sozinho qual skill usar?","Pelo campo description do frontmatter de cada SKILL.md. É esse texto que o Claude compara com o pedido do usuário para decidir se carrega aquela skill sem comando explícito. Uma descrição específica reduz o risco de a skill nunca disparar ou disparar fora de contexto; disable-model-invocation true desliga esse gatilho e deixa a skill só acessível pelo comando.",{"question":1957,"answer":1958},"Como testar um plugin antes de publicar o marketplace?","Em duas etapas. Primeiro, isolado, com claude --plugin-dir apontando para a pasta do plugin, confirmando que a skill responde certo. Depois, pelo caminho completo: registrar o marketplace local e instalar o plugin a partir dele, o mesmo fluxo que qualquer pessoa vai usar para instalar o seu.",{"question":1960,"answer":1961},"É seguro instalar qualquer plugin ou marketplace do Claude Code?","Não. Um plugin pode trazer hooks, que rodam comandos de shell na sua máquina quando um evento acontece, e um arquivo .mcp.json, que conecta servidores externos à sua sessão, além de skills que entram no contexto sozinhas sem você pedir. A única procedência que já vem com alguma garantia é a oficial, mantida pela própria Anthropic, e mesmo ela garante a origem, não o que o plugin faz na sua máquina. Antes de instalar um catálogo de terceiros, abra o repositório e leia o que está em hooks\u002F, o que o .mcp.json conecta e o que as skills mandam o Claude fazer; se não der para revisar, não instale. Para fontes de terceiros, fixar ref ou sha no source evita que uma atualização traga código que você nunca revisou.","\u002Fimages\u002Fblog\u002Fmarketplace-plugins-claude-code-capa.jpg",{},"\u002Fblog\u002Fmarketplace-de-plugins-claude-code",{"title":5,"description":1944},"Guia prático para montar um marketplace de plugins do Claude Code: skill, plugin, marketplace.json e publicação, passo a passo.","Marketplace de plugins do Claude Code: guia prático","blog\u002Fmarketplace-de-plugins-claude-code",[1970,332,1971,1972,1973,1974,1975],"claude-code","marketplace","skills","IA","agents","dev-tools","mRvsZIatMgXD7kJWxwHlhcKluKxBwOHz-AfcQX8Rco4",1787183108011]