qdd-framework 1.9.16 → 1.9.19
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 +53 -0
- package/bin/qdd +0 -0
- package/install.js +64 -23
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# QDD Framework — Quality-Driven Development
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/qdd-framework)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
**QDD (Quality-Driven Development)** es una Plataforma de Ingeniería de Software basada en Mejora Continua y Gobernanza de Código desde el Día Cero. Asegura la calidad de producción eliminando prompts manuales mediante un Framework (Wisdom Registry), certificaciones 'Rules-as-Code', auditoría técnica automatizada (9 pilares de calidad), equipo resolutor multi-agente nivel FAANG (`/qdd resolve`), soporte completo para estándares internacionales de Inteligencia Artificial (ISO 42001, ISO 29119-11, SOC 2, ISO 23894), detección de APIs locales de LLM (Antigravity, Ollama, LM Studio) y un sistema unificado de reportes y dashboard en tiempo real.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 🚀 Instalación Rápida
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g qdd-framework
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## ⚡ Comandos Principales
|
|
19
|
+
|
|
20
|
+
- `qdd init`: Inicializa el entorno QDD en el proyecto e inyecta la configuración MCP en IDEs compatibles (Cursor, Claude Code, Antigravity).
|
|
21
|
+
- `qdd audit`: Ejecuta la auditoría estática de código sobre los 9 pilares de calidad (Zero-Else, OWASP, Twelve-Factor, AI Governance, Clean Code, etc.).
|
|
22
|
+
- `qdd certify`: Valida las certificaciones del proyecto y genera el certificado histórico de calidad.
|
|
23
|
+
- `qdd doctor`: Diagnóstico determinista de salud y auto-reparación del entorno.
|
|
24
|
+
- `qdd report`: Genera un reporte ejecutivo consolidado en formato Texto, Markdown o JSON para CI/CD.
|
|
25
|
+
- `qdd evolution`: Consulta consultiva para determinar la siguiente mejora natural del proyecto.
|
|
26
|
+
- `qdd dashboard`: Centro de Comando Web interactivo con streaming en tiempo real (SSE) y ejecución de agentes.
|
|
27
|
+
- `qdd run`: Pipeline secuencial de comandos o modo supervisor con auto-reparación (`qdd run --keep-alive`).
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 🤖 Integración con Inteligencia Artificial (MCP Server)
|
|
32
|
+
|
|
33
|
+
QDD expone un servidor Model Context Protocol (MCP) que permite a asistentes como **Google Antigravity**, **Claude Code** y **Cursor** consultar reglas, diagnosticar problemas y ejecutar tareas de forma gobernada:
|
|
34
|
+
|
|
35
|
+
- `/qdd init`
|
|
36
|
+
- `/qdd validate`
|
|
37
|
+
- `/qdd certify`
|
|
38
|
+
- `/qdd resolve` (Equipo Resolutor FAANG)
|
|
39
|
+
- `/qdd report`
|
|
40
|
+
- `/qdd evolution`
|
|
41
|
+
- `/qdd docs`
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 🛡️ Reglas Globales de Codificación
|
|
46
|
+
1. **Cero-Else:** QDD prohíbe el uso de `else`, exigiendo cláusulas de guarda y retornos tempranos (*Early Returns*).
|
|
47
|
+
2. **Salida Más Rápida Primero:** Los errores y validaciones se manejan al inicio de cada función.
|
|
48
|
+
3. **Aprendizaje Perpetuo:** Todo bug encontrado se documenta como Finding y requiere un test unitario obligatorio.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 📄 Licencia
|
|
53
|
+
MIT © QDD Framework Team
|
package/bin/qdd
CHANGED
|
Binary file
|
package/install.js
CHANGED
|
@@ -23,51 +23,92 @@ const os = platformMap[process.platform];
|
|
|
23
23
|
const arch = archMap[process.arch];
|
|
24
24
|
|
|
25
25
|
if (!os || !arch) {
|
|
26
|
-
console.error(`Plataforma no soportada: ${process.platform} ${process.arch}`);
|
|
26
|
+
console.error(`[QDD] Plataforma no soportada: ${process.platform} ${process.arch}`);
|
|
27
27
|
process.exit(1);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
const ext = os === 'windows' ? 'zip' : 'tar.gz';
|
|
31
31
|
const binaryExt = os === 'windows' ? '.exe' : '';
|
|
32
32
|
const binaryName = `qdd${binaryExt}`;
|
|
33
|
-
const url = `https://github.com/${REPO}/releases/download/${VERSION}/qdd_${os}_${arch}.${ext}`;
|
|
34
|
-
|
|
35
33
|
const binDir = path.join(__dirname, 'bin');
|
|
34
|
+
|
|
35
|
+
if (!fs.existsSync(binDir)) {
|
|
36
|
+
fs.mkdirSync(binDir, { recursive: true });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// 1. Detección de binario local para desarrollo
|
|
40
|
+
const localBinRoot = path.join(__dirname, '..', binaryName);
|
|
41
|
+
const localBinCli = path.join(__dirname, '..', 'cli', binaryName);
|
|
42
|
+
|
|
43
|
+
if (fs.existsSync(localBinRoot)) {
|
|
44
|
+
console.log(`[QDD] Binario local detectado en ${localBinRoot}. Usando copia local para desarrollo...`);
|
|
45
|
+
fs.copyFileSync(localBinRoot, path.join(binDir, binaryName));
|
|
46
|
+
fs.chmodSync(path.join(binDir, binaryName), 0o755);
|
|
47
|
+
console.log('[QDD] ¡Instalación completada desde binario local!');
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (fs.existsSync(localBinCli)) {
|
|
52
|
+
console.log(`[QDD] Binario local detectado en ${localBinCli}. Usando copia local para desarrollo...`);
|
|
53
|
+
fs.copyFileSync(localBinCli, path.join(binDir, binaryName));
|
|
54
|
+
fs.chmodSync(path.join(binDir, binaryName), 0o755);
|
|
55
|
+
console.log('[QDD] ¡Instalación completada desde binario local!');
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// 2. Descarga desde GitHub Releases
|
|
60
|
+
const url = `https://github.com/${REPO}/releases/download/${VERSION}/qdd_${os}_${arch}.${ext}`;
|
|
36
61
|
const downloadDest = path.join(__dirname, `qdd-download.${ext}`);
|
|
37
62
|
|
|
38
63
|
console.log(`[QDD] Descargando binario nativo para ${os}-${arch}...`);
|
|
39
64
|
console.log(`[QDD] URL: ${url}`);
|
|
40
65
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
66
|
+
downloadBinary(url);
|
|
67
|
+
|
|
68
|
+
function downloadBinary(targetUrl) {
|
|
69
|
+
const file = fs.createWriteStream(downloadDest);
|
|
70
|
+
https.get(targetUrl, (response) => {
|
|
71
|
+
if (response.statusCode === 301 || response.statusCode === 302) {
|
|
72
|
+
if (response.headers.location) {
|
|
73
|
+
return downloadBinary(response.headers.location);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (response.statusCode !== 200) {
|
|
78
|
+
console.error(`[QDD] Error: GitHub Release devolvió HTTP ${response.statusCode} para ${targetUrl}`);
|
|
79
|
+
console.error('[QDD] Si estás instalando desde una versión no publicada aún, compila localmente con "make build"');
|
|
80
|
+
process.exit(0); // Permitir que la instalación de npm continúe sin romper builds de CI
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
response.pipe(file);
|
|
84
|
+
file.on('finish', () => {
|
|
85
|
+
file.close(extractBinary);
|
|
48
86
|
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
process.exit(1);
|
|
55
|
-
});
|
|
87
|
+
}).on('error', (err) => {
|
|
88
|
+
console.error('[QDD] Error de red descargando el binario:', err.message);
|
|
89
|
+
process.exit(0);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
56
92
|
|
|
57
93
|
function extractBinary() {
|
|
58
94
|
console.log('[QDD] Extrayendo...');
|
|
59
95
|
try {
|
|
60
96
|
if (os === 'windows') {
|
|
61
|
-
execSync(`tar -xf ${downloadDest} -C ${__dirname}`);
|
|
97
|
+
execSync(`tar -xf "${downloadDest}" -C "${__dirname}"`);
|
|
62
98
|
}
|
|
63
99
|
if (os !== 'windows') {
|
|
64
|
-
execSync(`tar -xzf ${downloadDest} -C ${__dirname}`);
|
|
100
|
+
execSync(`tar -xzf "${downloadDest}" -C "${__dirname}"`);
|
|
101
|
+
}
|
|
102
|
+
const extractedBin = path.join(__dirname, binaryName);
|
|
103
|
+
if (fs.existsSync(extractedBin)) {
|
|
104
|
+
fs.renameSync(extractedBin, path.join(binDir, binaryName));
|
|
105
|
+
fs.chmodSync(path.join(binDir, binaryName), 0o755);
|
|
106
|
+
}
|
|
107
|
+
if (fs.existsSync(downloadDest)) {
|
|
108
|
+
fs.unlinkSync(downloadDest);
|
|
65
109
|
}
|
|
66
|
-
fs.renameSync(path.join(__dirname, binaryName), path.join(binDir, binaryName));
|
|
67
|
-
fs.chmodSync(path.join(binDir, binaryName), 0o755);
|
|
68
|
-
fs.unlinkSync(downloadDest);
|
|
69
110
|
console.log('[QDD] ¡Instalación nativa completada exitosamente!');
|
|
70
111
|
} catch (err) {
|
|
71
|
-
console.error('[QDD] Error al extraer el binario:', err);
|
|
112
|
+
console.error('[QDD] Error al extraer el binario:', err.message);
|
|
72
113
|
}
|
|
73
114
|
}
|