@nac3/forge-cli 1.23.6 → 1.24.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/dist/bin/yf.js +0 -0
- package/dist/chat/claude.d.ts +8 -0
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/claude_cli.d.ts +23 -0
- package/dist/chat/claude_cli.d.ts.map +1 -1
- package/dist/chat/claude_cli.js +76 -2
- package/dist/chat/claude_cli.js.map +1 -1
- package/dist/chat/doctrine_digest.d.ts.map +1 -1
- package/dist/chat/doctrine_digest.js +2 -1
- package/dist/chat/doctrine_digest.js.map +1 -1
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +11 -0
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/pending.d.ts +11 -0
- package/dist/chat/tools/pending.d.ts.map +1 -1
- package/dist/chat/tools/pending.js +55 -8
- package/dist/chat/tools/pending.js.map +1 -1
- package/dist/chat/tools/shell.d.ts +39 -4
- package/dist/chat/tools/shell.d.ts.map +1 -1
- package/dist/chat/tools/shell.js +167 -7
- package/dist/chat/tools/shell.js.map +1 -1
- package/dist/chat/tools/urazuke.d.ts.map +1 -1
- package/dist/chat/tools/urazuke.js +8 -5
- package/dist/chat/tools/urazuke.js.map +1 -1
- package/dist/chat/urazuke_section.d.ts +26 -4
- package/dist/chat/urazuke_section.d.ts.map +1 -1
- package/dist/chat/urazuke_section.js +115 -9
- package/dist/chat/urazuke_section.js.map +1 -1
- package/dist/commands/pending.d.ts.map +1 -1
- package/dist/commands/pending.js +116 -12
- package/dist/commands/pending.js.map +1 -1
- package/dist/commands/urazuke.d.ts +3 -0
- package/dist/commands/urazuke.d.ts.map +1 -1
- package/dist/commands/urazuke.js +80 -3
- package/dist/commands/urazuke.js.map +1 -1
- package/dist/core/ascii_purity.d.ts +69 -0
- package/dist/core/ascii_purity.d.ts.map +1 -0
- package/dist/core/ascii_purity.js +141 -0
- package/dist/core/ascii_purity.js.map +1 -0
- package/dist/core/battery_stamp.d.ts +85 -0
- package/dist/core/battery_stamp.d.ts.map +1 -0
- package/dist/core/battery_stamp.js +237 -0
- package/dist/core/battery_stamp.js.map +1 -0
- package/dist/core/ci_gaps.d.ts +129 -0
- package/dist/core/ci_gaps.d.ts.map +1 -0
- package/dist/core/ci_gaps.js +352 -0
- package/dist/core/ci_gaps.js.map +1 -0
- package/dist/core/doc_citations.d.ts +133 -0
- package/dist/core/doc_citations.d.ts.map +1 -0
- package/dist/core/doc_citations.js +271 -0
- package/dist/core/doc_citations.js.map +1 -0
- package/dist/core/turn_classifier.d.ts +4 -3
- package/dist/core/turn_classifier.d.ts.map +1 -1
- package/dist/core/turn_classifier.js +65 -20
- package/dist/core/turn_classifier.js.map +1 -1
- package/dist/docs/doctrine/urazuke.md +173 -2
- package/dist/nac3/internal_manifest.d.ts.map +1 -1
- package/dist/nac3/internal_manifest.js +28 -2
- package/dist/nac3/internal_manifest.js.map +1 -1
- package/dist/pending/store.d.ts +29 -0
- package/dist/pending/store.d.ts.map +1 -1
- package/dist/pending/store.js +51 -1
- package/dist/pending/store.js.map +1 -1
- package/dist/pending/types.d.ts +23 -0
- package/dist/pending/types.d.ts.map +1 -1
- package/dist/pending/types.js.map +1 -1
- package/dist/telemetry/usage.d.ts +18 -0
- package/dist/telemetry/usage.d.ts.map +1 -1
- package/dist/telemetry/usage.js +16 -1
- package/dist/telemetry/usage.js.map +1 -1
- package/dist/urazuke/announce.d.ts +7 -0
- package/dist/urazuke/announce.d.ts.map +1 -1
- package/dist/urazuke/announce.js +20 -0
- package/dist/urazuke/announce.js.map +1 -1
- package/dist/urazuke/catalog.d.ts +1 -1
- package/dist/urazuke/catalog.d.ts.map +1 -1
- package/dist/urazuke/catalog.js.map +1 -1
- package/dist/urazuke/close_gate.d.ts +31 -4
- package/dist/urazuke/close_gate.d.ts.map +1 -1
- package/dist/urazuke/close_gate.js +70 -13
- package/dist/urazuke/close_gate.js.map +1 -1
- package/dist/urazuke/current.d.ts +28 -0
- package/dist/urazuke/current.d.ts.map +1 -1
- package/dist/urazuke/current.js +18 -5
- package/dist/urazuke/current.js.map +1 -1
- package/dist/urazuke/cycle.d.ts +3 -0
- package/dist/urazuke/cycle.d.ts.map +1 -1
- package/dist/urazuke/cycle.js +5 -3
- package/dist/urazuke/cycle.js.map +1 -1
- package/dist/urazuke/evidence.d.ts +58 -1
- package/dist/urazuke/evidence.d.ts.map +1 -1
- package/dist/urazuke/evidence.js +203 -27
- package/dist/urazuke/evidence.js.map +1 -1
- package/dist/urazuke/evidence_env.d.ts +78 -0
- package/dist/urazuke/evidence_env.d.ts.map +1 -0
- package/dist/urazuke/evidence_env.js +341 -0
- package/dist/urazuke/evidence_env.js.map +1 -0
- package/dist/urazuke/freeze.d.ts.map +1 -1
- package/dist/urazuke/freeze.js +16 -9
- package/dist/urazuke/freeze.js.map +1 -1
- package/dist/urazuke/gate.d.ts +48 -0
- package/dist/urazuke/gate.d.ts.map +1 -1
- package/dist/urazuke/gate.js +251 -25
- package/dist/urazuke/gate.js.map +1 -1
- package/dist/urazuke/gates_data.d.ts +30 -3
- package/dist/urazuke/gates_data.d.ts.map +1 -1
- package/dist/urazuke/gates_data.js +51 -5
- package/dist/urazuke/gates_data.js.map +1 -1
- package/dist/urazuke/gates_pull.d.ts +40 -0
- package/dist/urazuke/gates_pull.d.ts.map +1 -1
- package/dist/urazuke/gates_pull.js +118 -8
- package/dist/urazuke/gates_pull.js.map +1 -1
- package/dist/urazuke/manual_cases.d.ts +11 -1
- package/dist/urazuke/manual_cases.d.ts.map +1 -1
- package/dist/urazuke/manual_cases.js +1 -0
- package/dist/urazuke/manual_cases.js.map +1 -1
- package/dist/urazuke/overrides.d.ts +107 -0
- package/dist/urazuke/overrides.d.ts.map +1 -0
- package/dist/urazuke/overrides.js +128 -0
- package/dist/urazuke/overrides.js.map +1 -0
- package/dist/urazuke/probes.d.ts.map +1 -1
- package/dist/urazuke/probes.js +51 -0
- package/dist/urazuke/probes.js.map +1 -1
- package/dist/urazuke/profiles.d.ts +135 -0
- package/dist/urazuke/profiles.d.ts.map +1 -0
- package/dist/urazuke/profiles.js +470 -0
- package/dist/urazuke/profiles.js.map +1 -0
- package/dist/urazuke/receipt_audit.d.ts +67 -0
- package/dist/urazuke/receipt_audit.d.ts.map +1 -0
- package/dist/urazuke/receipt_audit.js +103 -0
- package/dist/urazuke/receipt_audit.js.map +1 -0
- package/dist/urazuke/receipts.d.ts +22 -0
- package/dist/urazuke/receipts.d.ts.map +1 -1
- package/dist/urazuke/receipts.js +44 -0
- package/dist/urazuke/receipts.js.map +1 -1
- package/dist/urazuke/report.d.ts +30 -0
- package/dist/urazuke/report.d.ts.map +1 -1
- package/dist/urazuke/report.js +39 -0
- package/dist/urazuke/report.js.map +1 -1
- package/dist/urazuke/reset.d.ts +35 -0
- package/dist/urazuke/reset.d.ts.map +1 -0
- package/dist/urazuke/reset.js +150 -0
- package/dist/urazuke/reset.js.map +1 -0
- package/dist/urazuke/retro.d.ts +5 -1
- package/dist/urazuke/retro.d.ts.map +1 -1
- package/dist/urazuke/retro.js +21 -8
- package/dist/urazuke/retro.js.map +1 -1
- package/dist/urazuke/section.d.ts.map +1 -1
- package/dist/urazuke/section.js +17 -2
- package/dist/urazuke/section.js.map +1 -1
- package/dist/urazuke/semantics.d.ts +173 -0
- package/dist/urazuke/semantics.d.ts.map +1 -0
- package/dist/urazuke/semantics.js +232 -0
- package/dist/urazuke/semantics.js.map +1 -0
- package/dist/urazuke/start.d.ts +8 -0
- package/dist/urazuke/start.d.ts.map +1 -1
- package/dist/urazuke/start.js +10 -2
- package/dist/urazuke/start.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/workflow/orchestrator.d.ts.map +1 -1
- package/dist/workflow/orchestrator.js +6 -7
- package/dist/workflow/orchestrator.js.map +1 -1
- package/docs/doctrine/urazuke.md +173 -2
- package/package.json +24 -20
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LO QUE LA CADENA NO CORRIO -- F-14 / F-15 (pedido del dueno, 2026-11-01).
|
|
3
|
+
*
|
|
4
|
+
* EL DEFECTO. Medido en el repositorio: `.github/workflows/ci.yml` instala y
|
|
5
|
+
* corre `typecheck`, nada mas; `prepublishOnly` corre SEIS compuertas (build,
|
|
6
|
+
* typecheck, catalog:lint, test, brain-matrix:gate, hito4:lint). Asi que un
|
|
7
|
+
* VERDE en el badge de CI no significa "la bateria paso" -- significa "los
|
|
8
|
+
* tipos compilan" -- y nada en la salida de la corrida lo dice. Esta forma ya
|
|
9
|
+
* costo una vez: 1.20.1 salio publicada con un bug adentro.
|
|
10
|
+
*
|
|
11
|
+
* El dueno NO pidio mover las compuertas pesadas a la cadena (es una decision
|
|
12
|
+
* suya, con su motivo: la matriz multi-OS consumia la cuota en una rafaga).
|
|
13
|
+
* Pidio que la corrida DECLARE lo que no corrio. Es la misma regla que el
|
|
14
|
+
* metodo aplica a un recibo: una corrida que no mide algo tiene que decir que
|
|
15
|
+
* no lo midio, porque el que lee un verde no tiene otra forma de saberlo.
|
|
16
|
+
*
|
|
17
|
+
* Y LA PAREJA QUE EL DUENO SOSPECHO Y RESULTO PEOR (F-15). `lefthook.yml`
|
|
18
|
+
* declaraba un `pre-push` con `pnpm test` + `brain-matrix:gate`: dos
|
|
19
|
+
* compuertas, no las seis del publish. Pero antes de eso: el gancho no
|
|
20
|
+
* estaba instalado y no podia estarlo -- `.git/hooks` vacio,
|
|
21
|
+
* `core.hooksPath` sin poner, `lefthook` no era dependencia. Asi que la
|
|
22
|
+
* "preflight local" a la que el comentario de ci.yml remite no la corria
|
|
23
|
+
* ningun mecanismo: era un habito. Y el circulo se cerraba solo: ci.yml
|
|
24
|
+
* decia que lo pesado corre local, y lefthook.yml decia "CI is the real
|
|
25
|
+
* gate". Cada uno senalaba al otro y ninguno lo hacia.
|
|
26
|
+
*
|
|
27
|
+
* ARREGLADO EL 2026-11-01, con la decision del dueno: `lefthook` es
|
|
28
|
+
* devDependency, el ciclo `prepare` lo instala, y el pre-push corre el
|
|
29
|
+
* paquete de 24,8 s (todo `prepublishOnly` menos la bateria). La cadena NO
|
|
30
|
+
* se ensancha -- se mantiene liviana por cuota -- asi que para el trabajo en
|
|
31
|
+
* rama el gancho es la UNICA puerta. De ahi los dos agregados de este
|
|
32
|
+
* modulo: `triggers`, porque una cadena que solo dispara en main no es una
|
|
33
|
+
* segunda puerta para una rama; y la cobertura POR EQUIVALENCIA, porque el
|
|
34
|
+
* gancho invoca los scripts directo (arranca mas rapido) y `build` corre el
|
|
35
|
+
* mismo `tsc` que `typecheck` -- decir "no corre typecheck" ahi seria una
|
|
36
|
+
* falsa alarma, y una falsa alarma termina con el instrumento apagado.
|
|
37
|
+
*
|
|
38
|
+
* POR QUE ESTO SE DERIVA Y NO SE ESCRIBE A MANO. Una lista fija de "lo que
|
|
39
|
+
* no corre" es una segunda fuente de verdad, y se desincroniza el dia que
|
|
40
|
+
* alguien agrega una compuerta al publish -- el mismo defecto que este
|
|
41
|
+
* modulo esta reportando. Asi que las tres listas salen de los archivos que
|
|
42
|
+
* YA son la verdad (package.json, el workflow, lefthook.yml) y la diferencia
|
|
43
|
+
* se calcula. Si una de las tres no se puede leer, esto FALLA: una medicion
|
|
44
|
+
* que no se pudo hacer no se reporta como "no falta nada".
|
|
45
|
+
*
|
|
46
|
+
* ASCII-only.
|
|
47
|
+
*/
|
|
48
|
+
/** Los nombres de script que una linea de comandos invoca. Cubre las formas
|
|
49
|
+
* que este repositorio usa de verdad (`pnpm run x`, `pnpm x`, `npm run x`)
|
|
50
|
+
* y nada mas: inventar formas que nadie escribe es ruido. */
|
|
51
|
+
export function scriptsInvoked(command) {
|
|
52
|
+
const out = [];
|
|
53
|
+
const re = /(?:pnpm|npm|yarn)\s+(?:run\s+)?([a-z0-9][a-z0-9:_-]*)/gi;
|
|
54
|
+
let m;
|
|
55
|
+
while ((m = re.exec(command)) !== null) {
|
|
56
|
+
const name = m[1];
|
|
57
|
+
/* `pnpm install` / `pnpm exec` no son scripts del paquete. */
|
|
58
|
+
if (['install', 'exec', 'dlx', 'add', 'why', 'ls', 'publish', 'pack'].includes(name))
|
|
59
|
+
continue;
|
|
60
|
+
if (!out.includes(name))
|
|
61
|
+
out.push(name);
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
/** Los PROGRAMAS que una linea de comandos invoca de verdad, expandiendo
|
|
66
|
+
* los scripts del paquete. Es lo que permite decir "el gancho cubre
|
|
67
|
+
* `typecheck` porque corre `build`, que corre el mismo tsc" sin escribirlo
|
|
68
|
+
* a mano en ninguna lista.
|
|
69
|
+
*
|
|
70
|
+
* La forma de cada invocacion: el programa, y para `node` tambien el
|
|
71
|
+
* archivo (`node:scripts/catalog_lint.mjs`) -- dos scripts de node
|
|
72
|
+
* distintos no son la misma compuerta. */
|
|
73
|
+
export function invocationsOf(command, scripts = {}, seen = new Set()) {
|
|
74
|
+
const out = [];
|
|
75
|
+
const add = (v) => { if (v && !out.includes(v))
|
|
76
|
+
out.push(v); };
|
|
77
|
+
for (const rawSegment of command.split(/&&|\|\||;/)) {
|
|
78
|
+
const seg = rawSegment.trim();
|
|
79
|
+
if (!seg)
|
|
80
|
+
continue;
|
|
81
|
+
const tokens = seg.split(/\s+/).filter(Boolean);
|
|
82
|
+
let i = 0;
|
|
83
|
+
let head = tokens[i];
|
|
84
|
+
if (!head)
|
|
85
|
+
continue;
|
|
86
|
+
/* `pnpm run x` / `pnpm x` / `npm run x`: se expande al script. */
|
|
87
|
+
if (/^(pnpm|npm|yarn)$/.test(head)) {
|
|
88
|
+
i++;
|
|
89
|
+
while (tokens[i] && (tokens[i].startsWith('-') || tokens[i] === 'run'))
|
|
90
|
+
i++;
|
|
91
|
+
const next = tokens[i];
|
|
92
|
+
if (!next)
|
|
93
|
+
continue;
|
|
94
|
+
if (next === 'exec' || next === 'dlx') {
|
|
95
|
+
const bin = tokens[i + 1];
|
|
96
|
+
if (bin)
|
|
97
|
+
add(bin);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (['install', 'add', 'why', 'ls', 'publish', 'pack'].includes(next))
|
|
101
|
+
continue;
|
|
102
|
+
if (scripts[next] !== undefined && !seen.has(next)) {
|
|
103
|
+
const nextSeen = new Set(seen);
|
|
104
|
+
nextSeen.add(next);
|
|
105
|
+
for (const v of invocationsOf(scripts[next], scripts, nextSeen))
|
|
106
|
+
add(v);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
add(next);
|
|
110
|
+
}
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (head === 'npx') {
|
|
114
|
+
const bin = tokens[1];
|
|
115
|
+
if (bin)
|
|
116
|
+
add(bin);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (head === 'node' || head === 'tsx') {
|
|
120
|
+
const file = tokens.slice(1).find((t) => !t.startsWith('-'));
|
|
121
|
+
add(file ? head + ':' + file.replace(/\\/g, '/') : head);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
add(head);
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
/** Las lineas `run:` de un workflow, sin parsear YAML entero. Un parser
|
|
129
|
+
* completo seria una dependencia nueva para leer tres lineas; lo que hace
|
|
130
|
+
* seguro al atajo es que el caso de la bateria corre sobre el archivo REAL
|
|
131
|
+
* del repositorio, asi que un cambio de forma que esto no entienda sale
|
|
132
|
+
* rojo en vez de salir en silencio. */
|
|
133
|
+
function runLines(yaml) {
|
|
134
|
+
const out = [];
|
|
135
|
+
const lines = yaml.split(/\r?\n/);
|
|
136
|
+
for (let i = 0; i < lines.length; i++) {
|
|
137
|
+
const line = lines[i];
|
|
138
|
+
/* Un `#` al principio de la linea (despues de la sangria) es un
|
|
139
|
+
* comentario: el NOTE al pie de ci.yml nombra justamente las compuertas
|
|
140
|
+
* que NO corren, y contarlas como ejecutadas seria leer la confesion
|
|
141
|
+
* como si fuera el hecho. */
|
|
142
|
+
if (/^\s*#/.test(line))
|
|
143
|
+
continue;
|
|
144
|
+
const m = /^\s*(?:-\s+)?run:\s*(.*)$/.exec(line);
|
|
145
|
+
if (!m)
|
|
146
|
+
continue;
|
|
147
|
+
const rest = m[1].trim();
|
|
148
|
+
if (rest === '|' || rest === '>' || rest === '|-' || rest === '>-') {
|
|
149
|
+
/* Bloque: todo lo que sigue con mas sangria. */
|
|
150
|
+
const indent = (/^(\s*)/.exec(line)[1] ?? '').length;
|
|
151
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
152
|
+
const l = lines[j];
|
|
153
|
+
if (!l.trim())
|
|
154
|
+
continue;
|
|
155
|
+
const ind = (/^(\s*)/.exec(l)[1] ?? '').length;
|
|
156
|
+
if (ind <= indent)
|
|
157
|
+
break;
|
|
158
|
+
if (!/^\s*#/.test(l))
|
|
159
|
+
out.push(l.trim());
|
|
160
|
+
i = j;
|
|
161
|
+
}
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
out.push(rest);
|
|
165
|
+
}
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
/** Los valores de una clave escalar repetida (`runs-on:`, `node-version:`),
|
|
169
|
+
* deduplicados y sin comillas. */
|
|
170
|
+
function scalarValues(yaml, key) {
|
|
171
|
+
const out = [];
|
|
172
|
+
const re = new RegExp('^\\s*' + key + ':\\s*([^\\n#]+)$', 'gim');
|
|
173
|
+
let m;
|
|
174
|
+
while ((m = re.exec(yaml)) !== null) {
|
|
175
|
+
const v = m[1].trim().replace(/^['"]|['"]$/g, '');
|
|
176
|
+
if (v && !v.startsWith('$') && !out.includes(v))
|
|
177
|
+
out.push(v);
|
|
178
|
+
}
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
/** El `on:` del workflow: en que ramas dispara cada evento. Atajo sobre el
|
|
182
|
+
* YAML, igual que `runLines`, y por el mismo motivo: un parser completo
|
|
183
|
+
* seria una dependencia nueva para leer cuatro lineas, y el caso corre
|
|
184
|
+
* sobre el archivo real, asi que una forma que esto no entienda sale roja
|
|
185
|
+
* en vez de salir en silencio. */
|
|
186
|
+
export function readTriggers(yaml) {
|
|
187
|
+
const lines = yaml.split(/\r?\n/);
|
|
188
|
+
const start = lines.findIndex((l) => /^on:\s*$/.test(l) || /^on:\s*\S/.test(l));
|
|
189
|
+
const res = { push: [], pull_request: [], other: [] };
|
|
190
|
+
if (start < 0)
|
|
191
|
+
return res;
|
|
192
|
+
/* `on: [push]` en una linea. */
|
|
193
|
+
const inline = /^on:\s*\[([^\]]*)\]/.exec(lines[start]);
|
|
194
|
+
if (inline) {
|
|
195
|
+
for (const ev of inline[1].split(',').map((s) => s.trim()).filter(Boolean))
|
|
196
|
+
res.other.push(ev);
|
|
197
|
+
return res;
|
|
198
|
+
}
|
|
199
|
+
let event = null;
|
|
200
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
201
|
+
const l = lines[i];
|
|
202
|
+
if (/^\S/.test(l) && l.trim())
|
|
203
|
+
break;
|
|
204
|
+
if (/^\s*#/.test(l))
|
|
205
|
+
continue;
|
|
206
|
+
const ev = /^\s{2}([a-z_]+):/.exec(l);
|
|
207
|
+
if (ev) {
|
|
208
|
+
const name = ev[1];
|
|
209
|
+
event = name === 'push' || name === 'pull_request' ? name : null;
|
|
210
|
+
if (!event && !res.other.includes(name))
|
|
211
|
+
res.other.push(name);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
const br = /^\s*branches:\s*\[([^\]]*)\]/.exec(l);
|
|
215
|
+
if (br && event) {
|
|
216
|
+
for (const b of br[1].split(',').map((s) => s.trim().replace(/^['"]|['"]$/g, '')).filter(Boolean)) {
|
|
217
|
+
res[event].push(b);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return res;
|
|
222
|
+
}
|
|
223
|
+
/** Derivar las tres listas y su diferencia. Tira cuando no puede medir: una
|
|
224
|
+
* medicion imposible no se reporta como "no falta nada". */
|
|
225
|
+
export function deriveCiGaps(input) {
|
|
226
|
+
const publishCmd = input.pkg.scripts?.['prepublishOnly'];
|
|
227
|
+
if (!publishCmd) {
|
|
228
|
+
throw new Error('no se puede medir: package.json no tiene `prepublishOnly`, '
|
|
229
|
+
+ 'que es la lista de compuertas contra la que se compara la cadena');
|
|
230
|
+
}
|
|
231
|
+
if (!input.workflow.trim()) {
|
|
232
|
+
throw new Error('no se puede medir: el workflow de CI vino vacio');
|
|
233
|
+
}
|
|
234
|
+
const scripts = input.pkg.scripts ?? {};
|
|
235
|
+
const publishGates = scriptsInvoked(publishCmd);
|
|
236
|
+
const ran = [...new Set(runLines(input.workflow).flatMap(scriptsInvoked))];
|
|
237
|
+
/* Lo que el gancho CORRE, en programas (no en nombres de script): asi un
|
|
238
|
+
* `node scripts/catalog_lint.mjs` en el gancho cuenta como la compuerta
|
|
239
|
+
* `catalog:lint`, y `build` cuenta como `typecheck` porque corre el mismo
|
|
240
|
+
* tsc. El gancho invoca los scripts directo a proposito (arranca mas
|
|
241
|
+
* rapido que `pnpm run`), y eso no puede costarle credito en la
|
|
242
|
+
* declaracion -- ni ganarselo sin que se pueda explicar cual lo cubre. */
|
|
243
|
+
const hookLines = input.lefthook
|
|
244
|
+
? runLines(preprocessLefthookPrePush(input.lefthook))
|
|
245
|
+
: [];
|
|
246
|
+
const hookInvocations = new Set(hookLines.flatMap((l) => invocationsOf(l, scripts)));
|
|
247
|
+
const lineSets = hookLines.map((l) => invocationsOf(l, scripts));
|
|
248
|
+
const sameSet = (a, b) => a.length === b.length && a.every((x) => b.includes(x));
|
|
249
|
+
const byEquivalence = [];
|
|
250
|
+
const hookDeclares = [];
|
|
251
|
+
for (const gate of publishGates) {
|
|
252
|
+
const needed = invocationsOf(scripts[gate] ?? gate, scripts);
|
|
253
|
+
if (!needed.length)
|
|
254
|
+
continue;
|
|
255
|
+
if (!needed.every((n) => hookInvocations.has(n)))
|
|
256
|
+
continue;
|
|
257
|
+
hookDeclares.push(gate);
|
|
258
|
+
/* DIRECTO: alguna linea del gancho corre exactamente eso. Si no, hay
|
|
259
|
+
* que poder decir QUIEN lo cubre -- un "lo cubre otro" sin nombre es la
|
|
260
|
+
* clase de afirmacion que este modulo existe para no repetir. */
|
|
261
|
+
if (lineSets.some((set) => sameSet(set, needed)))
|
|
262
|
+
continue;
|
|
263
|
+
const via = publishGates.find((other) => other !== gate
|
|
264
|
+
&& needed.every((n) => invocationsOf(scripts[other] ?? other, scripts).includes(n))
|
|
265
|
+
&& lineSets.some((set) => sameSet(set, invocationsOf(scripts[other] ?? other, scripts))));
|
|
266
|
+
byEquivalence.push({ gate, via: via ?? '(otro comando del gancho)' });
|
|
267
|
+
}
|
|
268
|
+
const notRun = publishGates.filter((g) => !ran.includes(g));
|
|
269
|
+
const hookNotRun = publishGates.filter((g) => !hookDeclares.includes(g));
|
|
270
|
+
return {
|
|
271
|
+
ran, not_run: notRun,
|
|
272
|
+
hook_declares: hookDeclares,
|
|
273
|
+
hook_covers_by_equivalence: byEquivalence,
|
|
274
|
+
hook_not_run: hookNotRun,
|
|
275
|
+
os: scalarValues(input.workflow, 'runs-on'),
|
|
276
|
+
node: scalarValues(input.workflow, 'node-version'),
|
|
277
|
+
nobody_runs: publishGates.filter((g) => !ran.includes(g) && !hookDeclares.includes(g)),
|
|
278
|
+
triggers: readTriggers(input.workflow),
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/** Solo la seccion `pre-push` de lefthook.yml. El `pre-commit` corre en otro
|
|
282
|
+
* momento y meterlo aca diria que el push verifica mas de lo que verifica,
|
|
283
|
+
* que es el defecto, al revez. */
|
|
284
|
+
export function preprocessLefthookPrePush(yaml) {
|
|
285
|
+
const lines = yaml.split(/\r?\n/);
|
|
286
|
+
const start = lines.findIndex((l) => /^pre-push:/.test(l));
|
|
287
|
+
if (start < 0)
|
|
288
|
+
return '';
|
|
289
|
+
const out = [];
|
|
290
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
291
|
+
const l = lines[i];
|
|
292
|
+
if (/^\S/.test(l) && l.trim())
|
|
293
|
+
break;
|
|
294
|
+
out.push(l);
|
|
295
|
+
}
|
|
296
|
+
return out.join('\n');
|
|
297
|
+
}
|
|
298
|
+
/** LA DECLARACION, con el formato que el dueno pidio textualmente.
|
|
299
|
+
*
|
|
300
|
+
* Primero lo que SI se verifico y despues lo que NO, en ese orden y en la
|
|
301
|
+
* misma salida: una lista de ausencias al final de un log de 300 lineas no
|
|
302
|
+
* la lee nadie. */
|
|
303
|
+
export function renderCiGaps(r) {
|
|
304
|
+
const out = [];
|
|
305
|
+
out.push('Esta corrida verifico: ' + (r.ran.length ? r.ran.join(', ') : '(ningun script del paquete)') + '.');
|
|
306
|
+
out.push('Plataforma cubierta: ' + (r.os.join(', ') || 'sin declarar')
|
|
307
|
+
+ ' / Node ' + (r.node.join(', ') || 'sin declarar') + '.');
|
|
308
|
+
if (r.not_run.length) {
|
|
309
|
+
out.push('NO corrio: ' + r.not_run.join(', ')
|
|
310
|
+
+ ' -- mas la matriz multi-OS y el barrido multi-Node (esta corrida es un solo par).');
|
|
311
|
+
out.push('Un verde aca NO significa que la bateria paso. La lista completa de compuertas');
|
|
312
|
+
out.push('es `prepublishOnly` en package.json; la directiva esta en docs/PROGRAMMING_NORMS.md.');
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
out.push('NO corrio: nada -- la cadena cubre todas las compuertas de `prepublishOnly`.');
|
|
316
|
+
}
|
|
317
|
+
/* CUANDO dispara esta cadena. El cuarto hueco de F-15: si solo dispara en
|
|
318
|
+
* main y en PR a main, en una rama sin PR la cadena no es una segunda
|
|
319
|
+
* puerta -- no corre ninguna vez, y el gancho local es la UNICA puerta
|
|
320
|
+
* que tiene el trabajo en rama. Decirlo aca es el punto: el que lee esto
|
|
321
|
+
* esta mirando justamente una corrida que si existio. */
|
|
322
|
+
const t = r.triggers;
|
|
323
|
+
if (t.push.length || t.pull_request.length) {
|
|
324
|
+
out.push('Esta cadena dispara en: '
|
|
325
|
+
+ [t.push.length ? 'push a ' + t.push.join('/') : '',
|
|
326
|
+
t.pull_request.length ? 'pull_request a ' + t.pull_request.join('/') : '',
|
|
327
|
+
...t.other].filter(Boolean).join(' y ') + '.');
|
|
328
|
+
out.push('En una rama SIN PR no corre ninguna vez: ahi la unica puerta es el gancho');
|
|
329
|
+
out.push('local (a proposito -- la cadena se mantiene liviana por cuota; el motivo');
|
|
330
|
+
out.push('esta en docs/PROGRAMMING_NORMS.md).');
|
|
331
|
+
}
|
|
332
|
+
if (r.hook_declares.length) {
|
|
333
|
+
out.push('El gancho pre-push cubre: ' + r.hook_declares.join(', ')
|
|
334
|
+
+ (r.hook_not_run.length ? ' (NO corre: ' + r.hook_not_run.join(', ') + ')' : ''));
|
|
335
|
+
for (const e of r.hook_covers_by_equivalence) {
|
|
336
|
+
out.push(' ' + e.gate + ' lo cubre `' + e.via + '`, que invoca el mismo programa.');
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
out.push('El gancho pre-push no declara ninguna compuerta: lo pesado depende del habito, '
|
|
341
|
+
+ 'no de un mecanismo.');
|
|
342
|
+
}
|
|
343
|
+
if (r.nobody_runs.length) {
|
|
344
|
+
out.push('NINGUNA de las dos puertas corre: ' + r.nobody_runs.join(', ')
|
|
345
|
+
+ ' -- solo las corre `prepublishOnly`, es decir recien al publicar.');
|
|
346
|
+
out.push('Para eso esta el sello de la bateria (.forge/battery-stamp.json): antes de');
|
|
347
|
+
out.push('empaquetar, `scripts/battery_freshness.mjs` dice si lo que se publica es lo');
|
|
348
|
+
out.push('que la bateria vio.');
|
|
349
|
+
}
|
|
350
|
+
return out.join('\n');
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=ci_gaps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci_gaps.js","sourceRoot":"","sources":["../../src/core/ci_gaps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LAS CITAS A LA NADA -- la compuerta que el dueno pidio (2026-11-01).
|
|
3
|
+
*
|
|
4
|
+
* EL DEFECTO, en sus palabras: "un documento que afirma una compuerta con
|
|
5
|
+
* confianza es mas convincente que uno que falta. La ausencia se nota; la
|
|
6
|
+
* afirmacion falsa no." Van tres citas a la nada medidas en dos lotes
|
|
7
|
+
* -- `docs/PROGRAMMING_NORMS.md` citado por `.github/workflows/ci.yml` cinco
|
|
8
|
+
* meses sin existir, cuatro jobs y dos crons descritos en
|
|
9
|
+
* `docs/CI_PIPELINE.md` que nunca existieron, y un comentario de
|
|
10
|
+
* `.github/workflows/ci.yml` al que remitia `CLAUDE.md` -- y las tres
|
|
11
|
+
* describian compuertas. Esta compuerta cierra la familia: todo archivo de
|
|
12
|
+
* este repositorio citado en un documento VIGENTE tiene que existir.
|
|
13
|
+
*
|
|
14
|
+
* POR QUE EL DETECTOR ES CONSERVADOR. Una compuerta ruidosa se desactiva, y
|
|
15
|
+
* un gancho desactivado es peor que ninguno porque figura como existente
|
|
16
|
+
* (el mismo argumento con el que el dueno acoto F-15). Asi que esto NO
|
|
17
|
+
* intenta encontrar toda cita: encuentra las que son inequivocamente una
|
|
18
|
+
* afirmacion sobre ESTE repositorio HOY. Las reglas, en orden:
|
|
19
|
+
*
|
|
20
|
+
* 1. Los bloques de codigo cercados no se miran. Un `ls docs/FOO.md` de
|
|
21
|
+
* ejemplo no es una afirmacion sobre el repositorio.
|
|
22
|
+
* 2. Solo cuentan los tramos entre acentos graves y los destinos de los
|
|
23
|
+
* enlaces markdown. Una ruta en prosa suelta no se toca.
|
|
24
|
+
* 3. Con `/`: el primer segmento tiene que ser un directorio que EXISTE en
|
|
25
|
+
* la raiz y no ser generado (`dist/`, `test-results/`, `.forge/`...).
|
|
26
|
+
* La cita afirma una UBICACION, asi que se verifica tal cual.
|
|
27
|
+
* Sin `/`: es un NOMBRE, no una ubicacion, y se verifica como tal --
|
|
28
|
+
* basta que un archivo con ese nombre exista en algun lugar del
|
|
29
|
+
* repositorio. Medido: tratar `claude.ts` como archivo de la raiz daba
|
|
30
|
+
* cientos de falsos positivos, y descartarlo del todo dejaba pasar
|
|
31
|
+
* nombres que ya no existen en ninguna parte (`relay_error.ts`).
|
|
32
|
+
* 4. Nada con comodin (`*`, `?`), hueco (`<x>`, `{x}`, `$x`), dos puntos
|
|
33
|
+
* (rutas de Windows, `repo:ruta`) ni esquema (`http://`). Son formas
|
|
34
|
+
* que no afirman un archivo concreto.
|
|
35
|
+
*
|
|
36
|
+
* Y LOS DOCUMENTOS HISTORICOS NO ENTRAN, por una razon que no es comodidad:
|
|
37
|
+
* un changelog, un traspaso o un informe fechado describen el estado del
|
|
38
|
+
* repositorio EN SU FECHA, y un archivo que existia entonces y se renombro
|
|
39
|
+
* despues es historia correcta, no una cita a la nada. Medido: de 2378 citas
|
|
40
|
+
* verificables, 762 estaban muertas y la enorme mayoria vivia justamente
|
|
41
|
+
* ahi. Meterlas obligaria a una lista de permisos de cientos de entradas sin
|
|
42
|
+
* motivo real, que es la misma afirmacion sin respaldo que esto persigue. La
|
|
43
|
+
* exclusion se DECLARA (`isHistoricalDoc`) y la corrida dice cuantos
|
|
44
|
+
* documentos salteo, nunca en silencio.
|
|
45
|
+
*
|
|
46
|
+
* ASCII-only.
|
|
47
|
+
*/
|
|
48
|
+
export interface DocCitation {
|
|
49
|
+
/** Linea 1-indexada donde aparece la cita. */
|
|
50
|
+
line: number;
|
|
51
|
+
/** La ruta citada, relativa a la raiz del repositorio, sin ancla. */
|
|
52
|
+
target: string;
|
|
53
|
+
/** El texto tal como estaba, para el mensaje de error. */
|
|
54
|
+
raw: string;
|
|
55
|
+
/** `path` se verifica en su ubicacion; `name` por nombre en cualquier
|
|
56
|
+
* lugar del repositorio. */
|
|
57
|
+
shape: 'path' | 'name';
|
|
58
|
+
}
|
|
59
|
+
/** Directorios de la raiz que existen pero NO son fuente: lo que hay dentro
|
|
60
|
+
* lo genera una corrida o lo escribe un producto en ejecucion, asi que un
|
|
61
|
+
* documento puede nombrarlos legitimamente sin que esten en disco. */
|
|
62
|
+
export declare const GENERATED_ROOTS: string[];
|
|
63
|
+
/** La forma de la cita, o el motivo por el que no es una cita verificable. */
|
|
64
|
+
export declare function classifyToken(token: string, rootDirs: string[]): 'path' | 'name' | {
|
|
65
|
+
reject: string;
|
|
66
|
+
};
|
|
67
|
+
/** Las citas verificables de un documento markdown. */
|
|
68
|
+
export declare function extractCitations(md: string, rootDirs: string[]): DocCitation[];
|
|
69
|
+
/** Un documento que describe el estado del repositorio en su fecha, no hoy.
|
|
70
|
+
* La lista es de FORMAS de nombre, no de rutas: una lista de rutas se
|
|
71
|
+
* desactualiza con cada documento nuevo y acaba siendo una lista de
|
|
72
|
+
* permisos. */
|
|
73
|
+
export declare function isHistoricalDoc(rel: string): boolean;
|
|
74
|
+
/** Las citas de un archivo de MAQUINARIA (workflow, lefthook, manifiesto):
|
|
75
|
+
* ahi una ruta no viene entre acentos graves, viene en un comentario o en
|
|
76
|
+
* un valor. Se buscan por forma y se pasan por el mismo clasificador.
|
|
77
|
+
*
|
|
78
|
+
* Esto NO se usa sobre fuentes TypeScript a proposito: un especificador de
|
|
79
|
+
* import (`./tools/x.js`) tiene forma de ruta, es relativo al archivo y
|
|
80
|
+
* apunta al transpilado, asi que daria cientos de falsos positivos.
|
|
81
|
+
* Medido antes de acotar: 307.
|
|
82
|
+
*
|
|
83
|
+
* Y aca la cita tiene que llevar EXTENSION. En un archivo de maquinaria no
|
|
84
|
+
* hay acentos graves que delimiten el token, asi que un tramo sin extension
|
|
85
|
+
* suele ser otra cosa con forma de ruta -- medido: `src/version\.ts` dentro
|
|
86
|
+
* de una expresion regular de `lefthook.yml` se lee como `src/version`. Las
|
|
87
|
+
* tres citas a la nada que este repositorio ya pago llevaban extension. */
|
|
88
|
+
export declare function extractMachineryCitations(text: string, rootDirs: string[]): DocCitation[];
|
|
89
|
+
/** EL ALCANCE QUE BLOQUEA, y por que es este y no "todos los documentos".
|
|
90
|
+
*
|
|
91
|
+
* Medido en este repositorio: de 1331 citas verificables en documentos
|
|
92
|
+
* vigentes, 206 apuntan a archivos que no existen -- y casi todas son
|
|
93
|
+
* correctas. El espacio `docs/` esta SOBRECARGADO: `docs/SQ.md` exige
|
|
94
|
+
* `docs/USER_MANUAL.md` al proyecto ADOPTANTE, `src/urazuke/catalog.ts`
|
|
95
|
+
* nombra `docs/GATES.md` como artefacto que produce el proyecto que corre
|
|
96
|
+
* el metodo, y `docs/worker/README.md` cita `src/relay.js` relativo a su
|
|
97
|
+
* propio componente. Prescribir rutas para otros proyectos es el negocio
|
|
98
|
+
* de este repositorio, asi que "toda ruta citada existe" es FALSO como
|
|
99
|
+
* regla general y una compuerta que lo exija pide una lista de permisos de
|
|
100
|
+
* cientos de entradas -- que es la misma afirmacion sin respaldo que esto
|
|
101
|
+
* persigue.
|
|
102
|
+
*
|
|
103
|
+
* Lo que si se puede exigir sin excepciones es este conjunto: los archivos
|
|
104
|
+
* que se leen como AUTORIDAD sobre la maquinaria de este repositorio. Es
|
|
105
|
+
* donde vivieron los tres defectos medidos y es chico y verificable. El
|
|
106
|
+
* resto se MIDE y se informa en la misma salida, nunca en silencio.
|
|
107
|
+
*
|
|
108
|
+
* Y dentro de ese conjunto bloquean solo las citas con forma de RUTA. Un
|
|
109
|
+
* nombre suelto (`nac-bridge.js`, `pilot.bundle.js` en el README) no afirma
|
|
110
|
+
* una ubicacion de este repositorio: nombra un artefacto de otro paquete.
|
|
111
|
+
* Una ruta si afirma: dice "esta aca". Esa es la afirmacion que las tres
|
|
112
|
+
* citas a la nada hicieron y la que esto verifica. */
|
|
113
|
+
export declare const AUTHORITY_SCOPE: string[];
|
|
114
|
+
export interface CitationViolation extends DocCitation {
|
|
115
|
+
/** El documento que contiene la cita, relativo a la raiz. */
|
|
116
|
+
doc: string;
|
|
117
|
+
}
|
|
118
|
+
/** El resultado de la compuerta. `checked` y `skipped` son load-bearing: una
|
|
119
|
+
* corrida que no miro nada NO es una corrida sin violaciones. */
|
|
120
|
+
export interface CitationReport {
|
|
121
|
+
/** El alcance que bloquea. */
|
|
122
|
+
authority_files: number;
|
|
123
|
+
authority_checked: number;
|
|
124
|
+
violations: CitationViolation[];
|
|
125
|
+
allowed: number;
|
|
126
|
+
/** El relevamiento informativo sobre los documentos vigentes. */
|
|
127
|
+
survey_docs: number;
|
|
128
|
+
survey_skipped_historical: number;
|
|
129
|
+
survey_checked: number;
|
|
130
|
+
survey_dead: number;
|
|
131
|
+
}
|
|
132
|
+
export declare function renderCitationReport(r: CitationReport): string;
|
|
133
|
+
//# sourceMappingURL=doc_citations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc_citations.d.ts","sourceRoot":"","sources":["../../src/core/doc_citations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ;iCAC6B;IAC7B,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED;;uEAEuE;AACvE,eAAO,MAAM,eAAe,UAE3B,CAAC;AAcF,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CA8BrG;AAED,uDAAuD;AACvD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAgC9E;AAED;;;gBAGgB;AAChB,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAepD;AAED;;;;;;;;;;;;;4EAa4E;AAC5E,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAezF;AAED;;;;;;;;;;;;;;;;;;;;;;;uDAuBuD;AACvD,eAAO,MAAM,eAAe,UAS3B,CAAC;AAEF,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;CACb;AAED;kEACkE;AAClE,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB,EAAE,MAAM,CAAC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAyB9D"}
|