pumuki 6.3.40 → 6.3.41
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/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v6.3.
|
|
1
|
+
v6.3.41
|
package/docs/RELEASE_NOTES.md
CHANGED
|
@@ -5,6 +5,20 @@ Detailed commit history remains available through Git history (`git log` / `git
|
|
|
5
5
|
|
|
6
6
|
## 2026-03 (enterprise hardening updates)
|
|
7
7
|
|
|
8
|
+
### 2026-03-05 (v6.3.41)
|
|
9
|
+
|
|
10
|
+
- UX de notificaciones de bloqueo mejorada para escenarios multi-repo:
|
|
11
|
+
- el subtítulo ahora incluye proyecto/repositorio (`<project> · <stage> · <causa>`),
|
|
12
|
+
- facilita distinguir bloqueos cuando hay varios repos abiertos.
|
|
13
|
+
- Modal de bloqueo en macOS ahora activa por defecto en `gate.blocked`:
|
|
14
|
+
- sin requerir `PUMUKI_MACOS_BLOCKED_DIALOG=1`,
|
|
15
|
+
- override explícito soportado con `PUMUKI_MACOS_BLOCKED_DIALOG=0|1`.
|
|
16
|
+
- Contrato de configuración de notificaciones endurecido:
|
|
17
|
+
- `blockedDialogEnabled` persistido y leído de forma determinista.
|
|
18
|
+
- Evidencia de validación:
|
|
19
|
+
- `npx --yes tsx@4.21.0 --test scripts/__tests__/framework-menu-system-notifications.test.ts` (`13 pass / 0 fail`)
|
|
20
|
+
- `npm run -s typecheck` (`PASS`)
|
|
21
|
+
|
|
8
22
|
### 2026-03-05 (v6.3.40)
|
|
9
23
|
|
|
10
24
|
- AST Intelligence dual validation PoC (`#616`) integrado en gate:
|
|
@@ -1713,8 +1713,45 @@
|
|
|
1713
1713
|
- actualización directa de `/Users/juancarlosmerlosalbarracin/Developer/Projects/R_GO/docs/technical/08-validation/refactor/pumuki-integration-feedback.md`.
|
|
1714
1714
|
- verificación de consistencia: `rg -n \"🚧 REPORTED|⏳ REPORTED\" .../pumuki-integration-feedback.md` -> sin incidencias abiertas.
|
|
1715
1715
|
|
|
1716
|
-
-
|
|
1716
|
+
- ✅ PUMUKI-137: Preparar y ejecutar el siguiente corte de release (versionado + publicación npm + upgrade en consumidores RuralGo/SAAS/Flux_training).
|
|
1717
|
+
- Resultado implementado:
|
|
1718
|
+
- release publicada: `pumuki@6.3.40` (npm `latest`).
|
|
1719
|
+
- upgrade consumidores completado:
|
|
1720
|
+
- `R_GO`: `pumuki@6.3.40` + `pumuki install` + `status/doctor` en verde.
|
|
1721
|
+
- `SAAS:APP_SUPERMERCADOS`: `pumuki@6.3.40` + `pumuki install` + `status/doctor` en verde.
|
|
1722
|
+
- `Flux_training`: instalación inicial `pumuki@6.3.40` + `pumuki install` + `status/doctor` en verde.
|
|
1723
|
+
- Evidencia (2026-03-05):
|
|
1724
|
+
- `npm publish --access public` -> `+ pumuki@6.3.40`.
|
|
1725
|
+
- `npm view pumuki version` -> `6.3.40`.
|
|
1726
|
+
- validación local release:
|
|
1727
|
+
- `npm run -s test:backlog-tooling` -> `49 pass / 0 fail`.
|
|
1728
|
+
- `npm run -s typecheck` -> `PASS`.
|
|
1729
|
+
|
|
1730
|
+
- ✅ PUMUKI-138: Endurecer UX de notificaciones de bloqueo multi-repo (contexto de proyecto + modal fiable).
|
|
1731
|
+
- Resultado implementado:
|
|
1732
|
+
- `scripts/framework-menu-system-notifications-lib.ts`:
|
|
1733
|
+
- añade contexto de proyecto en notificaciones (`<repo> · <stage> · <causa>`),
|
|
1734
|
+
- activa modal de bloqueo por defecto en macOS cuando hay `gate.blocked` (sin depender obligatoriamente de `PUMUKI_MACOS_BLOCKED_DIALOG=1`),
|
|
1735
|
+
- soporta override explícito (`PUMUKI_MACOS_BLOCKED_DIALOG=0|1`) y preserva control anti-spam existente.
|
|
1736
|
+
- `scripts/__tests__/framework-menu-system-notifications.test.ts`:
|
|
1737
|
+
- nueva cobertura para subtítulo con proyecto,
|
|
1738
|
+
- nueva cobertura para apertura de modal por defecto.
|
|
1739
|
+
- Evidencia (2026-03-05):
|
|
1740
|
+
- `npx --yes tsx@4.21.0 --test scripts/__tests__/framework-menu-system-notifications.test.ts` -> `13 pass / 0 fail`.
|
|
1741
|
+
- `npm run -s typecheck` -> `PASS`.
|
|
1742
|
+
|
|
1743
|
+
- 🚧 PUMUKI-139: Monitorizar feedback post-release en consumidores reales (SAAS y RuralGo) y registrar únicamente hallazgos netos nuevos para siguiente corte.
|
|
1717
1744
|
- Alcance:
|
|
1718
|
-
-
|
|
1719
|
-
-
|
|
1720
|
-
-
|
|
1745
|
+
- vigilar nuevos bloqueos/regresiones tras `6.3.41`,
|
|
1746
|
+
- mantener MDs externos sincronizados por leyenda sin contradicciones,
|
|
1747
|
+
- preparar siguiente paquete de fixes/mejoras sin re-bugs.
|
|
1748
|
+
|
|
1749
|
+
- ✅ PUMUKI-140: Publicar patch release con mejoras UX de notificación de bloqueo multi-repo.
|
|
1750
|
+
- Resultado implementado:
|
|
1751
|
+
- release `pumuki@6.3.41` publicada con:
|
|
1752
|
+
- proyecto visible en subtítulo de bloqueo,
|
|
1753
|
+
- modal de bloqueo habilitada por defecto en macOS,
|
|
1754
|
+
- override explícito `PUMUKI_MACOS_BLOCKED_DIALOG=0|1`.
|
|
1755
|
+
- Evidencia (2026-03-05):
|
|
1756
|
+
- `npm publish --access public` -> `+ pumuki@6.3.41`.
|
|
1757
|
+
- `npm view pumuki version` -> `6.3.41`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pumuki",
|
|
3
|
-
"version": "6.3.
|
|
3
|
+
"version": "6.3.41",
|
|
4
4
|
"description": "Enterprise-grade AST Intelligence System with multi-platform support (iOS, Android, Backend, Frontend) and Feature-First + DDD + Clean Architecture enforcement. Includes dynamic violations API for intelligent querying.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { execFileSync as runBinarySync } from 'node:child_process';
|
|
2
2
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import { join } from 'node:path';
|
|
3
|
+
import { basename, join } from 'node:path';
|
|
4
4
|
|
|
5
5
|
export type PumukiNotificationStage = 'PRE_COMMIT' | 'PRE_PUSH' | 'CI' | 'PRE_WRITE';
|
|
6
6
|
|
|
@@ -41,6 +41,7 @@ export type SystemNotificationsConfig = {
|
|
|
41
41
|
enabled: boolean;
|
|
42
42
|
channel: 'macos';
|
|
43
43
|
muteUntil?: string;
|
|
44
|
+
blockedDialogEnabled?: boolean;
|
|
44
45
|
};
|
|
45
46
|
|
|
46
47
|
export type SystemNotificationEmitResult =
|
|
@@ -110,6 +111,37 @@ const isTruthyFlag = (value?: string): boolean => {
|
|
|
110
111
|
return normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'on';
|
|
111
112
|
};
|
|
112
113
|
|
|
114
|
+
const resolveProjectLabel = (params: {
|
|
115
|
+
repoRoot?: string;
|
|
116
|
+
projectLabel?: string;
|
|
117
|
+
}): string | null => {
|
|
118
|
+
const explicit = params.projectLabel
|
|
119
|
+
? normalizeNotificationText(params.projectLabel)
|
|
120
|
+
: '';
|
|
121
|
+
if (explicit.length > 0) {
|
|
122
|
+
return truncateNotificationText(explicit, 28);
|
|
123
|
+
}
|
|
124
|
+
if (!params.repoRoot) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const inferred = normalizeNotificationText(basename(params.repoRoot));
|
|
128
|
+
if (inferred.length === 0) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
return truncateNotificationText(inferred, 28);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const resolveBlockedDialogEnabled = (params: {
|
|
135
|
+
env: NodeJS.ProcessEnv;
|
|
136
|
+
config: SystemNotificationsConfig;
|
|
137
|
+
}): boolean => {
|
|
138
|
+
const raw = params.env.PUMUKI_MACOS_BLOCKED_DIALOG;
|
|
139
|
+
if (typeof raw === 'string' && raw.trim().length > 0) {
|
|
140
|
+
return isTruthyFlag(raw);
|
|
141
|
+
}
|
|
142
|
+
return params.config.blockedDialogEnabled !== false;
|
|
143
|
+
};
|
|
144
|
+
|
|
113
145
|
const BLOCKED_CAUSE_SUMMARY_BY_CODE: Readonly<Record<string, string>> = {
|
|
114
146
|
EVIDENCE_MISSING: 'Falta evidencia para validar este paso.',
|
|
115
147
|
EVIDENCE_INVALID: 'La evidencia actual es inválida.',
|
|
@@ -253,6 +285,7 @@ export const buildSystemNotificationsConfigFromSelection = (
|
|
|
253
285
|
): SystemNotificationsConfig => ({
|
|
254
286
|
enabled,
|
|
255
287
|
channel: 'macos',
|
|
288
|
+
blockedDialogEnabled: true,
|
|
256
289
|
});
|
|
257
290
|
|
|
258
291
|
export const persistSystemNotificationsConfig = (repoRoot: string, enabled: boolean): string => {
|
|
@@ -273,10 +306,12 @@ export const readSystemNotificationsConfig = (repoRoot: string): SystemNotificat
|
|
|
273
306
|
enabled?: unknown;
|
|
274
307
|
channel?: unknown;
|
|
275
308
|
muteUntil?: unknown;
|
|
309
|
+
blockedDialogEnabled?: unknown;
|
|
276
310
|
};
|
|
277
311
|
const config: SystemNotificationsConfig = {
|
|
278
312
|
enabled: parsed.enabled === true,
|
|
279
313
|
channel: 'macos',
|
|
314
|
+
blockedDialogEnabled: parsed.blockedDialogEnabled !== false,
|
|
280
315
|
};
|
|
281
316
|
if (typeof parsed.muteUntil === 'string' && parsed.muteUntil.trim().length > 0) {
|
|
282
317
|
config.muteUntil = parsed.muteUntil;
|
|
@@ -319,6 +354,7 @@ const applyDialogChoice = (params: {
|
|
|
319
354
|
persistSystemNotificationsConfigFile(params.repoRoot, {
|
|
320
355
|
enabled: false,
|
|
321
356
|
channel: params.config.channel,
|
|
357
|
+
blockedDialogEnabled: params.config.blockedDialogEnabled !== false,
|
|
322
358
|
});
|
|
323
359
|
return;
|
|
324
360
|
}
|
|
@@ -329,13 +365,24 @@ const applyDialogChoice = (params: {
|
|
|
329
365
|
enabled: true,
|
|
330
366
|
channel: params.config.channel,
|
|
331
367
|
muteUntil,
|
|
368
|
+
blockedDialogEnabled: params.config.blockedDialogEnabled !== false,
|
|
332
369
|
});
|
|
333
370
|
}
|
|
334
371
|
};
|
|
335
372
|
|
|
336
373
|
export const buildSystemNotificationPayload = (
|
|
337
|
-
event: PumukiCriticalNotificationEvent
|
|
374
|
+
event: PumukiCriticalNotificationEvent,
|
|
375
|
+
context?: {
|
|
376
|
+
repoRoot?: string;
|
|
377
|
+
projectLabel?: string;
|
|
378
|
+
}
|
|
338
379
|
): SystemNotificationPayload => {
|
|
380
|
+
const projectLabel = resolveProjectLabel({
|
|
381
|
+
repoRoot: context?.repoRoot,
|
|
382
|
+
projectLabel: context?.projectLabel,
|
|
383
|
+
});
|
|
384
|
+
const projectPrefix = projectLabel ? `${projectLabel} · ` : '';
|
|
385
|
+
|
|
339
386
|
if (event.kind === 'audit.summary') {
|
|
340
387
|
if (event.criticalViolations > 0) {
|
|
341
388
|
return {
|
|
@@ -370,7 +417,7 @@ export const buildSystemNotificationPayload = (
|
|
|
370
417
|
const remediation = resolveBlockedRemediation(event, causeCode);
|
|
371
418
|
return {
|
|
372
419
|
title: '🔴 Pumuki bloqueado',
|
|
373
|
-
subtitle: `${event.stage} · ${causeSummary}`,
|
|
420
|
+
subtitle: `${projectPrefix}${event.stage} · ${causeSummary}`,
|
|
374
421
|
message: `Solución: ${remediation}`,
|
|
375
422
|
soundName: 'Basso',
|
|
376
423
|
};
|
|
@@ -418,7 +465,10 @@ export const emitSystemNotification = (params: {
|
|
|
418
465
|
}
|
|
419
466
|
|
|
420
467
|
const runner = params.runCommand ?? runSystemCommand;
|
|
421
|
-
const payload = buildSystemNotificationPayload(params.event
|
|
468
|
+
const payload = buildSystemNotificationPayload(params.event, {
|
|
469
|
+
repoRoot: params.repoRoot,
|
|
470
|
+
projectLabel: params.env?.PUMUKI_PROJECT_LABEL,
|
|
471
|
+
});
|
|
422
472
|
const script = buildDisplayNotificationScript(payload);
|
|
423
473
|
const exitCode = runner('osascript', ['-e', script]);
|
|
424
474
|
|
|
@@ -427,12 +477,22 @@ export const emitSystemNotification = (params: {
|
|
|
427
477
|
}
|
|
428
478
|
|
|
429
479
|
const env = params.env ?? process.env;
|
|
430
|
-
if (
|
|
480
|
+
if (
|
|
481
|
+
params.event.kind === 'gate.blocked'
|
|
482
|
+
&& resolveBlockedDialogEnabled({ env, config })
|
|
483
|
+
) {
|
|
431
484
|
const causeCode = params.event.causeCode ?? 'GATE_BLOCKED';
|
|
432
485
|
const cause = resolveBlockedCauseSummary(params.event, causeCode);
|
|
433
486
|
const remediation = resolveBlockedRemediation(params.event, causeCode);
|
|
487
|
+
const projectLabel = resolveProjectLabel({
|
|
488
|
+
repoRoot: params.repoRoot,
|
|
489
|
+
projectLabel: env.PUMUKI_PROJECT_LABEL,
|
|
490
|
+
});
|
|
491
|
+
const dialogTitle = projectLabel
|
|
492
|
+
? `🔴 Pumuki bloqueado · ${projectLabel}`
|
|
493
|
+
: '🔴 Pumuki bloqueado';
|
|
434
494
|
const dialogScript = buildDisplayDialogScript({
|
|
435
|
-
title:
|
|
495
|
+
title: dialogTitle,
|
|
436
496
|
cause,
|
|
437
497
|
remediation,
|
|
438
498
|
});
|