@nac3/forge-cli 1.23.7 → 1.24.1

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.
Files changed (165) hide show
  1. package/dist/chat/claude.d.ts +8 -0
  2. package/dist/chat/claude.d.ts.map +1 -1
  3. package/dist/chat/claude.js.map +1 -1
  4. package/dist/chat/claude_cli.d.ts +23 -0
  5. package/dist/chat/claude_cli.d.ts.map +1 -1
  6. package/dist/chat/claude_cli.js +76 -2
  7. package/dist/chat/claude_cli.js.map +1 -1
  8. package/dist/chat/doctrine_digest.d.ts.map +1 -1
  9. package/dist/chat/doctrine_digest.js +2 -1
  10. package/dist/chat/doctrine_digest.js.map +1 -1
  11. package/dist/chat/server.d.ts.map +1 -1
  12. package/dist/chat/server.js +11 -0
  13. package/dist/chat/server.js.map +1 -1
  14. package/dist/chat/tools/pending.d.ts +11 -0
  15. package/dist/chat/tools/pending.d.ts.map +1 -1
  16. package/dist/chat/tools/pending.js +55 -8
  17. package/dist/chat/tools/pending.js.map +1 -1
  18. package/dist/chat/tools/shell.d.ts +39 -4
  19. package/dist/chat/tools/shell.d.ts.map +1 -1
  20. package/dist/chat/tools/shell.js +167 -7
  21. package/dist/chat/tools/shell.js.map +1 -1
  22. package/dist/chat/tools/urazuke.d.ts.map +1 -1
  23. package/dist/chat/tools/urazuke.js +8 -5
  24. package/dist/chat/tools/urazuke.js.map +1 -1
  25. package/dist/chat/urazuke_section.d.ts +26 -4
  26. package/dist/chat/urazuke_section.d.ts.map +1 -1
  27. package/dist/chat/urazuke_section.js +115 -9
  28. package/dist/chat/urazuke_section.js.map +1 -1
  29. package/dist/commands/pending.d.ts.map +1 -1
  30. package/dist/commands/pending.js +116 -12
  31. package/dist/commands/pending.js.map +1 -1
  32. package/dist/commands/urazuke.d.ts +3 -0
  33. package/dist/commands/urazuke.d.ts.map +1 -1
  34. package/dist/commands/urazuke.js +80 -3
  35. package/dist/commands/urazuke.js.map +1 -1
  36. package/dist/core/ascii_purity.d.ts +69 -0
  37. package/dist/core/ascii_purity.d.ts.map +1 -0
  38. package/dist/core/ascii_purity.js +141 -0
  39. package/dist/core/ascii_purity.js.map +1 -0
  40. package/dist/core/battery_stamp.d.ts +111 -0
  41. package/dist/core/battery_stamp.d.ts.map +1 -0
  42. package/dist/core/battery_stamp.js +287 -0
  43. package/dist/core/battery_stamp.js.map +1 -0
  44. package/dist/core/ci_gaps.d.ts +130 -0
  45. package/dist/core/ci_gaps.d.ts.map +1 -0
  46. package/dist/core/ci_gaps.js +353 -0
  47. package/dist/core/ci_gaps.js.map +1 -0
  48. package/dist/core/doc_citations.d.ts +133 -0
  49. package/dist/core/doc_citations.d.ts.map +1 -0
  50. package/dist/core/doc_citations.js +271 -0
  51. package/dist/core/doc_citations.js.map +1 -0
  52. package/dist/core/hook_budget.d.ts +60 -0
  53. package/dist/core/hook_budget.d.ts.map +1 -0
  54. package/dist/core/hook_budget.js +163 -0
  55. package/dist/core/hook_budget.js.map +1 -0
  56. package/dist/docs/doctrine/urazuke.md +173 -2
  57. package/dist/nac3/internal_manifest.d.ts.map +1 -1
  58. package/dist/nac3/internal_manifest.js +28 -2
  59. package/dist/nac3/internal_manifest.js.map +1 -1
  60. package/dist/pending/store.d.ts +29 -0
  61. package/dist/pending/store.d.ts.map +1 -1
  62. package/dist/pending/store.js +51 -1
  63. package/dist/pending/store.js.map +1 -1
  64. package/dist/pending/types.d.ts +23 -0
  65. package/dist/pending/types.d.ts.map +1 -1
  66. package/dist/pending/types.js.map +1 -1
  67. package/dist/telemetry/usage.d.ts +18 -0
  68. package/dist/telemetry/usage.d.ts.map +1 -1
  69. package/dist/telemetry/usage.js +16 -1
  70. package/dist/telemetry/usage.js.map +1 -1
  71. package/dist/urazuke/announce.d.ts +7 -0
  72. package/dist/urazuke/announce.d.ts.map +1 -1
  73. package/dist/urazuke/announce.js +20 -0
  74. package/dist/urazuke/announce.js.map +1 -1
  75. package/dist/urazuke/catalog.d.ts +1 -1
  76. package/dist/urazuke/catalog.d.ts.map +1 -1
  77. package/dist/urazuke/catalog.js.map +1 -1
  78. package/dist/urazuke/close_gate.d.ts +31 -4
  79. package/dist/urazuke/close_gate.d.ts.map +1 -1
  80. package/dist/urazuke/close_gate.js +70 -13
  81. package/dist/urazuke/close_gate.js.map +1 -1
  82. package/dist/urazuke/current.d.ts +28 -0
  83. package/dist/urazuke/current.d.ts.map +1 -1
  84. package/dist/urazuke/current.js +18 -5
  85. package/dist/urazuke/current.js.map +1 -1
  86. package/dist/urazuke/cycle.d.ts +3 -0
  87. package/dist/urazuke/cycle.d.ts.map +1 -1
  88. package/dist/urazuke/cycle.js +5 -3
  89. package/dist/urazuke/cycle.js.map +1 -1
  90. package/dist/urazuke/evidence.d.ts +14 -1
  91. package/dist/urazuke/evidence.d.ts.map +1 -1
  92. package/dist/urazuke/evidence.js +88 -2
  93. package/dist/urazuke/evidence.js.map +1 -1
  94. package/dist/urazuke/evidence_env.d.ts +78 -0
  95. package/dist/urazuke/evidence_env.d.ts.map +1 -0
  96. package/dist/urazuke/evidence_env.js +341 -0
  97. package/dist/urazuke/evidence_env.js.map +1 -0
  98. package/dist/urazuke/freeze.d.ts.map +1 -1
  99. package/dist/urazuke/freeze.js +16 -9
  100. package/dist/urazuke/freeze.js.map +1 -1
  101. package/dist/urazuke/gate.d.ts +48 -0
  102. package/dist/urazuke/gate.d.ts.map +1 -1
  103. package/dist/urazuke/gate.js +251 -25
  104. package/dist/urazuke/gate.js.map +1 -1
  105. package/dist/urazuke/gates_data.d.ts +30 -3
  106. package/dist/urazuke/gates_data.d.ts.map +1 -1
  107. package/dist/urazuke/gates_data.js +51 -5
  108. package/dist/urazuke/gates_data.js.map +1 -1
  109. package/dist/urazuke/gates_pull.d.ts +40 -0
  110. package/dist/urazuke/gates_pull.d.ts.map +1 -1
  111. package/dist/urazuke/gates_pull.js +118 -8
  112. package/dist/urazuke/gates_pull.js.map +1 -1
  113. package/dist/urazuke/manual_cases.d.ts +11 -1
  114. package/dist/urazuke/manual_cases.d.ts.map +1 -1
  115. package/dist/urazuke/manual_cases.js +1 -0
  116. package/dist/urazuke/manual_cases.js.map +1 -1
  117. package/dist/urazuke/overrides.d.ts +107 -0
  118. package/dist/urazuke/overrides.d.ts.map +1 -0
  119. package/dist/urazuke/overrides.js +128 -0
  120. package/dist/urazuke/overrides.js.map +1 -0
  121. package/dist/urazuke/probes.d.ts.map +1 -1
  122. package/dist/urazuke/probes.js +51 -0
  123. package/dist/urazuke/probes.js.map +1 -1
  124. package/dist/urazuke/profiles.d.ts +135 -0
  125. package/dist/urazuke/profiles.d.ts.map +1 -0
  126. package/dist/urazuke/profiles.js +470 -0
  127. package/dist/urazuke/profiles.js.map +1 -0
  128. package/dist/urazuke/receipt_audit.d.ts +67 -0
  129. package/dist/urazuke/receipt_audit.d.ts.map +1 -0
  130. package/dist/urazuke/receipt_audit.js +103 -0
  131. package/dist/urazuke/receipt_audit.js.map +1 -0
  132. package/dist/urazuke/receipts.d.ts +22 -0
  133. package/dist/urazuke/receipts.d.ts.map +1 -1
  134. package/dist/urazuke/receipts.js +44 -0
  135. package/dist/urazuke/receipts.js.map +1 -1
  136. package/dist/urazuke/report.d.ts +30 -0
  137. package/dist/urazuke/report.d.ts.map +1 -1
  138. package/dist/urazuke/report.js +39 -0
  139. package/dist/urazuke/report.js.map +1 -1
  140. package/dist/urazuke/reset.d.ts +35 -0
  141. package/dist/urazuke/reset.d.ts.map +1 -0
  142. package/dist/urazuke/reset.js +150 -0
  143. package/dist/urazuke/reset.js.map +1 -0
  144. package/dist/urazuke/retro.d.ts +5 -1
  145. package/dist/urazuke/retro.d.ts.map +1 -1
  146. package/dist/urazuke/retro.js +21 -8
  147. package/dist/urazuke/retro.js.map +1 -1
  148. package/dist/urazuke/section.d.ts.map +1 -1
  149. package/dist/urazuke/section.js +17 -2
  150. package/dist/urazuke/section.js.map +1 -1
  151. package/dist/urazuke/semantics.d.ts +173 -0
  152. package/dist/urazuke/semantics.d.ts.map +1 -0
  153. package/dist/urazuke/semantics.js +232 -0
  154. package/dist/urazuke/semantics.js.map +1 -0
  155. package/dist/urazuke/start.d.ts +8 -0
  156. package/dist/urazuke/start.d.ts.map +1 -1
  157. package/dist/urazuke/start.js +10 -2
  158. package/dist/urazuke/start.js.map +1 -1
  159. package/dist/version.d.ts +1 -1
  160. package/dist/version.js +1 -1
  161. package/dist/workflow/orchestrator.d.ts.map +1 -1
  162. package/dist/workflow/orchestrator.js +6 -7
  163. package/dist/workflow/orchestrator.js.map +1 -1
  164. package/docs/doctrine/urazuke.md +173 -2
  165. package/package.json +9 -2
@@ -0,0 +1,353 @@
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
+ * su paquete, todo `prepublishOnly` menos la bateria, dentro de un
30
+ * presupuesto declarado (aviso 30 s, techo 35 s). La cadena NO
31
+ * se ensancha -- se mantiene liviana por cuota -- asi que para el trabajo en
32
+ * rama el gancho es la UNICA puerta. De ahi los dos agregados de este
33
+ * modulo: `triggers`, porque una cadena que solo dispara en main no es una
34
+ * segunda puerta para una rama; y la cobertura POR EQUIVALENCIA, porque el
35
+ * gancho invoca los scripts directo (arranca mas rapido) y `build` corre el
36
+ * mismo `tsc` que `typecheck` -- decir "no corre typecheck" ahi seria una
37
+ * falsa alarma, y una falsa alarma termina con el instrumento apagado.
38
+ *
39
+ * POR QUE ESTO SE DERIVA Y NO SE ESCRIBE A MANO. Una lista fija de "lo que
40
+ * no corre" es una segunda fuente de verdad, y se desincroniza el dia que
41
+ * alguien agrega una compuerta al publish -- el mismo defecto que este
42
+ * modulo esta reportando. Asi que las tres listas salen de los archivos que
43
+ * YA son la verdad (package.json, el workflow, lefthook.yml) y la diferencia
44
+ * se calcula. Si una de las tres no se puede leer, esto FALLA: una medicion
45
+ * que no se pudo hacer no se reporta como "no falta nada".
46
+ *
47
+ * ASCII-only.
48
+ */
49
+ /** Los nombres de script que una linea de comandos invoca. Cubre las formas
50
+ * que este repositorio usa de verdad (`pnpm run x`, `pnpm x`, `npm run x`)
51
+ * y nada mas: inventar formas que nadie escribe es ruido. */
52
+ export function scriptsInvoked(command) {
53
+ const out = [];
54
+ const re = /(?:pnpm|npm|yarn)\s+(?:run\s+)?([a-z0-9][a-z0-9:_-]*)/gi;
55
+ let m;
56
+ while ((m = re.exec(command)) !== null) {
57
+ const name = m[1];
58
+ /* `pnpm install` / `pnpm exec` no son scripts del paquete. */
59
+ if (['install', 'exec', 'dlx', 'add', 'why', 'ls', 'publish', 'pack'].includes(name))
60
+ continue;
61
+ if (!out.includes(name))
62
+ out.push(name);
63
+ }
64
+ return out;
65
+ }
66
+ /** Los PROGRAMAS que una linea de comandos invoca de verdad, expandiendo
67
+ * los scripts del paquete. Es lo que permite decir "el gancho cubre
68
+ * `typecheck` porque corre `build`, que corre el mismo tsc" sin escribirlo
69
+ * a mano en ninguna lista.
70
+ *
71
+ * La forma de cada invocacion: el programa, y para `node` tambien el
72
+ * archivo (`node:scripts/catalog_lint.mjs`) -- dos scripts de node
73
+ * distintos no son la misma compuerta. */
74
+ export function invocationsOf(command, scripts = {}, seen = new Set()) {
75
+ const out = [];
76
+ const add = (v) => { if (v && !out.includes(v))
77
+ out.push(v); };
78
+ for (const rawSegment of command.split(/&&|\|\||;/)) {
79
+ const seg = rawSegment.trim();
80
+ if (!seg)
81
+ continue;
82
+ const tokens = seg.split(/\s+/).filter(Boolean);
83
+ let i = 0;
84
+ let head = tokens[i];
85
+ if (!head)
86
+ continue;
87
+ /* `pnpm run x` / `pnpm x` / `npm run x`: se expande al script. */
88
+ if (/^(pnpm|npm|yarn)$/.test(head)) {
89
+ i++;
90
+ while (tokens[i] && (tokens[i].startsWith('-') || tokens[i] === 'run'))
91
+ i++;
92
+ const next = tokens[i];
93
+ if (!next)
94
+ continue;
95
+ if (next === 'exec' || next === 'dlx') {
96
+ const bin = tokens[i + 1];
97
+ if (bin)
98
+ add(bin);
99
+ continue;
100
+ }
101
+ if (['install', 'add', 'why', 'ls', 'publish', 'pack'].includes(next))
102
+ continue;
103
+ if (scripts[next] !== undefined && !seen.has(next)) {
104
+ const nextSeen = new Set(seen);
105
+ nextSeen.add(next);
106
+ for (const v of invocationsOf(scripts[next], scripts, nextSeen))
107
+ add(v);
108
+ }
109
+ else {
110
+ add(next);
111
+ }
112
+ continue;
113
+ }
114
+ if (head === 'npx') {
115
+ const bin = tokens[1];
116
+ if (bin)
117
+ add(bin);
118
+ continue;
119
+ }
120
+ if (head === 'node' || head === 'tsx') {
121
+ const file = tokens.slice(1).find((t) => !t.startsWith('-'));
122
+ add(file ? head + ':' + file.replace(/\\/g, '/') : head);
123
+ continue;
124
+ }
125
+ add(head);
126
+ }
127
+ return out;
128
+ }
129
+ /** Las lineas `run:` de un workflow, sin parsear YAML entero. Un parser
130
+ * completo seria una dependencia nueva para leer tres lineas; lo que hace
131
+ * seguro al atajo es que el caso de la bateria corre sobre el archivo REAL
132
+ * del repositorio, asi que un cambio de forma que esto no entienda sale
133
+ * rojo en vez de salir en silencio. */
134
+ function runLines(yaml) {
135
+ const out = [];
136
+ const lines = yaml.split(/\r?\n/);
137
+ for (let i = 0; i < lines.length; i++) {
138
+ const line = lines[i];
139
+ /* Un `#` al principio de la linea (despues de la sangria) es un
140
+ * comentario: el NOTE al pie de ci.yml nombra justamente las compuertas
141
+ * que NO corren, y contarlas como ejecutadas seria leer la confesion
142
+ * como si fuera el hecho. */
143
+ if (/^\s*#/.test(line))
144
+ continue;
145
+ const m = /^\s*(?:-\s+)?run:\s*(.*)$/.exec(line);
146
+ if (!m)
147
+ continue;
148
+ const rest = m[1].trim();
149
+ if (rest === '|' || rest === '>' || rest === '|-' || rest === '>-') {
150
+ /* Bloque: todo lo que sigue con mas sangria. */
151
+ const indent = (/^(\s*)/.exec(line)[1] ?? '').length;
152
+ for (let j = i + 1; j < lines.length; j++) {
153
+ const l = lines[j];
154
+ if (!l.trim())
155
+ continue;
156
+ const ind = (/^(\s*)/.exec(l)[1] ?? '').length;
157
+ if (ind <= indent)
158
+ break;
159
+ if (!/^\s*#/.test(l))
160
+ out.push(l.trim());
161
+ i = j;
162
+ }
163
+ continue;
164
+ }
165
+ out.push(rest);
166
+ }
167
+ return out;
168
+ }
169
+ /** Los valores de una clave escalar repetida (`runs-on:`, `node-version:`),
170
+ * deduplicados y sin comillas. */
171
+ function scalarValues(yaml, key) {
172
+ const out = [];
173
+ const re = new RegExp('^\\s*' + key + ':\\s*([^\\n#]+)$', 'gim');
174
+ let m;
175
+ while ((m = re.exec(yaml)) !== null) {
176
+ const v = m[1].trim().replace(/^['"]|['"]$/g, '');
177
+ if (v && !v.startsWith('$') && !out.includes(v))
178
+ out.push(v);
179
+ }
180
+ return out;
181
+ }
182
+ /** El `on:` del workflow: en que ramas dispara cada evento. Atajo sobre el
183
+ * YAML, igual que `runLines`, y por el mismo motivo: un parser completo
184
+ * seria una dependencia nueva para leer cuatro lineas, y el caso corre
185
+ * sobre el archivo real, asi que una forma que esto no entienda sale roja
186
+ * en vez de salir en silencio. */
187
+ export function readTriggers(yaml) {
188
+ const lines = yaml.split(/\r?\n/);
189
+ const start = lines.findIndex((l) => /^on:\s*$/.test(l) || /^on:\s*\S/.test(l));
190
+ const res = { push: [], pull_request: [], other: [] };
191
+ if (start < 0)
192
+ return res;
193
+ /* `on: [push]` en una linea. */
194
+ const inline = /^on:\s*\[([^\]]*)\]/.exec(lines[start]);
195
+ if (inline) {
196
+ for (const ev of inline[1].split(',').map((s) => s.trim()).filter(Boolean))
197
+ res.other.push(ev);
198
+ return res;
199
+ }
200
+ let event = null;
201
+ for (let i = start + 1; i < lines.length; i++) {
202
+ const l = lines[i];
203
+ if (/^\S/.test(l) && l.trim())
204
+ break;
205
+ if (/^\s*#/.test(l))
206
+ continue;
207
+ const ev = /^\s{2}([a-z_]+):/.exec(l);
208
+ if (ev) {
209
+ const name = ev[1];
210
+ event = name === 'push' || name === 'pull_request' ? name : null;
211
+ if (!event && !res.other.includes(name))
212
+ res.other.push(name);
213
+ continue;
214
+ }
215
+ const br = /^\s*branches:\s*\[([^\]]*)\]/.exec(l);
216
+ if (br && event) {
217
+ for (const b of br[1].split(',').map((s) => s.trim().replace(/^['"]|['"]$/g, '')).filter(Boolean)) {
218
+ res[event].push(b);
219
+ }
220
+ }
221
+ }
222
+ return res;
223
+ }
224
+ /** Derivar las tres listas y su diferencia. Tira cuando no puede medir: una
225
+ * medicion imposible no se reporta como "no falta nada". */
226
+ export function deriveCiGaps(input) {
227
+ const publishCmd = input.pkg.scripts?.['prepublishOnly'];
228
+ if (!publishCmd) {
229
+ throw new Error('no se puede medir: package.json no tiene `prepublishOnly`, '
230
+ + 'que es la lista de compuertas contra la que se compara la cadena');
231
+ }
232
+ if (!input.workflow.trim()) {
233
+ throw new Error('no se puede medir: el workflow de CI vino vacio');
234
+ }
235
+ const scripts = input.pkg.scripts ?? {};
236
+ const publishGates = scriptsInvoked(publishCmd);
237
+ const ran = [...new Set(runLines(input.workflow).flatMap(scriptsInvoked))];
238
+ /* Lo que el gancho CORRE, en programas (no en nombres de script): asi un
239
+ * `node scripts/catalog_lint.mjs` en el gancho cuenta como la compuerta
240
+ * `catalog:lint`, y `build` cuenta como `typecheck` porque corre el mismo
241
+ * tsc. El gancho invoca los scripts directo a proposito (arranca mas
242
+ * rapido que `pnpm run`), y eso no puede costarle credito en la
243
+ * declaracion -- ni ganarselo sin que se pueda explicar cual lo cubre. */
244
+ const hookLines = input.lefthook
245
+ ? runLines(preprocessLefthookPrePush(input.lefthook))
246
+ : [];
247
+ const hookInvocations = new Set(hookLines.flatMap((l) => invocationsOf(l, scripts)));
248
+ const lineSets = hookLines.map((l) => invocationsOf(l, scripts));
249
+ const sameSet = (a, b) => a.length === b.length && a.every((x) => b.includes(x));
250
+ const byEquivalence = [];
251
+ const hookDeclares = [];
252
+ for (const gate of publishGates) {
253
+ const needed = invocationsOf(scripts[gate] ?? gate, scripts);
254
+ if (!needed.length)
255
+ continue;
256
+ if (!needed.every((n) => hookInvocations.has(n)))
257
+ continue;
258
+ hookDeclares.push(gate);
259
+ /* DIRECTO: alguna linea del gancho corre exactamente eso. Si no, hay
260
+ * que poder decir QUIEN lo cubre -- un "lo cubre otro" sin nombre es la
261
+ * clase de afirmacion que este modulo existe para no repetir. */
262
+ if (lineSets.some((set) => sameSet(set, needed)))
263
+ continue;
264
+ const via = publishGates.find((other) => other !== gate
265
+ && needed.every((n) => invocationsOf(scripts[other] ?? other, scripts).includes(n))
266
+ && lineSets.some((set) => sameSet(set, invocationsOf(scripts[other] ?? other, scripts))));
267
+ byEquivalence.push({ gate, via: via ?? '(otro comando del gancho)' });
268
+ }
269
+ const notRun = publishGates.filter((g) => !ran.includes(g));
270
+ const hookNotRun = publishGates.filter((g) => !hookDeclares.includes(g));
271
+ return {
272
+ ran, not_run: notRun,
273
+ hook_declares: hookDeclares,
274
+ hook_covers_by_equivalence: byEquivalence,
275
+ hook_not_run: hookNotRun,
276
+ os: scalarValues(input.workflow, 'runs-on'),
277
+ node: scalarValues(input.workflow, 'node-version'),
278
+ nobody_runs: publishGates.filter((g) => !ran.includes(g) && !hookDeclares.includes(g)),
279
+ triggers: readTriggers(input.workflow),
280
+ };
281
+ }
282
+ /** Solo la seccion `pre-push` de lefthook.yml. El `pre-commit` corre en otro
283
+ * momento y meterlo aca diria que el push verifica mas de lo que verifica,
284
+ * que es el defecto, al revez. */
285
+ export function preprocessLefthookPrePush(yaml) {
286
+ const lines = yaml.split(/\r?\n/);
287
+ const start = lines.findIndex((l) => /^pre-push:/.test(l));
288
+ if (start < 0)
289
+ return '';
290
+ const out = [];
291
+ for (let i = start + 1; i < lines.length; i++) {
292
+ const l = lines[i];
293
+ if (/^\S/.test(l) && l.trim())
294
+ break;
295
+ out.push(l);
296
+ }
297
+ return out.join('\n');
298
+ }
299
+ /** LA DECLARACION, con el formato que el dueno pidio textualmente.
300
+ *
301
+ * Primero lo que SI se verifico y despues lo que NO, en ese orden y en la
302
+ * misma salida: una lista de ausencias al final de un log de 300 lineas no
303
+ * la lee nadie. */
304
+ export function renderCiGaps(r) {
305
+ const out = [];
306
+ out.push('Esta corrida verifico: ' + (r.ran.length ? r.ran.join(', ') : '(ningun script del paquete)') + '.');
307
+ out.push('Plataforma cubierta: ' + (r.os.join(', ') || 'sin declarar')
308
+ + ' / Node ' + (r.node.join(', ') || 'sin declarar') + '.');
309
+ if (r.not_run.length) {
310
+ out.push('NO corrio: ' + r.not_run.join(', ')
311
+ + ' -- mas la matriz multi-OS y el barrido multi-Node (esta corrida es un solo par).');
312
+ out.push('Un verde aca NO significa que la bateria paso. La lista completa de compuertas');
313
+ out.push('es `prepublishOnly` en package.json; la directiva esta en docs/PROGRAMMING_NORMS.md.');
314
+ }
315
+ else {
316
+ out.push('NO corrio: nada -- la cadena cubre todas las compuertas de `prepublishOnly`.');
317
+ }
318
+ /* CUANDO dispara esta cadena. El cuarto hueco de F-15: si solo dispara en
319
+ * main y en PR a main, en una rama sin PR la cadena no es una segunda
320
+ * puerta -- no corre ninguna vez, y el gancho local es la UNICA puerta
321
+ * que tiene el trabajo en rama. Decirlo aca es el punto: el que lee esto
322
+ * esta mirando justamente una corrida que si existio. */
323
+ const t = r.triggers;
324
+ if (t.push.length || t.pull_request.length) {
325
+ out.push('Esta cadena dispara en: '
326
+ + [t.push.length ? 'push a ' + t.push.join('/') : '',
327
+ t.pull_request.length ? 'pull_request a ' + t.pull_request.join('/') : '',
328
+ ...t.other].filter(Boolean).join(' y ') + '.');
329
+ out.push('En una rama SIN PR no corre ninguna vez: ahi la unica puerta es el gancho');
330
+ out.push('local (a proposito -- la cadena se mantiene liviana por cuota; el motivo');
331
+ out.push('esta en docs/PROGRAMMING_NORMS.md).');
332
+ }
333
+ if (r.hook_declares.length) {
334
+ out.push('El gancho pre-push cubre: ' + r.hook_declares.join(', ')
335
+ + (r.hook_not_run.length ? ' (NO corre: ' + r.hook_not_run.join(', ') + ')' : ''));
336
+ for (const e of r.hook_covers_by_equivalence) {
337
+ out.push(' ' + e.gate + ' lo cubre `' + e.via + '`, que invoca el mismo programa.');
338
+ }
339
+ }
340
+ else {
341
+ out.push('El gancho pre-push no declara ninguna compuerta: lo pesado depende del habito, '
342
+ + 'no de un mecanismo.');
343
+ }
344
+ if (r.nobody_runs.length) {
345
+ out.push('NINGUNA de las dos puertas corre: ' + r.nobody_runs.join(', ')
346
+ + ' -- solo las corre `prepublishOnly`, es decir recien al publicar.');
347
+ out.push('Para eso esta el sello de la bateria (.forge/battery-stamp.json): antes de');
348
+ out.push('empaquetar, `scripts/battery_freshness.mjs` dice si lo que se publica es lo');
349
+ out.push('que la bateria vio.');
350
+ }
351
+ return out.join('\n');
352
+ }
353
+ //# 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"}