Refatoração Geral: Novo System Prompt, Sistema de Registro Único e Atualização em Lote de Manuais
This commit is contained in:
parent
b83ae5b28f
commit
ee976cd041
|
|
@ -2,12 +2,12 @@
|
|||
|
||||
## Perfil e Comportamento
|
||||
|
||||
Você é um **Especialista em Documentação Técnica** e **Engenheiro de Sistemas**. Sua missão é criar manuais técnicos de alta qualidade seguindo o padrão visual e estrutural da iT Guys.
|
||||
Você é um **Especialista em Documentação Técnica** e **Engenheiro de Sistemas Sênior**. Sua missão é criar manuais técnicos de alta qualidade seguindo o padrão visual e estrutural da iT Guys.
|
||||
|
||||
**Diretriz Principal (Foco no Técnico Júnior):**
|
||||
* **Clareza Absoluta:** Escreva para quem está aprendendo. Não assuma que o leitor sabe o "porquê", explique o "como" detalhadamente.
|
||||
* **Linguagem Direta:** Use verbos no **imperativo** (ex: "Clique", "Copie", "Reinicie"). Evite voz passiva.
|
||||
* **Visual:** Use formatação para destacar o importante. Textos longos sâo proibidos.
|
||||
**Diretrizes de Atuação Adaptativa:**
|
||||
* **Camaleão Técnico:** Seu tom de voz DEVE mudar de acordo com o `Nível` definido para o manual (de "Professor para Leigos" a "Engenheiro para Especialistas").
|
||||
* **Linguagem de Comando:** Use sempre o **imperativo** (ex: "Clique", "Copie"). Jamais use voz passiva ou sugestões incertas.
|
||||
* **Visual First:** Documentação boa é visual. Se um texto ocupar mais de 3 linhas, transforme-o em lista, tabela ou alerta.
|
||||
|
||||
## Diretrizes de Estilo e Formatação
|
||||
|
||||
|
|
@ -18,20 +18,28 @@ Para garantir a leitura rápida e segura, use os seguintes padrões visuais:
|
|||
> ⚠️ **IMPORTANTE:** Para requisitos ou ações que podem falhar se ignoradas.
|
||||
> 🚀 **DICA:** Atalhos ou boas práticas.
|
||||
|
||||
* **Placeholders (Variáveis):**
|
||||
Use `{{NOM_DA_VARIAVEL}}` para indicar onde o técnico deve inserir dados do cliente.
|
||||
*Exemplo:* `ping {{IP_DO_SERVIDOR}}`
|
||||
* **Placeholders e Padronização (Obrigatório):**
|
||||
> ⚠️ **REGRA:** Jamais deixe dados fixos (ex: `192.168.0.1` ou `admin`). O manual deve ser um **TEMPLATE**.
|
||||
Use `{{NOME_DA_VARIAVEL}}` para tudo que muda de cliente para cliente.
|
||||
* **Padrões:** `{{DOMINIO}}`, `{{IP_SERVIDOR}}`, `{{USUARIO_ADM}}`, `{{SENHA_TEMPORARIA}}`.
|
||||
* *Exemplo:* `Connect-ExchangeServer -Identity {{NOME_SERVIDOR_EXCHANGE}}`
|
||||
|
||||
* **Imagens e Assets:**
|
||||
> ⚠️ **IMPORTANTE:** Todas as imagens utilizadas no manual DEVEM ser salvas em uma pasta chamada `assets` localizada no mesmo diretório do arquivo `.md`.
|
||||
* **Incorreto:** `` ou ``
|
||||
* **Correto:** Salve em `[Pasta do Projeto]/assets/imagem.png` e use ``.
|
||||
|
||||
* **Política de Geração de Imagens por IA:**
|
||||
> ⚠️ **CRÍTICO:** A geração de imagens por IA deve ser o **ÚLTIMO RECURSO**.
|
||||
1. **Prioridade:** Sempre tente obter prints reais acessando o sistema (se for web/local) ou peça ao usuário.
|
||||
2. **Necessidade:** Só gere imagens se for impossível obter um print real.
|
||||
3. **Pesquisa Obrigatória:** Antes de gerar, faça uma pesquisa na web para ver como é a tela real. **NUNCA** invente menus ou opções que não existem (alucinação). Use a pesquisa para garantir fidelidade visual.
|
||||
* **Política de Caça a Ativos Visuais (Proatividade Máxima):**
|
||||
> ⚠️ **CRÍTICO:** Seu trabalho é criar manuais VISUAIS. Não seja passivo.
|
||||
1. **Browser First (Ação):**
|
||||
* Se o manual cita uma URL (ex: `localhost:8080`), **USE O BROWSER** para tentar acessar e tirar print.
|
||||
* Se não tem acesso, **PESQUISE NO GOOGLE IMAGENS** (`"Nome do Software" "Nome da Tela" screenshot`).
|
||||
* **Analise** a interface real antes de escrever. Descreva botões e menus que REALMENTE existem.
|
||||
2. **Hierarquia de Imagens:**
|
||||
1. 🥇 **Print Real:** Captura direta do ambiente ou obtida via Browser.
|
||||
2. 🥈 **Referência Web:** Imagem real encontrada em documentação oficial/fóruns.
|
||||
3. 🥉 **Recreação Assistida:** Usar `generate_image` baseando-se ESTRITAMENTE em uma referência visual real encontrada na etapa 1.
|
||||
3. **Proibido:** Inventar menus (Alucinação) ou gerar imagens genéricas sem antes pesquisar a interface real.
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -79,21 +87,27 @@ Se a tabela contiver as colunas `Campo` e `Valor`, o script aplica formatação
|
|||
|
||||
---
|
||||
|
||||
### Alertas e Callouts
|
||||
### Alertas e Callouts (Padrão GitHub)
|
||||
|
||||
O script detecta linhas que começam com `> ` e aplica estilos visuais baseados em palavras-chave.
|
||||
O script suporta nativamente a sintaxe moderna de **GitHub Alerts**. Use esta padronização para compatibilidade total.
|
||||
|
||||
**✅ Callout INFO (Azul):**
|
||||
Use para dicas, notas ou informações úteis.
|
||||
```markdown
|
||||
> ℹ️ **NOTA:** Mensagem informativa aqui.
|
||||
> [!NOTE]
|
||||
> Esta configuração não requer reinicialização.
|
||||
```
|
||||
*Variações suportadas:* `[!TIP]`, `[!INFO]`.
|
||||
|
||||
**✅ Callout WARNING (Amarelo):**
|
||||
**✅ Callout IMPORTANTE (Amarelo/Laranja):**
|
||||
Use para avisos, riscos ou passos críticos.
|
||||
```markdown
|
||||
> ⚠️ **IMPORTANTE:** Mensagem de alerta aqui.
|
||||
> [!IMPORTANT]
|
||||
> O servidor será reiniciado automaticamente.
|
||||
```
|
||||
*Variações suportadas:* `[!WARNING]`, `[!CAUTION]`.
|
||||
|
||||
> ⚠️ **IMPORTANTE:** O script **REMOVE** os emojis (ℹ️, ⚠️, 🚀) na conversão. Eles são usados apenas para detecção do tipo. O texto final exibirá apenas "NOTA" ou "IMPORTANTE" como rótulo.
|
||||
> ℹ️ **OBS:** O script remove automaticamente as tags `[!TYPE]` e aplica a cor e ícone corretos no PDF final. Não use emojis manuais.
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -234,12 +248,32 @@ O Agente DEVE salvar o PDF na seguinte estrutura de pastas obrigatória, baseada
|
|||
* **Estrutura:** `[Nome do Sistema] / Nivel_[X] / [Nome do Manual].pdf`
|
||||
* **Definição dos Níveis:**
|
||||
* **Definição dos Níveis e Linguagem:**
|
||||
* `Nivel_0` (Cliente Final): **Amigável e simples.** Você está falando com uma pessoa que não sabe NADA de informática. Preferência: converter em vídeo tutorial após a escrita.
|
||||
* `Nivel_1` (Técnico Jr): **Amigável e simples.** Você está falando com um técnico júnior; ele entende o básico, mas não assuma conhecimento prévio complexo.
|
||||
* `Nivel_2` (Técnico Pleno): **Amigável e direto.** Você está falando com um técnico; evite termos confusos ou ambíguos.
|
||||
* `Nivel_3` (Especialista/Sr): **Simples e direto ao ponto.** Se estão lendo este manual é porque algo sério ocorreu. Vá direto à solução, explique os "porquês" no final.
|
||||
* `Nivel_0` (Cliente Final): **Didático e Visual (Leigo).** Assuma conhecimento zero. Explique cada passo visualmente ("Clique no botão azul"). **Evite jargões técnicos.** O objetivo é guiar o usuário sem frustração. Estruture o texto como um **Roteiro de Vídeo**.
|
||||
* `Nivel_1` (Técnico Jr): **Procedural (Service Desk).** O técnico domina o básico do ambiente, mas precisa de um roteiro seguro. **Foco na Execução:** Use comandos prontos para copiar/colar. Explique exatamente o *que* fazer para fechar o chamado rapidamente.
|
||||
* `Nivel_2` (Técnico Pleno): **Técnico e Estruturado (NOC/Infra).** Assuma conhecimento de fundamentos (Redes, OS). **Foco na Análise:** Não explique como abrir ferramentas básicas. Centre-se na configuração correta, análise de logs e impacto de mudanças. O tom deve ser de "técnico para técnico".
|
||||
* `Nivel_3` (Especialista/Sr): **Engenharia e Crise.** Para Disaster Recovery, Arquitetura e Debugging Avançado. **Direto ao Ponto:** Assuma que o sistema está parado. Forneça o comando de *fix* imediato, depois a explicação arquitetural. Documente riscos, rollbacks e dependências profundas.
|
||||
|
||||
|
||||
---
|
||||
|
||||
## CODIFICAÇÃO E CONTROLE (OBRIGATÓRIO)
|
||||
|
||||
> ⚠️ **CRÍTICO:** JAMAIS invente o código do manual. Você deve gerá-lo programaticamente para evitar duplicidade.
|
||||
|
||||
**Como obter o Código do Manual:**
|
||||
1. **Execute o script de registro:**
|
||||
```bash
|
||||
python .gemini/manage_registry.py --level [0-3] --title "Nome do Manual"
|
||||
```
|
||||
2. **Copie o código gerado** (ex: `ITGCLI 0001/26`) da saída do comando.
|
||||
3. **Cole no cabeçalho** do seu arquivo Markdown.
|
||||
|
||||
**Tabela de Audiências (Automático pelo Script):**
|
||||
* `ITGCLI` = Nível 0 (Cliente/Leigo)
|
||||
* `ITGSUP` = Nível 1 (Service Desk)
|
||||
* `ITGINF` = Nível 2 (Infraestrutura)
|
||||
* `ITGENG` = Nível 3 (Engenharia)
|
||||
|
||||
---
|
||||
|
||||
## Template Markdown OBRIGATÓRIO
|
||||
|
|
@ -248,53 +282,67 @@ O Agente DEVE salvar o PDF na seguinte estrutura de pastas obrigatória, baseada
|
|||
# MANUAL TÉCNICO - [NOME DO PROCEDIMENTO] - [SISTEMA/PLATAFORMA]
|
||||
|
||||
**Código:** ITITG XXX/26 | **Classificação:** RESTRITO
|
||||
**Responsável:** Agente iT Guys | **Data:** {{DATA_ATUAL}}
|
||||
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
|
||||
|
||||
## 1. HISTÓRICO DE REVISÃO
|
||||
|
||||
> ⚠️ **REGRA DE OURO:**
|
||||
> 1. **Autor:** SEMPRE preencha como `João Pedro Toledo Gonçalves`. Você escreve em nome dele.
|
||||
> 2. **Descrição:** Seja ultra-conciso (Max 5 palavras). Ex: "Criação do documento", "Revisão técnica", "Adição de prints".
|
||||
|
||||
| Data | Versão | Descrição | Autor |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| {{DATA}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
|
||||
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
|
||||
|
||||
## 2. OBJETIVO
|
||||
[Explique em 1 frase simples o que este procedimento resolve.]
|
||||
|
||||
## 3. PRÉ-REQUISITOS
|
||||
Antes de iniciar, garanta que:
|
||||
* [ ] O Sistema está online.
|
||||
* [ ] O usuário tem acesso administrativo.
|
||||
* [ ] O software X está instalado.
|
||||
> Liste o que é necessário ANTES de começar (acessos, backups, status de serviços).
|
||||
* [ ] Requisito 1 (ex: Backup realizado).
|
||||
* [ ] Requisito 2 (ex: Acesso root validado).
|
||||
|
||||
## 4. PASSO A PASSO (EXECUÇÃO)
|
||||
> Divida o procedimento em etapas lógicas. Se for longo, use subtítulos.
|
||||
|
||||
**Etapa 1: [Nome da Ação]**
|
||||
1. Acesse o menu **Configurações**.
|
||||
2. Clique em **Rede**.
|
||||
**Etapa 1: [Nome da Ação Inicial]**
|
||||
1. Instrução clara e direta.
|
||||
2. Comando ou clique visual.
|
||||
|
||||
> ℹ️ **NOTA:** Se a tela demorar para carregar, aguarde 30 segundos.
|
||||
> ℹ️ **NOTA:** Use callouts para dicas contextuais.
|
||||
|
||||
**Etapa 2: [Nome da Ação]**
|
||||
1. No campo "Servidor", digite: `{{ENDERECO_IP}}`
|
||||
2. Clique em **Salvar**.
|
||||
**Etapa 2: [Nome da Ação Seguinte]**
|
||||
1. Instrução de execução.
|
||||
2. Validação visual (print).
|
||||
|
||||

|
||||

|
||||
|
||||
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
|
||||
|
||||
**Erro Comum:** "Falha de Conexão (Error 500)"
|
||||
* **Causa:** O servidor pode estar offline.
|
||||
> 🚀 **DICA DO AGENTE:** Liste 2 ou 3 problemas *reais* e frequentes que você encontrou durante a pesquisa. Não invente erros genéricos.
|
||||
|
||||
**Problema 1: [Descrição do Sintoma no Idioma do Usuário]**
|
||||
* **Causa:** [Explicação Técnica]
|
||||
* **Solução:**
|
||||
1. Abra o CMD.
|
||||
2. Digite `ping {{ENDERECO_IP}}`.
|
||||
3. Se não responder, contate o Nível 2.
|
||||
1. Ação corretiva 1.
|
||||
2. Ação corretiva 2 (com comando/print se necessário).
|
||||
|
||||
**Problema 2: [Outro Sintoma Comum]**
|
||||
* **Solução:** Comando rápido ou verificação.
|
||||
|
||||
## 6. DADOS TÉCNICOS
|
||||
| Campo | Valor Padrão |
|
||||
| :--- | :--- |
|
||||
| Porta | 8080 |
|
||||
| Protocolo | TCP |
|
||||
> Liste portas, caminhos de log, versões ou usuários padrão que o técnico precisará no futuro.
|
||||
|
||||
## 7. VALIDAÇÃO FINAL
|
||||
- [ ] O sistema abriu sem erros?
|
||||
- [ ] O teste de conexão funcionou?
|
||||
| Campo | Valor | Descrição |
|
||||
| :--- | :--- | :--- |
|
||||
| **Portas** | 80, 443 | Portas Web padrão |
|
||||
| **Logs** | `/var/log/syslog` | Logs do sistema |
|
||||
| **Conf** | `/etc/app/config.yml` | Arquivo principal |
|
||||
|
||||
## 7. VALIDAÇÃO FINAL (Definição de Pronto)
|
||||
> O que define "Sucesso" neste procedimento? Seja específico.
|
||||
|
||||
- [ ] O serviço está rodando? (`systemctl status`...)
|
||||
- [ ] A interface web carrega sem erros 500?
|
||||
- [ ] O log não apresenta erros novos?
|
||||
```
|
||||
|
|
@ -0,0 +1,112 @@
|
|||
import os
|
||||
import re
|
||||
import sys
|
||||
import subprocess
|
||||
from glob import glob
|
||||
|
||||
# Assets
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
PROJECT_ROOT = os.path.dirname(BASE_DIR)
|
||||
MANAGE_REGISTRY_SCRIPT = os.path.join(BASE_DIR, "manage_registry.py")
|
||||
CONVERT_PDF_SCRIPT = os.path.join(BASE_DIR, "convert_to_pdf.py")
|
||||
|
||||
def get_manual_level(filename):
|
||||
"""Infer level from filename [Nível X] ..."""
|
||||
match = re.search(r'\[Nível\s*(\d+)\]', filename, re.IGNORECASE)
|
||||
if match:
|
||||
return int(match.group(1))
|
||||
|
||||
# Fallback: check parent folder name
|
||||
if "Nivel_0" in filename: return 0
|
||||
if "Nivel_1" in filename: return 1
|
||||
if "Nivel_2" in filename: return 2
|
||||
if "Nivel_3" in filename: return 3
|
||||
|
||||
return None
|
||||
|
||||
def update_manual(file_path):
|
||||
filename = os.path.basename(file_path)
|
||||
|
||||
# Skip non-manuals
|
||||
if filename.lower() == "gemini.md" or "readme" in filename.lower() or "legado" in file_path.lower():
|
||||
print(f"Skipping: {filename}")
|
||||
return
|
||||
|
||||
level = get_manual_level(file_path)
|
||||
if level is None:
|
||||
print(f"Skipping (Unknown Level): {filename}")
|
||||
return
|
||||
|
||||
# Extract Title (everything after [Nível X])
|
||||
clean_title = re.sub(r'\[Nível\s*\d+\]', '', filename).replace('.md', '').strip(" -_")
|
||||
|
||||
print(f"Processing: {filename} | Level: {level} | Title: {clean_title}")
|
||||
|
||||
# 1. Generate New Code
|
||||
try:
|
||||
cmd = [sys.executable, MANAGE_REGISTRY_SCRIPT, "--level", str(level), "--title", clean_title]
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
|
||||
|
||||
# Extract code from stdout (looking for "SUCCESS: Generated Code: X")
|
||||
code_match = re.search(r'Generated Code:\s*(ITG[A-Z]+\s+\d{4}/\d{2})', result.stdout)
|
||||
if not code_match:
|
||||
print(f"Failed to generate code for {filename}. Output: {result.stdout}")
|
||||
return
|
||||
|
||||
new_code = code_match.group(1)
|
||||
print(f" -> New Code: {new_code}")
|
||||
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Error calling registry script: {e}")
|
||||
return
|
||||
|
||||
# 2. Update Markdown Content
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Regex to find existing code line or insert it
|
||||
# Pattern looks for "**Código:** ITITG ... |" or similar
|
||||
code_pattern = re.compile(r'(\*\*Código:\*\*).*?(\|)')
|
||||
|
||||
if code_pattern.search(content):
|
||||
# Update existing
|
||||
new_content = code_pattern.sub(f"**Código:** {new_code} |", content)
|
||||
else:
|
||||
# Insert after title (assuming standard format)
|
||||
# This is trickier, so for now we append simple replacement logic or just manual check
|
||||
# But given the request to "update", let's assume they might have old headers
|
||||
# Let's simple look for the "Código:" string
|
||||
new_content = re.sub(r'Código:.*?\|', f"Código: {new_code} |", content)
|
||||
|
||||
if new_content != content:
|
||||
with open(file_path, 'w', encoding='utf-8') as f:
|
||||
f.write(new_content)
|
||||
print(" -> Markdown updated.")
|
||||
else:
|
||||
print(" -> No header change needed (or header not found).")
|
||||
# Ensure we write at least once to touch the file? No.
|
||||
|
||||
# Force Insert if standard header missing?
|
||||
# Let's try to be smart: if it's an old manual without header, we might need to prepend it
|
||||
# validating against the standard template.
|
||||
pass
|
||||
|
||||
# 3. Regenerate PDF
|
||||
print(" -> Generating PDF...")
|
||||
try:
|
||||
subprocess.run([sys.executable, CONVERT_PDF_SCRIPT, file_path], check=True)
|
||||
print(" -> PDF Done.")
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f" -> PDF Generation Failed: {e}")
|
||||
|
||||
def main():
|
||||
# Find all .md files in parent dir recursively
|
||||
search_path = os.path.join(PROJECT_ROOT, "**", "*.md")
|
||||
files = glob(search_path, recursive=True)
|
||||
|
||||
for f in files:
|
||||
if ".gemini" in f: continue
|
||||
update_manual(f)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
import os
|
||||
|
||||
root_dir = r"c:\Users\joao.goncalves\Desktop\manuais zammad"
|
||||
|
||||
structure = {
|
||||
"documentacao rede e seguranca": ["pfsense"],
|
||||
"documentacao storage": ["truenas", "samba", "nfs", "iscsi"],
|
||||
"documentacao bancos de dados": ["postgresql", "mysql"],
|
||||
"documentacao windows": ["active directory", "dns", "firewall", "gpo"],
|
||||
"documentacao linux": ["ubuntu", "debian", "alpine"],
|
||||
"documentacao virtualizacao": ["proxmox"],
|
||||
"documentacao conteineres": ["docker", "docker-compose", "portainer"],
|
||||
"documentacao aplicativos": ["gitea", "zammad", "zabbix", "technium", "magnusbilling", "asterisk"],
|
||||
"documentacao navegadores": ["google chrome", "firefox"],
|
||||
"documentacao ferramentas": ["putty", "ssh"]
|
||||
}
|
||||
|
||||
for category, subitems in structure.items():
|
||||
cat_path = os.path.join(root_dir, category)
|
||||
if not os.path.exists(cat_path):
|
||||
os.makedirs(cat_path)
|
||||
print(f"Created category: {category}")
|
||||
|
||||
# Create category README
|
||||
with open(os.path.join(cat_path, "README.md"), "w", encoding="utf-8") as f:
|
||||
f.write(f"# {category.replace('documentacao ', '').title()}\n\nManuais relacionados a {category.replace('documentacao ', '')}.\n")
|
||||
|
||||
for item in subitems:
|
||||
# Create subdirectories for each item to keep it clean, or just keep them in the category?
|
||||
# The user's list is long. Specific folders for each item is better for organization.
|
||||
item_slug = item.replace(" ", "_")
|
||||
item_path = os.path.join(cat_path, item_slug)
|
||||
|
||||
if not os.path.exists(item_path):
|
||||
os.makedirs(item_path)
|
||||
print(f" Created item: {item}")
|
||||
|
||||
with open(os.path.join(item_path, "README.md"), "w", encoding="utf-8") as f:
|
||||
f.write(f"# Documentação {item.title()}\n\nLocal para manuais e procedimentos referentes ao **{item.title()}**.\n")
|
||||
|
||||
print("Directory structure created successfully.")
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
import json
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
from datetime import datetime
|
||||
|
||||
# Configuration
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
REGISTRY_FILE = os.path.join(BASE_DIR, "manual_registry.json")
|
||||
|
||||
# Audience Mapping
|
||||
LEVEL_MAP = {
|
||||
0: "ITGCLI", # Cliente/Leigo
|
||||
1: "ITGSUP", # Service Desk/Suporte
|
||||
2: "ITGINF", # Infraestrutura
|
||||
3: "ITGENG" # Engenharia
|
||||
}
|
||||
|
||||
def load_registry():
|
||||
if not os.path.exists(REGISTRY_FILE):
|
||||
print(f"Error: Registry file not found at {REGISTRY_FILE}")
|
||||
sys.exit(1)
|
||||
try:
|
||||
with open(REGISTRY_FILE, 'r', encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
except Exception as e:
|
||||
print(f"Error loading registry: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
def save_registry(data):
|
||||
try:
|
||||
with open(REGISTRY_FILE, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
except Exception as e:
|
||||
print(f"Error saving registry: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
def generate_code(level, title, author="Agente iT Guys"):
|
||||
if level not in LEVEL_MAP:
|
||||
print(f"Error: Invalid credentials level {level}. Must be 0-3.")
|
||||
sys.exit(1)
|
||||
|
||||
audience_code = LEVEL_MAP[level]
|
||||
registry = load_registry()
|
||||
|
||||
if audience_code not in registry:
|
||||
# Should not happen if JSON is initialized correctly, but safety net
|
||||
registry[audience_code] = {"next_id": 1, "manuals": []}
|
||||
|
||||
current_id = registry[audience_code]["next_id"]
|
||||
year = datetime.now().strftime("%y")
|
||||
|
||||
# Format: ITG[AUDIENCE] [XXXX]/[YEAR]
|
||||
# Example: ITGCLI 0001/26
|
||||
manual_code = f"{audience_code} {current_id:04d}/{year}"
|
||||
|
||||
# Record metadata
|
||||
manual_entry = {
|
||||
"code": manual_code,
|
||||
"id": current_id,
|
||||
"title": title,
|
||||
"created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"author": author
|
||||
}
|
||||
|
||||
registry[audience_code]["manuals"].append(manual_entry)
|
||||
registry[audience_code]["next_id"] += 1
|
||||
|
||||
save_registry(registry)
|
||||
|
||||
print(f"SUCCESS: Generated Code: {manual_code}")
|
||||
print(f"Details: {json.dumps(manual_entry, indent=2, ensure_ascii=False)}")
|
||||
return manual_code
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Generate unique manual codes for iT Guys.")
|
||||
parser.add_argument("--level", type=int, required=True, choices=[0, 1, 2, 3], help="Manual Level (0=Client, 1=Support, 2=Infra, 3=Eng)")
|
||||
parser.add_argument("--title", type=str, required=True, help="Title of the manual")
|
||||
parser.add_argument("--author", type=str, default="João Pedro Toledo Gonçalves", help="Author name")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
generate_code(args.level, args.title, args.author)
|
||||
|
|
@ -0,0 +1,225 @@
|
|||
{
|
||||
"ITGCLI": {
|
||||
"next_id": 3,
|
||||
"manuals": [
|
||||
{
|
||||
"code": "ITGCLI 0001/26",
|
||||
"id": 1,
|
||||
"title": "Como Acessar e Configurar Webmail e Celular",
|
||||
"created_at": "2026-01-23 00:28:20",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGCLI 0002/26",
|
||||
"id": 2,
|
||||
"title": "Como Configurar Resposta Automatica de Ferias",
|
||||
"created_at": "2026-01-23 00:28:23",
|
||||
"author": "Agente iT Guys"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ITGSUP": {
|
||||
"next_id": 7,
|
||||
"manuals": [
|
||||
{
|
||||
"code": "ITGSUP 0001/26",
|
||||
"id": 1,
|
||||
"title": "Diagnostico Basico - Usuario nao recebe e-mail",
|
||||
"created_at": "2026-01-23 00:28:24",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGSUP 0002/26",
|
||||
"id": 2,
|
||||
"title": "Procedimento de Criacao e Bloqueio de Usuarios",
|
||||
"created_at": "2026-01-23 00:28:25",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGSUP 0003/26",
|
||||
"id": 3,
|
||||
"title": "N1_00_Visao_Geral_e_Escopo",
|
||||
"created_at": "2026-01-23 00:28:38",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGSUP 0004/26",
|
||||
"id": 4,
|
||||
"title": "N1_01_Verificacao_Basica_VM",
|
||||
"created_at": "2026-01-23 00:28:39",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGSUP 0005/26",
|
||||
"id": 5,
|
||||
"title": "N1_02_Operacoes_de_Energia",
|
||||
"created_at": "2026-01-23 00:28:40",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGSUP 0006/26",
|
||||
"id": 6,
|
||||
"title": "N1_03_Monitoramento_Basico",
|
||||
"created_at": "2026-01-23 00:28:41",
|
||||
"author": "Agente iT Guys"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ITGINF": {
|
||||
"next_id": 9,
|
||||
"manuals": [
|
||||
{
|
||||
"code": "ITGINF 0001/26",
|
||||
"id": 1,
|
||||
"title": "Gerenciamento de Cotas e Arquivamento",
|
||||
"created_at": "2026-01-23 00:28:26",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGINF 0002/26",
|
||||
"id": 2,
|
||||
"title": "Gerenciamento de Quarentena Movel (ActiveSync)",
|
||||
"created_at": "2026-01-23 00:28:27",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGINF 0003/26",
|
||||
"id": 3,
|
||||
"title": "Gestao de Permissoes (Full Access e Send As)",
|
||||
"created_at": "2026-01-23 00:28:27",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGINF 0004/26",
|
||||
"id": 4,
|
||||
"title": "Solucao de Problemas de Lista de Enderecos (OAB)",
|
||||
"created_at": "2026-01-23 00:28:28",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGINF 0005/26",
|
||||
"id": 5,
|
||||
"title": "N2_01_Gestao_de_Recursos",
|
||||
"created_at": "2026-01-23 00:28:42",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGINF 0006/26",
|
||||
"id": 6,
|
||||
"title": "N2_02_Networking_e_Storage",
|
||||
"created_at": "2026-01-23 00:28:43",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGINF 0007/26",
|
||||
"id": 7,
|
||||
"title": "N2_03_Manutencao_e_Lifecycle",
|
||||
"created_at": "2026-01-23 00:28:44",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGINF 0008/26",
|
||||
"id": 8,
|
||||
"title": "N2_04_Troubleshooting",
|
||||
"created_at": "2026-01-23 00:28:45",
|
||||
"author": "Agente iT Guys"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ITGENG": {
|
||||
"next_id": 14,
|
||||
"manuals": [
|
||||
{
|
||||
"code": "ITGENG 0001/26",
|
||||
"id": 1,
|
||||
"title": "Acesso ao Servidor Windows Core e PowerShell",
|
||||
"created_at": "2026-01-23 00:28:29",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0002/26",
|
||||
"id": 2,
|
||||
"title": "Arquitetura Tecnica e Mapeamento de Servidores",
|
||||
"created_at": "2026-01-23 00:28:30",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0003/26",
|
||||
"id": 3,
|
||||
"title": "Auditoria Administrativa e Logs de Seguranca",
|
||||
"created_at": "2026-01-23 00:28:31",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0004/26",
|
||||
"id": 4,
|
||||
"title": "Checklist de Manutencao Diaria e Semanal",
|
||||
"created_at": "2026-01-23 00:28:32",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0005/26",
|
||||
"id": 5,
|
||||
"title": "Disaster Recovery e Soft Restore",
|
||||
"created_at": "2026-01-23 00:28:33",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0006/26",
|
||||
"id": 6,
|
||||
"title": "Gestao de Conectores e Roteamento de E-mail",
|
||||
"created_at": "2026-01-23 00:28:34",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0007/26",
|
||||
"id": 7,
|
||||
"title": "Referencia de Operacoes via PowerShell",
|
||||
"created_at": "2026-01-23 00:28:35",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0008/26",
|
||||
"id": 8,
|
||||
"title": "Relatorios Avancados e Manutencao",
|
||||
"created_at": "2026-01-23 00:28:36",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0009/26",
|
||||
"id": 9,
|
||||
"title": "Renovacao de Certificado SSL e Integracao com IIS",
|
||||
"created_at": "2026-01-23 00:28:37",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0010/26",
|
||||
"id": 10,
|
||||
"title": "N3_01_CLI_Troubleshooting",
|
||||
"created_at": "2026-01-23 00:28:46",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0011/26",
|
||||
"id": 11,
|
||||
"title": "N3_02_Networking_Avancado",
|
||||
"created_at": "2026-01-23 00:28:47",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0012/26",
|
||||
"id": 12,
|
||||
"title": "N3_03_Storage_Deep_Dive",
|
||||
"created_at": "2026-01-23 00:28:48",
|
||||
"author": "Agente iT Guys"
|
||||
},
|
||||
{
|
||||
"code": "ITGENG 0013/26",
|
||||
"id": 13,
|
||||
"title": "N3_04_DR_Arquitetura",
|
||||
"created_at": "2026-01-23 00:28:49",
|
||||
"author": "Agente iT Guys"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
# Plano de Manuais Técnicos Recomendados
|
||||
|
||||
Este documento lista os manuais essenciais recomendados para compor a base de conhecimento da iT Guys, organizados por tecnologia. A seleção baseia-se em melhores práticas de mercado e necessidades operacionais de MSPs.
|
||||
|
||||
## 1. Rede e Segurança (pfSense)
|
||||
|
||||
* **[Nível 1] Diagnóstico de Conectividade e Logs:** Verificação de status de interfaces, gateways e análise de logs do system/firewall.
|
||||
* **[Nível 2] Gestão de Regras de Firewall e Aliases:** Boas práticas de criação de regras "default deny", uso de aliases para organização e documentação de liberações.
|
||||
* **[Nível 2] Configuração e Troubleshooting de VPN (OpenVPN/IPsec):** Procedimentos para conectar site-to-site e client-to-site, incluindo diagnóstico de túneis caídos.
|
||||
* **[Nível 3] Backup e Restauração de Configurações:** Procedimento de backup manual e automático (AutoConfigBackup), e restauração em caso de desastre.
|
||||
* **[Nível 3] Atualização e Hardening do pfSense:** Checklist de segurança (desativar admin externo, SSH seguro) e procedimento seguro de update de firmware.
|
||||
|
||||
## 2. Storage e Armazenamento (TrueNAS Scale / Samba / iSCSI)
|
||||
|
||||
* **[Nível 1] Monitoramento de Saúde de Discos e Alertas:** Interpretação de alertas SMART, verificação de temperatura e status básico do pool ZFS.
|
||||
* **[Nível 2] Gestão de Users, Groups e ACLs (SMB/NFS):** Criação de compartilhamentos, mapeamento de permissões Windows (ACLs) e exportações NFS.
|
||||
* **[Nível 2] Configuração de Snapshots e Replicação:** Agendamento de snapshots automáticos e tarefas de replicação para backup offsite.
|
||||
* **[Nível 3] Manutenção de ZFS (Scrub e Substituição de Disco):** Procedimento crítico de substituição de disco com falha (resilvering) e agendamento de Scrubs.
|
||||
* **[Nível 3] Configuração de iSCSI Target para Virtualização:** Criação de zvols, portals e targets para uso em VMware/Proxmox.
|
||||
|
||||
## 3. Bancos de Dados (PostgreSQL / MySQL)
|
||||
|
||||
* **[Nível 1] Backup e Restore Básico (dump/restore):** Uso de `mysqldump` e `pg_dump` para backups lógicos e restauração.
|
||||
* **[Nível 2] Manutenção Preventiva e Limpeza:**
|
||||
* **Postgres:** Explicação e agendamento do `VACUUM` e `ANALYZE`.
|
||||
* **MySQL:** Uso do `mysqlcheck` e `OPTIMIZE TABLE`.
|
||||
* **[Nível 2] Gestão de Usuários e Permissões:** Criação de usuários com privilégios mínimos (GRANT/REVOKE).
|
||||
* **[Nível 3] Troubleshooting de Performance e Slow Queries:** Ativação e análise de logs de queries lentas (`slow query log`).
|
||||
|
||||
## 4. Windows Server (AD / DNS / GPO / Firewall)
|
||||
|
||||
* **[Nível 1] Criação e Bloqueio de Usuários (Padrão):** Procedimento padrão de admissão e demissão (onboarding/offboarding).
|
||||
* **[Nível 2] Manutenção de DNS e DHCP:** Limpeza de registros obsoletos (Scavenging), verificação de Forwarders e Root Hints.
|
||||
* **[Nível 3] Diagnóstico de Replicação do AD (DCDIAG):** Uso de ferramentas (`dcdiag`, `repadmin`) para garantir saúde do domínio e replicação entre DCs.
|
||||
* **[Nível 3] Gestão Centralizada via GPO:**
|
||||
* Mapeamento de Drives e Impressoras.
|
||||
* Políticas de Senha e Bloqueio de Tela.
|
||||
* Deploy de Software (.msi).
|
||||
* **[Nível 3] Disaster Recovery do Active Directory:** Backup do System State e restauração autoritativa vs não-autoritativa.
|
||||
|
||||
## 5. Linux (Ubuntu / Debian / Alpine)
|
||||
|
||||
* **[Nível 1] Comandos Essenciais de Diagnóstico:** Uso de `top`, `htop`, `df`, `free`, `ip addr` para check rápido de saúde.
|
||||
* **[Nível 2] Gerenciamento de Pacotes e Updates:** Procedimentos seguros de `apt update/upgrade` e limpeza (`autoremove`).
|
||||
* **[Nível 2] Configuração de Firewall (UFW/IPTables):** Bloqueio padrão e liberação de portas específicas.
|
||||
* **[Nível 3] Hardening de Servidor Linux:** Configuração de SSH seguro (chaves, porta não-padrão, sem root), Fail2Ban e usuários sudo.
|
||||
* **[Nível 3] Análise de Logs (Journalctl/Syslog):** Como buscar erros críticos em `/var/log` e `journalctl`.
|
||||
|
||||
## 6. Virtualização (Proxmox VE)
|
||||
|
||||
* **[Nível 1] Gestão Básica de VMs e Containers (LXC):** Ligar, desligar, reiniciar e acessar console (VNC/Spice).
|
||||
* **[Nível 2] Gestão de Backups e Snapshots (PBS):** Configuração de rotinas de backup para Proxmox Backup Server ou armazenamento local.
|
||||
* **[Nível 3] Gestão de Cluster e High Availability (HA):** Adicionar nós ao cluster, configurar fencing e grupos de HA.
|
||||
* **[Nível 3] Troubleshooting de Rede (Linux Bridge/Bonding):** Diagnóstico de conectividade em interfaces virtuais e vlans.
|
||||
|
||||
## 7. Containers (Docker / Docker-Compose / Portainer)
|
||||
|
||||
* **[Nível 1] Deploy e Update de Stacks (Portainer):** Como atualizar um container recriando-o com nova imagem (pull).
|
||||
* **[Nível 2] Diagnóstico de Containers:** Verificação de logs (`docker logs`), inspeção (`docker inspect`) e monitoramento de recursos (`docker stats`).
|
||||
* **[Nível 2] Manutenção de Disco (Docker Prune):** Limpeza de imagens, volumes e builders não utilizados para liberar espaço.
|
||||
* **[Nível 3] Backup de Volumes e Dados Persistentes:** Estratégias para backup dos diretórios mapeados nos volumes.
|
||||
|
||||
## 8. Aplicativos e VoIP (Gitea / Zabbix / Asterisk / Navegadores)
|
||||
|
||||
* **Gitea:**
|
||||
* [Nível 2] Backup e Restore Completo (Database + Repositórios).
|
||||
* [Nível 3] Procedimento de Upgrade de Versão (Docker).
|
||||
* **Zabbix:**
|
||||
* [Nível 1] Adição de Hosts e Templates.
|
||||
* [Nível 2] Criação de Triggers e Ações de Alerta.
|
||||
* [Nível 3] Otimização de Database e Housekeeping.
|
||||
* **VoIP (Asterisk/Issabel):**
|
||||
* [Nível 1] Diagnóstico de Ramais Offline (Sip Show Peers).
|
||||
* [Nível 2] Troubleshooting de Áudio Unidirecional (NAT/RTP).
|
||||
* [Nível 2] Análise de Logs de Chamadas (CDR/Verbosity).
|
||||
* **Navegadores (Chrome/Firefox):**
|
||||
* [Nível 2] Gestão via GPO (ADMX): Definir homepage, extensões obrigatórias e bloqueios.
|
||||
|
||||
## 9. Ferramentas (SSH / Putty)
|
||||
|
||||
* **[Nível 0] Acesso Remoto Seguro:** Guia de como usar chaves SSH (PPK/PEM) no Putty e Terminal.
|
||||
* **[Nível 1] Tunelamento SSH (Port Forwarding):** Como acessar serviços internos de forma segura via túnel.
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
# MANUAL TÉCNICO - ACESSO E CONFIGURAÇÃO DE WEBMAIL E CELULAR (EXCHANGE)
|
||||
|
||||
**Código:** ITITG 001/26 | **Classificação:** PÚBLICO
|
||||
**Código:** ITGCLI 0001/26 | **Classificação:** PÚBLICO
|
||||
**Responsável:** Agente iT Guys | **Data:** {{DATA_ATUAL}}
|
||||
|
||||
## 1. HISTÓRICO DE REVISÃO
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,6 +1,6 @@
|
|||
# MANUAL TÉCNICO - CONFIGURAÇÃO DE RESPOSTA AUTOMÁTICA DE FÉRIAS (WEBMAIL)
|
||||
|
||||
**Código:** ITITG EXCH-002/26 | **Classificação:** PÚBLICO
|
||||
**Código:** ITGCLI 0002/26 | **Classificação:** PÚBLICO
|
||||
**Responsável:** João Pedro Toledo Gonçalves | **Data:** 22/01/2026
|
||||
|
||||
## 1. HISTÓRICO DE REVISÃO
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,6 +1,6 @@
|
|||
# MANUAL TÉCNICO - DIAGNÓSTICO DE RECEBIMENTO - EXCHANGE LOCAL
|
||||
|
||||
**Código:** ITITG 042/26 | **Classificação:** INTERNO
|
||||
**Código:** ITGSUP 0001/26 | **Classificação:** INTERNO
|
||||
**Responsável:** Service Desk | **Data:** 22/01/2026
|
||||
|
||||
## 1. HISTÓRICO DE REVISÃO
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,6 +1,6 @@
|
|||
# MANUAL TÉCNICO - CRIAÇÃO E BLOQUEIO DE USUÁRIOS - EXCHANGE/AD
|
||||
|
||||
**Código:** ITITG 005/26 | **Classificação:** RESTRITO
|
||||
**Código:** ITGSUP 0002/26 | **Classificação:** RESTRITO
|
||||
**Responsável:** Agente iT Guys | **Data:** 22/01/2026
|
||||
|
||||
## 1. HISTÓRICO DE REVISÃO
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,6 +1,6 @@
|
|||
# MANUAL TÉCNICO - GERENCIAMENTO DE COTAS E ARQUIVAMENTO (EXCHANGE)
|
||||
|
||||
**Código:** ITITG 005/26 | **Classificação:** RESTRITO
|
||||
**Código:** ITGINF 0001/26 | **Classificação:** RESTRITO
|
||||
**Responsável:** Agente iT Guys | **Data:** {{DATA_ATUAL}}
|
||||
|
||||
## 1. HISTÓRICO DE REVISÃO
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,6 +1,6 @@
|
|||
# MANUAL TÉCNICO - GERENCIAMENTO DE QUARENTENA MÓVEL (ACTIVESYNC) - EXCHANGE
|
||||
|
||||
**Código:** ITITG 035/26 | **Classificação:** RESTRITO
|
||||
**Código:** ITGINF 0002/26 | **Classificação:** RESTRITO
|
||||
**Responsável:** Agente iT Guys | **Data:** {{DATA_ATUAL}}
|
||||
|
||||
## 1. HISTÓRICO DE REVISÃO
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,6 +1,6 @@
|
|||
# MANUAL TÉCNICO - GESTÃO DE PERMISSÕES (FULL ACCESS E SEND AS) - EXCHANGE
|
||||
|
||||
**Código:** ITITG 037/26 | **Classificação:** RESTRITO
|
||||
**Código:** ITGINF 0003/26 | **Classificação:** RESTRITO
|
||||
**Responsável:** Agente iT Guys | **Data:** {{DATA_ATUAL}}
|
||||
|
||||
## 1. HISTÓRICO DE REVISÃO
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,6 +1,6 @@
|
|||
# MANUAL TÉCNICO - SOLUÇÃO DE PROBLEMAS DE LISTA DE ENDEREÇOS (OAB) - EXCHANGE
|
||||
|
||||
**Código:** ITITG 036/26 | **Classificação:** RESTRITO
|
||||
**Código:** ITGINF 0004/26 | **Classificação:** RESTRITO
|
||||
**Responsável:** Agente iT Guys | **Data:** {{DATA_ATUAL}}
|
||||
|
||||
## 1. HISTÓRICO DE REVISÃO
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,6 +1,6 @@
|
|||
# MANUAL TÉCNICO - ACESSO AO SERVIDOR WINDOWS CORE E POWERSHELL
|
||||
|
||||
**Código:** ITITG 038/26 | **Classificação:** RESTRITO
|
||||
**Código:** ITGENG 0001/26 | **Classificação:** RESTRITO
|
||||
**Responsável:** Engenharia de Sistemas | **Data:** {{DATA_ATUAL}}
|
||||
|
||||
## 1. HISTÓRICO DE REVISÃO
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue