Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 117 additions & 20 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -1,42 +1,139 @@
# Copilot Instructions — PawnPro Extension

## Contexto
## O que é este projeto

Extensão VS Code para Pawn (SA-MP / open.mp). TypeScript com arquitetura em duas camadas:
Extensão para a linguagem **Pawn** (SA-MP / open.mp). Divide-se em duas camadas:

- `src/core/` — lógica pura, zero imports de `vscode`
- `src/vscode/` — adaptação para APIs do VS Code
- **`src/core/`** — lógica pura TypeScript, zero imports de `vscode`. Testável fora do editor.
- **`src/editor/`**camada de adaptação: conecta `core/` às APIs do editor.

Motor de análise externo em Rust (`pawnpro-engine`) comunicado via LSP.

## Regras de código
---

- Nunca importar `vscode` em `src/core/`. Expor interfaces em `types.ts` e injetar via `vscode/`.
- Mensagens ao usuário sempre via `src/vscode/nls.ts` usando `vscode-nls`. Nunca strings hardcoded.
- Configuração sempre lida via `PawnProConfigManager`. Nunca `vscode.workspace.getConfiguration` fora de `configBridge.ts`.
- Sem `any` — usar tipos precisos ou `unknown` com narrowing.
- Sem comentários óbvios. Apenas comentários que explicam *por quê*.
- Erros de `async` sempre com `void` ou `await` — nunca promises flutuando sem tratamento.
## Regras absolutas

## Arquivos principais
- **Nunca importar `vscode` em `src/core/`**. Expor interfaces em `core/types.ts` e injetar via `editor/`.
- **Nunca escrever comentários óbvios**. Apenas comentários que explicam *por quê* — restrições ocultas, invariantes sutis, workarounds de bugs específicos.
- **Mensagens ao usuário sempre via `src/editor/nls.ts`**. Nunca strings hardcoded em outros arquivos.
- **Nunca mencionar "VS Code", "Copilot" ou qualquer marca de produto em strings visíveis ao usuário**. Use termos neutros: "editor", "assistente", etc.
- **Configuração sempre via `PawnProConfigManager`**. Nunca ler `vscode.workspace.getConfiguration('pawnpro')` diretamente fora de `configBridge.ts`.
- **`pawnpro.ui.separateContainer` é a única chave em `contributes.configuration`**. Todas as outras ficam em `.pawnpro/config.json`.
- Sem `any` — usar tipos precisos ou `unknown` com narrowing. Para objetos de configuração do editor: `get<Record<string, unknown>>()`, nunca `get<any>()`.
- Promises sempre tratadas com `await` ou `void` — nunca flutuando sem tratamento.

- `src/core/types.ts` — todos os tipos: `PawnProConfig`, `ServerConfig`, `HoverData`, etc.
- `src/core/config.ts` — `PawnProConfigManager` com deep merge e file watching
- `src/vscode/extension.ts` — entry point `activate`/`deactivate`
- `src/vscode/lspClient.ts` — inicialização e comunicação com o motor Rust
- `src/vscode/nls.ts` — strings localizadas (PT-BR padrão, EN via `package.nls.en.json`)
- `src/vscode/configBridge.ts` — ponte entre VS Code settings e `PawnProConfigManager`
---

## Configuração do projeto
## Arquitetura de configuração

Configurações em `.pawnpro/config.json` (projeto) e `~/.pawnpro/config.json` (global). A única chave em `contributes.configuration` é `pawnpro.ui.separateContainer`.
```
~/.pawnpro/config.json ← global (todos os projetos)
.pawnpro/config.json ← projeto (sobrescreve global)
.pawnpro/state.json ← estado local (favoritos, histórico)
```

`PawnProConfigManager` (`src/core/config.ts`) faz deep merge: projeto sobrescreve global, que sobrescreve defaults. O `deepMerge` bloqueia `__proto__`, `constructor`, `prototype`.

`${workspaceFolder}` em strings de config é substituído em runtime por `substituteWorkspace()`.

---

## Arquivos-chave

| Arquivo | Responsabilidade |
|---------|-----------------|
| `src/core/types.ts` | Todos os tipos compartilhados — `PawnProConfig`, `ServerConfig`, `HoverData`, etc. |
| `src/core/config.ts` | `PawnProConfigManager` — leitura, merge, watch, `onChange` |
| `src/core/state.ts` | `PawnProStateManager` — favoritos e histórico do servidor |
| `src/core/server.ts` | `LogTailer`, `SampRconClient`, detecção de executável, leitura de `server.cfg`/`config.json` |
| `src/core/includes.ts` | `buildIncludePaths`, `resolveInclude`, `listIncFilesRecursive`, `listNatives` |
| `src/core/themes.ts` | `AVAILABLE_SCHEMES`, `readSchemeFromFile`, `mergeTokenColors`, `pickAutoScheme` |
| `src/core/flags.ts` | `detectSupportedFlags`, `computeMinimalArgs` — introspecção de flags do compilador |
| `src/core/utils.ts` | `isPawnFile`, `pathExists`, `quoteIfNeeded`, `resolveInclude` |
| `src/editor/extension.ts` | Entry point — `activate` / `deactivate` |
| `src/editor/configBridge.ts` | Inicializa config/state, watchers de arquivo, dispara `sendConfigurationToEngine` no `onChange` |
| `src/editor/lspClient.ts` | `startLspClient`, `stopLspClient`, `restartLspClient`, `sendConfigurationToEngine` |
| `src/editor/nls.ts` | Todas as strings localizadas via `vscode-nls` |
| `src/editor/settingsView.ts` | WebView de configurações — `registerSettingsView` |
| `src/editor/serverView.ts` | `ServerViewProvider` — WebView do console do servidor |
| `src/editor/statusBar.ts` | Menu rápido da status bar |
| `src/editor/server.ts` | `ServerController` (terminal + RCON + log tail) |
| `src/editor/templates.ts` | Criação de scripts a partir de templates embutidos |
| `src/editor/themes.ts` | Comandos `applySyntaxScheme` / `resetSyntaxScheme` |

---

## Motor LSP (pawnpro-engine)

Repositório irmão em `../pawnpro-engine/` (Rust).

O motor recebe configuração via `initializationOptions` no `initialize` LSP:

```json
{
"workspaceFolder": "/caminho/do/projeto",
"includePaths": ["/caminho/pawno/include"],
"warnUnusedInInc": false,
"suppressDiagnosticsInInc": false,
"sdkFilePath": "/caminho/open.mp.inc",
"locale": "pt-BR"
}
```

Atualizações em tempo real via `workspace/didChangeConfiguration` — função `sendConfigurationToEngine` em `lspClient.ts`. Quando a configuração muda, a engine republica os diagnósticos de todos os arquivos abertos em paralelo (`join_all`).

O `restartLspClient` **recria o cliente LSP do zero** (stop + startLspClient com a config atual). Não usa `client.restart()` — que reenviaria as `initializationOptions` originais e perderia mudanças de config.

O locale é resolvido por `resolveLocale(cfg)`: usa `cfg.locale` se definido, senão `vscode.env.language`. A engine aceita qualquer string começando com `"pt"` como PT-BR; qualquer outra coisa vira EN.

---

## Internacionalização

Todas as mensagens visíveis ao usuário ficam em `src/editor/nls.ts` usando `vscode-nls`. Os arquivos de tradução são:

- `package.nls.json` — PT-BR (padrão)
- `package.nls.en.json` — EN

Ao adicionar uma nova mensagem: adicione em `nls.ts` com `localize('chave', 'texto padrão')`. Se a chave também aparecer em `package.json`, adicione em ambos os arquivos NLS.

---

## Build

```bash
bash scripts/build.sh
```

Executa `npx tsc`, depois `node scripts/bundle.mjs` (esbuild — gera `out/editor/extension.js` único), depois `repack-vsix.js` (embute `iconv-lite`, `safer-buffer`, `vscode-nls`).

Só TypeScript:
```bash
npx tsc -p .
```

**Build da engine:**
```bash
cd ../pawnpro-engine && cargo build --release
cp target/release/pawnpro-engine ../pawnpro/engines/pawnpro-engine-linux-x64
```

---

## Diagnósticos do motor (PP0001–PP0013)

Ver `docs/features.md` para a tabela completa. Os diagnósticos são emitidos pelo processo Rust externo via LSP.

---

## Gotchas

- `deepMerge` em `config.ts` precisa de `as unknown as Record<string, unknown>` nos casts de `PawnProConfig`.
- Callback de `fs.watch` precisa de tipos explícitos: `(_: string, filename: string | null)`.
- Temas usam `ConfigurationTarget.Global` (não `Workspace`) para não criar `.vscode/settings.json`.
- O tail de log do servidor só funciona em Linux e macOS (`!IS_WINDOWS`).
- `pawnpro.cacheStats` foi removido — não registrar handler para ele.
- Ao alterar `syntax.scheme` via comando, `applyOnStartup` é automaticamente definido como `true` pela extensão.
- `open_docs` na engine guarda a chave como URI completa (`file:///...`). Nunca fazer `format!("file://{}", key)` — já tem o prefixo.
- A pasta da camada de editor é `src/editor/` — **nunca** `src/vscode/` (foi renomeada). O bundle vai para `out/editor/extension.js`.
- `core/server.ts` tem `stripQuotes()` para normalizar paths — não recriar em `editor/`.
29 changes: 29 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Docs

