pumuki 6.3.321 → 6.3.322

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.
@@ -1696,6 +1696,9 @@ export const evaluateAiGate = (
1696
1696
  suppressSkillsContractViolation
1697
1697
  || skillsContract.status !== 'FAIL'
1698
1698
  || (params.stage === 'PRE_WRITE' && requiredSkillsPlatforms.length === 0)
1699
+ || skillsContract.violations.some((violation) =>
1700
+ violation.code === 'EVIDENCE_PLATFORM_CRITICAL_SKILLS_RULES_MISSING'
1701
+ )
1699
1702
  ? []
1700
1703
  : [
1701
1704
  toSkillsViolation(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki",
3
- "version": "6.3.321",
3
+ "version": "6.3.322",
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": {
@@ -22,6 +22,16 @@ const buildBlockingCausesDetails = (
22
22
  if (!causes || causes.length === 0) {
23
23
  return null;
24
24
  }
25
+ if (causes.every(isSkillsContractCause)) {
26
+ const first = resolvePrioritizedBlockingCauses(causes)[0];
27
+ if (!first) {
28
+ return null;
29
+ }
30
+ return [
31
+ 'Causas bloqueantes: 1',
32
+ ...formatBlockingCauseForDialog(first, 0),
33
+ ].join('\n');
34
+ }
25
35
  const total = causes.length;
26
36
  const header = total === 1
27
37
  ? 'Causas bloqueantes: 1'
@@ -236,16 +246,20 @@ const formatPlatformName = (platform: string | null): string =>
236
246
  : 'plataforma detectada';
237
247
 
238
248
  const extractSkillsContractPlatform = (message: string): string | null =>
239
- message.match(/\bplatforms?=([a-z0-9_,.-]+)/i)?.[1]?.split(',')[0]?.trim() ?? null;
249
+ message.match(/\bplatforms?=([a-z0-9_,.-]+)/i)?.[1]?.split(',')[0]?.trim()
250
+ ?? message.match(/\b(ios|android|frontend|backend)\(missing_critical_rule_ids=/i)?.[1]?.trim()
251
+ ?? message.match(/\bfor\s+(ios|android|frontend|backend)\s*:/i)?.[1]?.trim()
252
+ ?? null;
240
253
 
241
254
  const extractSkillsContractRules = (message: string): string | null => {
242
255
  const rulesMatch = message.match(/\brules?=\{([^}]+)\}/i)?.[1];
243
256
  const missingMatch = message.match(/\bmissing=\[([^\]]+)\]/i)?.[1];
244
- return normalizeNotificationText(rulesMatch ?? missingMatch ?? '');
257
+ const criticalMissingMatch = message.match(/\bmissing_critical_rule_ids=\[([^\]]+)\]/i)?.[1];
258
+ return normalizeNotificationText(rulesMatch ?? criticalMissingMatch ?? missingMatch ?? '');
245
259
  };
246
260
 
247
261
  const SKILLS_CONTRACT_REMEDIATION =
248
- 'Actualiza o reconcilia el contrato de skills de Pumuki y vuelve a intentar el commit. Si estás en un repo consumidor, repinea Pumuki a una versión que incluya esa regla crítica.';
262
+ 'Actualiza o reconcilia el contrato de skills de Pumuki y vuelve a intentar el commit. Si ya estás en la última versión, es un bug del motor de Pumuki y debe corregirse allí antes de cerrar el commit.';
249
263
 
250
264
  const WORKTREE_HYGIENE_REMEDIATION =
251
265
  'Reduce el worktree pendiente a un slice atómico: stagea solo la tarea activa o guarda el resto en stash nombrado, y reejecuta PRE_WRITE.';
@@ -65,16 +65,20 @@ const formatPlatformName = (platform: string | null): string =>
65
65
  : 'plataforma detectada';
66
66
 
67
67
  const extractSkillsContractPlatform = (message: string): string | null =>
68
- message.match(/\bplatforms?=([a-z0-9_,.-]+)/i)?.[1]?.split(',')[0]?.trim() ?? null;
68
+ message.match(/\bplatforms?=([a-z0-9_,.-]+)/i)?.[1]?.split(',')[0]?.trim()
69
+ ?? message.match(/\b(ios|android|frontend|backend)\(missing_critical_rule_ids=/i)?.[1]?.trim()
70
+ ?? message.match(/\bfor\s+(ios|android|frontend|backend)\s*:/i)?.[1]?.trim()
71
+ ?? null;
69
72
 
70
73
  const extractSkillsContractRules = (message: string): string | null => {
71
74
  const rulesMatch = message.match(/\brules?=\{([^}]+)\}/i)?.[1];
72
75
  const missingMatch = message.match(/\bmissing=\[([^\]]+)\]/i)?.[1];
73
- return normalizeNotificationText(rulesMatch ?? missingMatch ?? '');
76
+ const criticalMissingMatch = message.match(/\bmissing_critical_rule_ids=\[([^\]]+)\]/i)?.[1];
77
+ return normalizeNotificationText(rulesMatch ?? criticalMissingMatch ?? missingMatch ?? '');
74
78
  };
75
79
 
76
80
  const SKILLS_CONTRACT_REMEDIATION =
77
- 'Actualiza o reconcilia el contrato de skills de Pumuki y vuelve a intentar el commit. Si estás en un repo consumidor, repinea Pumuki a una versión que incluya esa regla crítica.';
81
+ 'Actualiza o reconcilia el contrato de skills de Pumuki y vuelve a intentar el commit. Si ya estás en la última versión, es un bug del motor de Pumuki y debe corregirse allí antes de cerrar el commit.';
78
82
 
79
83
  const extractExpectedBddFeatureFile = (cause: BlockedCause): string => {
80
84
  const directFile = cause.file?.endsWith('.feature') ? cause.file : null;