![Logo UPT](./media/logo-upt.png) **UNIVERSIDAD PRIVADA DE TACNA** **FACULTAD DE INGENIERÍA** **Escuela Profesional de Ingeniería de Sistemas** **Estándar de Programación** **Sistema Analizador de Dependencias Multi-Lenguaje (DepAnalyzer)** Curso: *Calidad y Pruebas de Software* Docente: *Patrick Cuadros Quiroga* Integrantes: ***Carbajal Vargas, Andre Alejandro (2023077287)*** ***Yupa Gómez, Fátima Sofía (2023076618)*** **Tacna - Perú** ***2026***
\pagebreak

Sistema Analizador de Dependencias Multi-Lenguaje (DepAnalyzer)

Estándar de Programación

Versión 1.0

CONTROL DE VERSIONES
Versión Hecha por Revisada por Aprobada por Fecha Motivo
1.0 ACV, FYG ACV, FYG P. Cuadros Q. 2026-06-23 Versión inicial del estándar

ÍNDICE GENERAL

  1. Introducción
  2. Principios Generales
  3. Organización del Código
  4. Convenciones Kotlin
  5. Manejo de Errores y Recursos
  6. Seguridad
  7. Pruebas
  8. Documentación
  9. Git y Revisión de Cambios
  10. Automatización y Criterios de Aceptación
\pagebreak

1. Introducción

1.1 Propósito

Este estándar establece las reglas de desarrollo de DepAnalyzer para mantener consistencia entre código, pruebas, documentación y automatización. Sus disposiciones se aplican a nuevas funcionalidades, correcciones, refactorizaciones y revisiones de código.

1.2 Alcance

El estándar cubre la aplicación Kotlin, scripts de construcción, integración MCP, workflows, pruebas y documentos técnicos. Cuando una herramienta aplique reglas más estrictas, se debe adoptar la regla que proporcione mayor claridad y seguridad sin contradecir la arquitectura del proyecto.

1.3 Referencias

2. Principios Generales

  1. Priorizar legibilidad y comportamiento explícito sobre soluciones ingeniosas.
  2. Mantener cada módulo enfocado en una responsabilidad.
  3. Modelar estados válidos mediante tipos y enumeraciones.
  4. Validar entradas en los límites: CLI, archivos, procesos y APIs.
  5. Conservar degradación controlada cuando exista información parcial útil.
  6. Evitar registrar o persistir secretos.
  7. Acompañar cambios de comportamiento con pruebas.
  8. Mantener documentación y código sincronizados.
  9. Evitar refactorizaciones no relacionadas dentro de una corrección puntual.
  10. Favorecer funciones pequeñas y nombres que expresen intención.

3. Organización del Código

Paquete / Módulo Responsabilidad permitida
cli Comandos, opciones, validación de entrada y códigos de salida
core Orquestación del análisis y reglas transversales
core.graph Grafo, nodos, recorridos y cadenas vulnerables
parser Detección y lectura de manifiestos o lockfiles
repository APIs, repositorios de paquetes, autenticación y reintentos
report Modelos de salida, JSON, consola y árboles
update Planificación, respaldo y modificación controlada
tui Estado, layout, interacción y capacidades de terminal
security Políticas para credenciales y destinos confiables
telemetry Eventos anónimos y control de envío
integrations/mcp Exposición controlada para clientes MCP

3.1 Dependencias entre Módulos

3.2 Estructura de Archivos

4. Convenciones Kotlin

4.1 Nombres

Elemento Convención Ejemplo
Clase, interfaz, enum PascalCase ProjectAnalyzer
Función y propiedad camelCase getVulnerabilities
Constante UPPER_SNAKE_CASE MAX_RETRIES
Paquete Minúsculas, dominio reverso com.depanalyzer.parser
Archivo Nombre del tipo principal DependencyReport.kt
Test Tipo o comportamiento probado + Test OssIndexClientTest

Los nombres deben describir el dominio. Se deben evitar abreviaturas ambiguas, sufijos genéricos como Manager cuando exista una responsabilidad más precisa y nombres que repitan innecesariamente el paquete.

4.2 Formato e Imports

4.3 Tipos y Nulabilidad

4.4 Funciones y Clases

4.5 Inmutabilidad y Efectos

5. Manejo de Errores y Recursos