on:
push:
branches: [master]
paths:
- 'docs/**'
- 'mkdocs.yml'

permissions: {}

jobs:
deploy:
name: Build & Deploy
runs-on: ubuntu-latest
permissions:
contents: write

steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Install MkDocs Material
run: pip install mkdocs-material

- name: Deploy to GitHub Pages
run: mkdocs gh-deploy --force
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ node_modules
out/
*.vsix
engines/
.claude
.claude
site/
11 changes: 10 additions & 1 deletion .vscodeignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
# Fontes — nunca incluir no VSIX
src/**

# Documentação
# Documentação interna e de repositório
docs/**
CLAUDE.md
SECURITY.md
SUPPORT.md
CODE_OF_CONDUCT.md
CONTRIBUTING.md
changelogs/**
mkdocs.yml

# Source maps
out/**/*.map
Expand All @@ -14,6 +21,8 @@ tsconfig.json
scripts/
.gitignore
.claude
package-lock.json
*.vsix

# CI/CD
.github/**
Expand Down
32 changes: 32 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,44 @@ Todas as mudanças notáveis neste projeto serão documentadas aqui.
O formato é baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.0.0/),
e este projeto adere ao [Semantic Versioning](https://semver.org/lang/pt-BR/).

Podem existir falhas ou itens não declarados, causados por falha humana ou por IA, caso encontre por favor relate para ajudar a manter a consistência dos dados.

## Versões anteriores

- [Versões 2.x e anteriores](changelogs/CHANGELOG_v2.md)

---

## [3.2.0] - 29/04/2026

### Adicionado
- **`analysis.suppressDiagnosticsInInc`** — nova chave de configuração; suprime todos os diagnósticos dentro de arquivos `.inc` quando `true`
- **`locale`** — nova chave de configuração; define o idioma das mensagens de diagnóstico do motor LSP (`""` = automático, `"pt-BR"`, `"en"`)
- **`analysis.sdk.platform: "auto"`** — novo valor para detecção automática: busca `open.mp.inc` em `qawno/include/` e nos `includePaths`; assume SA-MP se não encontrar
- **Painel de configurações gráfico (`pawnpro.openSettings`)** — interface WebView substitui o bloco `contributes.configuration` nativo; edição visual de todas as chaves sem tocar em JSON
- **Suporte a `.p` e `.pawn`** — extensões adicionadas ao contributes da linguagem Pawn; IntelliSense e diagnósticos passam a cobrir esses arquivos
- **`src/editor/`** — nova pasta da camada de adaptação (renomeada de `src/vscode/`); isolamento completo entre lógica pura (`core/`) e APIs do editor

### Alterado
- **`analysis.sdk.platform`** — default alterado de `"omp"` para `"auto"`
- **`main` do pacote** — agora aponta para `./out/editor/extension.js` (reflete a renomeação da pasta)
- **`SdkPlatform`** — tipo expandido: `'auto' | 'omp' | 'samp' | 'none'`
- **`PawnProConfigManager`** — merge simplificado: camada `externalDefaults` (settings do VS Code) removida; merge direto de DEFAULTS → global → projeto
- **`AnalysisConfig`** — recebe `suppressDiagnosticsInInc` e `locale`
- **Tipos auxiliares removidos de `src/core/types.ts`** — `HoverData`, `HoverSection`, `HoverParams`, `DiagnosticData` (responsabilidade transferida integralmente ao motor Rust)

### Removido
- **`contributes.configuration`** — bloco inteiro removido do `package.json`; as chaves `pawnpro.*` nativas do VS Code não existem mais; todas as configurações vivem em `.pawnpro/config.json` / `~/.pawnpro/config.json`
- **`PawnProConfigManager.setExternalDefaults`** — método removido (não há mais sync com `vscode.workspace.getConfiguration`)
- **`PawnProConfigManager.hasProjectConfig` / `hasGlobalConfig`** — métodos auxiliares removidos
- **`src/vscode/`** — pasta inteiramente deletada; conteúdo migrado e refatorado em `src/editor/`
- **`src/core/utils.ts`** — removido; funções redistribuídas para os módulos que as usam

### Detalhe importante
- Podem haver alguns dados que não foram mencionados ou que foram esquecidos de serem adicionados a este arquivo, não intencionalmente mas sim pelo fator humano.

---

## [3.1.0] - 20/04/2026

### Adicionado
Expand Down
Loading
Loading