maestro-bundle 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -0
- package/package.json +25 -0
- package/src/cli.mjs +212 -0
- package/templates/bundle-ai-agents/.spec/constitution.md +33 -0
- package/templates/bundle-ai-agents/AGENTS.md +140 -0
- package/templates/bundle-ai-agents/skills/agent-orchestration/SKILL.md +132 -0
- package/templates/bundle-ai-agents/skills/api-design/SKILL.md +100 -0
- package/templates/bundle-ai-agents/skills/clean-architecture/SKILL.md +99 -0
- package/templates/bundle-ai-agents/skills/context-engineering/SKILL.md +98 -0
- package/templates/bundle-ai-agents/skills/database-modeling/SKILL.md +59 -0
- package/templates/bundle-ai-agents/skills/docker-containerization/SKILL.md +114 -0
- package/templates/bundle-ai-agents/skills/eval-testing/SKILL.md +115 -0
- package/templates/bundle-ai-agents/skills/memory-management/SKILL.md +106 -0
- package/templates/bundle-ai-agents/skills/prompt-engineering/SKILL.md +66 -0
- package/templates/bundle-ai-agents/skills/rag-pipeline/SKILL.md +128 -0
- package/templates/bundle-ai-agents/skills/testing-strategy/SKILL.md +95 -0
- package/templates/bundle-base/AGENTS.md +118 -0
- package/templates/bundle-base/skills/branch-strategy/SKILL.md +42 -0
- package/templates/bundle-base/skills/code-review/SKILL.md +54 -0
- package/templates/bundle-base/skills/commit-pattern/SKILL.md +58 -0
- package/templates/bundle-data-pipeline/.spec/constitution.md +32 -0
- package/templates/bundle-data-pipeline/AGENTS.md +115 -0
- package/templates/bundle-data-pipeline/skills/data-preprocessing/SKILL.md +75 -0
- package/templates/bundle-data-pipeline/skills/docker-containerization/SKILL.md +114 -0
- package/templates/bundle-data-pipeline/skills/feature-engineering/SKILL.md +76 -0
- package/templates/bundle-data-pipeline/skills/mlops-pipeline/SKILL.md +77 -0
- package/templates/bundle-data-pipeline/skills/model-training/SKILL.md +68 -0
- package/templates/bundle-data-pipeline/skills/rag-pipeline/SKILL.md +128 -0
- package/templates/bundle-frontend-spa/.spec/constitution.md +32 -0
- package/templates/bundle-frontend-spa/AGENTS.md +107 -0
- package/templates/bundle-frontend-spa/skills/authentication/SKILL.md +90 -0
- package/templates/bundle-frontend-spa/skills/component-design/SKILL.md +115 -0
- package/templates/bundle-frontend-spa/skills/e2e-testing/SKILL.md +101 -0
- package/templates/bundle-frontend-spa/skills/integration-api/SKILL.md +95 -0
- package/templates/bundle-frontend-spa/skills/react-patterns/SKILL.md +130 -0
- package/templates/bundle-frontend-spa/skills/responsive-layout/SKILL.md +65 -0
- package/templates/bundle-frontend-spa/skills/state-management/SKILL.md +86 -0
- package/templates/bundle-jhipster-microservices/.spec/constitution.md +37 -0
- package/templates/bundle-jhipster-microservices/AGENTS.md +307 -0
- package/templates/bundle-jhipster-microservices/skills/ci-cd-pipeline/SKILL.md +112 -0
- package/templates/bundle-jhipster-microservices/skills/clean-architecture/SKILL.md +99 -0
- package/templates/bundle-jhipster-microservices/skills/ddd-tactical/SKILL.md +138 -0
- package/templates/bundle-jhipster-microservices/skills/jhipster-angular/SKILL.md +97 -0
- package/templates/bundle-jhipster-microservices/skills/jhipster-docker-k8s/SKILL.md +183 -0
- package/templates/bundle-jhipster-microservices/skills/jhipster-entities/SKILL.md +87 -0
- package/templates/bundle-jhipster-microservices/skills/jhipster-gateway/SKILL.md +96 -0
- package/templates/bundle-jhipster-microservices/skills/jhipster-kafka/SKILL.md +145 -0
- package/templates/bundle-jhipster-microservices/skills/jhipster-registry/SKILL.md +83 -0
- package/templates/bundle-jhipster-microservices/skills/jhipster-service/SKILL.md +131 -0
- package/templates/bundle-jhipster-microservices/skills/testing-strategy/SKILL.md +95 -0
- package/templates/bundle-jhipster-monorepo/.spec/constitution.md +32 -0
- package/templates/bundle-jhipster-monorepo/AGENTS.md +227 -0
- package/templates/bundle-jhipster-monorepo/skills/clean-architecture/SKILL.md +99 -0
- package/templates/bundle-jhipster-monorepo/skills/ddd-tactical/SKILL.md +138 -0
- package/templates/bundle-jhipster-monorepo/skills/jhipster-angular/SKILL.md +166 -0
- package/templates/bundle-jhipster-monorepo/skills/jhipster-entities/SKILL.md +141 -0
- package/templates/bundle-jhipster-monorepo/skills/jhipster-liquibase/SKILL.md +95 -0
- package/templates/bundle-jhipster-monorepo/skills/jhipster-security/SKILL.md +89 -0
- package/templates/bundle-jhipster-monorepo/skills/jhipster-spring/SKILL.md +155 -0
- package/templates/bundle-jhipster-monorepo/skills/testing-strategy/SKILL.md +95 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prompt-engineering
|
|
3
|
+
description: Criar e otimizar system prompts para agentes seguindo melhores práticas de context engineering. Use quando precisar escrever prompts, melhorar prompts existentes, ou criar instruções para agentes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Prompt Engineering para Agentes
|
|
7
|
+
|
|
8
|
+
## Estrutura de System Prompt
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
1. IDENTIDADE — Quem o agente é
|
|
12
|
+
2. OBJETIVO — O que ele deve alcançar
|
|
13
|
+
3. FERRAMENTAS — O que tem disponível
|
|
14
|
+
4. REGRAS — Limites inegociáveis
|
|
15
|
+
5. FORMATO — Como estruturar a saída
|
|
16
|
+
6. EXEMPLOS — Demonstrações concretas
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Template
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
SYSTEM_PROMPT = """
|
|
23
|
+
## Identidade
|
|
24
|
+
Você é {role}, especializado em {especialidade}.
|
|
25
|
+
|
|
26
|
+
## Objetivo
|
|
27
|
+
Sua missão é {objetivo_principal}. Você trabalha dentro do Maestro,
|
|
28
|
+
uma plataforma de governança de desenvolvimento.
|
|
29
|
+
|
|
30
|
+
## Ferramentas disponíveis
|
|
31
|
+
{lista_de_tools_com_descrição}
|
|
32
|
+
|
|
33
|
+
## Regras
|
|
34
|
+
1. Sempre seguir o bundle {bundle_name} para padrões de código
|
|
35
|
+
2. Todo commit deve referenciar a task: {task_id}
|
|
36
|
+
3. Trabalhar apenas na worktree designada: {worktree_path}
|
|
37
|
+
4. Reportar progresso a cada etapa significativa
|
|
38
|
+
5. Solicitar human review para operações destrutivas
|
|
39
|
+
|
|
40
|
+
## Formato de resposta
|
|
41
|
+
- Para código: blocos com linguagem especificada
|
|
42
|
+
- Para decisões: justificar com "porquê"
|
|
43
|
+
- Para erros: incluir contexto e sugestão de fix
|
|
44
|
+
|
|
45
|
+
## Exemplo
|
|
46
|
+
Task: "Criar endpoint GET /api/v1/demands"
|
|
47
|
+
Ação: Criar controller, use case, repository seguindo Clean Architecture
|
|
48
|
+
Branch: feature/backend-{task_id}
|
|
49
|
+
"""
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Boas práticas
|
|
53
|
+
|
|
54
|
+
1. **Seja específico** — "Crie uma API REST com FastAPI" > "Crie uma API"
|
|
55
|
+
2. **Explique o porquê** — "Usar Value Objects porque garantem validação no construtor" > "Usar Value Objects"
|
|
56
|
+
3. **Dê exemplos** — Um bom exemplo vale mais que 10 linhas de instrução
|
|
57
|
+
4. **Evite negativos** — "Mantenha funções com até 20 linhas" > "Não crie funções longas"
|
|
58
|
+
5. **Priorize** — Coloque as regras mais importantes primeiro
|
|
59
|
+
6. **Teste** — Rode o prompt com cenários reais antes de deployar
|
|
60
|
+
|
|
61
|
+
## Anti-patterns
|
|
62
|
+
|
|
63
|
+
- NEVER/ALWAYS em excesso (perde a força)
|
|
64
|
+
- Instruções contraditórias
|
|
65
|
+
- Prompts com 5000+ palavras (o agente se perde)
|
|
66
|
+
- Regras sem justificativa (o agente não sabe quando flexibilizar)
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rag-pipeline
|
|
3
|
+
description: Construir pipeline RAG completo com ingestão, chunking, embedding, indexação e retrieval usando LangChain + pgvector. Use sempre que precisar implementar busca semântica, responder perguntas sobre documentos, ou criar um sistema de retrieval.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# RAG Pipeline
|
|
7
|
+
|
|
8
|
+
## Pipeline completo
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
Documentos → Loader → Splitter → Embeddings → pgvector → Retriever → Re-ranker → LLM
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## 1. Ingestão
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
from langchain_community.document_loaders import DirectoryLoader, UnstructuredMarkdownLoader
|
|
18
|
+
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
|
19
|
+
|
|
20
|
+
# Loader por tipo de documento
|
|
21
|
+
loader = DirectoryLoader(
|
|
22
|
+
"./documents/",
|
|
23
|
+
glob="**/*.md",
|
|
24
|
+
loader_cls=UnstructuredMarkdownLoader
|
|
25
|
+
)
|
|
26
|
+
docs = loader.load()
|
|
27
|
+
|
|
28
|
+
# Splitter com separadores Markdown
|
|
29
|
+
splitter = RecursiveCharacterTextSplitter(
|
|
30
|
+
chunk_size=1000,
|
|
31
|
+
chunk_overlap=200,
|
|
32
|
+
separators=["\n## ", "\n### ", "\n\n", "\n", ". ", " "]
|
|
33
|
+
)
|
|
34
|
+
chunks = splitter.split_documents(docs)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 2. Metadados obrigatórios
|
|
38
|
+
|
|
39
|
+
Cada chunk deve ter:
|
|
40
|
+
```python
|
|
41
|
+
for chunk in chunks:
|
|
42
|
+
chunk.metadata.update({
|
|
43
|
+
"source": chunk.metadata.get("source", "unknown"),
|
|
44
|
+
"doc_type": classify_document(chunk), # skill, agent_md, prd, code
|
|
45
|
+
"language": detect_language(chunk),
|
|
46
|
+
"created_at": datetime.now().isoformat(),
|
|
47
|
+
})
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 3. Embedding + Indexação
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
from langchain_openai import OpenAIEmbeddings
|
|
54
|
+
from langchain_postgres import PGVector
|
|
55
|
+
|
|
56
|
+
embeddings = OpenAIEmbeddings(model="text-embedding-3-large", dimensions=1536)
|
|
57
|
+
|
|
58
|
+
vectorstore = PGVector(
|
|
59
|
+
collection_name="documents",
|
|
60
|
+
connection=DATABASE_URL,
|
|
61
|
+
embedding_function=embeddings,
|
|
62
|
+
)
|
|
63
|
+
vectorstore.add_documents(chunks)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 4. Retrieval Híbrido
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
from langchain.retrievers import EnsembleRetriever
|
|
70
|
+
from langchain_community.retrievers import BM25Retriever
|
|
71
|
+
|
|
72
|
+
# Semântico
|
|
73
|
+
semantic_retriever = vectorstore.as_retriever(search_kwargs={"k": 20})
|
|
74
|
+
|
|
75
|
+
# Keyword
|
|
76
|
+
bm25_retriever = BM25Retriever.from_documents(chunks, k=20)
|
|
77
|
+
|
|
78
|
+
# Ensemble com RRF
|
|
79
|
+
hybrid_retriever = EnsembleRetriever(
|
|
80
|
+
retrievers=[semantic_retriever, bm25_retriever],
|
|
81
|
+
weights=[0.6, 0.4]
|
|
82
|
+
)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 5. Re-ranking
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
from langchain.retrievers import ContextualCompressionRetriever
|
|
89
|
+
from langchain_cohere import CohereRerank
|
|
90
|
+
|
|
91
|
+
reranker = CohereRerank(top_n=5)
|
|
92
|
+
final_retriever = ContextualCompressionRetriever(
|
|
93
|
+
base_compressor=reranker,
|
|
94
|
+
base_retriever=hybrid_retriever
|
|
95
|
+
)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## 6. Query Chain
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
from langchain_core.prompts import ChatPromptTemplate
|
|
102
|
+
from langchain_core.output_parsers import StrOutputParser
|
|
103
|
+
|
|
104
|
+
prompt = ChatPromptTemplate.from_template("""
|
|
105
|
+
Responda a pergunta baseado apenas no contexto fornecido.
|
|
106
|
+
Se a resposta não estiver no contexto, diga "Não encontrei essa informação".
|
|
107
|
+
|
|
108
|
+
Contexto: {context}
|
|
109
|
+
Pergunta: {question}
|
|
110
|
+
""")
|
|
111
|
+
|
|
112
|
+
chain = (
|
|
113
|
+
{"context": final_retriever, "question": RunnablePassthrough()}
|
|
114
|
+
| prompt
|
|
115
|
+
| llm
|
|
116
|
+
| StrOutputParser()
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
result = chain.invoke("Qual skill usar para criar componentes React?")
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Checklist de qualidade
|
|
123
|
+
|
|
124
|
+
- [ ] Chunks testados com perguntas reais
|
|
125
|
+
- [ ] Metadados completos em todos os chunks
|
|
126
|
+
- [ ] Retrieval quality medido com golden dataset
|
|
127
|
+
- [ ] Re-ranking ativo para refinar top-k
|
|
128
|
+
- [ ] Fallback para quando retrieval não encontra nada
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: testing-strategy
|
|
3
|
+
description: Implementar estratégia de testes com unitários, integração e e2e usando Pytest ou JUnit. Use quando for escrever testes, definir estratégia de testes, ou melhorar cobertura.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Estratégia de Testes
|
|
7
|
+
|
|
8
|
+
## Pirâmide
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
/ E2E \ Poucos, lentos, caros
|
|
12
|
+
/ Integr. \ Moderados
|
|
13
|
+
/ Unitários \ Muitos, rápidos, baratos
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Testes Unitários — Domínio
|
|
17
|
+
|
|
18
|
+
Testar regras de negócio sem infraestrutura.
|
|
19
|
+
|
|
20
|
+
```python
|
|
21
|
+
# tests/domain/test_demand.py
|
|
22
|
+
class TestDemand:
|
|
23
|
+
def test_should_decompose_new_demand(self):
|
|
24
|
+
demand = Demand(id=DemandId.generate(), description="Criar CRUD")
|
|
25
|
+
planner = FakePlanner(tasks=[Task(...), Task(...)])
|
|
26
|
+
|
|
27
|
+
tasks = demand.decompose(planner)
|
|
28
|
+
|
|
29
|
+
assert len(tasks) == 2
|
|
30
|
+
assert demand.status == DemandStatus.PLANNED
|
|
31
|
+
|
|
32
|
+
def test_should_reject_decompose_if_already_planned(self):
|
|
33
|
+
demand = Demand(id=DemandId.generate(), description="Criar CRUD")
|
|
34
|
+
demand.decompose(FakePlanner(tasks=[Task(...)]))
|
|
35
|
+
|
|
36
|
+
with pytest.raises(DemandAlreadyDecomposedException):
|
|
37
|
+
demand.decompose(FakePlanner(tasks=[]))
|
|
38
|
+
|
|
39
|
+
def test_should_not_allow_more_than_20_tasks(self):
|
|
40
|
+
demand = Demand(id=DemandId.generate(), description="Mega projeto")
|
|
41
|
+
for i in range(20):
|
|
42
|
+
demand.add_task(Task(...))
|
|
43
|
+
|
|
44
|
+
with pytest.raises(TooManyTasksException):
|
|
45
|
+
demand.add_task(Task(...))
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Testes Unitários — Value Objects
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
class TestComplianceScore:
|
|
52
|
+
def test_passing_score(self):
|
|
53
|
+
score = ComplianceScore(85.0)
|
|
54
|
+
assert score.is_passing() is True
|
|
55
|
+
|
|
56
|
+
def test_failing_score(self):
|
|
57
|
+
score = ComplianceScore(60.0)
|
|
58
|
+
assert score.is_passing() is False
|
|
59
|
+
|
|
60
|
+
def test_invalid_score_raises(self):
|
|
61
|
+
with pytest.raises(ValueError):
|
|
62
|
+
ComplianceScore(150.0)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Testes de Integração — Repositórios
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
# tests/infrastructure/test_pg_demand_repository.py
|
|
69
|
+
@pytest.fixture
|
|
70
|
+
def db_session():
|
|
71
|
+
engine = create_engine(TEST_DATABASE_URL)
|
|
72
|
+
with Session(engine) as session:
|
|
73
|
+
yield session
|
|
74
|
+
session.rollback()
|
|
75
|
+
|
|
76
|
+
class TestPgDemandRepository:
|
|
77
|
+
def test_should_save_and_find_demand(self, db_session):
|
|
78
|
+
repo = PgDemandRepository(db_session)
|
|
79
|
+
demand = Demand(id=DemandId.generate(), description="Test")
|
|
80
|
+
|
|
81
|
+
repo.save(demand)
|
|
82
|
+
found = repo.find_by_id(demand.id)
|
|
83
|
+
|
|
84
|
+
assert found.description == "Test"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Naming
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
test_should_<resultado>_when_<condição>
|
|
91
|
+
|
|
92
|
+
test_should_return_error_when_email_is_invalid
|
|
93
|
+
test_should_decompose_demand_when_status_is_created
|
|
94
|
+
test_should_reject_merge_when_conflicts_exist
|
|
95
|
+
```
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Bundle Base — Padrões da Organização
|
|
2
|
+
|
|
3
|
+
Este é o bundle base que TODOS os desenvolvedores devem usar. Ele define os padrões inegociáveis da organização.
|
|
4
|
+
|
|
5
|
+
## Quem você é
|
|
6
|
+
|
|
7
|
+
Você é um assistente de desenvolvimento que segue rigorosamente os padrões da organização. Todo código produzido deve aderir às convenções abaixo.
|
|
8
|
+
|
|
9
|
+
## Padrões de Código
|
|
10
|
+
|
|
11
|
+
### Geral
|
|
12
|
+
- Máximo de 500 linhas por arquivo
|
|
13
|
+
- Funções com no máximo 20 linhas
|
|
14
|
+
- Nomes de variáveis e funções descritivos (nunca `d`, `x`, `tmp`)
|
|
15
|
+
- Usar funções nativas da linguagem para manipulação de strings
|
|
16
|
+
- Evitar ifs aninhados (hadouken) — usar early returns e guard clauses
|
|
17
|
+
- Tratar fluxos de exceção, não só o caminho feliz
|
|
18
|
+
- Não deixar código morto, comentários TODO sem prazo, ou prints de debug
|
|
19
|
+
|
|
20
|
+
### Python
|
|
21
|
+
- Usar f-strings para interpolação
|
|
22
|
+
- Type hints em todas as funções públicas
|
|
23
|
+
- Docstrings apenas em funções complexas (não óbvias)
|
|
24
|
+
- Black para formatação, Ruff para linting
|
|
25
|
+
|
|
26
|
+
### TypeScript
|
|
27
|
+
- Strict mode habilitado
|
|
28
|
+
- Interfaces sobre types quando possível
|
|
29
|
+
- Async/await sobre .then()
|
|
30
|
+
|
|
31
|
+
### Java
|
|
32
|
+
- Seguir convenções do Google Java Style Guide
|
|
33
|
+
- Records para DTOs imutáveis
|
|
34
|
+
- Optional ao invés de null
|
|
35
|
+
|
|
36
|
+
## Padrões de Git
|
|
37
|
+
|
|
38
|
+
### Branches
|
|
39
|
+
- `main` — produção, protegida
|
|
40
|
+
- `develop` — integração
|
|
41
|
+
- `feature/<escopo>-<descricao>` — novas funcionalidades
|
|
42
|
+
- `fix/<escopo>-<descricao>` — correções
|
|
43
|
+
- `hotfix/<descricao>` — correções urgentes em produção
|
|
44
|
+
|
|
45
|
+
### Commits
|
|
46
|
+
Formato: `<tipo>(<escopo>): <descrição>`
|
|
47
|
+
|
|
48
|
+
Tipos permitidos:
|
|
49
|
+
- `feat` — nova funcionalidade
|
|
50
|
+
- `fix` — correção de bug
|
|
51
|
+
- `refactor` — refatoração sem mudança de comportamento
|
|
52
|
+
- `docs` — documentação
|
|
53
|
+
- `test` — adição ou correção de testes
|
|
54
|
+
- `chore` — tarefas de manutenção
|
|
55
|
+
- `ci` — mudanças em CI/CD
|
|
56
|
+
|
|
57
|
+
Exemplos:
|
|
58
|
+
```
|
|
59
|
+
feat(auth): implementar autenticação JWT
|
|
60
|
+
fix(api): corrigir timeout na busca de usuários
|
|
61
|
+
refactor(domain): extrair value object para CPF
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Pull Requests
|
|
65
|
+
- Título curto (< 70 caracteres)
|
|
66
|
+
- Descrição com: resumo, motivação, como testar
|
|
67
|
+
- Sempre vincular à task/issue
|
|
68
|
+
- Mínimo 1 reviewer
|
|
69
|
+
|
|
70
|
+
## Segurança
|
|
71
|
+
|
|
72
|
+
- NUNCA commitar secrets (.env, credentials, API keys)
|
|
73
|
+
- Rate limiting em todas as APIs
|
|
74
|
+
- Validar inputs em fronteiras do sistema (API, UI)
|
|
75
|
+
- Seguir OWASP Top 10
|
|
76
|
+
- HTTPS obrigatório
|
|
77
|
+
|
|
78
|
+
## Testes
|
|
79
|
+
|
|
80
|
+
- Cobertura mínima: 80% no código de domínio
|
|
81
|
+
- Testes unitários para regras de negócio
|
|
82
|
+
- Testes de integração para repositórios e APIs
|
|
83
|
+
- Nomear testes descritivamente: `should_return_error_when_email_is_invalid`
|
|
84
|
+
|
|
85
|
+
## Estrutura de Projeto
|
|
86
|
+
|
|
87
|
+
Organizar por domínio/feature, não por tipo técnico:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
# BOM — por domínio
|
|
91
|
+
src/
|
|
92
|
+
├── demands/
|
|
93
|
+
├── bundles/
|
|
94
|
+
├── agents/
|
|
95
|
+
└── tracking/
|
|
96
|
+
|
|
97
|
+
# RUIM — por camada técnica
|
|
98
|
+
src/
|
|
99
|
+
├── controllers/
|
|
100
|
+
├── services/
|
|
101
|
+
├── repositories/
|
|
102
|
+
└── models/
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Documentação
|
|
106
|
+
|
|
107
|
+
- README.md na raiz com: propósito, como rodar, como testar
|
|
108
|
+
- ADRs para decisões arquiteturais significativas
|
|
109
|
+
- Diagramas como código (Mermaid) versionados no repo
|
|
110
|
+
|
|
111
|
+
## O que NÃO fazer
|
|
112
|
+
|
|
113
|
+
- Não usar `any` em TypeScript
|
|
114
|
+
- Não ignorar erros com try/catch vazio
|
|
115
|
+
- Não fazer push direto na main
|
|
116
|
+
- Não criar utils/helpers genéricos "para o futuro"
|
|
117
|
+
- Não instalar dependências sem justificativa
|
|
118
|
+
- Não fazer "vibing coding" — sempre ter uma task/spec associada
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: branch-strategy
|
|
3
|
+
description: Criar e gerenciar branches seguindo a estratégia Git da organização. Use quando for criar branch, iniciar uma feature, ou organizar o fluxo de branches.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Estratégia de Branches Maestro
|
|
7
|
+
|
|
8
|
+
## Branches permanentes
|
|
9
|
+
|
|
10
|
+
| Branch | Propósito | Proteção |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| `main` | Código em produção | Protegida, só via MR aprovado |
|
|
13
|
+
| `develop` | Integração de features | Protegida, MR com 1+ reviewer |
|
|
14
|
+
|
|
15
|
+
## Branches temporárias
|
|
16
|
+
|
|
17
|
+
| Padrão | Exemplo | Origem | Destino |
|
|
18
|
+
|---|---|---|---|
|
|
19
|
+
| `feature/<modulo>-<desc>` | `feature/demands-auto-decompose` | `develop` | `develop` |
|
|
20
|
+
| `fix/<modulo>-<desc>` | `fix/agents-timeout-skill` | `develop` | `develop` |
|
|
21
|
+
| `hotfix/<desc>` | `hotfix/fix-login-crash` | `main` | `main` + `develop` |
|
|
22
|
+
| `release/<versao>` | `release/1.2.0` | `develop` | `main` + `develop` |
|
|
23
|
+
|
|
24
|
+
## Fluxo para agentes do Maestro
|
|
25
|
+
|
|
26
|
+
Cada agente trabalha em worktree isolada com seu próprio branch:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
feature/agent-frontend-<task-id>
|
|
30
|
+
feature/agent-backend-<task-id>
|
|
31
|
+
feature/agent-devops-<task-id>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
O agente orquestrador faz o merge após aprovação humana.
|
|
35
|
+
|
|
36
|
+
## Regras
|
|
37
|
+
|
|
38
|
+
1. Nunca commitar direto na `main` ou `develop`
|
|
39
|
+
2. Branches de feature vivem no máximo 5 dias
|
|
40
|
+
3. Rebase antes de abrir MR (manter histórico limpo)
|
|
41
|
+
4. Deletar branch após merge
|
|
42
|
+
5. Um branch = uma task/issue
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-review
|
|
3
|
+
description: Revisar código seguindo os padrões da organização. Use quando for revisar um PR, avaliar qualidade de código, ou quando o desenvolvedor pedir review.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Code Review — Padrões da organização
|
|
7
|
+
|
|
8
|
+
## Checklist de Review
|
|
9
|
+
|
|
10
|
+
### 1. Correção
|
|
11
|
+
- O código faz o que a task/spec pede?
|
|
12
|
+
- Os edge cases estão cobertos?
|
|
13
|
+
- Os fluxos de exceção estão tratados?
|
|
14
|
+
|
|
15
|
+
### 2. Qualidade
|
|
16
|
+
- Arquivos com mais de 500 linhas? Dividir.
|
|
17
|
+
- Funções com mais de 20 linhas? Extrair.
|
|
18
|
+
- Ifs aninhados (hadouken)? Usar early return.
|
|
19
|
+
- Nomes descritivos? (`calculateComplianceScore` > `calc`)
|
|
20
|
+
- Código duplicado? Extrair se repetir 3+ vezes.
|
|
21
|
+
- Código morto? Remover.
|
|
22
|
+
|
|
23
|
+
### 3. Segurança
|
|
24
|
+
- Inputs validados nas fronteiras?
|
|
25
|
+
- Secrets hardcoded? REJEITAR.
|
|
26
|
+
- SQL injection possível? Usar parameterized queries.
|
|
27
|
+
- Rate limiting presente nas APIs?
|
|
28
|
+
|
|
29
|
+
### 4. Testes
|
|
30
|
+
- Testes unitários para regras de negócio?
|
|
31
|
+
- Nomes de testes descritivos?
|
|
32
|
+
- Testes cobrem caminho feliz E fluxos alternativos?
|
|
33
|
+
|
|
34
|
+
### 5. Padrões
|
|
35
|
+
- Commit segue Conventional Commits?
|
|
36
|
+
- Branch segue nomenclatura?
|
|
37
|
+
- Estrutura de diretórios por domínio?
|
|
38
|
+
- Linguagem ubíqua do projeto respeitada?
|
|
39
|
+
|
|
40
|
+
## Formato do Feedback
|
|
41
|
+
|
|
42
|
+
Categorizar cada comentário:
|
|
43
|
+
|
|
44
|
+
- **[BLOCKER]** — Deve ser corrigido antes do merge
|
|
45
|
+
- **[SUGGESTION]** — Melhoria recomendada, não obrigatória
|
|
46
|
+
- **[QUESTION]** — Dúvida sobre a intenção do código
|
|
47
|
+
- **[PRAISE]** — Algo bem feito que vale destacar
|
|
48
|
+
|
|
49
|
+
Exemplo:
|
|
50
|
+
```
|
|
51
|
+
[BLOCKER] linha 45: API key hardcoded. Mover para variável de ambiente.
|
|
52
|
+
[SUGGESTION] linha 120: Esse if aninhado ficaria mais legível com early return.
|
|
53
|
+
[PRAISE] Boa extração do value object ComplianceScore.
|
|
54
|
+
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: commit-pattern
|
|
3
|
+
description: Gerar mensagens de commit seguindo o padrão Conventional Commits da organização. Use sempre que for fazer um commit, commitar mudanças, ou precisar de uma mensagem de commit.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Padrão de Commit Maestro
|
|
7
|
+
|
|
8
|
+
## Formato
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
<tipo>(<escopo>): <descrição imperativa em português>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Tipos
|
|
15
|
+
|
|
16
|
+
| Tipo | Quando usar |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `feat` | Nova funcionalidade para o usuário |
|
|
19
|
+
| `fix` | Correção de bug |
|
|
20
|
+
| `refactor` | Mudança de código que não altera comportamento |
|
|
21
|
+
| `docs` | Mudanças apenas em documentação |
|
|
22
|
+
| `test` | Adição ou correção de testes |
|
|
23
|
+
| `chore` | Build, deps, configs, tarefas de manutenção |
|
|
24
|
+
| `ci` | Mudanças em CI/CD (pipelines, workflows) |
|
|
25
|
+
| `perf` | Melhoria de performance |
|
|
26
|
+
|
|
27
|
+
## Regras
|
|
28
|
+
|
|
29
|
+
1. Descrição no imperativo: "adicionar", não "adicionado" ou "adicionando"
|
|
30
|
+
2. Primeira letra minúscula
|
|
31
|
+
3. Sem ponto final
|
|
32
|
+
4. Máximo 72 caracteres na primeira linha
|
|
33
|
+
5. Escopo é o módulo/feature afetada
|
|
34
|
+
6. Se a mudança quebra compatibilidade, adicionar `BREAKING CHANGE:` no corpo
|
|
35
|
+
|
|
36
|
+
## Exemplos
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
feat(demands): adicionar decomposição automática de tasks
|
|
40
|
+
fix(agents): corrigir timeout na execução de skill
|
|
41
|
+
refactor(bundles): extrair validação para value object
|
|
42
|
+
test(tracking): adicionar testes para eventos MCP
|
|
43
|
+
docs(readme): atualizar instruções de instalação
|
|
44
|
+
chore(deps): atualizar langchain para 0.3.x
|
|
45
|
+
ci(gitlab): adicionar stage de compliance check
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Corpo (opcional)
|
|
49
|
+
|
|
50
|
+
Para mudanças complexas, adicionar corpo explicando o **porquê**:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
refactor(orchestrator): simplificar alocação de agentes
|
|
54
|
+
|
|
55
|
+
A alocação anterior usava um loop O(n²) comparando todos os agentes
|
|
56
|
+
com todas as tasks. Agora usa um mapa indexado por tipo de agente,
|
|
57
|
+
reduzindo para O(n).
|
|
58
|
+
```
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Constitution — Projeto Pipeline de Dados e ML
|
|
2
|
+
|
|
3
|
+
## Princípios
|
|
4
|
+
|
|
5
|
+
1. **Spec primeiro, código depois** — Toda demanda passa pelo fluxo SDD antes de implementação
|
|
6
|
+
2. **Dados originais são imutáveis** — Nunca editar dados em `raw/`
|
|
7
|
+
3. **Reprodutibilidade** — Todo pipeline deve ser reproduzível com mesma entrada = mesma saída
|
|
8
|
+
4. **Baseline obrigatório** — Todo modelo precisa de baseline para comparação
|
|
9
|
+
5. **Notebook para exploração, script para produção** — Refatorar antes de merge
|
|
10
|
+
|
|
11
|
+
## Padrões de desenvolvimento
|
|
12
|
+
|
|
13
|
+
- Python 3.11+, type hints, Black + Ruff
|
|
14
|
+
- Funções puras para transformações (input → output)
|
|
15
|
+
- Validação de schema em cada etapa (Pandera)
|
|
16
|
+
- Versionamento de datasets com DVC
|
|
17
|
+
- Experiment tracking com MLflow
|
|
18
|
+
|
|
19
|
+
## Padrões de ML
|
|
20
|
+
|
|
21
|
+
- Cross-validation k=5 mínimo
|
|
22
|
+
- Métricas documentadas no MLflow
|
|
23
|
+
- Feature importance registrada
|
|
24
|
+
- Random seed consistente
|
|
25
|
+
- A/B testing antes de substituir modelo
|
|
26
|
+
|
|
27
|
+
## Padrões de qualidade
|
|
28
|
+
|
|
29
|
+
- Testes de schema para transformações
|
|
30
|
+
- Testes de regressão para métricas
|
|
31
|
+
- Cobertura mínima: 80% em pipelines
|
|
32
|
+
- Commits seguem Conventional Commits
|