dotnet-desktop-setup · v1.8.0 · 2026-09-28 · sha256 9d1ed45e3fdb8cb6

dotnet-desktop-setup v1.8.0A

Immutable. This exact content never changes and is served at /api/v1/blob/9d1ed45e3fdb8cb6.

---
name: dotnet-desktop-setup
metadata:
  version: 1.8.0
description: C#/.NET desktop scaffolding (WinForms / WPF / Avalonia) — generates CLAUDE.md, scoped rules, .editorconfig, Directory.Build.props, global.json. Audits coupling (UI/logic, God Classes). Triggers — dotnet setup, .NET scaffolding, WPF project, WinForms project, editorconfig.
---

# dotnet-desktop-setup

Skill de setup para projetos C#/.NET desktop no Claude Code. Funciona como um wizard que analisa
o estado atual do ambiente e codebase, depois gera ou atualiza arquivos de configuracao para
maximizar a qualidade do codigo gerado pelo Claude.

Usa **progressive disclosure** — este arquivo contem o workflow e decisoes. Templates e guias
detalhados ficam em `references/` e sao lidos sob demanda.

---

## Quando usar

- Configurar um novo projeto .NET para Claude Code
- Melhorar CLAUDE.md de um projeto C# existente
- Adicionar padroes de codificacao (.editorconfig, regras escopadas)
- Preparar codebase para desacoplamento UI (WinForms -> WPF/Avalonia)
- Configurar convencoes de teste xUnit
- Auditar acoplamento UI/negocio no codebase

---

## Workflow: 8 Passos

Duas ordens importam: a auditoria (Passo 1) vem antes de tudo — os outros passos usam o que ela mede
(SDK instalado, configs existentes, acoplamento); e o CLAUDE.md do projeto (Passo 4) vem antes das
regras escopadas (Passo 5), porque `domain.md` e extraido dele. Os demais passos sao independentes —
pule ou reordene conforme o cenario (secao "Tratamento de Cenarios"). Cada passo verifica o estado
atual antes de agir — nunca sobrescreve arquivos existentes sem apresentar diff ao usuario.

### Passo 1: Auditoria do Ambiente

Tente executar `scripts/audit-environment.sh` (requer Git Bash no Windows).
Se bash nao estiver disponivel, execute os comandos equivalentes inline usando as ferramentas
Bash, Grep e Glob do Claude Code:

- `dotnet --list-sdks` para listar SDKs
- Glob para verificar existencia de arquivos de config
- Grep para escanear acoplamento (MessageBox, System.Windows.Forms, public static)
- Grep para contar [Fact] e [Theory]

O script/auditoria coleta:
- SDKs .NET instalados (`dotnet --list-sdks`)
- Arquivos de config existentes (CLAUDE.md, .editorconfig, Directory.Build.props, global.json, .claude/rules/)
- Estrutura da solution (.sln → projetos e target frameworks)
- Indicadores de acoplamento UI:
  - `MessageBox.Show()` em arquivos que NAO sao Form*.cs
  - `System.Windows.Forms` em classes fora da camada UI
  - Campos `public static` mutaveis (padrao Global.cs)
- Cobertura de testes (contagem de [Fact] e [Theory])

Apresente o relatorio ao usuario antes de prosseguir. Se o usuario pediu apenas auditoria, pare aqui.

### Passo 2: global.json

Gere `global.json` na raiz da solution para fixar a versao do SDK:

```json
{
  "sdk": {
    "version": "<versao-mais-alta-instalada>",
    "rollForward": "latestFeature"
  }
}
```

- Use a versao mais alta detectada no Passo 1
- `rollForward: latestFeature` permite patch updates sem quebrar
- Se `global.json` ja existe, mostre diff e pergunte ao usuario

### Passo 3: CLAUDE.md Global (~/.claude/CLAUDE.md)

Leia `references/global-claude-md-template.md` para o template completo.

Este arquivo contem convencoes que se aplicam a **qualquer** projeto C#/.NET do usuario:
- Naming conventions (PascalCase publico, _camelCase privado)
- Padroes .NET CLI (--filter, --no-restore, -v q)
- Convencoes de teste (Arrange/Act/Assert, nomenclatura)
- Anti-padroes universais (MessageBox em dominio, static mutavel)
- Preferencias de linguagem C# moderna (file-scoped namespaces, pattern matching, collection expressions)

**Regra:** Se `~/.claude/CLAUDE.md` ja existe, nao sobrescreva. Leia o conteudo atual, identifique
lacunas comparando com o template, e proponha apenas as adicoes necessarias.

### Passo 4: CLAUDE.md do Projeto

Leia `references/project-claude-md-template.md` para o template.

O CLAUDE.md do projeto segue o framework **WHAT-WHY-HOW**:
- **WHAT**: Stack exata com versoes, modelos de dados, dominio
- **WHY**: Decisoes arquiteturais e motivacoes
- **HOW**: Comandos exatos de build/test/release

Limite: **300 linhas maximo** — acima disso, mova conteudo para `.claude/rules/` (Passo 5). Se o
existente ja esta bom (como projetos com CLAUDE.md detalhado), proponha apenas melhorias incrementais:
- Adicionar secao de convencoes se ausente
- Adicionar referencia a codigo canonico (ex: "Para novo service, veja `Services/LicenseValidationService.cs`")
- Adicionar anti-padroes especificos do projeto

### Passo 5: Regras Escopadas (.claude/rules/)

Leia `references/scoped-rules-templates.md` para os 4 templates.

Regras escopadas usam YAML frontmatter com `paths:` para ativar apenas em arquivos relevantes:

| Arquivo | Escopo | Conteudo |
|---------|--------|----------|
| `testing.md` | `**/*Tests*/**` | Convencoes xUnit, Arrange/Act/Assert, nomenclatura |
| `ui-decoupling.md` | `**/*.cs` | Onde MessageBox e permitido, separacao de camadas |
| `architecture.md` | `**/*.cs` | Direcao de dependencias, DI, camadas |
| `domain.md` | `**/*.cs` | Glossario de dominio, regras de validacao especificas |

Para `domain.md`, analise o CLAUDE.md existente e extraia terminologia do projeto.

Crie o diretorio `.claude/rules/` se nao existir. Para regras que ja existem, mostre diff.

### Passo 6: .editorconfig

Leia `references/editorconfig-template.md` para o template completo.

Pontos criticos para projetos .NET desktop:
- `charset = utf-8-bom` — necessario para caracteres especiais (portugues, acentos)
- `end_of_line = crlf` — padrao Windows
- Naming rules com severity `warning` (nao `error`) para adocao gradual
- Analyzers CA relevantes habilitados, CA2007 desabilitado (nao relevante para desktop)

Se `.editorconfig` ja existe, mostre diff. Nunca sobrescreva.

### Passo 7: Directory.Build.props

Gere `Directory.Build.props` na raiz da solution com propriedades compartilhadas.

**Cuidado com frameworks mistos!** Se a solution tem projetos em net5.0, net6.0 e net8.0,
use condicoes para nao quebrar builds:

```xml
<Project>
  <PropertyGroup>
    <Nullable>enable</Nullable>
    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
  </PropertyGroup>
  <PropertyGroup Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net6.0'))">
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
</Project>
```

Apos gerar, **sempre** valide: `dotnet build <solution>.sln`

Se `Directory.Build.props` ja existe, mostre diff. Nunca sobrescreva.

### Passo 8: Hooks Claude Code (recomendacao)

Apresente ao usuario como **recomendacao**, nao aplique automaticamente. Build rapido apos cada
edicao de arquivo C#, em `.claude/settings.json` — o comando fica dentro de `hooks[]`, com `type`:

```json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "dotnet build --no-restore -v q 2>&1 | tail -5"
          }
        ]
      }
    ]
  }
}
```

Claude Code nao tem evento de commit: para rodar `dotnet test --no-build -v q` antes de cada commit,
use um git hook `pre-commit` do proprio repositorio.

Explique: hooks de build a cada edicao podem ser lentos em solutions grandes. O usuario decide.

---

## Tratamento de Cenarios

### Projeto novo (sem configs)
Execute todos os 8 passos na ordem.

### Projeto existente com config parcial
1. Execute Passo 1 (auditoria)
2. Apresente o que existe vs o que falta
3. Pergunte ao usuario quais passos executar
4. Para cada arquivo existente, mostre diff das adicoes propostas

### Apenas auditoria
Execute apenas Passo 1, apresente relatorio.

### Apenas regras escopadas
Execute Passo 1 (rapido) + Passo 5.

---

## Guias de Referencia (progressive disclosure level 3)

Leia estes arquivos **somente quando necessario** no passo correspondente:

| Arquivo | Leia quando... |
|---------|----------------|
| `references/global-claude-md-template.md` | Passo 3 — criando/atualizando CLAUDE.md global |
| `references/project-claude-md-template.md` | Passo 4 — criando/atualizando CLAUDE.md do projeto |
| `references/scoped-rules-templates.md` | Passo 5 — criando regras em .claude/rules/ |
| `references/editorconfig-template.md` | Passo 6 — criando .editorconfig |
| `references/decoupling-guide.md` | Usuario pede ajuda com desacoplamento UI ou arquitetura |
| `references/testing-guide.md` | Usuario pede ajuda com setup/padroes de testes xUnit |

---

## Detalhes Criticos (aprendidos nos testes)

Estes pontos falharam consistentemente quando a skill nao foi usada:

1. **utf-8-bom, nao utf-8** — Projetos em portugues precisam de `charset = utf-8-bom` no .editorconfig: utf-8 sem BOM causa problemas com acentos em builds do Visual Studio.

2. **YAML frontmatter nas regras escopadas** — Toda regra em `.claude/rules/` precisa de frontmatter com `paths:`; sem isso, a regra carrega em todo contexto e polui o prompt.

3. **Condicoes no Directory.Build.props** — Solutions com frameworks mistos (net5.0 + net8.0) quebram se voce aplicar `<ImplicitUsings>enable</ImplicitUsings>` sem condicao de framework. Sempre use `Condition="$([MSBuild]::IsTargetFrameworkCompatible(...))"`.

4. **CLAUDE.md global vs projeto** — Crie ambos, com conteudo distinto: `~/.claude/CLAUDE.md` guarda o que vale para qualquer projeto C#/.NET do usuario (naming, CLI, anti-padroes universais); `./CLAUDE.md` guarda so o que e deste projeto (stack, dominio, comandos). Convencao universal no arquivo do projeto se repete a cada projeto; convencao do projeto no global vaza para os outros.

5. **Nunca sobrescrever CLAUDE.md existente** — Proponha adicoes como diff. O usuario pode ter contexto importante que seria perdido.

6. **Global.cs e estado estatico** — Sempre incluir na auditoria a busca por `public static` mutavel. E o acoplamento mais insidioso e facil de esquecer.

7. **Atualizar docs apos migracao UI** — Quando a skill gera CLAUDE.md para um projeto que depois migra de WinForms para WPF, os nomes de arquivos UI e a descricao do stack ficam desatualizados. Sempre verificar se referencias a Form*.cs ainda existem apos migracao. Veja `references/decoupling-guide.md` secao "Checklist Pos-Migracao".

---

## Anti-padroes desta Skill

Evite estes erros ao executar o workflow:

- **Fixar SDK nao instalado** — global.json deve refletir o que `dotnet --list-sdks` retorna
- **Adicionar pacotes sem consultar** — Nao adicione FluentAssertions, NSubstitute etc. sem perguntar
- **Forcar MVVM em WinForms** — WinForms nao tem data binding nativo. Use Passive View/MVP como intermediario
- **Ignorar convencoes existentes** — Se o projeto usa portugues nos testes, mantenha. Se usa Assert direto, nao force FluentAssertions