pumuki 6.3.49 → 6.3.50

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.
@@ -5,6 +5,17 @@ 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.50)
9
+
10
+ - Atomicity remediation clarity (`GIT_ATOMICITY_TOO_MANY_SCOPES`):
11
+ - blocking message now includes `scope_files=` with per-scope file breakdown,
12
+ - remediation now includes explicit `Sugerencia split` wording for deterministic staging split.
13
+ - Gate summary `next_action` updated for this code:
14
+ - explicitly instructs to use `scope_files` before running split commands.
15
+ - Validation evidence:
16
+ - `npx --yes tsx@4.21.0 --test integrations/git/__tests__/gitAtomicity.test.ts integrations/git/__tests__/runPlatformGateOutput.test.ts` (`9 pass / 0 fail`)
17
+ - `npm run -s typecheck` (`PASS`)
18
+
8
19
  ### 2026-03-05 (v6.3.49)
9
20
 
10
21
  - Watch JSON contract clarity for staged scope:
@@ -2578,14 +2578,28 @@
2578
2578
  - `gh issue create --repo SwiftEnProfundidad/ast-intelligence-hooks ...` -> `#723`
2579
2579
  - `/Users/juancarlosmerlosalbarracin/Developer/Projects/Flux_training/docs/BUGS_Y_MEJORAS_PUMUKI.md` actualizado.
2580
2580
 
2581
- - 🚧 PUMUKI-192: Ejecutar fix de `PUM-014/#723` en `watch --json` para alinear `lastTick.changed` con delta real de archivos del scope, validar en tests y preparar cierre de leyenda externa.
2581
+ - PUMUKI-192: Ejecutar fix de `PUM-014/#723` en `watch --json` para alinear `lastTick.changed` con delta real de archivos del scope, validar en tests y preparar cierre de leyenda externa.
2582
2582
  - Avance (2026-03-05):
2583
2583
  - fix aplicado en `integrations/lifecycle/watch.ts` (`changed` ahora depende del delta real del scope).
2584
2584
  - regresión añadida/actualizada en `integrations/lifecycle/__tests__/watch.test.ts`.
2585
2585
  - smoke en Flux con binario local del core:
2586
2586
  - `changed=false`, `changedFiles=[]`, `evaluatedFiles=[]`, `gateOutcome=ALLOW`.
2587
2587
  - issue `#723` actualizada con evidencia técnica.
2588
- - Pendiente para cierre:
2589
- - publicar corte con este fix,
2590
- - validar en Flux con `npx --yes --package pumuki@latest ...`,
2591
- - mover `PUM-014` de `🚧` a `✅` y cerrar `#723`.
2588
+ - Cierre (2026-03-05):
2589
+ - release publicada: `pumuki@6.3.49`.
2590
+ - validación final en Flux con `@latest`:
2591
+ - `changed=false`, `changedFiles=[]`, `evaluatedFiles=[]`, `gateOutcome=ALLOW`.
2592
+ - MD externo Flux actualizado: `PUM-014` -> `✅ Cerrado`.
2593
+ - issue `#723` cerrada.
2594
+
2595
+ - ✅ PUMUKI-193: Mantener monitorización continua multi-consumer (`SAAS` + `RuralGo` + `Flux`) y abrir fix inmediato solo ante hallazgo neto nuevo, actualizando en el mismo ciclo MD externo afectado + MD interno.
2596
+ - Resultado (2026-03-05):
2597
+ - tick fleet posterior al cierre de Flux detectó nuevo pendiente en SAAS: `PUMUKI-M009` (`needs_issue`).
2598
+ - issue upstream creada: `#724`.
2599
+ - MD externo SAAS actualizado a estado activo (`PUMUKI-M009` -> `🚧`, ref `#724`).
2600
+ - Evidencia:
2601
+ - `npm run -s validation:backlog-watch:tick` (run_id `0856d3f4-9508-4a93-9229-ce5c702c8b4d`)
2602
+ - `gh issue create --repo SwiftEnProfundidad/ast-intelligence-hooks ...` -> `#724`
2603
+ - `/Users/juancarlosmerlosalbarracin/Developer/Projects/SAAS:APP_SUPERMERCADOS/docs/pumuki/PUMUKI_BUGS_MEJORAS.md` actualizado.
2604
+
2605
+ - 🚧 PUMUKI-194: Implementar `PUMUKI-M009/#724` para que bloqueos `GIT_ATOMICITY_TOO_MANY_SCOPES` incluyan desglose accionable por scopes/archivos + `next_action` determinista de split.
@@ -172,6 +172,26 @@ const resolveScopeKey = (filePath: string): string => {
172
172
  return segments[0] ?? '';
173
173
  };