5.1 Reglas

5.2 Excepciones

Situación Tratamiento recomendado
Argumento inválido IllegalArgumentException o error de validación Clikt
Estado interno imposible IllegalStateException o check
Archivo inexistente Mensaje operativo con ruta y acción sugerida
Error HTTP Resultado controlado con código, fuente y posibilidad de fallback
Timeout de proceso Cancelación, advertencia y recomendación de ajustar --timeout
Respuesta incompleta Omitir el dato inválido y conservar advertencia

5.3 Recursos

6. Seguridad

  1. No registrar tokens, contraseñas, cabeceras sensibles ni URLs con credenciales.
  2. Leer OSS_INDEX_TOKEN, NVD_API_KEY, SONAR_TOKEN y SNYK_TOKEN desde variables de entorno o secretos CI.
  3. Enviar credenciales de repositorios solo por HTTPS.
  4. Aplicar DEPANALYZER_TRUSTED_CREDENTIAL_HOSTS como allowlist y denegar por defecto.
  5. Validar y normalizar URLs antes de compararlas con hosts confiables.
  6. Tratar archivos, respuestas HTTP y salida de procesos como entradas no confiables.
  7. No ejecutar comandos construidos mediante concatenación de texto no validado.
  8. No modificar archivos de build sin aprobación, --apply-id o flujo explícito.
  9. Crear backup antes de aplicar una actualización.
  10. Evitar incluir datos sensibles en reportes, telemetría y excepciones.

7. Pruebas

7.1 Convenciones

7.2 Cobertura por Cambio

La cobertura de líneas del núcleo medible debe ser mayor o igual al 70% en JaCoCo y Sonar. Se excluyen únicamente fronteras que dependen directamente de una terminal interactiva o de procesos externos:

Estas exclusiones no eliminan sus pruebas. Solo evitan que detalles dependientes de plataforma distorsionen la métrica estructural; sus resultados se reportan en las suites de interfaz e integración.

La mutación se concentra en reglas puras y críticas: grafo de dependencias, construcción del árbol, clasificación de vulnerabilidades y validación de entradas. Los adaptadores de red, terminal y procesos se validan mediante integración y no se incluyen en PIT para mantener una ejecución reproducible dentro del límite del pipeline.

La línea base de PIT exige mutation score mayor o igual al 45% y cobertura de las clases mutadas mayor o igual al 65%. Estos umbrales deben incrementarse cuando se añadan pruebas que eliminen mutantes supervivientes.

Cambio Pruebas mínimas esperadas
Nuevo parser Archivo válido, sintaxis alternativa, campo ausente y entrada inválida
Cliente HTTP Éxito, error, autenticación, timeout y respuesta parcial
Opción CLI Valor predeterminado, opción explícita, combinación inválida y código de salida
Formato JSON Serialización válida, listas vacías y ausencia de ruido en stdout
Actualizador Dry-run, cambio seleccionado, archivo no compatible y backup
TUI Estado inicial, navegación, filtros y terminal reducida
Corrección de bug Test de regresión que falla antes de la corrección

7.3 Tipos de Prueba y Evidencia

Tipo Ubicación / Evidencia
Unitarias src/test/kotlin/com/depanalyzer/**
Integración src/test/kotlin/com/depanalyzer/integration/**
Interfaz Pruebas de cli y tui
Mutación build/reports/pitest
MCP npm test en integrations/mcp
Análisis estático Semgrep y Sonar
Dependencias Snyk

Las pruebas no deben depender de APIs reales, credenciales personales, orden de ejecución ni conectividad externa salvo que sean pruebas end-to-end explícitamente separadas.

8. Documentación

9. Git y Revisión de Cambios

9.1 Commits

9.2 Revisión

La revisión debe priorizar:

  1. Corrección y regresiones.
  2. Seguridad y exposición de credenciales.
  3. Compatibilidad del JSON y la CLI.
  4. Manejo de errores y recursos.
  5. Pruebas faltantes.
  6. Consistencia arquitectónica.
  7. Legibilidad y documentación.

10. Automatización y Criterios de Aceptación

10.1 Comandos Principales

./gradlew test
./gradlew assemble
./gradlew pitest

Para MCP:

cd integrations/mcp
npm ci
npm test

10.2 Definición de Terminado

Un cambio se considera terminado cuando: