agentic-workflow-manager 6.3.0 → 6.4.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.
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
// Guard estructural — un sensor declarado cuyo archivo de configuración no existe no es un
|
|
7
|
+
// sensor: es un `fail` o un `inconclusive` permanente que entrena a ignorar el rojo.
|
|
8
|
+
//
|
|
9
|
+
// Pasó dos veces en este repo, y las dos veces sobrevivió meses:
|
|
10
|
+
// - `depcheck` apuntaba a `.dep-cruiser.awm.js`, que NUNCA existió en ninguna rama →
|
|
11
|
+
// `awm sensors run` daba `fail` permanente.
|
|
12
|
+
// - `security` apuntaba a `.semgrep.awm.yml`, que existía en el sensor-pack pero el
|
|
13
|
+
// `.gitignore` del repo (`*.awm.*`) impedía versionarlo → `inconclusive` permanente.
|
|
14
|
+
//
|
|
15
|
+
// La regla no enumera esos dos: deriva los configs del PROPIO `sensors.json`, así que un
|
|
16
|
+
// sensor agregado mañana la hereda sin que nadie se acuerde de este comentario.
|
|
17
|
+
const fs_1 = __importDefault(require("fs"));
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const CLI_ROOT = path_1.default.resolve(__dirname, '..', '..');
|
|
20
|
+
const SENSORS = path_1.default.join(CLI_ROOT, '.awm', 'sensors.json');
|
|
21
|
+
/** Extrae los archivos de config que un comando de sensor referencia. Se buscan por la
|
|
22
|
+
* convención `*.awm.*` que usan todos los packs, no por una lista de nombres — un pack
|
|
23
|
+
* nuevo con otro linter queda cubierto igual. */
|
|
24
|
+
function configFilesIn(cmd) {
|
|
25
|
+
return cmd.split(/\s+/).filter((token) => /\.awm\./.test(token) && !token.startsWith('-'));
|
|
26
|
+
}
|
|
27
|
+
describe('configs de sensores: declarados <=> presentes', () => {
|
|
28
|
+
const manifest = fs_1.default.existsSync(SENSORS)
|
|
29
|
+
? JSON.parse(fs_1.default.readFileSync(SENSORS, 'utf8'))
|
|
30
|
+
: null;
|
|
31
|
+
it('el manifiesto de sensores existe y declara sensores', () => {
|
|
32
|
+
expect(manifest?.sensors).toBeDefined();
|
|
33
|
+
expect(Object.keys(manifest.sensors).length).toBeGreaterThan(0);
|
|
34
|
+
});
|
|
35
|
+
it('cada archivo de config que un sensor referencia existe en el repo', () => {
|
|
36
|
+
const missing = [];
|
|
37
|
+
for (const [name, sensor] of Object.entries(manifest?.sensors ?? {})) {
|
|
38
|
+
for (const cmd of [sensor.cmd, sensor.changedCmd].filter((c) => typeof c === 'string')) {
|
|
39
|
+
for (const file of configFilesIn(cmd)) {
|
|
40
|
+
if (!fs_1.default.existsSync(path_1.default.join(CLI_ROOT, file)))
|
|
41
|
+
missing.push(`${name} -> ${file}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// El mensaje nombra sensor y archivo: un rojo que no dice cuál de los dos falta
|
|
46
|
+
// termina resuelto borrando el sensor, que es la salida equivocada.
|
|
47
|
+
expect(missing.join('\n') || 'todos presentes').toBe('todos presentes');
|
|
48
|
+
});
|
|
49
|
+
});
|