174
174
 
175
+ const collectScopePaths = (
176
+ changedPaths: ReadonlyArray<string>
177
+ ): ReadonlyMap<string, ReadonlyArray<string>> => {
178
+ const buckets = new Map<string, Array<string>>();
179
+ for (const path of changedPaths) {
180
+ const scope = resolveScopeKey(path);
181
+ if (scope.length === 0) {
182
+ continue;
183
+ }
184
+ const current = buckets.get(scope) ?? [];
185
+ current.push(path.replace(/\\/g, '/'));
186
+ buckets.set(scope, current);
187
+ }
188
+ const normalized = new Map<string, ReadonlyArray<string>>();
189
+ for (const [scope, paths] of buckets.entries()) {
190
+ normalized.set(scope, [...new Set(paths)].sort());
191
+ }
192
+ return normalized;
193
+ };
194
+
175
195
  const collectChangedPaths = (params: {
176
196
  git: IGitService;
177
197
  repoRoot: string;
@@ -259,25 +279,30 @@ export const evaluateGitAtomicity = (params: {
259
279
  });
260
280
  }
261
281
 
262
- const scopeKeys = new Set(
263
- changedPaths
264
- .map((filePath) => resolveScopeKey(filePath))
265
- .filter((scopeKey) => scopeKey.length > 0)
266
- );
282
+ const scopePaths = collectScopePaths(changedPaths);
283
+ const scopeKeys = new Set(scopePaths.keys());
267
284
  if (scopeKeys.size > config.maxScopes) {
268
285
  const sortedScopes = [...scopeKeys].sort();
269
286
  const suggestedScopeAdds = sortedScopes
270
287
  .slice(0, Math.max(1, Math.min(config.maxScopes + 1, 3)))
271
288
  .map((scope) => `git add ${scope}/`)
272
289
  .join(' && ');
290
+ const scopeBreakdown = sortedScopes
291
+ .map((scope) => {
292
+ const paths = scopePaths.get(scope) ?? [];
293
+ const sample = paths.slice(0, 3);
294
+ return `${scope}{count=${paths.length}; sample=[${sample.join(', ')}]}`;
295
+ })
296
+ .join(' | ');
273
297
  violations.push({
274
298
  code: 'GIT_ATOMICITY_TOO_MANY_SCOPES',
275
299
  message:
276
- `Git atomicity guard blocked at ${params.stage}: changed_scopes=${scopeKeys.size} exceeds max_scopes=${config.maxScopes}.`,
300
+ `Git atomicity guard blocked at ${params.stage}: changed_scopes=${scopeKeys.size} exceeds max_scopes=${config.maxScopes}. ` +
301
+ `scope_files=${scopeBreakdown}.`,
277
302
  remediation:
278
303
  `Agrupa cambios por ámbito funcional (máximo ${config.maxScopes} scopes por commit). ` +
279
304
  `scopes_detectados=[${sortedScopes.join(', ')}]. ` +
280
- `Sugerencia: git restore --staged . && ${suggestedScopeAdds} && git commit -m "<tipo>: <scope>".`,
305
+ `Sugerencia split: git restore --staged . && ${suggestedScopeAdds} && git commit -m "<tipo>: <scope>".`,
281
306
  });
282
307
  }
283
308
 
@@ -16,7 +16,7 @@ const BLOCK_NEXT_ACTION_BY_CODE: Readonly<Record<string, string>> = {
16
16
  GIT_ATOMICITY_TOO_MANY_FILES:
17
17
  'git restore --staged . && separa cambios en commits más pequeños',
18
18
  GIT_ATOMICITY_TOO_MANY_SCOPES:
19
- 'git restore --staged . && git add <scope>/ && git commit -m "<tipo>: <scope>"',
19
+ 'Revisa scope_files del bloqueo y aplica: git restore --staged . && git add <scope>/ && git commit -m "<tipo>: <scope>"',
20
20
  ACTIVE_RULE_IDS_EMPTY_FOR_CODE_CHANGES_HIGH:
21
21
  'Reconcilia policy/skills y reintenta PRE_COMMIT: npx --yes --package pumuki@latest pumuki policy reconcile --strict --json && npx --yes --package pumuki@latest pumuki-pre-commit',
22
22
  SKILLS_SKILLS_FRONTEND_NO_SOLID_VIOLATIONS:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki",
3
- "version": "6.3.49",
3
+ "version": "6.3.50",
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": {