Skip to content

Commit 968e363

Browse files
committed
refactor: standardize code style and formatting across codebase while introducing project integrity agent rules.
1 parent 7011ce5 commit 968e363

77 files changed

Lines changed: 1811 additions & 1003 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/AGENTS.md

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,19 @@
22

33
This file documents workspace-specific rules, patterns, and guidelines that all AI coding assistants must adhere to when working on this repository.
44

5-
## MCP Tools & Discovery
5+
## Specialized Agents & Automated Scanners
66

7-
- **Codebase Memory**: This project uses `codebase-memory-mcp`. Always prefer using MCP graph tools (`search_graph`, `trace_path`, `get_code_snippet`, etc.) over raw grep/find commands for exploring the codebase.
8-
- **Mandatory Re-indexation**: After completing any task that creates, modifies, or deletes source files, you MUST re-index the repository by calling `index_repository` via `codebase-memory-mcp`. This keeps the knowledge graph in sync with the current codebase and ensures future graph queries remain accurate. Do this as the last step of every task before reporting completion.
7+
This project uses a dedicated ecosystem of specialized agents located in `.agents/skills/` and `.agents/rules/`:
8+
9+
1. **Cybersecurity Agent (`cybersecurity-agent`)**: OWASP Top 10 auditing, secret leak prevention, SVG/XSS sanitization, SSRF protection, database query safety, and dependency vulnerability checks (`pnpm security:scan`).
10+
2. **Code Integrity Agent (`code-integrity-agent`)**: ESLint compliance, Prettier code formatting, dead code sweeping, DRY principles, and strict TypeScript checks (`pnpm integrity:scan`).
11+
3. **Architecture Agent (`architecture-agent`)**: Clean Architecture layer boundaries (Domain -> Use Cases -> Adapters -> Modules), monorepo package version synchronization, and documentation integrity (`pnpm architecture:scan`).
12+
4. **Best Practices Agent (`best-practices-agent`)**: Guard clauses (negation first), `readonly` class properties, runtime parameter type validation, exact package versions, and non-root Docker execution (`pnpm best-practices:scan`).
13+
14+
To run the complete suite of agent checks before completing any task, run:
15+
```bash
16+
pnpm scan:all
17+
```
918

1019
## Security Rules & Mandatory OWASP Review Workflow
1120

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Directivas del Agente de Arquitectura
2+
3+
Este archivo define las reglas obligatorias de estructura y arquitectura Clean para todo agente o desarrollador en **GitCard Studio**.
4+
5+
## 1. Escaneo Obligatorio Pre-Commit
6+
Antes de finalizar cualquier tarea que altere la estructura de carpetas, dependencias o módulos en el backend o frontend, se DEBE ejecutar:
7+
8+
```bash
9+
pnpm architecture:scan
10+
```
11+
12+
## 2. Reglas Estrictas de Arquitectura
13+
1. **Aislamiento de la Capa Domain**: `backend/src/domain` no debe importar módulos de `infrastructure`, `adapters`, `modules` ni librerías de infraestructura externa (Fastify, NestJS, TypeORM).
14+
2. **Desacoplamiento de Casos de Uso**: Los casos de uso (`use-cases/`) deben depender exclusivamente de interfaces de repositorio e interactuar con entidades de dominio.
15+
3. **Sincronización de Versiones Monorepo**: La propiedad `"version"` debe coincidir exactamente en `package.json`, `backend/package.json` y `frontend/package.json`.
16+
4. **Sincronización de Documentación**: Toda modificación arquitectónica o de despliegue requiere actualizar `README.md`, `CHANGELOG.md` y `.agents/ARCHITECTURE.md`.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Directivas del Agente de Buenas Prácticas
2+
3+
Este archivo define las reglas obligatorias de patrones de desarrollo y programación defensiva en **GitCard Studio**.
4+
5+
## 1. Escaneo Obligatorio Pre-Commit
6+
Antes de dar por completada cualquier tarea, se DEBE ejecutar el análisis de buenas prácticas:
7+
8+
```bash
9+
pnpm best-practices:scan
10+
```
11+
12+
## 2. Reglas Estrictas de Patrones
13+
1. **Programación Defensiva y Cláusulas de Guardia**: Tratar primero la condición de falla/negación en cláusulas `if` (`if (!param) { return ...; }`) para evitar anidamiento.
14+
2. **Propiedades Inmutables (`readonly`)**: Marcar todas las dependencias inyectadas en constructores y propiedades de clase como `readonly`.
15+
3. **Validación de Parámetros de Consulta**: Verificar explícitamente el tipo `typeof req.query.x === 'string'` antes de utilizar parámetros HTTP.
16+
4. **Gestión de Paquetes y Versiones**: Usar exclusivamente `pnpm`. No instalar paquetes con prefijos `^` o `~` en `package.json`.
17+
5. **Aislamiento en Docker**: Garantizar que el contenedor ejecute la app bajo `USER node`.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Directivas del Agente de Integridad de Código
2+
3+
Este archivo define las reglas obligatorias de calidad de código y formato para todo agente o desarrollador que modifique **GitCard Studio**.
4+
5+
## 1. Escaneo Obligatorio Pre-Commit
6+
Antes de finalizar cualquier tarea que altere código fuente en backend o frontend, se DEBE ejecutar la verificación de integridad:
7+
8+
```bash
9+
pnpm integrity:scan
10+
```
11+
12+
## 2. Reglas Estrictas de Integridad y Limpieza
13+
1. **Formato Prettier**: Ningún archivo con código desalineado o sin formato debe ser enviado al repositorio. Usar `pnpm format`.
14+
2. **ESLint Sin Incidencias**: El comando `pnpm lint` debe arrojar `0` errores y `0` advertencias.
15+
3. **Limpieza de Código Muerto**: Prohibido dejar bloques de código fuente comentados (`// const x = ...`), importaciones no utilizadas o variables inactivas.
16+
4. **Principios DRY**: Reutilizar siempre helpers centralizados (como `renderBrandHeader` en presentadores SVG o `escapeXml` en sanitización) en lugar de duplicar lógica.
17+
5. **Tipado TypeScript Inmutable**: Utilizar `readonly` en miembros de clase privados o propiedades inicializadas que no se reasignan.

