pumuki 6.3.351 → 6.3.353

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki",
3
- "version": "6.3.351",
3
+ "version": "6.3.353",
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": {
@@ -98,6 +98,18 @@ const formatSummaryFinding = (
98
98
  return `[${finding.severity}] ${finding.ruleId} -> ${finding.file}:${finding.line}`;
99
99
  };
100
100
 
101
+ const normalizeBlockedCauseLine = (cause: { line?: number; lines?: ReadonlyArray<number> }): number => {
102
+ if (typeof cause.line === 'number' && Number.isFinite(cause.line) && cause.line > 0) {
103
+ return Math.floor(cause.line);
104
+ }
105
+ const lines = Array.isArray(cause.lines)
106
+ ? cause.lines
107
+ .filter((line) => Number.isFinite(line) && line > 0)
108
+ .map((line) => Math.floor(line))
109
+ : [];
110
+ return lines.length > 0 ? Math.min(...lines) : 1;
111
+ };
112
+
101
113
  export const buildConsumerRuntimeEvidenceDriftLines = (
102
114
  gateSummary: FrameworkMenuEvidenceSummary,
103
115
  canonicalSummary: FrameworkMenuEvidenceSummary
@@ -194,7 +206,7 @@ export const buildConsumerRuntimeBlockedSummary = (
194
206
  severity: 'HIGH' as const,
195
207
  ruleId: cause.ruleId ?? cause.code,
196
208
  file: cause.file ?? 'PROJECT_ROOT',
197
- line: 1,
209
+ line: normalizeBlockedCauseLine(cause),
198
210
  }))
199
211
  : [
200
212
  {
@@ -5,6 +5,8 @@ export type PumukiBlockedNotificationCause = {
5
5
  message: string;
6
6
  ruleId?: string;
7
7
  file?: string;
8
+ line?: number;
9
+ lines?: ReadonlyArray<number>;
8
10
  remediation?: string;
9
11
  };
10
12
 
@@ -137,6 +137,17 @@ const formatLocation = (cause: NonNullable<Extract<PumukiCriticalNotificationEve
137
137
  if (!cause.file) {
138
138
  return 'sin fichero';
139
139
  }
140
+ if (typeof cause.line === 'number' && Number.isFinite(cause.line) && cause.line > 0) {
141
+ return `${cause.file}:${Math.floor(cause.line)}`;
142
+ }
143
+ if (Array.isArray(cause.lines)) {
144
+ const lines = cause.lines
145
+ .filter((line) => Number.isFinite(line) && line > 0)
146
+ .map((line) => Math.floor(line));
147
+ if (lines.length > 0) {
148
+ return `${cause.file}:${lines.join(',')}`;
149
+ }
150
+ }
140
151
  const line = extractLineFromCauseMessage(cause.message);
141
152
  return line ? `${cause.file}:${line}` : cause.file;
142
153
  };
@@ -118,6 +118,17 @@ const formatCauseLocation = (cause: BlockedCause): string => {
118
118
  return 'sin fichero';
119
119
  }
120
120
  const baseFile = cause.file.split('/').filter(Boolean).pop() ?? cause.file;
121
+ if (typeof cause.line === 'number' && Number.isFinite(cause.line) && cause.line > 0) {
122
+ return `${baseFile}:${Math.floor(cause.line)}`;
123
+ }
124
+ if (Array.isArray(cause.lines)) {
125
+ const lines = cause.lines
126
+ .filter((line) => Number.isFinite(line) && line > 0)
127
+ .map((line) => Math.floor(line));
128
+ if (lines.length > 0) {
129
+ return `${baseFile}:${lines.join(',')}`;
130
+ }
131
+ }
121
132
  const lineMatch = cause.message.match(/\blines?=([0-9][0-9,\-\s]*)\b/i);
122
133
  if (!lineMatch?.[1]) {
123
134
  return baseFile;