<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">
  <channel>
    <title>Blogue - Xúlio Zé</title>
    <link>https://xulioze.com/</link>
    <atom:link href="https://xulioze.com/pt/blogue/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Um caderno onde falo dos meus projetos e o que com eles aprendo.</description>
    <lastBuildDate>Tue, 20 Oct 2026 20:27:32 GMT</lastBuildDate>
    <language>pt</language>
    <generator>Lume v3.2.5</generator>
    <author>
      <name>Xúlio Zé</name>
      <uri>https://xulioze.com/</uri>
    </author>
    <item>
      <title>atproto-comments</title>
      <link>https://xulioze.com/pt/blogue/atproto-comments.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/atproto-comments.html</guid>
      <description>
        atproto-comments é um web component que leva os comentários do AT Protocol (Bluesky, Mu, Deer…) a qualquer site, sem base de dados nem autenticação.
      </description>
      <content:encoded>
        <![CDATA[        <p>Acabei de publicar o atproto-comments (no npm e no JSR), um web component que leva os comentários do AT Protocol a qualquer site, de forma simples e sem necessidade de autenticação.</p>

        <ol>
          <li>Publicas um artigo no teu site.</li>
          <li>Publicas um post numa app do AT Protocol (Bluesky, Mu, Deer, etc.) com a ligação para esse artigo.</li>
          <li>Inseres o componente no teu HTML, apontando para o post através da sua AT URI:</li>
        </ol>

        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">&lt;atproto-comments thread-uri="at://did:plc:xxxx/app.bsky.feed.post/yyyy"&gt;&lt;/atproto-comments&gt;</code></pre>

        <p>E pronto: as respostas a esse post aparecem como comentários no teu artigo. Além disso, se um visitante com conta numa app do AT Protocol quiser comentar, escolhe a sua app e é redirecionado para o post.</p>

        <p>O objetivo é duplo. Por um lado, oferecer um sistema de comentários fácil de integrar, sem base de dados própria e sem depender de plataformas como o Disqus. Por outro, trazer para o teu site as conversas que hoje ficam fechadas dentro das redes sociais.</p>

        <p>Se não conheces o AT Protocol, continua a ler. Vou-che contar o caminho que segui até o conhecer e entender, porque tenho a intuição de que vai ser mais útil do que uma definição de manual.</p>

        <p>Há um ano e meio, farto da esterqueira em que se converteu o X, procurei alternativas. Dei com o Bluesky, que prometia ser uma rede aberta e tinha uma interface com vibes do velho Twitter. Gostei: case sem ruído, nazis e bots. Mas não entendi o porquê do "aberta".</p>

        <p>Em março vi um chio da Eurosky, uma iniciativa europeia independente que trabalha para construir uma web social aberta. Convidavam a mudar as nossas contas do Bluesky, alojadas em servidores nos EUA, para os seus servidores na Europa, e a continuar a conversar no Bluesky. Como? Isto já era um chisco mais estranho. Mas era verdade: mudei a minha conta para a Eurosky e continuei a conversar no Bluesky.</p>

        <p>Em junho, outro chio da Eurosky. Desta vez anunciavam o <a href="http://mu.social/" target="_blank" rel="noopener" title="mu.social">mu.social</a>, uma nova app de microblogging. Experimentei entrar com as minhas credenciais do Bluesky e fiquei co cu torto. Ali estava o meu perfil, com os meus posts, a gente que sigo e os meus seguidores. Tudo. Depois dei com o Deer e passou a mesma cousa.</p>

        <p>Espera, isto lembrava-me algo que já tinha vivido. Já sei: o RSS, o Google Reader, o Feedly, a época dourada dos blogues! Quando a internet era descentralizada e o que líamos e publicávamos não estava deformado polos algoritmos de empresas privadas.</p>

        <p>Investiguei e recapitulei. Isto era possível porque o Bluesky está construído sobre o AT Protocol, um protocolo aberto para redes sociais descentralizadas. Nele, os teus dados vivem num servidor de dados pessoal (PDS) e estão assinados criptograficamente. Por isso podemos mudar de fornecedor sem perder a conta nem os seguidores (os dados são nossos!), e até montar o nosso próprio servidor (<a href="https://xulioze.com/pt/blogue/URL" target="_blank" rel="noopener" title="ligação ao repositório no GitHub">ligação ao repositório no GitHub</a>). Podemos consumir os nossos dados e os das pessoas que seguimos a partir de diferentes apps. E podemos desenvolver ferramentas como o atproto-comments, que agora publiquei, sem depender do que uma empresa decida em cada momento.</p>

        <h2>Como funciona por dentro</h2>

        <p>Se queres ver as peças do puzzle, estas são as que entram em jogo quando o atproto-comments carrega os comentários:</p>

        <ul>
          <li>Identidade (DID e handle): cada conta tem um identificador permanente (<code>did:plc:...</code>) e um nome legível (<code>@xulio.eurosky.social</code>). O DID é o que permite mudar de servidor sem perder nada.</li>
          <li>PDS (Personal Data Server): o servidor onde vivem os teus dados, num repositório assinado. Pode ser o do Bluesky, o da Eurosky ou o teu próprio.</li>
          <li>Lexicons e registos: cada tipo de dado tem um esquema público. Um post é um registo da coleção <code>app.bsky.feed.post</code>; por isso a AT URI aponta para <code>at://&lt;did&gt;/app.bsky.feed.post/&lt;id&gt;</code>.</li>
          <li>Relay: recolhe as mudanças de todos os PDS e emite-as num fluxo único (o <em>firehose</em>).</li>
          <li>AppView: consome esse fluxo, indexa-o e serve vistas já montadas, como o fio de respostas de um post. O atproto-comments pede esse fio à API pública do AppView do Bluesky (<code>app.bsky.feed.getPostThread</code>), mas podes apontá-lo para outro AppView com o atributo <code>appview</code>.</li>
          <li>Apps clientes: Bluesky, Mu, Deer… são só interfaces diferentes sobre os mesmos dados, e cada uma pode decidir como os mostra: que algoritmo usa, como ordena o feed, que moderação aplica. Se um dia não gostar de como o Bluesky me serve o feed, mudo para outra app que o faça mais ao meu gosto, sem perder nada.</li>
        </ul>

        <p>No fundo, é a mesma ideia daquela época dourada dos blogues: os dados são teus e podes lê-los, publicá-los e levá-los para onde quiseres. O atproto-comments é só uma pequena peça mais nesse puzzle. Experimenta-o e, se o usares no teu site, conta-mo respondendo ao post deste artigo: o teu comentário vai aparecer aqui em baixo.</p>

        <atproto-comments
          thread-uri="at://did:plc:ooensn4mr5mhznzypvxelfa3/app.bsky.feed.post/3mnyoeuenq225"
          style="color-scheme: dark; --atproto-font-family: inherit; --atproto-font-size: 1rem; --atproto-color-muted: oklch(70% 0 0); --atproto-color-border: oklch(40% 0 0); --atproto-color-surface: #1c1c3d;"
        ></atproto-comments>
]]>
      </content:encoded>
      <pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Contexto Estendido 2.0: Os agentes precisam de arquitetura, não apenas de tomar notas</title>
      <link>https://xulioze.com/pt/blogue/contexto-estendido-v2.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/contexto-estendido-v2.html</guid>
      <description>
        Guia melhorado para estruturar desenvolvimento assistido por IA: separar conhecimento reutilizável (rules) de memória temporária (memory) elimina o vibe-coding.
      </description>
      <content:encoded>
        <![CDATA[        <figure class="c-post__body-img c-post__body-img--figure">
          <img src="https://xulioze.com/img/blade-runner-2049-k-in-rooftop.jpg" alt="Silhueta de K em Blade Runner 2049 a olhar a cidade de um telhado, simbolizando a arquitetura de conhecimento para agentes de IA" width="1200" loading="lazy">
          <figcaption>Observando a cidade</figcaption>
        </figure>

        <p>Este guia é uma versão melhorada da que propus em "<a href="https://xulioze.com/pt/blogue/contexto-estendido.html" target="_blank" rel="noopener" title="Contexto Estendido. Os agentes também precisam de tomar notas">Contexto Estendido. Os agentes também precisam de tomar notas</a>" e <a href="https://xulioze.com/pt/blogue/guia-desenvolver-software-agentes.html" target="_blank" rel="noopener" title="Guia: desenvolver software de qualidade assistido por agentes de IA">Guia: desenvolver software de qualidade assistido por agentes de IA</a>.</p>

        <p>Quando chegaram os editores com agentes de IA autónomos (Cursor, GitHub Copilot, Claude Code), muitos compramos a promessa: "<a href="https://xulioze.com/pt/blogue/oneshot-vs-dialogo.html" target="_blank" rel="noopener" title="One-shot vs diálogo: como escolher o modo correto para o teu agente de IA">escreve o prompt perfeito</a> e o agente gera a feature completa de uma vez". A realidade foi outra: sem estrutura nem constraints, acabávamos a dedicar mais tempo a corrigir bugs que a escrever código.</p>

        <p>O "vibe-coding", confiar em que o agente "apanhe a vibe" do teu projeto, funciona bem para protótipos rápidos, mas em projetos reais e complexos gera mais problemas que soluções:</p>
        <ul>
          <li>Decisões perdidas: Porque escolhemos esta arquitetura há duas semanas?</li>
          <li>Alucinações constantes: A IA inventa APIs, mistura frameworks, ignora constraints</li>
          <li>Trabalho monolítico: Impossível dividir features em tarefas rastreáveis</li>
          <li>Improvisação contínua: Cada sessão começa do zero</li>
        </ul>

        <p>Há uns meses documentei <a href="https://xulioze.com/pt/blogue/guia-desenvolver-software-agentes.html" target="_blank" rel="noopener" title="Guia: desenvolver software de qualidade assistido por agentes de IA">uma solução</a> (v1): um workflow estruturado (análise → solução → backlog → execução → progresso guardado) com quatro arquivos de contexto que convertia o vibe-coding em engenharia rastreável. Funcionou, mas havia fricção: repetir manualmente os mesmos prompts em cada sessão era doloroso.</p>

        <p>Este guia apresenta a evolução desse sistema (v2). Aproveita o sistema de rules do Cursor para automatizar prompts e converte o workflow em protocolos reutilizáveis. Mas ao desenhá-lo emergiu um padrão universal: separar conhecimento reutilizável (rules) de memória temporária (memory). Isto vai além de poupar-te escrever os mesmos prompts: podes reutilizar o conhecimento em diferentes projetos e levar um registo ordenado de tudo o que fazes. E o padrão funciona com qualquer ferramenta de IA, não só com Cursor.</p>

        <p>Vamos ver como construir essa arquitetura.</p>

        <h2>Problema de v1</h2>

        <p>Sistema de quatro arquivos em <code>context/</code>:</p>
        <ul>
          <li><code>01-expert.md</code> - Perfil do especialista</li>
          <li><code>02-analysis.md</code> - Análise do código</li>
          <li><code>03-plan.md</code> - Plano de implementação</li>
          <li><code>04-backlog.md</code> - Tarefas pendentes</li>
        </ul>

        <h3>Limitações em Projetos Reais</h3>

        <p>Conhecimento misturado: <code>01-expert.md</code> combina princípios gerais (KISS, DRY) com constraints específicos do projeto (stack, versões, dependências críticas). Impossível reutilizar princípios entre projetos sem arrastar configuração irrelevante.</p>

        <p>Duplicação entre projetos: Cada projeto replica conhecimento comum. Se trabalhas em 3 projetos WordPress, tens <code>security: sanitize_*, nonces</code> copiado três vezes. Atualizas uma best practice, deves sincronizar manualmente.</p>

        <p>Sem gestão de histórico: v1 dá-te três opções, todas más:</p>
        <ul>
          <li>Sobrescrever <code>02-analysis.md</code> → perdes decisões prévias</li>
          <li>Acumular análises no mesmo arquivo → cresce descontroladamente, impossível rastrear quando se tomou cada decisão</li>
          <li>Criar múltiplos arquivos (<code>02-analysis-feature-X.md</code>) → desordem, sem nomenclatura consistente</li>
        </ul>

        <p>Em todos os casos: Porque rejeitaste a arquitetura X há duas semanas? Não há forma sistemática de recuperá-lo.</p>

        <p>Sem modularidade: Mudar de WordPress a React requer reescrever <code>01-expert.md</code> completo. Não podes manter módulos comuns (princípios, padrões) e só intercambiar o especialista técnico.</p>

        <p>v1 tinha dois problemas fundamentais: (1) conhecimento misturado num só arquivo (<code>01-expert.md</code>), (2) execução manual - cada ação requeria escrever o prompt completo ("analisa este arquivo e guarda em <code>02-analysis.md</code>", "lê <code>04-backlog.md</code>, executa tarefas 1-3, atualiza estado"). v2 resolve ambos: separa conhecimento em <code>rules/</code> modulares e automatiza execução mediante protocolos invocáveis em <code>rules/utils/</code> (<code>@analysis</code>, <code>@execute</code>).</p>

        <h2>Solução: Separação Rules/Memory</h2>

        <p>A solução replica como funciona o nosso cérebro: separamos conhecimento permanente (idioma, matemáticas, habilidades) de memória episódica (o que fizemos ontem, decisões da semana passada). Mas além disso, o nosso conhecimento não é monolítico: temos módulos especializados (JavaScript, WordPress, princípios KISS) que ativamos segundo o contexto.</p>

        <p>v2 implementa esta arquitetura dual:</p>

        <ol>
          <li>Separação conhecimento/memória: Rules reutilizáveis vs memory temporária</li>
          <li>Modularização do conhecimento: Especialistas, guidelines e protocolos executáveis</li>
        </ol>

        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">.cursor/
├── rules/          # Conhecimento reutilizável e modular
│   ├── experts/    # Papéis técnicos (WordPress, React, Python...)
│   ├── guidelines/ # Princípios e constraints (KISS, projeto-específicos)
│   └── utils/      # Protocolos executáveis (analysis, backlog, commit)
└── memory/         # Experiências temporárias
    └── YYYYMMDD-VV-descricao.md</code></pre>

        <h3>Conceito Chave: alwaysApply</h3>

        <p>O sistema rules/memory necessita de um mecanismo de ativação: que conhecimento carrega o Cursor automaticamente vs. o que invocas sob demanda? Sem isto, terias 100 regras a competir por contexto limitado.</p>

        <p>O flag <code>alwaysApply</code> resolve isto:</p>

        <ul>
          <li><code>alwaysApply: true</code> → Cursor carrega-as automaticamente em cada conversação
            <ul>
              <li>Usa para: Especialistas base, guidelines críticas do projeto</li>
              <li>Exemplo: <code>wordpress-classic-themes.mdc</code>, <code>constraints-balneario.mdc</code></li>
            </ul>
          </li>
          <li><code>alwaysApply: false</code> → Utilizador invoca-as com <code>@</code> segundo necessidade
            <ul>
              <li>Usa para: Protocolos sob demanda, ferramentas específicas</li>
              <li>Exemplo: <code>@analysis</code>, <code>@backlog</code></li>
            </ul>
          </li>
        </ul>

        <h3>Rules: Conhecimento Reutilizável</h3>

        <p>Experts - Perfis de especialistas técnicos/domínio:</p>

        <p><code>rules/experts/wordpress-classic-themes.mdc</code></p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">---
alwaysApply: true
---
# WordPress Classic Expert
PHP + vanilla JS specialist. WordPress core APIs, theme dev.

## Stack
Backend: PHP 7.4+, WP Core APIs | Frontend: Vanilla JS, HTML5, CSS3

## Core Patterns
- Security: sanitize_*, esc_*, nonces
- Performance: transients (12h), conditional enqueue
- Translation: __(), _e() with text domain</code></pre>

        <p>Guidelines - Princípios de código e restrições de projeto:</p>

        <p><code>rules/guidelines/constraints-balneario.mdc</code></p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">---
alwaysApply: true
---
# Balneario Theme
Text domain: themefront v0.1.2
Stack: Node | SASS 1.67.0 | PHP 7.4+ | jQuery 3.x
Build: npm run watch:sass (never edit compiled CSS)

Critical: ACF PRO (18 groups), WooCommerce, WPML
Core Systems: PDF Generator (pdf-generator.php), WooCommerce integration</code></pre>

        <p><code>rules/guidelines/kiss.mdc</code></p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">---
alwaysApply: true
---
# KISS Principle
- Direct solutions, avoid over-engineering
- Simple patterns, minimal dependencies
- Single responsibility per function

Rule: If you can't explain it in 2-3 sentences, it's too complex.</code></pre>

        <p>O princípio KISS é especialmente importante em desenvolvimento assistido por IA: é mais fácil pedir ao agente que adicione complexidade a uma solução simples, que perder tempo a analisar o que sobra na sua proposta (<a href="https://arxiv.org/html/2411.09916v1" target="_blank" rel="noopener" title="Research paper: LLMs tend to generate more complex code than necessary">os LLMs tendem a gerar código mais complexo do que o necessário</a>).</p>

        <p>Utils - Protocolos invocáveis:</p>

        <p><code>rules/utils/analysis.mdc</code> → Analisa código/pastas e guarda em memory</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">---
alwaysApply: false
---
# Analysis Protocol
Trigger: @file/@folder or "analyze"
1. Acknowledge → 2. Analyze → 3. Save to .cursor/memory/YYYYMMDD-VV-*.md → 4. Confirm</code></pre>

        <p><code>rules/utils/solution.mdc</code> → Propõe solução e guarda em memory</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">---
alwaysApply: false
---
# Solution Protocol (KISS)
Trigger: User requests solution
1. Acknowledge → 2. Propose simplest solution → 3. Save to memory → 4. Confirm
Principles: Simplicity > complexity, proven patterns > novel</code></pre>

        <p><code>rules/utils/backlog.mdc</code> → Converte solução em tarefas atómicas rastreáveis</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">---
alwaysApply: false
---
# Backlog Protocol
Solution → atomic tasks → persistent backlog (YYYYMMDD-VV-backlog-*.md)

Format: [Phase.Task#] ⏳/🔄/✅/⚠️ Title
> What to do | Date completed | Work done

Rules: 2-4h max, sequential, testable</code></pre>

        <p><code>rules/utils/execute.mdc</code> → Executa tarefas do backlog e atualiza estado</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">---
alwaysApply: false
---
# Task Execution Protocol
Load backlog → parse scope → execute → update status → stop at boundary
Input: [1.1], [2.3,2.4], Phase 2, continue</code></pre>

        <p><code>rules/utils/commit.mdc</code> → Gera commits convencionais e atualiza backlog</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">---
alwaysApply: false
---
# Commit Protocol
Analyze staged → generate conventional commit → approve → execute → update backlog
Format: [JIRA-XXX] type(scope): subject (English, imperative, max 72 chars)</code></pre>

        <h3>Memory: Registo Histórico</h3>

        <p>Os protocolos utils geram automaticamente arquivos em <code>memory/</code> seguindo a nomenclatura <code>YYYYMMDD-VV-descricao.md</code> (VV = sequência diária: 01, 02, 03...):</p>

        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">memory/
├── 20250919-01-analisis-pdf-generator.md
├── 20250919-02-sistema-pdfs-emails-finalizado.md
├── 20251015-01-analisis-completo-balneario-theme.md
├── 20251015-02-solucion-facturacion-automatica-399.md
└── 20251015-03-backlog-facturacion-automatica-399.md</code></pre>

        <p>Vantagens: ordenação cronológica, múltiplas entradas/dia, rastreabilidade, relações visíveis.</p>

        <p>Isto resolve o problema das três opções más de v1: a nomenclatura cronológica (YYYYMMDD-VV) acumula histórico sem descontrolo, mantém ordem sem desorganização, e preserva decisões sem sobrescrita.</p>

        <h2>Workflow no Cursor</h2>

        <blockquote>
          <p>Nota: Os comandos com <code>@</code> invocam regras específicas. Por exemplo, <code>@analysis</code> carrega <code>rules/utils/analysis.mdc</code> sem necessidade de escrever o caminho completo. Isto é parte da sintaxe nativa do Cursor.</p>
        </blockquote>

        <p>Esta secção descreve o workflow geral para desenvolvimento assistido por IA: separar conhecimento reutilizável de memória temporária, seguindo o ciclo análise → solução → backlog → execução → commit → continuar. Usamos Cursor e o seu sistema de rules como exemplo de implementação, mas o workflow é aplicável a qualquer ferramenta de IA com capacidade de injetar contexto.</p>

        <p>A seguir verás como funciona o workflow na prática. Se depois quiseres implementá-lo nos teus projetos com Cursor, consulta o guia de Implementação e Configuração mais abaixo.</p>

        <h3>Desenvolvimento de Feature: Faturação Automática</h3>

        <p>1. Análise</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">@analysis checkout.php</code></pre>
        <p>→ Gera: <code>20251015-01-analisis-checkout.md</code></p>

        <p>2. Solução</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">@solution
Implementa faturação automática WooCommerce</code></pre>
        <p>→ Gera: <code>20251015-02-solucion-facturacion.md</code></p>

        <p>3. Backlog</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">@memory/20251015-02-solucion-facturacion
@backlog</code></pre>
        <p>→ Gera: <code>20251015-03-backlog-facturacion.md</code></p>

        <p>4. Execução</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">@memory/20251015-03-backlog-facturacion
@execute [1.1]</code></pre>
        <p>→ Atualiza: <code>[1.1] ⏳ → ✅</code></p>

        <p>5. Commit</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">@memory/20251015-03-backlog-facturacion
@commit</code></pre>
        <p>→ Cria commit + atualiza backlog</p>

        <p>6. Continuar trabalho (nova sessão)</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">@memory/20251015-03-backlog-facturacion
Resume trabalho</code></pre>
        <p>→ Carrega contexto + mostra próximas tarefas</p>

        <h2>Implementação e Configuração</h2>

        <h3>1. Instalar o Sistema (5 min)</h3>

        <p>Este sistema está disponível em <a href="https://github.com/arinspunk/extended-context" target="_blank" rel="noopener" title="Extended Context - Knowledge architecture for AI agents">github.com/arinspunk/extended-context</a>.</p>

        <p>Duas formas de configurar:</p>

        <p>Opção A - Contribuir ao repo partilhado (recomendado se quiseres participar na manutenção):</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">cd teu-projeto
git clone https://github.com/arinspunk/extended-context.git .cursor</code></pre>
        <p>Mantém conexão com o repo para receber atualizações e contribuir melhorias. Atualiza quando quiseres: <code>cd .cursor && git pull</code></p>

        <p>Opção B - Snapshot para o teu projeto (recomendado para trabalho diário):</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">git clone https://github.com/arinspunk/extended-context.git temp
cp -r temp/rules temp/memory teu-projeto/.cursor/
rm -rf temp</code></pre>
        <p>Cópia independente que personalizas livremente sem afetar o repo original, ideal para versionar junto com o código do teu projeto.</p>

        <p>Migração desde v1: Usa Opção B para integrar com a tua estrutura existente.</p>

        <h3>2. Configuração Inicial (15 min)</h3>

        <p>Pré-requisitos:</p>
        <ul>
          <li>Cursor instalado e projeto aberto</li>
          <li>Sistema rules/memory clonado em <code>.cursor/</code> (passo anterior completado)</li>
        </ul>

        <p>Passo 1: Identifica o teu stack (2 min)</p>
        <p>Revisa <code>rules/experts/</code> e ativa o especialista que coincida com o teu projeto:</p>
        <ul>
          <li>WordPress → <code>wordpress-classic-themes.mdc</code></li>
          <li>React → <code>react-typescript.mdc</code> (se existir)</li>
          <li>Backend Python → <code>python-fastapi.mdc</code> (se existir)</li>
        </ul>
        <p>Se o teu stack não existir: copia o especialista mais próximo e adapta-o.</p>

        <p>Passo 2: Ativa constraints do projeto (3 min)</p>
        <ol>
          <li>Copia <code>rules/guidelines/constraints-template.mdc</code> a <code>constraints-{projeto}.mdc</code></li>
          <li>Completa:
            <ul>
              <li>Stack técnico (versões específicas)</li>
              <li>Dependências críticas (bibliotecas que NÃO se podem mudar)</li>
              <li>Sistemas legacy que deves respeitar</li>
            </ul>
          </li>
          <li>Muda <code>alwaysApply: false</code> → <code>true</code></li>
        </ol>

        <p>Passo 3: Ativa princípios base (1 min)</p>
        <p>Ativa <code>kiss.mdc</code> mudando <code>alwaysApply: false</code> → <code>true</code></p>

        <p>Passo 4: Verifica carga (1 min)</p>
        <p>Abre chat do Cursor (Cmd+L) e escreve:</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">Que especialista e guidelines tens ativas?</code></pre>
        <p>Cursor deve listar os arquivos com <code>alwaysApply: true</code>.</p>

        <p>Passo 5: Primeira execução (8 min)</p>
        <p>Prova o workflow completo com um arquivo real:</p>
        <pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">@analysis src/components/Header.tsx</code></pre>
        <p>Se gerar corretamente <code>memory/YYYYMMDD-01-*.md</code>, o sistema está operativo.</p>

        <blockquote>
          <p>Nota para outras ferramentas: Este sistema é agnóstico ao Cursor. A separação conceptual rules/memory pode implementar-se em qualquer ferramenta capaz de injetar contexto (GitHub Copilot, Claude Code, etc.).</p>
        </blockquote>

        <p>Uma vez configurado o sistema, o verdadeiro trabalho começa: alimentar rules com conhecimento específico do projeto e práticas habituais da equipa, enquanto memory regista o trabalho realizado com a IA (análises, propostas de solução, tarefas e progresso). Na prática, isto transforma como a IA gera código: soluções coerentes com a arquitetura do projeto e escaláveis. Além disso, documenta decisões que facilitam debug posteriores e transferência de conhecimento entre programadores.</p>

        <h2>Conclusão</h2>

        <p>O vibe-coding funciona para protótipos, mas gera mais problemas que soluções em projetos reais: decisões perdidas, alucinações constantes, trabalho impossível de rastrear. v1 resolveu isto com workflow estruturado, mas requeria repetir prompts manualmente em cada sessão.</p>

        <p>v2 elimina essa fricção automatizando os protocolos e, ao fazê-lo, descobre um padrão universal: separar conhecimento reutilizável (rules) de memória temporária (memory). Esta separação, a mesma que faz o teu cérebro entre habilidades e experiências, converte qualquer ferramenta de IA num sistema onde o conhecimento persiste, evolui e se reutiliza sistematicamente.</p>

        <p>Não elimina as limitações de janela de contexto, mas transforma-as num framework estruturado para construir software de forma rastreável e escalável.</p>

        <h3>Próximos Passos</h3>

        <ol>
          <li>Se usas Cursor: <a href="https://github.com/arinspunk/extended-context" target="_blank" rel="noopener" title="Extended Context - Knowledge architecture for AI agents">Clona o repo</a> e configura o teu primeiro projeto</li>
          <li>Se usas outra ferramenta: Adapta a separação rules/memory ao teu sistema</li>
          <li>Partilha a tua implementação: Criaste especialistas para o teu stack? Contribui ao repo</li>
          <li>Partilha resultados: Melhoraste o workflow? Documenta os teus achados para refinar coletivamente o sistema</li>
        </ol>
]]>
      </content:encoded>
      <pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>One-shot prompting? Prefiro conversar com a minha IA</title>
      <link>https://xulioze.com/pt/blogue/oneshot-vs-dialogo.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/oneshot-vs-dialogo.html</guid>
      <description>
        O valor real da IA não está na geração inicial, mas nas iterações posteriores. A iteração não é desenvolvimento, é trabalho de design.
      </description>
      <content:encoded>
        <![CDATA[				<figure class="c-post__body-img c-post__body-img--figure">
					<img src="https://xulioze.com/img/bicentennial-man.jpg" alt="Cena do filme O Homem Bicentenário: um homem trabalha em um laptop enquanto dois robôs humanoides dourados observam atentamente por cima de seus ombros" width="768" loading="lazy">
					<figcaption>Andrew, Galatea e Rupert Burns trabalhando juntos</figcaption>
				</figure>

				<p>Há uns dias, numa conversa com colegas, surgiu o debate sobre a utilidade do one-shot prompting na geração de código com IA. Eu defendia que não é útil, e o argumento que usei creio que merece ser partilhado.</p>

				<h2>O problema do one-shot como objetivo</h2>

				<p>Quando assumimos que o one-shot pode dar-nos os resultados esperados, estamos a carregar toda a responsabilidade da qualidade do output na parte humana: se o LLM não produz uma boa resposta, o problema é que não escrevemos o prompt correto.</p>

				<p>Mas esta ideia choca frontalmente com a natureza da IA generativa, que é não-determinística. Para o mesmo prompt e modelo, obtemos respostas diferentes em cada execução. Portanto, torna-se impossível—sobretudo com tarefas complexas—obter a resposta ótima numa só interação. A iteração torna-se inevitável.</p>

				<p>Nesse debate, com pequenos matizes, todos concordávamos que o one-shot não é válido como fim em si mesmo, mas como exercício para melhorar os nossos prompts. É impossível alcançar 100% de qualidade, mas com esta prática aprendemos a passar, por assim dizer, de 60% para 70%.</p>

				<h2>De Figma ao código: outra perspetiva</h2>

				<p>Este fim de semana li <a href="https://www.uxtools.co/blog/the-only-ai-workflow-i-use-in-production" title="The only AI workflow I use in production" target="_blank" rel="noopener">The only AI workflow I use in production</a>, de Tommy Geoco. O artigo descreve o fluxo que Tommy utiliza para desenvolver o seu trabalho de design assistido por IA (Figma → Claude Code), afirmando que supera em termos absolutos o uso de outras ferramentas como Lovable, Replit ou Bolt. Se és designer UX/UI interessado na integração de IA no teu trabalho, recomendo a leitura porque contém ideias verdadeiramente interessantes.</p>

				<p>Entre essas ideias há uma que me fez refletir novamente sobre a inconveniência do one-shot. Segundo o autor, devemos desmistificá-lo porque não capta o valor real. A verdadeira potência não está na geração inicial, mas nas iterações posteriores.</p>

				<p>O seu fluxo de trabalho é o seguinte:</p>

				<ol>
					<li>Desenhar o "happy path" (fluxo ótimo) no Figma</li>
					<li>Alimentar o design ao Claude Code via <a href="https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Figma-MCP-server" title="Figma MCP server guide" target="_blank" rel="noopener">Figma MCP</a></li>
					<li>Obter uma base sólida em 15 minutos (vs. 50 horas de codificação manual)</li>
					<li>Iterar e refinar durante 50 horas</li>
				</ol>

				<p>O último ponto é chave para ele: a iteração não é desenvolvimento, é trabalho de design. Não se trata de refinar o código para representar um design fechado, mas com ele tomar decisões sobre hierarquia visual, padrões de interação, casos extremos, estados de erro, etc.</p>

				<h2>E se o valor está na iteração?</h2>

				<p>Daqui tiro duas conclusões igualmente importantes. A primeira: o autor está a transferir grande parte do exercício de design do Figma para o código, algo inovador que esbate a fronteira UX/UI-Desenvolvimento. Não vou desenvolvê-la aqui para não me desviar do tema, mas merece um post próprio.</p>

				<p>A segunda, relacionada com o debate sobre one-shot: o autor não usa a IA para que desenhe por ele com base em instruções iniciais, mas apoia-se nela para iterar mais rapidamente, refletir sobre o design de forma mais profunda e conseguir um melhor resultado. Creio que não só porque a IA lhe poupa tempo de trabalho repetitivo sem valor e ganha-o para pensar, mas porque o diálogo gerado pode levá-lo a lugares, pensamentos e decisões aos quais sozinho não teria chegado.</p>

				<p>Fica por ver se este esquema se translada igualmente ao desenvolvimento de software, mas se funciona de forma similar, então a inconveniência do one-shot não se deve unicamente às limitações que nos impõe a natureza não-determinística dos LLMs. Há algo mais importante: a iteração—esse diálogo continuado entre humano e IA—proporciona-nos valor real, obtemos melhores resultados.</p>

				<p>Esta ideia da iteração como diálogo fez-me recordar os <a href="https://intralation-culture-theory-posthuman-pedagogy.ghost.io/attuning-orienting-and-navigating-the-co-emergence-of-meaning-in-ai-dialogue-13-propositions-for-a-critical-ai-pedagogy/" title="Attuning, Orienting, and Navigating the Co-Emergence of Meaning in AI Dialogue: 13 Propositions for a Critical AI Pedagogy" target="_blank" rel="noopener">planteamentos sobre cocriação humano-IA de Owen Matson</a>. E tenho de reconhecer que foi escrevendo este post—em diálogo com uma IA—quando creio que finalmente entendi o que Owen planteia. Fica pendente aprofundar esta via 🙂</p>
]]>
      </content:encoded>
      <pubDate>Mon, 13 Oct 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Use as ferramentas de formas inesperadas, a IA também</title>
      <link>https://xulioze.com/pt/blogue/use-ferramentas-formas-inesperadas-ia.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/use-ferramentas-formas-inesperadas-ia.html</guid>
      <description>
        Não hesite em pedir à IA para fazer coisas que você acha que são impossíveis. Você pode se surpreender com os resultados e aprender algo novo.
      </description>
      <content:encoded>
        <![CDATA[				<p>Quando trabalhava como designer gráfico, adorava usar ferramentas ou objetos de formas para as quais não foram originalmente concebidos. Por exemplo, fazer desenhos colorindo as células de uma folha de cálculo do Excel ou  <a href="https://arinspunk.com/kraksh-disco/" title="Disco Kraksh desenhado pelas Arinspunk" target="_blank" rel="noopener">escrever um texto com fita isoladora amarela</a>.</p>

				<p>No outro dia, enquanto testava <a href="https://xulioze.com/pt/blogue/claude-talk-to-figma-mcp.html" title="Como integrar Figma com Claude">o MCP que desenvolvi para integrar o Figma com o Claude</a>, a minha filha de 9 anos perguntou-me o que estava a fazer. Expliquei-lhe e ela ouviu com atenção. Quando terminei, ela disse:<br>
				—Diz-lhe para desenhar um monstro zangado.<br>
				Pedi ao Claude e ele desenhou um.</p>

				<figure class="c-post__body-img c-post__body-img--figure">
					<img src="https://xulioze.com/img/monstruo.png" alt="Um monstro zangado desenhado por uma IA no Figma" width="768" loading="lazy">
					<figcaption>Monstro zangado desenhado com Figma por Claude Sonnet 3.7</figcaption>
				</figure>

				<p><a href="https://xulioze.com/pt/blogue/guia-desenvolver-software-agentes.html" title="desenvolver software de qualidade assistido por agentes de IA">Tenho usado IA intensivamente no meu trabalho</a> há já algum tempo e uma das coisas que percebi é que não devemos deixar de pedir algo só porque achamos que não o consegue fazer. Peça na mesma — verá como muitas vezes o surpreenderá com a solução proposta e aprenderá algo novo.</p>

				<p>Hoje, a trabalhar com o Figma + Cursor, lembrei-me da minha filha e pedi-lhe ao agente que desenhasse um dragão.</p>
				
				<figure class="c-post__body-img c-post__body-img--figure">
					<img src="https://xulioze.com/img/dragon-og.png" alt="Um dragão a cuspir fogo desenhado por uma IA no Figma" width="768" loading="lazy">
					<figcaption>Dragão encantador desenhado com Figma por Claude Sonnet 4</figcaption>
				</figure>
				
				<p>Acho que vou voltar ao passatempo que tinha <a href="https://arinspunk.com/" title="arquivo das defuntas Arinspunk" target="_blank" rel="noopener">quando era designer</a> 😊</p>
]]>
      </content:encoded>
      <pubDate>Wed, 30 Jul 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Guia: integrar o Figma em fluxos de trabalho com IA</title>
      <link>https://xulioze.com/pt/blogue/guia-integrar-figma-com-ia.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/guia-integrar-figma-com-ia.html</guid>
      <description>
        Aprenda a integrar o Figma nos seus fluxos de trabalho de IA com a API do Figma, o Dev Mode MCP Server e o Claude Talk to Figma MCP. Um guia para equipas de desenvolvimento e design.
      </description>
      <content:encoded>
        <![CDATA[                <img class="c-post__body-img" src="https://xulioze.com/img/ex-machina.jpg" alt="Ava mostra o seu desenho" width="768" loading="lazy">

                <h2>Propósito</h2>
                <p>Permitir que os LLMs:</p>
                <ul>
                    <li>Analisem e modifiquem designs no Figma.</li>
                    <li>Gerem código a partir deles.</li>
                </ul>

                <h2>A quem se destina</h2>
                <p>Equipas de UX/UI que pretendem automatizar auditorias de acessibilidade, realizar testes de utilizador sintéticos e iterar designs com base em feedback automatizado.</p>
                <p>Equipas de Frontend que precisam de acelerar a tradução de designs para código, especialmente quando trabalham com sistemas de componentes e frameworks modernos.</p>
                <p>Equipas de Backend/DevOps que desenvolvem workflows automatizados e agentes de IA que requerem a integração da análise de designs no Figma e a geração de código a partir deles.</p>
                <p>Equipas multidisciplinares que procuram reduzir o atrito na passagem de design para desenvolvimento, mantendo cada equipa nas suas ferramentas habituais.</p>

                <h2>Ferramentas</h2>
                
				<div class="c-post__table">
					<table>
						<thead>
							<tr>
								<th>Ferramenta</th>
								<th>Funcionalidade</th>
								<th>Uso recomendado</th>
								<th>Equipa alvo</th>
								<th>Ambiente de uso</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td>
									<a href="https://xulioze.com/pt/blogue/guia-integrar-figma-com-ia.html#api-figma" title="API do Figma">API do Figma</a>
								</td>
								<td>
									Análise de designs + geração de código
								</td>
								<td>
									Integração do Figma em fluxos de trabalho de agentes de IA
								</td>
								<td>
									Equipas de backend que desenvolvem fluxos de trabalho de agentes de IA
								</td>
								<td>
									ADK, Crew AI, LangGraph, etc.
								</td>
							</tr>
							<tr>
								<td>
									<a href="https://xulioze.com/pt/blogue/guia-integrar-figma-com-ia.html#dev-mode-mcp-server" title="Dev Mode MCP Server">Dev Mode MCP Server</a>
								</td>
								<td>
									Análise de designs + geração de código
								</td>
								<td>
									Geração de código a partir de designs no Figma
								</td>
								<td>
									Equipas de frontend
								</td>
								<td>
									Cursor, VS Code + Github Copilot, Windsurf, Claude Code, etc.
								</td>
							</tr>
							<tr>
								<td>
									<a href="https://xulioze.com/pt/blogue/guia-integrar-figma-com-ia.html#claude-talk-to-figma-mcp" title="Claude Talk to Figma MCP">Claude Talk to Figma MCP</a>
								</td>
								<td>
									Análise e modificação de designs
								</td>
								<td>
									Testes de utilizadores (sintéticos), auditorias de acessibilidade e SEO, e modificação de designs
								</td>
								<td>
									Equipas de UX/UI
								</td>
								<td>
									Claude
								</td>
							</tr>
						</tbody>
					</table>
				</div>
                
                <h3 id="api-figma">API do Figma</h3>
                <h4>Requisitos</h4>
                <ul>
                    <li>Conta do Figma</li>
                    <li>Gerar um <a href="https://www.figma.com/developers/api#access-tokens" target="_blank" rel="noopener" title="'Access tokens' na documentação do Figma">token de acesso</a> ou usar <a href="https://www.figma.com/developers/api#oauth2" target="_blank" rel="noopener" title="'OAuth 2' na documentação do Figma">OAuth 2</a></li>
                </ul>
                <h4>Descrição</h4>
                <p>É a forma mais simples para um LLM analisar um design.</p>
                <p>A API do Figma permite construir endpoints para solicitar ficheiros, imagens, versões de ficheiros, utilizadores, comentários, projetos de equipa e ficheiros de projeto. Devolve um JSON que podemos passar ao LLM para que o interprete.</p>
                <p>Ao contrário dos MCPs, não precisamos de ter o Figma Desktop aberto para que um agente analise um design. Isto torna-o no método ideal para integrar o Figma em fluxos de trabalho de agentes de IA.</p>
                <h4>Instalação</h4>
                <p>Por se tratar de uma API, e não de um MCP, não existe uma instalação como tal. Podemos ver como funciona com um teste simples com o Cursor ou o VS Code:</p>
                <ol>
                    <li><a href="https://www.figma.com/developers/api#access-tokens" target="_blank" rel="noopener" title="'Access tokens' na documentação do Figma">Crie um token</a>.</li>
                    <li>Diga ao seu agente para analisar um design no Figma executando <a href="https://www.figma.com/developers/api#get-file-nodes-endpoint" target="_blank" rel="noopener" title="'GET file nodes' na documentação do Figma">um pedido curl a um endpoint</a>.</li>
                </ol>
                <p>Por exemplo, para o seguinte URL de um nó de um design:</p>
<pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">https://www.figma.com/design/XG1EYHLnC7NdwGuYc7LmUf/MVC---WEB?node-id=6037-2235&t=AHpchSRAIyGCdoci-0</code></pre>
                <p>diga-lhe para usar:</p>
<pre class="c-post__prompt c-post__prompt--scroll"><button class="c-post__copy-btn" aria-label="Copiar código"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff" viewBox="0 -960 960 960"><path d="M362.31-260q-27.01 0-45.66-18.65T298-324.31v-455.38q0-27.01 18.65-45.66T362.31-844h359.38q27.01 0 45.66 18.65T786-779.69v455.38q0 27.01-18.65 45.66T721.69-260zm0-52h359.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85m-124 176q-27.01 0-45.66-18.65T174-200.31v-507.38h52v507.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h411.38v52zM350-312v-480z"/></svg></button><code class="c-post__prompt-code">curl -H 'X-FIGMA-TOKEN: {o seu token de acesso pessoal}'
'https://api.figma.com/v1/files/XG1EYHLnC7NdwGuYc7LmUf/nodes?ids=6037-2235'</code></pre>
                <p>Ao receber o prompt, o agente executará o pedido curl e obterá um JSON com os parâmetros do design. Depois, irá analisá-lo e gerar um texto com o conteúdo da sua análise.</p>
                
                <h3 id="dev-mode-mcp-server">Dev Mode MCP Server</h3>
                <h4>Requisitos</h4>
                <ul>
                    <li><a href="https://help.figma.com/hc/en-us/articles/27468498501527-Updates-to-Figma-s-pricing-seats-and-billing-experience#h_01JCPBM8X2MBEXTABDM92HWZG4" target="_blank" rel="noopener" title="descrições dos 'seats' do Figma">Dev ou Full seat</a> nos <a href="https://help.figma.com/hc/en-us/articles/360040328273-Figma-plans-and-features" target="_blank" rel="noopener" title="Figma plans and features">planos Professional, Organization ou Enterprise</a>.</li>
                    <li>Um editor de código ou aplicação que suporte MCP Servers (<a href="https://code.visualstudio.com/docs/copilot/overview" target="_blank" rel="noopener" title="GitHub Copilot no VS Code">VS Code</a>, <a href="https://www.cursor.com/" target="_blank" rel="noopener" title="Página oficial do Cursor">Cursor</a>, <a href="https://windsurf.dev/" target="_blank" rel="noopener" title="Página oficial do Windsurf">Windsurf</a>, <a href="https://docs.anthropic.com/en/docs/claude-code/overview" target="_blank" rel="noopener" title="Página oficial do Claude Code">Claude Code</a>).</li>
                    <li><a href="https://www.figma.com/downloads/" target="_blank" rel="noopener" title="Downloads do Figma">Figma Desktop App</a></li>
                </ul>
                <h4>Descrição</h4>
                <p>Trata-se do servidor MCP oficial do Figma.</p>
                <p>Habilita várias ferramentas de análise (5 à data de publicação deste post) que os agentes podem usar para gerar código a partir de um design.</p>
                <p>As ferramentas que permitem "ver" um design são <code>get_code</code> e <code>get_image</code>. Ao contrário da API do Figma, <code>get_code</code> não devolve um JSON com os dados do design, mas sim uma tradução do design para React que o Dev Mode gera dinamicamente.</p>
                <p>Isto facilita ao LLM a geração de código, mesmo que não seja React, já que a distância entre React e outro framework/linguagem é menor do que entre a informação do JSON e o nosso framework/linguagem.</p>
                <p><code>get_image</code> cria uma captura de ecrã do design selecionado e serve de apoio ao agente na hora de gerar código.</p>
                <h4>Instalação</h4>
                <ol>
                    <li><a href="https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server#h_01K25F7RBP00A3VH1733692QN2" target="_blank" rel="noopener" title="Step 1: Enable the MCP Server">Ativação no Figma Desktop App</a></li>
                    <li><a href="https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server#h_01K25F7RBRZKCATVJHNXCS6KXW" target="_blank" rel="noopener" title="Step 2: Set up your MCP client">Instalação no nosso editor de código</a> (Cursor, VS Code, Windsurf, Claude Code, Outros)</li>
                </ol>

                <h3 id="claude-talk-to-figma-mcp">Claude Talk to Figma MCP</h3>
                <h4>Requisitos</h4>
                <ul>
                    <li><a href="https://claude.ai/download" target="_blank" rel="noopener" title="Página de download do Claude Desktop">Claude Desktop</a></li>
                    <li><a href="https://www.figma.com/downloads/" target="_blank" rel="noopener" title="Downloads do Figma">Figma Desktop</a></li>
                    <li><a href="https://bun.sh/" target="_blank" rel="noopener" title="Página oficial do Bun">Bun</a> instalado</li>
                </ul>
                <h4>Descrição</h4>
                <p>Servidor MCP de código aberto.</p>
                <p>Habilita um conjunto amplo de ferramentas (43 à data de publicação deste post) que permite aos agentes analisar e também modificar designs no Figma.</p>
                <p>As ferramentas que permitem "ver" um design devolvem um JSON com os seus dados. Isto permite aos LLMs analisá-lo através de "thinking aloud", avaliação crítica, teste de utilizador, auditoria de acessibilidade, auditoria de SEO, etc.</p>
                <p>Com as ferramentas de modificação, o LLM pode depois aplicar as alterações propostas na análise.</p>
                <h4>Instalação</h4>
                <p>Siga as instruções da <a href="https://github.com/arinspunk/claude-talk-to-figma-mcp/tree/main?tab=readme-ov-file#-installation" target="_blank" rel="noopener" title="Instalação do Claude Talk to Figma MCP">documentação oficial</a>.</p>
                
                <h2>Partilhe a sua experiência</h2>
                <p>Se já está a integrar o Figma no seu fluxo de trabalho com IA, seja com estas ou outras ferramentas, adoraria conhecer a sua experiência:</p>
                <ul>
                    <li>Como correu a instalação.</li>
					<li>Experiências e descobertas.</li>
                    <li>Casos de uso reais.</li>
                    <li>Resultados obtidos.</li>
                </ul>
                <p>O ecossistema de IA + design/desenvolvimento está em constante evolução e as melhores práticas emergem da experiência coletiva de quem as implementa em projetos reais ✊</p>
                <p>Se ainda não o fez, atreva-se com alguma das ferramentas deste post. Se algo emperrar, pode escrever-me no meu <a href="https://www.linkedin.com/in/xulioze/" target="_blank" rel="noopener" title="Perfil do LinkedIn">perfil do LinkedIn</a> 😉</p>
]]>
      </content:encoded>
      <pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Prompt, Contexto e Memória</title>
      <link>https://xulioze.com/pt/blogue/prompt-contexto-memoria.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/prompt-contexto-memoria.html</guid>
      <description>Os três pilares fundamentais de qualquer interação com modelos de linguagem IA.</description>
      <content:encoded>
        <![CDATA[				<p>Comecei a usar IA no meu trabalho como desenvolvedor de software há pouco mais de 2 anos. <a href="https://xulioze.com/pt/blogue/construir-pwa-com-chatgpt.html" title="A minha experiência inicial com ChatGPT para construir uma PWA">Com ChatGPT e de forma tosca</a>, como a maioria, imagino 😅</p>

				<p>Ao longo deste tempo <a href="https://xulioze.com/pt/blogue/como-falar-com-chatgpt.html" title="Guia sobre como comunicar eficazmente com ChatGPT">refinei a minha conversa com LLMs</a>, comecei a usar assistentes de código (GitHub Copilot) e depois assistentes com agentes (Cursor) e até desenvolvi sistemas de agentes com frameworks como CrewAI. Mas não foi até agora que entendi de forma clara que qualquer interação com modelos de linguagem, <a href="https://xulioze.com/pt/blogue/desenvolvimento-com-ia.html" title="Reflexões sobre o desenvolvimento de software com inteligência artificial">não importa que ferramenta usemos</a>, se resume em três pontos fundamentais: prompt, contexto e memória.</p>

				<h2>Prompt</h2>

				<p>Através do prompt criamos o perito que precisamos para uma determinada tarefa, indicamos-lhe o que há que fazer e também o que não há que fazer. É o meio de que dispomos para alcançar o resultado desejado.</p>

				<p>Para escrever o prompt adequado para cada tarefa, temos a <a href="https://www.promptingguide.ai/pt" title="Guia completa de engenharia de prompts">engenharia de prompts</a>. Conhecer as suas principais técnicas é importante, mas o que de verdade faz que melhoremos, é a prática contínua com os LLMs, a nossa conversa com a IA.</p>

				<h2>Contexto</h2>

				<p>Os grandes modelos de linguagem dispõem de um vasto conhecimento, mas para determinadas tarefas este não é suficiente. Fornecer-lhe contexto adicional torna-se uma necessidade ineludível.</p>

				<p>Para dar contexto dispomos de diferentes vias, desde a simples inclusão de informação relevante no prompt, passando por adicionar documentos de referência até <a href="https://www.anthropic.com/news/model-context-protocol" title="MCP explicado pela Anthropic">o uso de MCPs</a> que permitem aos LLMs aceder ao conteúdo de múltiplas plataformas (Jira, Drive, etc.) e ferramentas (<a href="https://xulioze.com/pt/blogue/claude-talk-to-figma-mcp.html" title="Como fazer que o Claude se comunique com o Figma usando MCP">Figma</a>, Draw.io, etc.).</p>

				<h2>Memória</h2>

				<p>Os LLMs têm a capacidade de recordar as nossas conversas, mas esta memória tem um limite (<a href="https://www.ibm.com/pt-pt/think/topics/context-window" title="Explicação sobre o limite da janela de contexto em LLMs">limite da janela de contexto</a>). Quanto mais complexa é a tarefa a desenvolver, com maior probabilidade superamos este limite e mais necessário se torna estender a memória do LLM.</p>

				<p>Existem diferentes técnicas para ampliar a memória dos LLMs, algumas bastante sofisticadas como o uso de bases de dados clássicas e <a href="https://xulioze.com/pt/blogue/bases-dados-vectoriais-introducao.html" title="Introdução às bases de dados vectoriais">vectoriais</a>, mas a forma mais simples de o fazer é introduzindo nas nossas rotinas estratégias de <a href="https://xulioze.com/pt/blogue/contexto-estendido.html" title="Estratégias para estender o contexto e memória dos LLMs">contexto/memória estendida</a>.</p>

                <img class="c-post__body-img" src="https://xulioze.com/img/prompt-contexto-memoria.jpg" alt="Frank e o robô a falarem" width="900" height="383" loading="lazy">

				<h2>Em perspetiva</h2>

				<p>Prompt, contexto e memória. Ou seja, as instruções corretas para lograr o objetivo desejado, a informação necessária para entender o projeto e o seu objetivo, e o registo do trabalho completado (quando, como, onde e porquê).</p>

				<p>Se o pensares por um momento, não é muito diferente do que os humanos precisamos para desenvolver qualquer tarefa complexa. Realmente cada vez que aprofundamos no uso da IA encontramo-nos com situações em que vemos um paralelismo claro entre a forma como os LLMs trabalham e a nossa. Não em vão estamos a entrar numa era onde já não "falamos" com as máquinas através de código, mas sim que falamos com as máquinas de forma natural. <a href="https://www.youtube.com/watch?v=YBPOguI-AFI&ab_channel=ChandanDatta" target="_blank" rel="noopener" title="Conversa do Frank com o seu robot">Algo que o Frank já descobriu há mais de 10 anos</a> 😎🤖.</p>
]]>
      </content:encoded>
      <pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Guia: desenvolver software de qualidade assistido por agentes de IA</title>
      <link>https://xulioze.com/pt/blogue/guia-desenvolver-software-agentes.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/guia-desenvolver-software-agentes.html</guid>
      <description>
        Uma guia completa para implementar estratégias de contexto estendido que permitem desenvolver projetos complexos com agentes IA mantendo coerência e qualidade.
      </description>
      <content:encoded>
        <![CDATA[				<img class="c-post__body-img" src="https://xulioze.com/img/extended-context-guide.jpg" alt="ecrã com notas"  width="900" height="383" loading="lazy">

				<p>Esta guia é uma versão melhorada da proposta inicialmente apresentada em "<a href="https://xulioze.com/pt/blogue/contexto-estendido.html" title="Contexto estendido. Os agentes também precisam de tomar notas">Contexto estendido. Os agentes também precisam de tomar notas</a>".</p>

				<p>O seu propósito é implementar uma estratégia que nos permite desenvolver projetos complexos assistidos por agentes sem perder a coerência e qualidade do código gerado.</p>

				<p>A sua redação está orientada para o uso com ferramentas como Cursor ou GitHub Copilot, mas pode ser adaptada de forma simples a muitas outras.</p>

				<h2>Estrutura do Sistema de Contexto</h2>

				<p>Para implementar esta estratégia, criamos uma pasta <code>context/</code> na raiz do projeto com a seguinte estrutura:</p>

				<pre class="c-post__prompt"><code class="c-post__prompt-code">context/
├── 01-expert.md      # Definição de especialista sintético
├── 02-analysis.md    # Análise do código existente (vazio)
├── 03-plan.md        # Plano mestre de desenvolvimento (vazio)
└── 04-backlog.md     # Tarefas desglosadas e o seu estado (vazio)</code></pre>

				<h2>Passo 1: Definição do Especialista Sintético</h2>

				<p>O primeiro passo consiste em definir um "especialista sintético": um papel específico com competências e restrições claras que guiará o agente de IA durante todo o desenvolvimento.</p>

				<h3>Prompt para o agente:</h3>

				<pre class="c-post__prompt"><code class="c-post__prompt-code">Lê o ficheiro `context/01-expert.md` para entenderes o teu papel no projeto.

Não geres código até receberes requisitos específicos.</code></pre>

				<h3>Exemplo de conteúdo para <code>context/01-expert.md</code>:</h3>

				<pre class="c-post__prompt"><code class="c-post__prompt-code">
# SUDO: Age como um Especialista Sénior em Desenvolvimento Frontend especializado em HTML5, CSS3/SCSS e JavaScript ES6+.

## PAPEL
Desenvolvedor Frontend Sénior (10+ anos) especialista em HTML5 semântico, CSS3/SCSS avançado com metodologias BEM e ITCSS, e JavaScript ES6+ moderno, com foco em arquitetura de componentes, desempenho e acessibilidade.

## COMPETÊNCIAS_TÉCNICAS

- HTML5 semântico e acessibilidade (ARIA, WCAG 2.1)
- CSS3 avançado (Grid, Flexbox, animações, propriedades personalizadas)
- SCSS/Sass com arquitetura ITCSS (Triângulo Invertido CSS)
- Metodologia BEM estrita (Bloco__Elemento--Modificador)
- JavaScript ES6+ (async/await, módulos, destructuring, classes)
- Gestão de estado e arquitetura de componentes
- Otimização de desempenho web (Core Web Vitals)
- Testes unitários e de integração
- Ferramentas de construção modernas (Vite, Webpack)

## PRINCÍPIOS_DE_TRABALHO

- Código limpo e mantível seguindo princípios SOLID
- Documentação clara e concisa
- Abordagem mobile-first e responsiva
- Melhoria progressiva
- Semântica antes da apresentação

## RESTRIÇÕES

- Evitar jQuery e bibliotecas legacy exceto requerimento específico
- Manter compatibilidade com navegadores modernos (últimas 2 versões)
- Priorizar soluções nativas sobre dependências externas
- Não gerar código até receber requisitos específicos</code></pre>

				<p>⚠️ Importante: A última restrição ("Não gerar código até receber requisitos específicos") é fundamental, os modelos são muito proativos 😅</p>

				<h2>Passo 2: Análise do Código do Projeto</h2>

				<p>Este passo só é necessário para projetos existentes. Se estás a começar um projeto do zero, podes omiti-lo.</p>

				<p>Agora pedimos ao agente que analise o código do projeto e guarde a sua análise em <code>context/02-analysis.md</code></p>

				<h3>Prompt para o agente:</h3>

				<pre class="c-post__prompt"><code class="c-post__prompt-code">Analisa em profundidade o código atual do projeto. Exclui a pasta `context/` da análise.

Guarda o resultado da análise em `context/02-analysis.md` com a seguinte estrutura:
- Resumo executivo
- Arquitetura atual
- Tecnologias utilizadas
- Padrões identificados
- Áreas de melhoria potencial
- Dependências críticas

Ao terminar, espera instruções adicionais sem realizar nenhuma ação.</code></pre>

				<p>⚠️ Importante: Não duvides em iterar com o agente se não estiveres satisfeito com a sua primeira análise.</p>

				<h2>Passo 3: Criação do Plano Mestre</h2>

				<p>Uma vez analisado o código, explicamos ao agente o que queremos desenvolver e pedimos-lhe que defina um plano mestre que deve ser guardado em <code>context/03-plan.md</code></p>

				<p>O plano mestre é o documento fundamental que guiará todo o desenvolvimento. Toma o tempo necessário para definir claramente os requisitos e objetivos.</p>

				<h3>Prompt para o agente:</h3>

				<pre class="c-post__prompt"><code class="c-post__prompt-code">Baseando-te nos seguintes requisitos, cria um plano mestre detalhado para o desenvolvimento:

[REQUISITOS DO PROJETO]

Preciso criar um serviço REST que processe imagens em lotes. O serviço deve:

- Receber múltiplas imagens numa única pedição
- Redimensionar imagens segundo parâmetros configuráveis
- Comprimir e otimizar para web
- Devolver imagens processadas em formato WebP
- Implementar cache para otimizar recursos
- Fornecer endpoints para consultar estado de processamento

Considerações técnicas:

- Usar Bun pelo seu desempenho em operações intensivas
- Avaliar compatibilidade com bibliotecas de processamento de imagens
- Implementar processamento assíncrono para lotes grandes
- Incluir validação robusta de entrada

[FIM DE REQUISITOS]

Cria um plano mestre estruturado e guarda-o em `context/03-plan.md`.

Ao terminar, espera instruções adicionais.</code></pre>

				<p>⚠️ Importante: Continua a dialogar com o agente se vires que ao plano falta ou sobra algo.</p>

				<h2>Passo 4: Criação do Backlog Detalhado</h2>

				<p>Neste ponto pedimos ao agente que transforme o plano mestre em tarefas executáveis, o mais pequenas e específicas possível. Tarefas mais granulares resultam em código de maior qualidade.</p>

				<h3>Prompt para o agente:</h3>

				<pre class="c-post__prompt"><code class="c-post__prompt-code">Divide o plano mestre em tarefas atómicas seguindo estes critérios:

- Descrição detalhada de requisitos técnicos
- Dependências claramente identificadas

Guarda a lista em `context/04-backlog.md` com esta estrutura:

# Backlog de Tarefas - [Nome do Projeto]

## Resumo do Projeto
[Breve descrição e implementação do plano em `context/03-plan.md`]

## Estado de Tarefas

### FASE 1: [TÍTULO DE FASE]

- **1.1** ⏳ [título de tarefa]
  - **Descrição detalhada**:
  - **Dependências**:
  - **Data**: 
  - **Trabalho realizado**: 

- **1.2** ⏳ [título de tarefa]
  - **Descrição detalhada**:
  - **Dependências**:
  - **Data**: 
  - **Trabalho realizado**:

### FASE 2: [TÍTULO DE FASE]
[Continua com o mesmo formato...]

## Legenda de Estados
- ⏳ Pendente
- 🔄 Em progresso
- ✅ Completada
- ⚠️ Bloqueada

## Notas e Dependências
[Informação adicional relevante]

## Acompanhamento do Progresso
- Tarefas totais: 0
- Tarefas completadas: 0
- Progresso: 0%

Ao terminar, espera instruções adicionais</code></pre>

				<p>⚠️ Importante: É necessário indicar ao LLM a estrutura de backlog que queremos, se não torna-se criativo 😬</p>

				<h2>Passo 5: Execução de Tarefas</h2>

				<p>Com o backlog definido, procedemos a executar tarefas de forma sistemática.</p>

				<h3>Prompt para executar uma tarefa:</h3>

				<pre class="c-post__prompt"><code class="c-post__prompt-code">Executa a tarefa 1.1 do backlog (`context/04-backlog.md`) seguindo estritamente a sua descrição.

Contexto adicional disponível em:
- `context/02-analysis.md` (se existir)
- `context/03-plan.md`

Requisitos de execução:
- Usar ferramentas do agente para criar ficheiros e pastas (não a terminal)
- Seguir convenções estabelecidas no prompt inicial
- Documentar código segundo padrões definidos
- Não realizar ações fora do âmbito da tarefa

Ao completar:
1. Atualizar estado da tarefa em `context/04-backlog.md`:
   - Mudar estado para ✅
   - Adicionar data de finalização
   - Descrever trabalho realizado
   - Atualizar Acompanhamento do Progresso
2. Esperar instruções adicionais sem executar mais tarefas</code></pre>

				<p>⚠️ Importante: É necessário pedir ao LLM que não faça nada mais do que indicado na tarefa para evitar que se extralimite.</p>

				<h2>Passo 6: Reinício da Janela de Contexto</h2>

				<p>Para manter a qualidade e coerência, é necessário reiniciar periodicamente a janela de contexto.</p>

				<p>É evidente que devemos reiniciar a janela de contexto quando notarmos que o agente começa a "perder o norte". Mas a abordagem ótima é não chegar nunca a este ponto e abrir um chat novo:</p>

				<ul>
					<li>Cada 4-6 tarefas completadas</li>
					<li>Ao mudar de fase (o backlog do nosso exemplo está estruturado em fases que se dividem em tarefas).</li>
				</ul>

				<h3>Prompt para reiniciar:</h3>

				<pre class="c-post__prompt"><code class="c-post__prompt-code">Instruções iniciais:

1. Lê `context/01-expert.md` para entenderes o teu papel neste projeto
2. Lê `context/02-analysis.md` para conheceres o estado atual do código
3. Lê `context/03-plan.md` para entenderes os objetivos
4. Lê `context/04-backlog.md` para veres o progresso e tarefas pendentes

Fornece um breve resumo de:

- O teu papel e competências
- Estado atual do projeto
- Próximas tarefas a executar

Ao terminar, espera instruções adicionais.</code></pre>

				<h2>🔧 Automação com Atalhos</h2>

				<p>Tanto o GitHub Copilot como o Cursor permitem criar atalhos personalizados para prompts frequentes:</p>

				<h3>GitHub Copilot</h3>
				<ul>
					<li>
						<a href="https://code.visualstudio.com/docs/copilot/copilot-customization#_instruction-files" target="_blank" rel="noopener" title="Custom instructions (VSCode)">
							Instructions
						</a>
					</li>
					<li>
						<a href="https://code.visualstudio.com/docs/copilot/copilot-customization#_prompt-files-experimental" target="_blank" rel="noopener" title="Custom prompts (VSCode)">
							Prompts
						</a>
					</li>
				</ul>

				<h3>Cursor</h3>
				<ul>
					<li>
						<a href="https://docs.cursor.com/context/rules" target="_blank" rel="noopener" title="Custom rules (Cursor)">
							Rules
						</a>
					</li>
				</ul>

				<h2>Benefícios do Sistema</h2>

				<p>Esta estratégia de gestão de contexto transforma a limitação da janela de contexto de um obstáculo numa oportunidade para trabalhar de forma mais estruturada e eficiente. Os principais benefícios incluem:</p>

				<ul>
					<li>Continuidade: Manter o progresso sem perder informação crítica</li>
					<li>Qualidade consistente: O agente mantém o mesmo nível de detalhe e precisão</li>
					<li>Rastreabilidade: Registo completo de decisões e evolução do projeto</li>
					<li>Melhor colaboração: Facilita o trabalho em equipa e a incorporação de novos membros</li>
				</ul>

				<h2>Conclusão</h2>

				<p>Ao implementar este sistema, não só evitas as limitações técnicas dos LLM mas também estabeleces uma metodologia de desenvolvimento mais profissional e escalável para projetos assistidos por IA.</p>

				<hr>

				<p>Perguntas ou sugestões? Partilha a tua experiência implementando esta estratégia e ajuda a melhorar a guia para a comunidade.</p>
]]>
      </content:encoded>
      <pubDate>Sun, 25 May 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Contexto Estendido. Os agentes também precisam de tomar notas</title>
      <link>https://xulioze.com/pt/blogue/contexto-estendido.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/contexto-estendido.html</guid>
      <description>
        Descobre a estratégia de 'contexto estendido' para manter coerência em projetos complexos com agentes IA usando ficheiros markdown como memória externa para os teus LLMs.
      </description>
      <content:encoded>
        <![CDATA[				<img class="c-post__body-img" src="https://xulioze.com/img/extended-context-her.jpg" alt="ecrã com notas à mão" width="768" loading="lazy">

				<p>O propósito deste post é descrever uma estratégia de ampliação de contexto no desenvolvimento de projetos complexos com agentes. Mas como não só os LLMs precisam de contexto para compreender ideias, começo com um pouco de contexto para humanos.</p>

				<p><em>Se tens pressa e passas do contexto prévio, <a href="https://xulioze.com/pt/blogue/contexto-estendido.html#contexto-estendido">avança</a> e não te preocupes, ninguém saberá que tiveste este mini ataque de preguiça </em> 😬</p>

				<h2>Contexto para humanos</h2>

				<p>A aparição dos agentes nos assistentes de código tem representado um salto enorme no desenvolvimento de software assistido por IA.</p>

				<p>O primeiro que chama a atenção é a sua capacidade para iterar de forma automática sobre as suas próprias respostas, criar/modificar ficheiros e executar comandos na terminal. Mas creio que a habilidade que realmente marca a diferença é que são capazes de indexar e analisar o código de um projeto, incluídas as dependências entre ficheiros e as relações entre os seus componentes.</p>

				<p>Se os assistentes nos permitiam trabalhar a nível ficheiro, com a aparição dos agentes passámos a trabalhar a nível arquitetura. Agora a IA não só nos ajuda na escrita/correção de partes do nosso código, como nos assiste na construção de projetos completos (a uma velocidade que às vezes dá vertigem).</p>

				<p>Mas este aumento na complexidade das tarefas desenvolvidas provoca algo que antes era difícil de ver, levamos ao limite a janela de contexto dos próprios agentes. Desenvolver um projeto completo requer muitas tarefas, pelo que chegado a um ponto o agente começa a esquecer partes da conversa, tornando muito difícil (por não dizer impossível) manter a coerência do trabalho que estamos a realizar.</p>

				<p>Quando isto acontece o mais normal é abrir um novo chat para reiniciar a janela de contexto, mas, como levamos o agente ao ponto em que estávamos? Como fazer-lhe recordar o que já tinha construído e o que lhe falta por desenvolver?</p>

				<p>No meu caso estou a usar uma estratégia a que cheguei a partir das minhas interações com Cursor primeiro e GitHub Copilot Agent Mode depois e a que chamo Contexto Estendido. Vale, sei que não sou muito original, mas creio que exprime decentemente a ideia 🤓</p>

				<h2 id="contexto-estendido">Contexto estendido (usando markdowns como memória)</h2>

				<p>Esta estratégia baseia-se no armazenamento de ficheiros markdown com informação do projeto numa pasta chamada <code>context/</code></p>

				<p>A ideia é criar uma memória a que o agente (ou nós) pode recorrer em todo o momento permitindo-lhe saber em que ponto está e o que lhe falta por fazer.</p>
				
				<p>Graças a esta memória podemos dividir o trabalho em tarefas pequenas e usar tantos chats quantos sejam necessários para evitar alcançar o limite da janela de contexto. Mantendo desta forma a coerência e qualidade do trabalho de princípio a fim.</p>

				<h3>Esquema de trabalho</h3>

				<p>Na seguinte imagem resume-se o esquema de trabalho.</p>

				<img class="c-post__body-img" src="https://xulioze.com/img/extended-context.png" alt="Esquema de trabalho com 3 chats" width="840" loading="lazy">

				<p>Chat 0</p>

				<ol>
					<li>Prompt para criar um perito sintético na tecnologia do projeto: papel, experiência, stack técnico, forma de raciocínio e formato de resposta. Finalizado com um "não escrevas código ainda".</li>
					<li>Prompt onde pedimos que:
						<ul>
							<li>analise o código do projeto,</li>
							<li>gere um relatório da sua análise,</li>
							<li>e o guarde em formato <code>.md</code> dentro da pasta <code>context/</code> com um 00- à frente do nome do ficheiro.
							Se o relatório não nos agradar de todo, podemos iterar sobre ele até ficarmos satisfeitos.</li>
						</ul>
					</li>
					<li>Prompt onde:
						<ul>
							<li>indicamos o que queremos fazer (requisitos),</li>
							<li>pedimos que gere um plano mestre,</li>
							<li>e o guarde em formato <code>.md</code> dentro da pasta <code>context/</code> com um 01- à frente do nome do ficheiro.
							Tal como com a análise, podemos iterar sobre ele até ficarmos satisfeitos.</li>
						</ul>
					</li>
				</ol>

				<p>Chat 1</p>

				<ol>
					<li>Mesmo prompt para criação de perito sintético.</li>
					<li>Prompt pedindo que leia e interiorize a análise do projeto.</li>
					<li>Prompt pedindo que leia e interiorize o plano mestre.</li>
					<li>Prompt pedindo que execute o ponto 1 do plano mestre.</li>
					<li>Iteração normal até terminar o ponto 1.</li>
					<li>Prompt pedindo que documente o trabalho desenvolvido no ponto 1. num <code>.md</code> dentro de <code>context/</code> seguindo a numeração atual e que marque o ponto como resolvido no plano mestre.</li>
				</ol>

				<p>Chat n</p>

				<ol>
					<li>Mesmo prompt para criação de perito sintético</li>
					<li>Prompt pedindo que leia e interiorize a análise do projeto</li>
					<li>Prompt pedindo que leia e interiorize o plano mestre</li>
					<li>Prompt pedindo que execute o ponto n do plano mestre</li>
					<li>Iteração normal até terminar o ponto n.</li>
					<li>Prompt pedindo que documente o trabalho desenvolvido no ponto n. dentro do <code>.md</code> de documentação criado anteriormente e que marque o ponto como resolvido no plano mestre.</li>
				</ol>

				<p>Evidentemente, este esquema trata-se de uma base de trabalho que pode ser modificada em função das necessidades de cada projeto e que espero melhorar com o tempo. Ainda assim, nesta primeira versão, já aporta algumas vantagens relativamente a não usar nenhuma estratégia.</p>

				<h2>Vantagens do contexto estendido</h2>

				<ol>
					<li>Evitamos a perda de contexto: o agente pode consultar os ficheiros quando precisar de recordar de onde vem e para onde vai.</li>
					<li>Continuidade: podemos fechar o computador e retomar o trabalho dias depois sem perder o fio.</li>
					<li>Colaboração: outros membros da equipa podem entender facilmente o estado do projeto e continuá-lo (com os seus agentes).</li>
					<li>Documentação automática: ao finalizar, temos já uma documentação estruturada.</li>
					<li>Facilita a divisão de tarefas: orientando o trabalho para metodologias ágeis e sprints.</li>
				</ol>

				<h2>Terminando</h2>

				<p>Resulta irónico que nesta imitação do pensamento humano que representam os modelos de linguagem, não só tenhamos copiado as suas capacidades, como também as suas limitações. E entre elas está uma muito humana: o esquecer. Assim que tal como os imperfeitos humanos, os imperfeitos LLMs também precisam de tomar notas. Isso sim, se são em markdown melhor, adoram o markdown!</p>

				<p>Já agora, fazes tomar notas aos teus agentes ou tens alguma outra estratégia na altura de desenvolver projetos complexos? Se trabalhas de outra forma, adoraria conhecer a tua experiência 😊</p>
]]>
      </content:encoded>
      <pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Claude Talk to Figma, o meu primeiro servidor MCP</title>
      <link>https://xulioze.com/pt/blogue/claude-talk-to-figma-mcp.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/claude-talk-to-figma-mcp.html</guid>
      <description>
        A minha experiência a criar um servidor MCP que conecta Claude com Figma, permitindo que a IA interaja diretamente com designs UX/UI.
      </description>
      <content:encoded>
        <![CDATA[				<img class="c-post__body-img" src="https://xulioze.com/img/claude-talk-to-figma-metas.jpg" alt="Theodore a pensar" width="768" loading="lazy">

				<p>Na semana passada o <a href="https://www.linkedin.com/in/marc-wabnitz-0135ba24/" target="_blank" rel="noopener" title="perfil do LinkedIn">Marc</a>, colega da incrível equipa UX/UI da <a href="https://www.makingscience.es/" target="_blank" rel="noopener" title="AI Powered Digital Acceleration">Making Science</a>, passou-nos um servidor MCP para conectar Cursor ao Figma e proporcionar aos seus agentes a capacidade não só de ver designs no Figma, mas também de os manipular 😳</p>

				<p>O MCP era o <a href="https://github.com/sonnylazuardi/cursor-talk-to-figma-mcp" target="_blank" rel="noopener" title="repositório do projeto">Cursor Talk to Figma</a>, do <a href="https://sonnylab.framer.website/" target="_blank" rel="noopener" title="página pessoal">Sunny Lazuardi</a>. Se estás à procura da forma de conectar Cursor com Figma não procures mais, este é o teu MCP 👌🏻</p>
    
				<p>Como tenho uma licença do Cursor, disse-lhe que podia instalá-lo e fazer com eles uma prova. A prova correu bem, a verdade é que foi bastante surpreendente ver o agente do Cursor tomar o controlo do Figma e modificar um design, mas pouco depois entrou-me a dúvida se seria a forma correta da equipa de UX/UI introduzir no seu fluxo de trabalho a IA, fundamentalmente porque Cursor é uma ferramenta focada no desenvolvimento de código.</p>
				
				<p>Revisando o código do MCP vi que talvez se pudesse adaptar para usá-lo no Claude Desktop, já que os meus colegas de UX/UI têm licenças desta ferramenta. O certo é que o original já se podia conectar ao Claude, mas a forma de o fazer não era evidente e não estava descrita na documentação, por isso com ânimo de mexer um pouco e aprender como funciona um servidor MCP por dentro, pus-me a trabalhar:</p>
				
				<ol>
					<li>Escrevi <a href="https://github.com/arinspunk/claude-talk-to-figma-mcp/blob/main/scripts/configure-claude.js" target="_blank" rel="noopener" title="código no GitHub">um script para configurar Claude de forma automática</a> lançando um comando via terminal: <code>bun run configure-claude</code>.</li>
					<li><a href="https://github.com/arinspunk/claude-talk-to-figma-mcp/commit/9de571d6bff9ea552b2a22cb2ca0b89f0108853c#diff-8d97fde957b1b60105e210d02f027f6a1babb3f5521e88d87d888171763bf08e" target="_blank" rel="noopener" title="commit das alterações">Ampliei as características do socket</a>:
						<ol>
							<li>Logging melhorado</li>
							<li>Criação de endpoint de estado <code>/status</code></li>
							<li>Sistema de canais para permitir que diferentes clientes se juntem a canais específicos</li>
							<li>Inclusão de estatísticas de cada canal</li>
						</ol>
					</li>
					<li><a href="https://github.com/arinspunk/claude-talk-to-figma-mcp/blob/main/TESTING.md" target="_blank" rel="noopener" title="documentação dos testes no GitHub">Adicionei testes</a> para comprovar a correta integração do projeto.</li>
					<li>Redigi um <a href="https://github.com/arinspunk/claude-talk-to-figma-mcp/blob/main/readme.md" target="_blank" rel="noopener" title="documentação do projeto">README.md</a> com a documentação já orientada para o seu uso no Claude.</li>
					<li>Publiquei o servidor MCP como <a href="https://www.npmjs.com/package/claude-talk-to-figma-mcp" target="_blank" rel="noopener" title="página do pacote no NPM">pacote de npm</a>.</li>
					<li>Publiquei o projeto no GitHub...</li>
				</ol>
				
				<p>E voilá, o meu primeiro servidor MCP: <a href="https://github.com/arinspunk/claude-talk-to-figma-mcp" target="_blank" rel="noopener" title="repositório do projeto">Claude Talk To Figma MCP</a> 🥳</p>

				<h2>Atualização, 11 de abril</h2>
				
				<p>Depois de uns dias de testes, a equipa de UX/UI detetou que na coleção inicial de ferramentas para modificar designs faltavam algumas importantes como auto layout (layoutMode, paddingTop, paddingBottom, etc.), controlo tipográfico (fontName, fontSize, fontWeight, etc.) ou criação de formas (createEllipse, createPolygon, createStar, etc.), por isso atualmente estamos a adicioná-las pouco a pouco. Podes seguir o progresso no <a href="https://github.com/arinspunk/claude-talk-to-figma-mcp/blob/main/CHANGELOG.md" target="_blank" rel="noopener" title="visita o changelog em GitHub">changelog do projeto</a>.</p>
]]>
      </content:encoded>
      <pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>IA para developers. Apaixonamo-nos?</title>
      <link>https://xulioze.com/pt/blogue/desenvolvimento-com-ia.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/desenvolvimento-com-ia.html</guid>
      <description>
        As cinco vias que existem atualmente para escrever código assistido por Inteligência Artificial e para desenvolver ferramentas com IA integrada.
      </description>
      <content:encoded>
        <![CDATA[				<img class="c-post__body-img" src="https://xulioze.com/img/ia-developing-status-her.jpg" alt="Theodore a pensar" width="768" loading="lazy">

				<p>Se começou a ler este post atraído pelo seu título, talvez fique desapontado. Não encontrará aqui uma história de amor entre humanos e IAs, nem sequer uma narração habitual. São simplesmente algumas notas, com certa estruturação, sobre a minha visão do estado atual do desenvolvimento de software com e para inteligência artificial.</p>

				<p>Com "com" refiro-me a escrever código com a ajuda da IA. E com "para", a desenvolver software específico com IA integrada.</p>

				<h2>Vias para desenvolver com/para IA</h2>

				<p>Atualmente existem 5:</p>

				<ol>
					<li>Não usar IA</li>
					<li>Chats</li>
					<li>Assistentes de código</li>
					<li>Assistentes de código com agentes IA</li>
					<li>Desenvolvimento de agentes próprios</li>
				</ol>

				<h3>Não usar IA</h3>

				<p>Compreendo esta postura, sobretudo se és Sénior e além disso estás um pouco farto/a de toda a conversa que se está a dar sobre o tema. Reconheço que <a href="https://www.wheresyoured.at/longcon/" title="Artigo sobre o hype da IA" target="_blank" rel="noopener">na IA há muito de hype</a> (dá uma oportunidade ao artigo, é sempre bom ter algum vento entre tanto fumo 😉), mas vale a pena usá-la, nem que seja para evitares dar duzentas voltas pelo <a href="https://stackoverflow.com/" title="Comunidade de perguntas e respostas para programadores" target="_blank" rel="noopener">Stack Overflow</a> para solucionar um erro que te está a bloquear ou evitar ter de ler toda a documentação de uma nova API para desenvolver algo simples.</p>

				<h3>Chats</h3>

				<p><a href="https://chat.openai.com/" title="ChatGPT da OpenAI" target="_blank" rel="noopener">ChatGPT</a>, <a href="https://www.deepseek.com/" title="Plataforma de IA DeepSeek" target="_blank" rel="noopener">DeepSeek</a>, <a href="https://gemini.google.com/" title="Modelo de IA da Google Gemini" target="_blank" rel="noopener">Gemini</a>, <a href="https://claude.ai/" title="Assistente de IA da Anthropic" target="_blank" rel="noopener">Claude</a>, etc.</p>

				<p>São o tipo de ferramenta mais utilizado. Tanto por antiguidade como por acessibilidade, já que todos os modelos têm versões gratuitas através do navegador ou App.</p>

				<p>O tipo de interação com a IA é conversacional: fazemos perguntas e obtemos respostas. Mas a desconexão do chat com os nossos ficheiros locais obriga-nos a andar a mover o código de um lado para o outro.</p>

				<p>Nos chats, proporcionar o contexto adequado é fundamental. Dado que o seu conhecimento é vastíssimo, para obter respostas precisas sobre uma linguagem de programação específica, é necessário delimitar e definir claramente o âmbito da consulta. Para isto usamos prompts com:</p>

				<ul>
					<li>Papel</li>
					<li>Experiência</li>
					<li>Staff técnico</li>
					<li>Técnicas de prompting como:
						<ul>
							<li>Chain-of-Thought</li>
							<li>Knowledge Generation</li>
						</ul>
					</li>
				</ul>

				<p>Além disso, os chats evoluíram, incorporando a possibilidade de adicionar contexto extra através do carregamento de ficheiros a partir do teu local ou até diretamente de repositórios do GitHub, como no caso do Claude.</p>

				<h3>Assistentes de código</h3>

				<p><a href="https://github.com/features/copilot" title="GitHub Copilot" target="_blank" rel="noopener">GitHub Copilot</a>, <a href="https://developers.google.com/gemini-code-assist" title="Assistente de código da Google Gemini" target="_blank" rel="noopener">Gemini Code Assist</a>, <a href="https://v0.dev/" title="Plataforma de geração de código V0" target="_blank" rel="noopener">V0</a>, etc.</p>

				<p>O seu uso não está tão generalizado. Por serem mais recentes que os chats e porque as suas versões gratuitas só duram alguns dias de teste. Embora esta situação pareça estar a mudar, por exemplo, a Google oferece de forma gratuita o seu <a href="https://developers.google.com/gemini-code-assist/docs/overview#supported-features-gca" title="Características do Gemini Code Assist" target="_blank" rel="noopener">Gemini Code Assist</a> para uso individual.</p>

				<p>Além de poder conversar com a IA, os assistentes oferecem sugestões de código sobre o ficheiro que estamos a editar. Ao contrário dos Chats, aqui não temos de andar a copiar e colar código.</p>

				<p>Dar-lhe contexto não é tão importante. O seu conhecimento está limitado ao desenvolvimento de código e lê o ficheiro que temos aberto, o que lhe permite conhecer a linguagem que estamos a usar.</p>

				<p>Na altura de realizar consultas podem-se adicionar ficheiros ou linhas específicas dentro de um ficheiro, mas os assistentes não têm o contexto de todos os ficheiros de um projeto.</p>

				<h3>Assistentes de código com agentes IA</h3>

				<p><a href="https://www.cursor.com/" title="Cursor: Assistente de código com IA" target="_blank" rel="noopener">Cursor</a>, <a href="https://pythagora.ai/" title="Pythagora.ai: Plataforma de desenvolvimento com IA" target="_blank" rel="noopener">Pythagora.ai</a>, <a href="https://codegpt.com/" title="CodeGPT: Assistente de código com inteligência artificial" target="_blank" rel="noopener">CodeGPT</a>, e proximamente <a href="https://github.blog/news-insights/product-news/github-copilot-the-agent-awakens/" title="Próximo modo agente do GitHub Copilot" target="_blank" rel="noopener">GitHub Copilot Agent Mode</a> (se tens uma licença do GitHub Copilot e queres experimentá-lo, inscreve-te na <a href="https://github.com/github-copilot/workspace_waitlist_signup/" title="Lista de espera para o GitHub Copilot" target="_blank" rel="noopener">lista de espera</a>, talvez tenha sido sorte, mas a mim deram-me acesso em menos de 24h).</p>

				<p>Além da conversação e das sugestões de código, este tipo de assistentes inclui Agentes IA.</p>

				<p>Enquanto que para os assistentes de código tradicionais o contexto não era tão importante, com o uso de agentes volta a ser imprescindível, sobretudo se vamos construir software de raiz. Por isso, nada de deixar de lado a <a href="https://www.promptingguide.ai/es" title="Guia de engenharia de prompt" target="_blank" rel="noopener">engenharia de prompt</a>, e ainda bem porque considero que é uma das partes mais divertidas do trabalho com IAs!</p>

				<p>Ao contrário dos assistentes "tradicionais", os agentes têm o contexto de todos os ficheiros de um projeto, incluindo as suas relações (como imports de funções). Além disso, são capazes de:</p>

				<ul>
					<li>Criar e modificar ficheiros. Sempre pendente da tua aprovação final</li>
					<li>Fazer uso do terminal. Vê-lo nas primeiras vezes causa alguma impressão 😅</li>
					<li>Criar ramos e fazer commits. As fusões ficam a cargo de um mamífero bípede.</li>
					<li>Trabalhar em paralelo contigo. Sim, podes rever o código da conexão a uma API enquanto ele desenvolve os 5 novos componentes que lhe pediste 😳</li>
				</ul>

				<h3>Desenvolvimento de agentes próprios</h3>

				<p>Esta via é a mais diferente, já que a sua verdadeira função não é ajudar-nos a desenvolver código, mas criar software com IA integrada.</p>

				<p>Existem várias frameworks (principalmente de Python) que facilitam o desenvolvimento do código, a criação de agentes e a integração de LLMs. Entre as mais usadas estão <a href="https://docs.llamaindex.ai/en/stable/" title="Documentação do LlamaIndex" target="_blank" rel="noopener">LlamaIndex</a> e <a href="https://docs.crewai.com/introduction" title="Documentação do Crew AI" target="_blank" rel="noopener">Crew AI</a>.</p>

				<p>Em teoria, poderíamos desenvolver ferramentas próprias para a criação de código. No entanto, a minha opinião é que, a menos que procures uma solução muito específica, construir um agente de assistência não compensa o esforço. A razão é simples: requer desenvolver múltiplos componentes de raiz que no caso dos Assistentes como Cursor ou Pythagora já vêm incluídos:</p>

				<ul>
					<li>Ferramentas para ler o código de um repositório</li>
					<li>RAG (Retrieval-Augmented Generation) para dar contexto ao LLM:
						<ul>
							<li>Base de dados vetorial com o código do repositório</li>
							<li>Retrievers para fazer consultas à base de dados e devolver resultados ao LLM</li>
						</ul>
					</li>
					<li>Agentes e tarefas</li>
					<li>Ferramentas para escrever código</li>
					<li>Outros componentes técnicos</li>
				</ul>

				<p>No entanto, creio que a potência desta via está em que podemos incorporar IA de forma relativamente simples no nosso software e desenvolver ferramentas IA próprias sem depender das oferecidas (e cobradas) por terceiros. Embora por agora não possamos livrar-nos completamente de pagar pelas consultas às APIs dos modelos que usemos nos nossos desenvolvimentos. Uma alternativa às APIs, sobretudo se não precisas de grande profundidade de raciocínio, é usar <a href="https://ollama.com/search" title="Modelos de IA locais com Ollama" target="_blank" rel="noopener">modelos em local</a>, mas essa é uma história para abordar noutro post 😊</p>

				<h2>Algumas reflexões finais</h2>

				<p>Acredito que o uso dos chats não vai desaparecer. Ficar insatisfeito com a proposta do assistente, preferir contrastar a resposta com outros modelos, ou aprender sobre uma nova linguagem enquanto vais no comboio, são situações em que recorrer a estas ferramentas continuará a ser uma boa opção. Por isso, se vires uma pessoa a fazer perguntas ao seu telemóvel sobre Redux enquanto pega num pacote de leite no supermercado, dá-lhe uma oportunidade, talvez não esteja completamente louca e simplesmente pretenda esclarecer essa dúvida que trouxe do trabalho usando a interface de voz do ChatGPT.</p>

				<p>Creio que todos os assistentes de código vão acabar por incluir agentes e que se tornarão o padrão de trabalho para programadores num futuro próximo. Também acredito que a forma de trabalhar vai mudar radicalmente com eles, embora não tenha ideia de como será a nossa profissão depois da transformação.</p>

				<p>Acredito que vale a pena aventurar-se na criação de software com IA integrada. Começar é acessível, com uma curva de aprendizagem suave. Uma parte importante da nossa profissão vai orientar-se para aí. E fundamentalmente porque está tudo por fazer, o que supõe muita diversão!</p>

				<p>Então, deixamo-nos arrastar pela loucura generalizada e apaixonamo-nos? Bem, se algo aprendemos com Theodore é que apaixonar-se por uma IA não é um bom negócio, por isso é melhor explorarmos estas novas ferramentas com calma, aprendermos a usá-las (e a desfrutá-las) e vermos o que resta quando se dissipar toda esta aparente paixão. Porque o que é certo é que durante muito tempo, por detrás de cada linha de código continuará a estar o critério humano.</p>
]]>
      </content:encoded>
      <pubDate>Wed, 26 Mar 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Introdução às bases de dados vetoriais: dados, mais dados!</title>
      <link>https://xulioze.com/pt/blogue/bases-dados-vectoriais-introducao.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/bases-dados-vectoriais-introducao.html</guid>
      <description>
        Descobre o que são as bases de dados vetoriais, como armazenam embeddings e por que são fundamentais no desenvolvimento de software com IA.
      </description>
      <content:encoded>
        <![CDATA[				<img class="c-post__body-img" src="https://xulioze.com/img/vectorstores-johnny-5-input.webp" alt="Johnny nº5 a ler um livro" width="768" loading="lazy">

				<p>Já estou há alguns dias a desenvolver com o meu colega Olivier um projeto de IA. A nossa ideia é criar uma ferramenta que permita automatizar tarefas de documentação, refatoração e escrita de testes para o código de um repositório. Atualmente, não temos a certeza se do ponto de vista operacional vale a pena o esforço, principalmente porque estamos a verificar que existem serviços desenvolvidos especificamente para isto, como <a href="https://www.cursor.com/" target="_blank" rel="noopener" title="Site oficial">Cursor</a> ou <a href="https://www.pythagora.ai/" target="_blank" rel="noopener" title="Site oficial">Pythagora</a>. No entanto, o que é certo é que estamos a aprender muito, além de perder algumas horas de sono... 😴</p>

				<p>Quando nos aproximamos pela primeira vez de uma tecnologia, o habitual é sentirmo-nos arrastados por uma torrente de novos conceitos e ferramentas. No caso do desenvolvimento de software com IA, a inundação inicial traz-nos termos como LLMs, bases de dados vetoriais, retrievers, RAGs, agentes de IA, sentence transformers, etc.</p>

				<p>Neste artigo vou focar-me nas bases de dados vetoriais (o título não engana). Por ser uma das peças fundamentais neste âmbito e também porque a melhor maneira de compreender um conceito é ser capaz de explicá-lo de forma simples. Se também te ajudar, significará que não as compreendi mal de todo. 😊</p>

				<h2>Vetores</h2>

				<p>Para entender o que são e como funcionam as bases de dados vetoriais, primeiro devemos saber o que é um vetor.</p>

				<p>No âmbito da aprendizagem automática, um vetor é uma lista ordenada de números que representa dados de qualquer tipo, inclusive não estruturados, como documentos de texto, imagens, áudios ou vídeos.</p>

				<p>A quantidade de números que compõem um vetor é conhecida como dimensão, e as bases de dados vetoriais gerem vetores de várias centenas de dimensões. Por exemplo, o modelo <a href="https://platform.openai.com/docs/guides/embeddings#how-to-get-embeddings" target="_blank" rel="noopener" title="How to get embeddings, por Open AI"><code>text-embedding-3-small</code></a> da OpenAI gera vetores de 1536 dimensões.</p>

				<p>1536 dimensões formam uma lista de números muito grande. Se colocássemos um aqui, o mais provável é que abandonasses o artigo aborrecido de fazer scroll. Assim, para um exemplo mais manejável, podemos mostrar a representação vetorial em 3 dimensões da palavra "amor":</p>

				<pre><code>[ 0.1234, -0.2567, 0.5432 ]</code></pre>

				<h2>Embeddings</h2>

				<p>Agora que temos mais claro o que são os vetores, é altura de conhecer como são armazenados numa base de dados vetorial. A forma de o fazer é incrustando-os como pontos num espaço multidimensional.</p>

				<p>O número de dimensões do espaço é determinado pela dimensionalidade dos vetores guardados. Para mim, imaginar pontos distribuídos em 768, 1536 ou 3072 dimensões é um pouco complicado. Embora talvez tenhas visto <em>Interstellar</em> n vezes e te sintas capaz de o fazer. 😅</p>

				<p>Se não for o caso, voltemos ao nosso exemplo anterior. Como representámos "amor" com um vetor de apenas 3 dimensões, este dispor-se-á junto dos restantes embeddings como um ponto num eixo de coordenadas XYZ. Assim é mais fácil de visualizar, não é verdade?</p>

				<img class="c-post__body-img" src="https://xulioze.com/img/vectorstores-embeddings.png" alt="embeddings num espaço multidimensional" width="768" loading="lazy">

				<h2>Consultas</h2>

				<p>Agora que sabemos como se armazenam os dados numa base de dados vetorial, vejamos como se realizam as consultas.</p>

				<p>Em primeiro lugar, a consulta é convertida num embedding que pode ser comparado com os restantes vetores da base de dados.</p>

				<p>Dado que os embeddings são representações numéricas, é possível medir a distância entre eles utilizando diferentes métricas matemáticas, entre as mais comuns:</p>

				<ul>
					<li>Distância euclidiana ( √Σ(xᵢ - yᵢ)² ): mede a distância geométrica num espaço multidimensional.</li>
					<li>Similaridade do cosseno ( cosθ ): mede o ângulo entre dois vetores, indicando quão semelhantes são em direção.</li>
					<li>Distância de Manhattan ( Σ |xᵢ - yᵢ| ): calcula a soma das diferenças absolutas entre cada coordenada.</li>
				</ul>

				<p>As bases de dados vetoriais empregam algoritmos como <code>k-NN</code> (k-Nearest Neighbors) e <code>ANN</code> (Approximate Nearest Neighbors) que utilizam estas métricas para devolver os vetores mais próximos ao da consulta.</p>

				<p>Esta forma de trabalhar permite realizar pesquisas eficientes em grandes volumes de dados, já que não é necessário analisar o conteúdo interno de cada vetor, basta simplesmente comparar as suas posições dentro do espaço multidimensional.</p>

				<p>Embora a eficiência nas consultas seja muito importante, a característica fundamental das bases de dados vetoriais é a sua capacidade para encontrar os vetores mais próximos da consulta, processo conhecido como pesquisa por similaridade.</p>

				<h2>Importância da pesquisa por similaridade</h2>

				<p>Mas, por que é tão importante a pesquisa por similaridade? Para entendê-lo bem, temos de voltar ao ponto inicial: a transformação dos dados em vetores, também conhecida como embedding.</p>

				<p>Quem se encarrega de gerar os embeddings não é a própria base de dados, mas sim um modelo de linguagem especializado, chamado modelo de embedding. Estes modelos não fazem uma simples tradução numérica dos dados, mas encapsulam a sua semântica e contexto.</p>

				<img class="c-post__body-img" src="https://xulioze.com/img/vectorstores-semantic-similarity.png" alt="embeddings próximos semanticamente" width="768" loading="lazy">

				<p>E aqui é onde encontramos a chave para compreender a importância deste tipo de pesquisa. As pesquisas por similaridade não só identificam elementos próximos em termos numéricos, como capturam similaridades semânticas, permitindo aos LLMs reconhecer relações profundas dentro dos dados armazenados.</p>

				<p>Em suma, as bases de dados vetoriais não só facilitam o acesso à informação, como ampliam a capacidade dos LLMs para interpretar e aproveitar o conhecimento disponível. <a href="https://www.youtube.com/watch?v=WnTKllDbu5o" target="_blank" rel="noopener" title="input, more input!">O que a Stephanie teria dado para ter uma em 1986</a>!</p>
]]>
      </content:encoded>
      <pubDate>Wed, 05 Mar 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Impressoras 3D e morte da simetria</title>
      <link>https://xulioze.com/pt/blogue/impressoras-3d-morte-simetria.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/impressoras-3d-morte-simetria.html</guid>
      <description>Produção subtrativa vs. aditiva, projetar como a natureza o faz.</description>
      <content:encoded>
        <![CDATA[				<p>
					<em>Este post que hoje recupero aqui publiquei-o em fevereiro de 2016 no extinto blog das <a href="https://arinspunk.com/" target="_blank" rel="noopener" title="Arquivo do estúdio">Arinspunk</a>. Escrevi-o após ver uma <a href="https://www.youtube.com/watch?v=kbAac9DxM1I&ab_channel=TEDxTalks" target="_blank" rel="noopener" title="3D Printing Our Future in Space - Youtube (en)">palestra TEDx</a> de Tommaso Ghidini (ESA) que me deixou louco. Nela, o Tommaso argumentava que, com as impressoras 3D, devíamos esquecer a simetria e abraçar a assimetria, o modo como a natureza projeta.</em>
				<p>
				<p>
					<em>Talvez seja apenas a opinião equivocada de alguém que desconhece muito da impressão 3D mas tenho a sensação de que ainda há muito caminho a percorrer nessa abordagem. Tu que achas?</em>
				</p>
				<span class="separator" role="separator"></span>
				<p>
					A nossa tecnologia, já desde as primeiras e rudimentares ferramentas, é principalmente de tipo subtrativa. O que quer dizer que para construirmos um objecto, tiramos material dumha porçom inicial de matéria prima, até darmos com a forma desejada.
				</p>
				<figure class="figure-img">
					<img class="c-post__body-img" src="https://xulioze.com/img/bifaces-pedra.gif" alt="flechas de sílex" loading="lazy">
					<figcaption>Bifaces de pedra</figcaption>
				</figure>
				<p>
					Com a apariçom das impressoras 3D, este jeito de agirmos muda. Passamos dumha técnica subtrativa, a outra aditiva, pois as impressoras 3D nom subtraem, adicionam matéria.
				</p>
				<p>
					Esta mudança pode passar desapercebida inicialmente, acochada por trás doutros aspetos com os que o fabbing está a revolucionar a produçom industrial:
				</p>
				<ul>
					<li>
						Reduçom ao máximo da <a href="https://web.archive.org/web/20160729132020/https://lasindias.com/indianopedia/crisis-de-las-escalas" target="_blank" rel="noopener" title="Crisis de las escalas - Indianopedia (es)">escala ótima de produçom</a>.
					</li>
					<li>
						Extensom da pirataria até o campo das patentes.
					</li>
					<li>
						Início da <a href="https://www.youtube.com/watch?v=kbAac9DxM1I&ab_channel=TEDxTalks" target="_blank" rel="noopener" title="3D Printing Our Future in Space - Youtube (en)">fabricaçom de objetos no espaço</a>.
					</li>
				</ul>
				<p>
					Mas traz consigo umha consequência significativa (e muito interessante) desde o ponto de vista do design (de produto): a morte da simetria (ou da sua inutilidade).
				</p>
				<p>
					A simetria é fundamental à hora de produzirmos peças de jeito subtrativo, pois um objeto é mais doado de fabricar se possui formas singelas dispostas em eixos simétricos. Mas com a técnica aditiva, esta simetria já nom é necessária. Para umha impressora 3D, tanto faz imprimir um objeto simétrico, do que um assimétrico.</p>
				<p>
					Entom, por quê nom continuar a desenhar objetos simétricos[<a id="termo-1" href="https://xulioze.com/pt/blogue/impressoras-3d-morte-simetria.html#nota-1">1</a>] e aproveitar o abaratamento/simplificaçom da fabricaçom através do fabbing? Porque a assimetria abre umha nova porta: desenhar/produzir coma a natureza desenha/produz.
				</p>
				<figure class="figure-img">
					<img class="c-post__body-img" src="https://xulioze.com/img/raiz.jpeg" alt="células vegetais vistas com microscópio" loading="lazy">
					<figcaption>
						Raiz dumha lentelha a medrar na Estaçom Internacional. <a href="https://www.esa.int/ESA_Multimedia/Images/2016/01/Plant_gravity" target="_blank" rel="noopener" title="Mais info no site da ESA (en)">ESA/Université Blaise Pascal</a>
					</figcaption>
				</figure>
				<p>
					Na natureza nada é realmente simétrico[<a id="termo-2" href="https://xulioze.com/pt/blogue/impressoras-3d-morte-simetria.html#nota-2">2</a>], mas esta ausência de simetria nom faz diminuir a qualidade das estruturas naturais, bem pelo contrário. Milhons de anos de evoluçom criaram inumeráveis (e excelentes) soluçons para tantos outros problemas. Soluçons que estám a aguardar por nós, para serem aplicadas nos nossos objetos.
				</p>
				<p>
					Por isso, replicarmos peças simétricas com umha impressora 3D, só polo facto de ser mais doado e barato, é um erro. Para aproveitarmos toda a potencialidade que esta nova tecnologia nos oferece, devemos deixar de pensar como fizemos até agora e começar a desenhar como a natureza o fiz, de jeito orgânico, assimétrico.
				</p>
				<figure class="figure-img">
					<img class="c-post__body-img" src="https://xulioze.com/img/cadeira-celular.jpeg" alt="Sofá de estrutura orgánica" loading="lazy">
					<figcaption>
						3D printed soft seat by <a href="https://www.lilianvandaal.com/biomimicry-3d-printed-soft-seat" target="_blank" rel="noopener" title="a cadeira no site de Lilian (en)">Lilian van Daal</a>
					</figcaption>
				</figure>
				<h2>Futuro</h2>
				<p>
					Permeará nalgum momento este design orgânico, do design de produto ao design gráfico?
				</p>
				<p>
					Aplicá-lo no design editorial e web, se quadra é um pouco forçado. Mas, como havemos desenhar para umha <a href="https://www.youtube.com/watch?v=KHSdObeUdxI&ab_channel=CNET" target="_blank" rel="noopener" title="LG OLED TV - Youtube (en)">pantalha flexível</a> adaptada às formas dum objeto tridimensional? Como é que será o design gráfico para a pele digital dum <a href="https://www.youtube.com/watch?v=uJF75t1fFRA&ab_channel=IEEESpectrum" target="_blank" rel="noopener" title="Robot Octopus Takes to the Sea - Youtube">polvo elétrico</a>?
				</p>
				<p>
					<small id="nota-1">
						[<a href="https://xulioze.com/pt/blogue/impressoras-3d-morte-simetria.html#termo-1">1</a>] O trabalho com formas assimétricas rara vez foi além do carácter ornamental, ou <a title="Postmodernism - Victoria and Albert Museum (en)" href="http://www.vam.ac.uk/page/p/postmodernism/" target="_blank" rel="noopener">lúdico/provocativo</a>.
					</small><br>
					<small id="nota-2">
						[<a href="https://xulioze.com/pt/blogue/impressoras-3d-morte-simetria.html#termo-2">2</a>] <a title="Simetria bilateral na Wikipedia (gl - RAG)" href="https://gl.wikipedia.org/wiki/Simetr%C3%ADa_bilateral" target="_blank" rel="noopener">Simetria bilateral</a> e <a title="Simetria radial na Wikipedia (gl - RAG)" href="https://gl.wikipedia.org/wiki/Simetr%C3%ADa_radial" target="_blank" rel="noopener">radial</a> nom som simetrias exatas (geométricas).
					</small>
				</p>
				<p>
					<small>
						A imagem “Bifaces de pedra” é um gif feito a partires de <a href="https://fr.wikipedia.org/wiki/Acheul%C3%A9en#/media" title="Biface - Wikipedia (fr)" target="_blank" rel="noopener">fotos de Didier Descouens</a> – <a href="http://creativecommons.org/licenses/by-sa/4.0/" title="licença no site de Creative Commons (en)" target="_blank" rel="noopener">CC BY-SA 4.0</a>
					</small>
				</p>
]]>
      </content:encoded>
      <pubDate>Mon, 12 Feb 2024 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Ressarcimento</title>
      <link>https://xulioze.com/pt/blogue/ressarcimento.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/ressarcimento.html</guid>
      <description>Um post sobre o feismo na Galiza escrito há mais de 10 anos</description>
      <content:encoded>
        <![CDATA[				<p>
					<em>Este post meu que hoje recupero cá, publicou-se há 10 anos no blog <a href="https://niquelarte.prazapublica.com/post/41122929792/ressarcimento" target="_blank" rel="noopener" title="post original">Canibalismo Patrimonial Periférico</a> do jornal galego <a href="https://praza.gal/" target="_blank" rel="noopener" title="site do jornal">Praza.gal</a>. Na altura, além do meu trabalho em <a href="https://arinspunk.com/" target="_blank" rel="noopener" title="Arquivo do finado estúdio">Arinspunk</a>, participava intensamente em Niquelarte, um coletivo que trabalhava com o patrimônio material e imaterial de uma maneira um tanto heterodoxa</em> 😬
				</p>
				<span class="separator" role="separator"></span>
				<img class="c-post__body-img" src="https://xulioze.com/img/cicatriz.png" alt="" width="655" loading="lazy">
				<p>
					No nosso País, o caminho da tradiçom à contemporaneidade percorremo-lo de súpeto, sem transiçom. Baterom pedra, madeira, telha, linho, com cemento, alumínio, uralita, náilon, e o novo e o velho ficarom separados, mas também ligados numha gram cicatriz. 
				</p>
				<p>
					Alguns chamarom-lhe "<a href="https://gl.wikipedia.org/wiki/Fe%C3%ADsmo" title="artigo na Galipedia">feísmo</a>", mas devemos falarmos com claridade, isso só é lixo intelectual (mais um) cuspido desde o Polígono Industrial de Sabom. Por que feio? Por nom se ajeitar a um cânone de beleza que nunca importou às instituiçons? Por que o nosso rural e as nossas vilas dificilmente podem ser transformadas em parques temáticos patrimoniais coma muitas das ruas de Compostela? Por que escaralhamos <a href="http://www.culturagalega.org/noticia.php?id=11704" title="Un país de postal - Culturagalega">a postal</a>?
				</p>
				<p>
					Poderíamos pensar que a sua afirmaçom se inseria dentro dumha estratégia meirande de asimilaçom e uniformizaçom (que existe), mas seria supor-lhes umha maior capacidade. O projeto capitalista que as nossas elites desenvolverom durante o século XX obtivo, desde a própria óptica capitalista, um resultado medíocre, e no final do processo, quiserom maquilhar parte do seu fracasso dizendo que o que foi umha adaptaçom às pressas da gente perante o seu desleixo, era algo feio que devíamos apagar. Coitados...
				</p>
				<p>
					A cicatriz está aí, é totalmente evidente e nom pode ser apagada. Mas nom tem sentido falarmos de se é mais ou menos feia. Isso nom é o que importa dumha cicatriz. A leitura proveitosa, além de nos lembrar de que a pesar de tudo estamos vivos, é a de que toda cicatriz encerra umha história, umha história neste caso que é nossa.
				</p>
				<p>
					Deixemos ló de mirá-la como algo do que se avergonhar e afundemos nela. Havemos saber mais do que fomos e somos, e também nos há ajudar a criar o nosso próprio relato. Porque eis, na ferida sandada às pressas com ares salgados e azedos, onde atoparmos beleza. Nom a verdadeira, isso nom existe, mas sim a nossa própria.
				</p>
]]>
      </content:encoded>
      <pubDate>Mon, 25 Sep 2023 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>A arte de conversar com o ChatGPT (e outros LLMs)</title>
      <link>https://xulioze.com/pt/blogue/como-falar-com-chatgpt.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/como-falar-com-chatgpt.html</guid>
      <description>Como escrever prompts ajeitados à hora de desenvolvermos código</description>
      <content:encoded>
        <![CDATA[				<img class="c-post__body-img" src="https://xulioze.com/img/chatgpt-rachael.jpg" alt="Rachael e o Voight-Kampff test" width="655" loading="lazy">
				<p>
					Numa troca de emails sobre o ChatGPT, um colega perguntou-me qual seria a melhor forma de escrevermos prompts ao desenvolver código. Bom, a resposta não é simples, afinal isso implica conversar com uma rede neuronal e muitas vezes já é difícil fazê-lo com outras pessoas, quanto mais com uma máquina. No entanto, como sou uma pessoa muito educada e que gosta de ajudar sempre que possível, refleti e respondi da melhor maneira que pude.
				</p>
				<p>
					A rede está repleta de <a href="https://github.com/readme/guides/coding-generative-ai" title="Harness the power of generative AI for software development - ReadME Project" target="_blank" rel="noopener">dicas</a> para melhorarmos os nossos prompts e tenho incorporado muitas delas, mas ao analisá-las individualmente, não sei qual grau de melhoria trouxeram. Inclusive, há algumas em que não tenho certeza se tiveram um impacto significativo. É normal, a experiencia que acumulo ainda não é suficiente para fazer estatística. Porém, o que posso afirmar é que em conjunto e em comparação aos meus rudimentares testes iniciais, a sua incorporação resultou em uma inegável melhora nos resultados obtidos. 
				</p>
				<p>
					Um caso diferente é o das estratégias focadas na resolução de tarefas mais complexas, pois, ao contrário das simples em que podemos obter uma resposta válida e até mesmo muito semelhante, usando ou não uma determinada dica, a adoção destas técnicas traz uma melhora imediata e evidente. <a href="https://xulioze.com/pt/blogue/construir-pwa-com-chatgpt.html" title="Como construir uma PWA com o ChatGPT antes que ele nos mande para o desemprego" target="_blank" rel="noopener">Sem uma estratégia definida</a>, o LLM tendia a se dispersar e cometer erros, exigindo que eu o corrigisse e o guiasse com novas perguntas ou instruções. No entanto, quando incluí no meu trabalho o <a href="https://www.promptingguide.ai/pt/techniques/cot" title="descrição no Prompt Engineering Guide" target="_blank" rel="noopener">Chain-of-Thought</a> e o <a href="https://www.promptingguide.ai/pt/techniques/knowledge" title="descrição no Prompt Engineering Guide" target="_blank" rel="noopener">Generated Knowledge</a>, esses problemas foram resolvidos. (Tenho pendente um post contando como desenvolvi um blogue em React com ajuda do ChatGPT).
				</p>
				<figure>
					<blockquote cite="https://www.promptingguide.ai/models">
						<p>Understanding these capabilities are important to understand the limitations of these models and how to use them effectively.</p>
					</blockquote>
					<figcaption><cite>Prompt Engineering Guide</cite></figcaption>
				</figure>
				<p>
					Então, como avaliamos as pequenas dicas que achamos na rede? Uma primeira (e óbvia) abordagem é seguir os conselhos de fontes confiáveis. Eu gosto muito do <a href="https://learnprompting.org/" title="Your Guide to Communicating with Artificial Intelligence" target="_blank" rel="noopener">learnprompting.org</a> e do <a href="https://www.promptingguide.ai/pt" title="Guia de Engenharia Prompt" target="_blank" rel="noopener">promptingguide.ai</a>, no entanto <a href="https://github.com/openai/openai-cookbook#prompting-guides" title="Prompting guides - OpenAI" target="_blank" rel="noopener">existem muitas mais</a>. Outra, complementar, é determinar se o propósito de uma dica faz sentido com o funcionamento dos LLMs. É evidente que seguir essa abordagem implica um gasto extra de tempo, pois:
				</p>
				<ol>
					<li>
						Devemos ter clareza sobre o propósito da dica, embora todas tendam a buscar:
						<ul>
							<li>
								Reduzir o <a href="https://platform.openai.com/tokenizer" title="Contador de tokens - OpenAI (En)" target="_blank" rel="noopener">número de tokens</a> utilizados nas perguntas e respostas.
							</li>
							<li>
								Otimizar o trabalho do LLM no processamento das perguntas e na geração das respostas.
							</li>
							<li>
								Obter a melhor resposta possível para a nossa tarefa.
							</li>
						</ul>
					</li>
					<li>
						E obriga-nos a aprofundar na <a href="https://www.promptingguide.ai/pt/models" title="principais modelos de linguagem" target="_blank" rel="noopener">compreensão e conhecimento dessas ferramentas</a>.
					</li>
				</ol>
				<p>
					Porém, esse sempre é um bom investimento, já que ajuda a melhorar nosso trabalho diário e nos permite desfrutar do prazer de aprendermos algo novo.
				</p>
				<p>
					Finalmente o meu colega, que também é muito educado, agradeceu a resposta. Mas como igualmente é pragmático e directo, logo quis saber se eu tinha identificado alguma boa prática. Resumindo, procurava uma lista de dicas 😬
				</p>
				<h2>As minhas dicas</h2>
				<p>
					Eis as práticas que sempre incluo nos meus prompts orientados desenvolver tarefas simples. Para aprenderes a escrever código complexo com ChatGPT recomendo começares polo post "<a href="https://martinfowler.com/articles/2023-chatgpt-xu-hao.html" title="How Xu Hao uses chain of thought and general knowledge prompting with ChatGPT" target="_blank" rel="noopener">An example of LLM prompting for programming</a>".
				</p>
				<ul>
					<li>
						Evito a formalidade. Nada de "Bom dia", "poderia a senhora…", "muito obrigado", etc. Não sufras, o LLM não é um ser senciente e sempre é bom pouparmos alguns tokens.
					</li>
					<li>
						Começo sempre com um "As a [rol name]". Com isto procuro formatar a resposta do modelo de uma maneira mais específica.
					</li>
					<li>
						Incluo detalhes com terminologia especializada. A ideia é fornecer o contexto suficiente para evitar o modelo ter de adivinhar o que eu quero dizer. 
					</li>
					<li>
						Procuro ser o mais sintético possível, em equilíbrio com o anterior ponto. Quanto mais breve e direto é o nosso prompt, mais concisa será a resposta, além de continuarmos a popuar alguns tokens. 
					</li>
					<li>
						Limpo o código de exemplo. Tudo o que não é precisso para desenvolver a tarefa só achega ruido e malgasto de tokens.
					</li>
				</ul>
				<p>
					O que pretendia ser um rascunho de um método para aprender a conversar com as máquinas, transformou-se em outro post com dicas para usar o ChatGPT. Achas que o propósito de cada uma faz sentido com o funcionamento dos LLMs?
				</p>
]]>
      </content:encoded>
      <pubDate>Fri, 30 Jun 2023 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Como construir uma PWA com o ChatGPT antes que ele nos mande para o desemprego</title>
      <link>https://xulioze.com/pt/blogue/construir-pwa-com-chatgpt.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/construir-pwa-com-chatgpt.html</guid>
      <description>Experimentando o ChatGPT antes que ele nos mande para o desemprego</description>
      <content:encoded>
        <![CDATA[				<img class="c-post__body-img" src="https://xulioze.com/img/chatgpt-hal-9000.jpg" alt="David Bowman perante HAL 9000" width="655" loading="lazy">
				<figure>
					<blockquote>
						<p>Qualquer tecnologia suficientemente avançada é indistinguível da magia.</p>
					</blockquote>
					<figcaption><cite>Arthur C. Clarke</cite></figcaption>
				</figure>
				<p>
					A primeira IA que usei (conscientemente) foi a <a href="https://www.midjourney.com/" title="site da IA" target="_blank" rel="noopener">Midjourney</a>: escrever um prompt, pressionar enter, esperar um instante e a imagem surgia do nada. Linda, sofisticada e estranha. Foi como presenciar um ato mágico.
				</p>
				<p>
					Depois experimentei o <a href="https://openai.com/research/dall-e" title="site da IA" target="_blank" rel="noopener">Dall·E</a> e o <a href="https://stablediffusionweb.com/" title="site da IA" target="_blank" rel="noopener">Stable Diffusion</a>, igualmente espetaculares, mas no final o tédio venceu a magia. Não achei utilidade para mim, prefiro <a href="https://twitter.com/naia_ze/status/1621621795907420162" title="fio em Twitter" target="_blank" rel="noopener">gerar imagens do meu jeito</a>.
				</p>
				<p>
					Os meses passaram e deixou-se de falar tanto sobre elas, havia novo brinquedo, o <a href="https://stablediffusionweb.com/" title="site da IA" target="_blank" rel="noopener">ChatGPT</a>.
				</p>
				<p>
					Demorei para usá-lo, mas a semana passada copiei um snippet de JavaScript de um site antigo, colei-o na caixa do chat e perguntei: "Could you optimize this code snippet?" E o texto foi crescendo enquanto dizia, claro, você pode melhorar isso com aquilo, e aquilo com isso, etc. Deixo um exemplo para você. O exemplo fazia sentido e funcionava. Novamente um ato aparentemente mágico. Novamente a emoção. Mas agora também uma sensação diferente, um pouco de medo.
				</p>
				<img class="c-post__body-img" src="https://xulioze.com/img/fired.gif" alt="está despedido" width="655" loading="lazy">
				<p>
					Solo un poquito. La verdad es que no creo en la magia (excepto en la de <a href="https://www.nytimes.com/2023/01/02/magazine/juan-tamariz-magic.html" title="The Man Who Made Spain the Magic Capital of the World - NYT" target="_blank" rel="noopener">Tamariz</a>), ya vi gastar el adjetivo disruptivo en la primera década del siglo y como la mejor manera de perder el miedo a algo es conocerlo, me puse manos a la obra, antes de que nos enviara derechas al desempleo.
				</p>
				<h2>
					Experimento
				</h2>
				<p>
					Hmm… ¿Por dónde empezar? Bueno, <a href="https://twitter.com/naia_ze" title="NZ&A en Twitter" target="_blank" rel="noopener">Naia y yo</a> tenemos la idea de crear una aplicación meteorológica en la que, en lugar de los clásicos iconos, se muestren unos dibujos un poco más divertidos. Así que aprovechando la excusa, escribí la siguiente pregunta:
				</p>
				<img class="c-post__body-img" src="https://xulioze.com/img/chatgpt-01.jpg" alt="primera pregunta a ChatGPT y su respuesta" width="655" loading="lazy">
				<p>
					Perfecto. En su primera respuesta, ChatGPT proporcionó un HTML, un fragmento de JS y una explicación detallada de todo el código.
				</p>
				<p>
					Reemplacé <code>your_openweathermap_api_key_here</code> por una clave válida de la API OpenWeatherMap y funcionó. El único error reseñable fue la temperatura de la ciudad, ya que indicaba que estaba en grados Celsius, pero en realidad el valor estaba en Kelvin.
				</p>
				<iframe class="c-post__body-iframe" height="300" style="width: 100%;" scrolling="no" title="chatGPT 01" src="https://codepen.io/arinspunk/embed/GRYpLrL?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
					See the Pen <a href="https://codepen.io/arinspunk/pen/GRYpLrL">
					chatGPT 01</a> by Arinspunk (<a href="https://codepen.io/arinspunk">@arinspunk</a>)
					on <a href="https://codepen.io/">CodePen</a>.
				</iframe>
				<p>Después de algunas pruebas más, noté que si el nombre de la ciudad no existía en la base de datos de la API, por ejemplo Portox, obtenía un error en el fetch (con el mensaje que pasábamos en el código, "Failed to fetch weather data for Portox"). También ocurría que si varias ciudades compartían el mismo nombre, como Porto, que hay en Portugal, Brasil y España, los datos que veíamos pertenecían solo a una de ellas. Por lo que escribí una segunda pregunta:</p>
				<img class="c-post__body-img" src="https://xulioze.com/img/chatgpt-02.jpg" alt="segunda pergunta a ChatGPT e a sua resposta" width="655" loading="lazy">
				<p>Desta vez o ChatGPT não acertou. Ou melhor, acertou mas eu não forneci o contexto correto. Ele simplesmente verificava se a cidade existia na base de dados antes de buscar as informações meteorológicas. No entanto, para o usuário não havia diferença em relação à versão anterior, exceto pela troca de mensagens. Além disso, o problema das cidades com o mesmo nome não era resolvido.</p>
				<iframe class="c-post__body-iframe" height="300" style="width: 100%;" scrolling="no" title="PWA com ChatGPT 02" src="https://codepen.io/arinspunk/embed/qBJOzJX?default-tab=js%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
					See the Pen <a href="https://codepen.io/arinspunk/pen/qBJOzJX">
					PWA com ChatGPT 02</a> by Arinspunk (<a href="https://codepen.io/arinspunk">@arinspunk</a>)
					on <a href="https://codepen.io/">CodePen</a>.
				</iframe>
				<p>Mea culpa e nova pergunta. Agora focada nas cidades de mesmo nome:</p>
				<img class="c-post__body-img" src="https://xulioze.com/img/chatgpt-03.jpg" alt="terça pergunta a ChatGPT e a sua resposta" width="655" loading="lazy">
				<p>Com o código novo conseguia exibir a lista das cidades, mas não era possível clicar nelas, obtendo como resultado os dados de apenas uma ao pressionarmos o botão "Search".</p>
				<iframe class="c-post__body-iframe" height="300" style="width: 100%;" scrolling="no" title="PWA com ChatGPT 02" src="https://codepen.io/arinspunk/embed/oNajrao?default-tab=js%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
					See the Pen <a href="https://codepen.io/arinspunk/pen/oNajrao">
					PWA com ChatGPT 02</a> by Arinspunk (<a href="https://codepen.io/arinspunk">@arinspunk</a>)
					on <a href="https://codepen.io/">CodePen</a>.
				</iframe>
				<p>Mais outra pergunta:</p>
				<img class="c-post__body-img" src="https://xulioze.com/img/chatgpt-04.jpg" alt="quarta pergunta a ChatGPT e a sua resposta" width="655" loading="lazy">
				<p>Com a troca sim era possível clicar numa das cidades da lista e, ao fazê-lo, obtiamos os seus dados meteorológicos.</p>
				<iframe  class="c-post__body-iframe" height="300" style="width: 100%;" scrolling="no" title="PWA com ChatGPT 04" src="https://codepen.io/arinspunk/embed/abRpbjQ?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
					See the Pen <a href="https://codepen.io/arinspunk/pen/abRpbjQ">
					PWA com ChatGPT 04</a> by Arinspunk (<a href="https://codepen.io/arinspunk">@arinspunk</a>)
					on <a href="https://codepen.io/">CodePen</a>.
				</iframe>
				<p>Mas ainda restavam alguns pontos por polir:</p>
				<ul>
					<li>O botão "Search" realmente não servia para nada.</li>
					<li>A lista deveria desaparecer ao clicarmos numa das opções.</li>
					<li>Havia que passar a temperatura a Celsius.</li>
					<li>Estaria bem indicar o nome do país à direita de cada cidade.</li>
				</ul>
				<p>Foi neste ponto que decidi deixar o piloto automâtico e passar a "modo manual", pois achei mais rápido modificar eu o código que continuar a perguntar.</p>
				<p>Eis o resultado com as "modifciações humanas":</p>
				<iframe class="c-post__body-iframe" height="300" style="width: 100%;" scrolling="no" title="PWA com ChatGPT 05" src="https://codepen.io/arinspunk/embed/wvYgBdP?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
					See the Pen <a href="https://codepen.io/arinspunk/pen/wvYgBdP">
					PWA com ChatGPT 05</a> by Arinspunk (<a href="https://codepen.io/arinspunk">@arinspunk</a>)
					on <a href="https://codepen.io/">CodePen</a>.
				</iframe>
				<p>Já com o código pronto, chegava a hora de transformar nosso site em uma PWA (Progressive Web App):</p>
				<img class="c-post__body-img" src="https://xulioze.com/img/chatgpt-05.jpg" alt="quinta pergunta a ChatGPT e a sua resposta" width="655" loading="lazy">
				<p>E na primeira tentativa funcionou 🥳</p>
				<p>Eis o resultado: <a href="https://xulioze.com/test/pwa/" target="_blank" rel="noopener" title="Visita e descarrega a PWA">Pe Man</a></p>
				<p>Muito obrigado ChatGPT!</p>
				<img class="c-post__body-img" src="https://xulioze.com/img/chatgpt-06.jpg" alt="última pergunta a ChatGPT e a sua resposta" width="655" loading="lazy">
				<h2>
					Conclusões
				</h2>
				<p>
					A primeira conclusão é que o ChatGPT é capaz de compreender muito bem até mesmo um inglês ruim como o meu 😬
				</p>
				<p>
					A segunda é que ele pode ser útil para:
				</p>
				<ul>
					<li>
						Escrever um código base, ajudando-nos a poupar tempo. Depois de analisar o meu experimento, devo constatar que a melhor estratégia é escrever um prompt o mais amplo e contextualizado possível, em vez de formular muitas perguntas curtas.
					</li>
					<li>
						Fazer melhorias/trocas no código. Até certo ponto, depois é melhor passarmos ao modo manual/humano.
					</li>
					<li>
						Realizar consultas a uma API que não conhecemos sem necessidade de visitar sua documentação.
					</li>
					<li>
						Optimizar o código.
					</li>
					<li>
						Ampliar o conhecimento sobre uma linguagem, conhecendo outras abordagens.
					</li>
					<li>
						Iniciar-se em novas linguagens/tecnologias.
					</li>
				</ul>
				<p>
					E a última e mais importante, é que ele não nos vai mandar as programadoras diretinhas para o desemprego. Pelo menos nos próximos meses…
				</p>
				<p>🥹</p>
				<img class="c-post__body-img" src="https://xulioze.com/img/fired.gif" alt="primeira pergunta a ChatGPT e a sua resposta" width="655" loading="lazy">
]]>
      </content:encoded>
      <pubDate>Fri, 14 Apr 2023 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Custom Page Templates em Frontity? Vigentes e muito simples</title>
      <link>https://xulioze.com/pt/blogue/frontity-custom-page-templates.html</link>
      <guid isPermaLink="false">https://xulioze.com/pt/blogue/frontity-custom-page-templates.html</guid>
      <description>Como criar Custom Page Templates no Wordpress e desenvolver os seus layouts em Frontity</description>
      <content:encoded>
        <![CDATA[				<p>
					As <a href="https://developer.wordpress.org/themes/template-files-section/page-template-files/#creating-custom-page-templates-for-global-use" title="documentación oficial de Wordpress" target="_blank" rel="noopener">Custom Page Templates</a> são o mecanismo do que dispomos em Wordpress para criarmos templates globais com designs específicos que podem se aplicar a uma ou mais páginas.
				</p>
				<p>
					Por exemplo, se num site precisamos de dous tipos de página: uma a uma coluna e outra com duas (conteúdo principal y coluna lateral), uma boa opção é usarmos a página por defeito, <code>page.php</code>, para a primeira e criarmos um template, <code>sidebar-page.php</code>, para a segunda. Deste jeito, para cada nova página, podemos eleger um ou outro layout desde o editor.
				</p>
				<p>
					E em <a href="https://frontity.org/" title="Site del framework" target="_blank" rel="noopener">Frontity</a>, onde o frontend não se gera com os templates em php do theme de Wordpress senão desde uma app em React? Pois as Custom Page Templates continuam a ser a melhor opção para trabalharmos com múltiples designs de página porque permitem:
				</p>
				<ul>
					<li>
						selecionar o design desejado desde o editor duma página,
					</li>
					<li>
						atribuir-lhes grupos de campos <a href="https://www.advancedcustomfields.com/" title="página oficial del plugin" target="_blank" rel="noopener">ACF</a>, extendendo as posibilidades de edição,
					</li>
					<li>
						que na REST API (e no <a href="https://gitbook-docs.frontity.org/learning-frontity/state" title="Descripción en la documentación de Frontity" target="_blank" rel="noopener">state</a> de Frontity) apareça o nome do arqivo do template atribuido a uma página, facilitando a Frontity servir o layout correcto em cada caso.
					</li>
				</ul>
				<p>
					Vejamos agora o processo completo com um exemplo singelo.
				</p>
				<h2>
					Wordpress
				</h2>
				<p>
					Criamos um arquivo php, <code>custom-page-template.php</code> por exemplo, com um comentário ao início como o seguinte:
				</p>
				<script src="https://gist.github.com/arinspunk/c1c7b8d374b0608a64a4f4e63cbb4448.js"></script>
				<p>
					“Template name:” é quem lhe indica ao Wordpress que esse ficheiro é uma page template e “My Custom Page Template Name” o nome do nosso novo template, que aparecerá no seletor de templates do editor de cada página.
				</p>
				<p>
					¿Algo mais a fazer? não, isso é tudo na parte do Wordpress 😎
				</p>
				<p>
					Bom, para evitarmos erros (e alguma dor de cabeça) devemos ter en conta que:
				</p>
				<ul>
					<li>
						As templates personalizadas só funcionan se temos um <code>index.php</code> (pode estar vazio) na raiz do nosso theme de Wordpress,
					</li>
					<li>
						nunca devemos usar <code>page-</code> como prefixo no nome do arquivo, pois o WordPress irá interpretá-lo como uma template especializada destinada a ser aplicada apenas a uma página do site.
					</li>
				</ul>
				<h2>
					Frontity
				</h2>
				<p>
					Criamos três componentes:
				</p>
				<ol>
					<li>
						<code>
							Page
						</code>
					</li>
					<li>
						<code>
							PageDefault
						</code>
					</li>
					<li>
						<code>
							PageTemplate
						</code>
					</li>
				</ol>
				<p>
					No primeiro incluímos um <code>Switch</code> que chama o segundo, <code>PageDefault</code>, ou o terceiro, <code>PageTemplate</code>, em função do valor da propiedade <code>template</code> que aparece nos dados da página do state do Frontity. Se a página publicada em Wordpress utilizar a template da página padrão, este valor chegará vazio e se utilizar uma custom, virá com o nome do ficheiro da template, <code>custom-page-template.php</code> no nosso caso.
				</p>
				<script src="https://gist.github.com/arinspunk/dbe49b71f4ab06ad1b872beb0b02d53d.js"></script>
				<p>
					E finalmente, na segunda e terceira, incluímos os layouts de ambos os tipos de página.
				</p>
				<p>
					Simples, não é? 
				</p>
				<p>Se tiverdes alguma pergunta, achais que há margem para melhorias ou quererdes apenas dizer olá, podeis escrever-me para <a href="mailto:hola@xulioze.com" title="mi email">hola@xulioze.com</a> 😋</p>
]]>
      </content:encoded>
      <pubDate>Thu, 03 Feb 2022 00:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>