pumuki 6.3.320 → 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.
@@ -1501,9 +1501,6 @@ const appendWorktreeHygieneViolations = (
1501
1501
  };
1502
1502
 
1503
1503
  const toPolicyStage = (stage: AiGateStage): SkillsStage => {
1504
- if (stage === 'PRE_WRITE') {
1505
- return 'PRE_COMMIT';
1506
- }
1507
1504
  return stage;
1508
1505
  };
1509
1506
 
@@ -1699,6 +1696,9 @@ export const evaluateAiGate = (
1699
1696
  suppressSkillsContractViolation
1700
1697
  || skillsContract.status !== 'FAIL'
1701
1698
  || (params.stage === 'PRE_WRITE' && requiredSkillsPlatforms.length === 0)
1699
+ || skillsContract.violations.some((violation) =>
1700
+ violation.code === 'EVIDENCE_PLATFORM_CRITICAL_SKILLS_RULES_MISSING'
1701
+ )
1702
1702
  ? []
1703
1703
  : [
1704
1704
  toSkillsViolation(
@@ -84,9 +84,6 @@ const defaultDependencies: PlatformGateEvaluationDependencies = {
84
84
  const normalizeStageForSkills = (
85
85
  stage: GateStage
86
86
  ): Exclude<GateStage, 'STAGED'> => {
87
- if (stage === 'PRE_WRITE') {
88
- return 'CI';
89
- }
90
87
  return stage === 'STAGED' ? 'PRE_COMMIT' : stage;
91
88
  };
92
89
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki",
3
- "version": "6.3.320",
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;