CHANGELOG.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,21 @@
22

33
Todos los cambios notables en este proyecto serán documentados en este archivo.
44

5+
## [1.8.3] - 2026-08-24
6+
7+
### 🤖 Ecosistema de Agentes Especializados & Auditoría Automatizada (`pnpm scan:all`)
8+
- **Sistema de Agentes Dedicados**: Creación e integración de 4 agentes especializados para garantizar la calidad del repositorio:
9+
- **`cybersecurity-agent`**: Auditorías OWASP Top 10, sanitización XSS/SVG, prevención de SSRF/Inyección SQL y control de credenciales (`pnpm security:scan`).
10+
- **`code-integrity-agent`**: Cumplimiento estricto de ESLint, Prettier, detección de código muerto y tipado inmutable (`pnpm integrity:scan`).
11+
- **`architecture-agent`**: Verificación de límites de capa Clean Architecture, aislamiento del dominio y sincronización de documentación/versiones (`pnpm architecture:scan`).
12+
- **`best-practices-agent`**: Programación defensiva con cláusulas de guardia (negación primero), modificadores `readonly` y versiones fijas exactas (`pnpm best-practices:scan`).
13+
- **Comando Unificado de Escaneo**: Añadido `pnpm scan:all` para ejecutar de forma consecutiva la suite completa de agentes antes de cada commit.
14+
15+
### 📦 Gestor de Paquetes & Actualizaciones de Dependencias
16+
- **Sincronización de pnpm**: Actualizado el gestor de paquetes a `pnpm@11.24.0` en el `Dockerfile` (etapas builder y runner) y alineado con `packageManager` en `package.json`.
17+
- **Remediación de Seguridad en Dependencias (`pnpm audit`)**: Actualizado la anulación de `brace-expansion` a `5.0.9` en `pnpm-workspace.yaml`, logrando 0 vulnerabilidades reportadas.
18+
- **Actualización de Dependencias Frontend**: Actualizado `astro` a `7.2.5` y `happy-dom` a `20.11.6` en `frontend/package.json`.
19+
520
## [1.8.2] - 2026-08-19
621

722
### 🛡️ Agente de Ciberseguridad & Auditorías de Seguridad Automatizadas
@@ -407,4 +422,4 @@ Todos los cambios notables en este proyecto serán documentados en este archivo.
407422

