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.
package/docs/RELEASE_NOTES.md
CHANGED
|
@@ -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
|
-
-
|
|
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
|
-
-
|
|
2589
|
-
-
|
|
2590
|
-
-
|
|
2591
|
-
|
|
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
|
|
263
|
-
|
|
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.
|
|
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": {
|