408423
---
409424

410-
**Versión actualmente expuesta / en producción:** v1.8.2
425+
**Versión actualmente expuesta / en producción:** v1.8.3

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
FROM node:24-alpine AS builder
33

44
# Install pnpm globally
5-
RUN npm install -g pnpm@11.20.0 --ignore-scripts
5+
RUN npm install -g pnpm@11.24.0 --ignore-scripts
66

77
WORKDIR /usr/src/app
88

@@ -27,7 +27,7 @@ RUN pnpm run build
2727
FROM node:24-alpine AS runner
2828

2929
# Install pnpm
30-
RUN npm install -g pnpm@11.20.0 --ignore-scripts
30+
RUN npm install -g pnpm@11.24.0 --ignore-scripts
3131

3232
WORKDIR /usr/src/app
3333

backend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "gitcard-studio-backend",
3-
"version": "1.8.2",
3+
"version": "1.8.3",
44
"description": "High-performance NestJS & Fastify API backend server for GitCard Studio SVG stats card generation, OAuth integration, and metrics tracking.",
55
"main": "dist/server.js",
66
"scripts": {

backend/src/adapters/presenters/topReposCard.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ export function renderTopReposCard(
2424
const repoRows = top4
2525
.map((repo, i) => {
2626
const y = HEADER_HEIGHT + i * ROW_HEIGHT;
27-
const desc = repo.description.length > 55 ? `${repo.description.slice(0, 52)}…` : repo.description;
27+
const desc =
28+
repo.description.length > 55 ? `${repo.description.slice(0, 52)}…` : repo.description;
2829

2930
return `
3031
<g transform="translate(0, ${y})">

backend/src/adapters/presenters/viewsBadge.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ function resolveColor(colorParam?: string, themeParam?: string): string {
3535
return theme.accent;
3636
}
3737

38-
3938
export function renderViewsBadge(
4039
count: number,
4140
label?: string,

backend/src/adapters/repositories/ApiGitHubRepository.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@ export class ApiGitHubRepository implements IGitHubRepository {
165165
if (!reposData) {
166166
return { totalPublicCount: currentPublicCount, hasNextPage: false, afterCursor: null };
167167
}
168-
const totalPublicCount = currentPublicCount === 0 ? (reposData.totalCount || 0) : currentPublicCount;
168+
const totalPublicCount =
169+
currentPublicCount === 0 ? reposData.totalCount || 0 : currentPublicCount;
169170
allRepoNodes.push(...(reposData.nodes ?? []));
170171
return {
171172
totalPublicCount,
@@ -194,11 +195,10 @@ export class ApiGitHubRepository implements IGitHubRepository {
194195
? { after: afterCursor }
195196
: { username, after: afterCursor };
196197

197-
const data: { user?: any; viewer?: any } | null = await this.fetchGraphQL<{ user?: any; viewer?: any }>(
198-
query,
199-
variables,
200-
userToken
201-
);
198+
const data: { user?: any; viewer?: any } | null = await this.fetchGraphQL<{
199+
user?: any;
200+
viewer?: any;
201+
}>(query, variables, userToken);
202202

203203
const currentUser: any = isViewer ? data?.viewer : data?.user;
204204
if (!currentUser) break;
@@ -1084,7 +1084,8 @@ export class ApiGitHubRepository implements IGitHubRepository {
10841084
if (!sponsorEntity) continue;
10851085

10861086
const tier = node.tier;
1087-
const dollars = tier?.monthlyPriceInDollars ?? Math.round((tier?.monthlyPriceInCents ?? 0) / 100);
1087+
const dollars =
1088+
tier?.monthlyPriceInDollars ?? Math.round((tier?.monthlyPriceInCents ?? 0) / 100);
10881089
const isOneTime = Boolean(tier?.isOneTime);
10891090

10901091
if (isOneTime) {
@@ -1223,7 +1224,10 @@ export class ApiGitHubRepository implements IGitHubRepository {
12231224
}
12241225
}
12251226
} catch (err) {
1226-
logger.warn(`Could not fetch commit activity for user ${username}:`, { username, error: err });
1227+
logger.warn(`Could not fetch commit activity for user ${username}:`, {
1228+
username,
1229+
error: err
1230+
});
12271231
}
12281232

12291233
return {

0 commit comments

Comments
 (0)