@gherk/requirements-extractor 1.4.0 → 1.5.0

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.
@@ -0,0 +1,14 @@
1
+ export type Language = "es" | "en" | "auto";
2
+ export type Confidence = "high" | "medium" | "low";
3
+ export interface HeuristicMatch {
4
+ text: string;
5
+ page: number;
6
+ patternType: string;
7
+ pattern: string;
8
+ confidence: Confidence;
9
+ suggestedCategories: string[];
10
+ reason: string;
11
+ }
12
+ export declare function detectLanguage(text: string): "es" | "en";
13
+ export declare function scanForImplicitRequirements(text: string, startPage: number, endPage: number, language?: Language): HeuristicMatch[];
14
+ //# sourceMappingURL=heuristics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heuristics.d.ts","sourceRoot":"","sources":["../src/heuristics.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAC5C,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CAClB;AAsID,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAKxD;AA2CD,wBAAgB,2BAA2B,CACvC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,QAAiB,GAC5B,cAAc,EAAE,CA+ClB"}
@@ -0,0 +1,255 @@
1
+ // ─── Heuristic Scanner for Implicit Requirements ────────────────────
2
+ //
3
+ // Scans parsed PDF text for implicit requirements that lack formal identifiers.
4
+ // Supports multilingual patterns (ES/EN) with auto-detect fallback.
5
+ const PATTERNS = {
6
+ es: {
7
+ obligation: [
8
+ "debe", "deberá", "es obligatorio", "se requiere", "tiene que",
9
+ "necesita", "tendrá que", "ha de", "es necesario", "es imprescindible",
10
+ "será obligatorio", "no puede estar vacío",
11
+ ],
12
+ capability: [
13
+ "puede", "podrá", "será capaz de", "permite", "será posible",
14
+ "tendrá la posibilidad", "habilitará",
15
+ ],
16
+ access: [
17
+ "tendrá acceso", "tiene acceso a", "acceso a ver", "acceso a crear",
18
+ "acceso a modificar", "acceso a eliminar", "acceso a gestionar",
19
+ "will have access", "has access to",
20
+ ],
21
+ system: [
22
+ "el sistema deberá", "la plataforma", "el backend", "la aplicación",
23
+ "el portal", "el panel", "el módulo",
24
+ ],
25
+ condition: [
26
+ "si.*entonces", "cuando.*debe", "en caso de", "siempre que",
27
+ "a menos que", "excepto si",
28
+ ],
29
+ validation: [
30
+ "no debe", "no puede", "no se permite", "no está permitido",
31
+ "no se aceptará", "restringido a", "limitado a",
32
+ ],
33
+ configuration: [
34
+ "configurable", "editable", "campo obligatorio", "parámetro",
35
+ "a nivel de empresa", "a nivel de fleet", "por empresa",
36
+ "personalizable", "activar.*desactivar",
37
+ ],
38
+ structural: [
39
+ "observaciones preliminares", "introducción", "contexto",
40
+ "caso de uso", "supuestos", "restricciones", "alcance",
41
+ "flujo de trabajo", "proceso", "preliminary remarks",
42
+ "use case", "assumptions",
43
+ ],
44
+ actors: [
45
+ "fleet manager", "super admin", "control room", "call center",
46
+ "company manager", "company user", "driver", "conductor",
47
+ "dealer", "concesionario", "administrador", "usuario",
48
+ "equipo acs", "acs team", "icc team",
49
+ ],
50
+ integration: [
51
+ "api", "dms", "obd", "canbus", "can-bus", "payment gateway",
52
+ "pasarela de pago", "sincronización", "integración", "webhook",
53
+ "bluetooth", "ble", "gps", "psd2", "gdpr",
54
+ ],
55
+ workflow: [
56
+ "el usuario llama", "envía.*email", "se notifica", "se envía",
57
+ "sube.*archivo", "descarga", "completar.*perfil",
58
+ "validar.*perfil", "proceso.*kyc", "onboarding",
59
+ ],
60
+ },
61
+ en: {
62
+ obligation: [
63
+ "must", "shall", "is required", "needs to", "has to",
64
+ "will have to", "is mandatory", "cannot be empty",
65
+ ],
66
+ capability: [
67
+ "can", "could", "will be able to", "allows", "enables",
68
+ "makes it possible",
69
+ ],
70
+ access: [
71
+ "will have access", "has access to", "access to view",
72
+ "access to create", "access to modify", "access to delete",
73
+ "access to manage",
74
+ ],
75
+ system: [
76
+ "the system must", "the system shall", "the platform",
77
+ "the backend", "the application", "the portal", "the module",
78
+ ],
79
+ condition: [
80
+ "if.*then", "when.*must", "in case of", "whenever",
81
+ "unless", "except when",
82
+ ],
83
+ validation: [
84
+ "must not", "cannot", "is not allowed", "shall not",
85
+ "restricted to", "limited to",
86
+ ],
87
+ configuration: [
88
+ "configurable", "editable", "mandatory field", "parameter",
89
+ "at company level", "at fleet level", "per company",
90
+ "customizable", "enable.*disable",
91
+ ],
92
+ structural: [
93
+ "preliminary remarks", "introduction", "context",
94
+ "use case", "assumptions", "constraints", "scope",
95
+ "workflow", "process",
96
+ ],
97
+ actors: [
98
+ "fleet manager", "super admin", "control room", "call center",
99
+ "company manager", "company user", "driver",
100
+ "dealer", "administrator", "user",
101
+ "acs team", "icc team",
102
+ ],
103
+ integration: [
104
+ "api", "dms", "obd", "canbus", "can-bus", "payment gateway",
105
+ "synchronization", "integration", "webhook",
106
+ "bluetooth", "ble", "gps", "psd2", "gdpr",
107
+ ],
108
+ workflow: [
109
+ "the user calls", "sends.*email", "is notified", "is sent",
110
+ "uploads.*file", "downloads", "complete.*profile",
111
+ "validate.*profile", "kyc process", "onboarding",
112
+ ],
113
+ },
114
+ };
115
+ // ─── Language Detection ─────────────────────────────────────────────
116
+ const ES_MARKERS = ["debe", "deberá", "tiene", "puede", "también", "está", "será", "según", "configurar", "gestionar"];
117
+ const EN_MARKERS = ["must", "shall", "should", "will", "can", "the system", "access to", "configure", "manage"];
118
+ export function detectLanguage(text) {
119
+ const lower = text.toLowerCase();
120
+ const esScore = ES_MARKERS.reduce((acc, m) => acc + (lower.split(m).length - 1), 0);
121
+ const enScore = EN_MARKERS.reduce((acc, m) => acc + (lower.split(m).length - 1), 0);
122
+ return esScore >= enScore ? "es" : "en";
123
+ }
124
+ // ─── Category Suggestion ────────────────────────────────────────────
125
+ function suggestCategories(text) {
126
+ const lower = text.toLowerCase();
127
+ const cats = [];
128
+ // Backend signals
129
+ if (/api|endpoint|rest|servicio|service|lógica de negocio|business logic|base de datos|database|email|integración|integration/.test(lower)) {
130
+ cats.push("backend");
131
+ }
132
+ // BO signals
133
+ if (/gestionar|gestión|administrar|configurar|crud|panel|backoffice|back.?office|fleet manager|super admin|control room|crear.*desde.*backend|menu.*backend/.test(lower)) {
134
+ cats.push("bo");
135
+ }
136
+ // Frontend signals
137
+ if (/portal.*driver|driver.*portal|portal.*web|web.*portal|el conductor ve|el driver|the driver sees|usuario final|end.?user/.test(lower)) {
138
+ cats.push("frontend");
139
+ }
140
+ // Mobile signals
141
+ if (/app|aplicación|ios|android|móvil|mobile|bluetooth|ble|push.*notif|notificación.*push|pantalla/.test(lower)) {
142
+ cats.push("mobile");
143
+ }
144
+ // Non-functional signals
145
+ if (/psd2|gdpr|seguridad|security|rendimiento|performance|escalabilidad|scalability|sla|auditoría|audit/.test(lower)) {
146
+ cats.push("non-functional");
147
+ }
148
+ // Infra signals
149
+ if (/entorno|environment|uat|preprod|staging|producción|production|base de datos|database|migración|migration/.test(lower)) {
150
+ cats.push("infra");
151
+ }
152
+ return cats.length > 0 ? cats : ["backend"];
153
+ }
154
+ // ─── Scanner ────────────────────────────────────────────────────────
155
+ export function scanForImplicitRequirements(text, startPage, endPage, language = "auto") {
156
+ const lang = language === "auto" ? detectLanguage(text) : language;
157
+ const patterns = PATTERNS[lang];
158
+ const matches = [];
159
+ const seen = new Set();
160
+ // Split into sentences for granular matching
161
+ const sentences = text.split(/[.!?\n]/).map(s => s.trim()).filter(s => s.length > 20);
162
+ for (const sentence of sentences) {
163
+ const lower = sentence.toLowerCase();
164
+ // Skip boilerplate (copyright, confidentiality, version control)
165
+ if (/copyright|confidential|version control|change history|issued by|arval internal use/.test(lower)) {
166
+ continue;
167
+ }
168
+ for (const [patternType, patternList] of Object.entries(patterns)) {
169
+ for (const pattern of patternList) {
170
+ const regex = new RegExp(pattern, "i");
171
+ if (regex.test(lower)) {
172
+ // Deduplicate by sentence
173
+ const key = `${patternType}:${sentence.substring(0, 80)}`;
174
+ if (seen.has(key))
175
+ continue;
176
+ seen.add(key);
177
+ const confidence = getConfidence(patternType, lower);
178
+ const suggestedCategories = suggestCategories(sentence);
179
+ matches.push({
180
+ text: sentence.substring(0, 300),
181
+ page: startPage,
182
+ patternType,
183
+ pattern,
184
+ confidence,
185
+ suggestedCategories,
186
+ reason: getReasonMessage(patternType, pattern, lang),
187
+ });
188
+ break; // One match per pattern type per sentence
189
+ }
190
+ }
191
+ }
192
+ }
193
+ // Deduplicate and keep only most confident per text
194
+ return deduplicateMatches(matches);
195
+ }
196
+ function getConfidence(patternType, text) {
197
+ // High confidence: obligation verbs + structural sections with actors
198
+ if (patternType === "obligation" || patternType === "access")
199
+ return "high";
200
+ if (patternType === "workflow")
201
+ return "high";
202
+ // Medium: system, validation, configuration
203
+ if (patternType === "system" || patternType === "validation" || patternType === "configuration")
204
+ return "medium";
205
+ if (patternType === "actors" || patternType === "integration")
206
+ return "medium";
207
+ // Low: capability, structural, condition
208
+ return "low";
209
+ }
210
+ function getReasonMessage(patternType, pattern, lang) {
211
+ const reasons = {
212
+ es: {
213
+ obligation: `Verbo de obligación detectado ("${pattern}") — probable requisito funcional`,
214
+ capability: `Verbo de capacidad detectado ("${pattern}") — posible requisito funcional`,
215
+ access: `Patrón de acceso/permisos detectado ("${pattern}") — requisito de RBAC/BO`,
216
+ system: `Referencia al sistema detectada ("${pattern}") — requisito técnico`,
217
+ condition: `Condición de negocio detectada ("${pattern}") — regla de negocio`,
218
+ validation: `Restricción/validación detectada ("${pattern}") — requisito de validación`,
219
+ configuration: `Parámetro configurable detectado ("${pattern}") — requisito de configuración`,
220
+ structural: `Sección contextual con contenido técnico ("${pattern}") — posible requisito disfrazado de contexto`,
221
+ actors: `Actor del sistema detectado ("${pattern}") — verificar que tiene requisitos asociados`,
222
+ integration: `Integración externa detectada ("${pattern}") — requisito de integración`,
223
+ workflow: `Flujo de trabajo/proceso detectado ("${pattern}") — requisito de proceso/onboarding`,
224
+ },
225
+ en: {
226
+ obligation: `Obligation verb detected ("${pattern}") — likely functional requirement`,
227
+ capability: `Capability verb detected ("${pattern}") — possible functional requirement`,
228
+ access: `Access/permission pattern detected ("${pattern}") — RBAC/BO requirement`,
229
+ system: `System reference detected ("${pattern}") — technical requirement`,
230
+ condition: `Business condition detected ("${pattern}") — business rule`,
231
+ validation: `Restriction/validation detected ("${pattern}") — validation requirement`,
232
+ configuration: `Configurable parameter detected ("${pattern}") — configuration requirement`,
233
+ structural: `Contextual section with technical content ("${pattern}") — possible requirement disguised as context`,
234
+ actors: `System actor detected ("${pattern}") — verify associated requirements exist`,
235
+ integration: `External integration detected ("${pattern}") — integration requirement`,
236
+ workflow: `Workflow/process detected ("${pattern}") — process/onboarding requirement`,
237
+ },
238
+ };
239
+ return reasons[lang][patternType] || `Pattern "${pattern}" matched in category "${patternType}"`;
240
+ }
241
+ function deduplicateMatches(matches) {
242
+ const byText = new Map();
243
+ for (const m of matches) {
244
+ const key = m.text.substring(0, 80);
245
+ const existing = byText.get(key);
246
+ if (!existing || confidenceRank(m.confidence) > confidenceRank(existing.confidence)) {
247
+ byText.set(key, m);
248
+ }
249
+ }
250
+ return Array.from(byText.values()).sort((a, b) => confidenceRank(b.confidence) - confidenceRank(a.confidence));
251
+ }
252
+ function confidenceRank(c) {
253
+ return c === "high" ? 3 : c === "medium" ? 2 : 1;
254
+ }
255
+ //# sourceMappingURL=heuristics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heuristics.js","sourceRoot":"","sources":["../src/heuristics.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -10,6 +10,8 @@ import { checkProvider } from "./llm-client.js";
10
10
  import { parsePdf } from "./pdf-parser.js";
11
11
  import { DEFAULT_CATEGORIES } from "./types.js";
12
12
  import { jobManager } from "./job-manager.js";
13
+ import { scanForImplicitRequirements, detectLanguage } from "./heuristics.js";
14
+ import { analyzeRequirement, formatWarnings } from "./requirement-analyzer.js";
13
15
  // ─── MCP Server ─────────────────────────────────────────────────────
14
16
  const server = new McpServer({
15
17
  name: "mcp-requirements-extractor",
@@ -242,12 +244,18 @@ When analyzing requirements, remember that a SINGLE requirement from the PDF oft
242
244
  - Does the end-user (driver/client) SEE or USE it in a web portal? → Write a "frontend" requirement
243
245
  - Does the user interact with it on a mobile app (iOS/Android)? → Write a "mobile" requirement
244
246
 
247
+ NEW — HEURISTIC HINTS:
248
+ Each chunk now includes "heuristicHints" — automatically detected patterns that may indicate implicit requirements.
249
+ Pay special attention to hints with confidence "high" — these are likely real requirements disguised as context.
250
+ Do NOT skip introductory sections (Preliminary Remarks, Use Cases, etc.) — they often contain critical requirements.
251
+
245
252
  Categories: backend, bo, frontend, mobile, infra, devops, non-functional
246
253
  Use write_requirement to save each decomposed requirement to its category directory.`, {
247
254
  pdfPath: z.string().describe("Absolute path to the PDF file"),
248
255
  pagesPerChunk: z.number().optional().default(5).describe("Number of pages per chunk (default: 5)"),
249
256
  chunkIndex: z.number().optional().describe("If set, return only this specific chunk (0-based). Omit to get all chunks."),
250
- }, async ({ pdfPath, pagesPerChunk, chunkIndex }) => {
257
+ language: z.enum(["es", "en", "auto"]).optional().default("auto").describe("Language for heuristic scanning: 'es', 'en', or 'auto' (auto-detect)"),
258
+ }, async ({ pdfPath, pagesPerChunk, chunkIndex, language }) => {
251
259
  if (!fs.existsSync(pdfPath)) {
252
260
  return {
253
261
  content: [{ type: "text", text: `❌ PDF not found: ${pdfPath}` }],
@@ -262,6 +270,7 @@ Use write_requirement to save each decomposed requirement to its category direct
262
270
  };
263
271
  }
264
272
  const chunk = chunks[chunkIndex];
273
+ const hints = scanForImplicitRequirements(chunk.text, chunk.startPage, chunk.endPage, language);
265
274
  return {
266
275
  content: [{
267
276
  type: "text",
@@ -271,23 +280,28 @@ Use write_requirement to save each decomposed requirement to its category direct
271
280
  startPage: chunk.startPage,
272
281
  endPage: chunk.endPage,
273
282
  text: chunk.text,
283
+ heuristicHints: hints.filter(h => h.confidence !== "low"),
274
284
  }),
275
285
  }],
276
286
  };
277
287
  }
278
- // Return all chunks with metadata
288
+ // Return all chunks with metadata and heuristic hints
279
289
  return {
280
290
  content: [{
281
291
  type: "text",
282
292
  text: JSON.stringify({
283
293
  totalChunks: chunks.length,
284
294
  totalPages: chunks[chunks.length - 1]?.endPage || 0,
285
- chunks: chunks.map((c, i) => ({
286
- index: i,
287
- startPage: c.startPage,
288
- endPage: c.endPage,
289
- text: c.text,
290
- })),
295
+ chunks: chunks.map((c, i) => {
296
+ const hints = scanForImplicitRequirements(c.text, c.startPage, c.endPage, language);
297
+ return {
298
+ index: i,
299
+ startPage: c.startPage,
300
+ endPage: c.endPage,
301
+ text: c.text,
302
+ heuristicHints: hints.filter(h => h.confidence !== "low"),
303
+ };
304
+ }),
291
305
  }),
292
306
  }],
293
307
  };
@@ -306,6 +320,14 @@ Use this after YOU (the IDE AI) have generated the requirement content.
306
320
  The file will be saved as: {outputDir}/{category}/{filename}
307
321
  It also creates the category directory if it doesn't exist.
308
322
 
323
+ ACTIVE VALIDATION — This tool now analyzes the content before writing and returns warnings:
324
+ - 🔍 GRANULARITY: Items within the requirement that could be separate requirements (e.g., "Fuel Cards: Crear y gestionar" inside a Vehicle Management requirement)
325
+ - 🏗️ MISSING LAYERS: If the content mentions admin actors (Fleet Manager, Super Admin) but category is not 'bo', it suggests creating a BO requirement too
326
+ - 📋 ACCEPTANCE CRITERIA QUALITY: Flags vague criteria that read like user stories instead of specific, testable conditions
327
+ - 🔗 CROSS-REFERENCES: Checks if referenced requirement IDs exist as files
328
+
329
+ Pay attention to these warnings and act on them — create additional requirements for flagged sub-items and missing layers.
330
+
309
331
  IMPORTANT: A single requirement from the source PDF often results in MULTIPLE calls to this tool — one per layer/category.
310
332
  For example, "Booking Management" might generate:
311
333
  - backend/ACS_BE_07_bookings.md (API + business logic)
@@ -327,10 +349,13 @@ Expected markdown format:
327
349
  fs.mkdirSync(catDir, { recursive: true });
328
350
  const filePath = path.join(catDir, filename);
329
351
  fs.writeFileSync(filePath, content, "utf-8");
352
+ // Analyze the written requirement
353
+ const analysis = analyzeRequirement(content, category, outputDir);
354
+ const warningsText = formatWarnings(analysis);
330
355
  return {
331
356
  content: [{
332
357
  type: "text",
333
- text: `✅ Written: ${category}/${filename} (${content.length} bytes)`,
358
+ text: `✅ Written: ${category}/${filename} (${content.length} bytes)${warningsText}`,
334
359
  }],
335
360
  };
336
361
  }
@@ -341,6 +366,66 @@ Expected markdown format:
341
366
  };
342
367
  }
343
368
  });
369
+ // ─── Tool: scan_implicit_requirements (IDE-driven) ──────────────────
370
+ server.tool("scan_implicit_requirements", `Scans text for implicit requirements using multilingual heuristic patterns.
371
+ Use this AFTER parse_pdf to find requirements that lack formal identifiers (e.g., "ACS_BE_XX").
372
+
373
+ This tool detects:
374
+ - Obligation verbs: "must", "shall", "debe", "deberá", "tiene que"
375
+ - Access/permission patterns: "will have access to", "tendrá acceso a"
376
+ - Actor workflows: onboarding flows, KYC processes, dealer interactions
377
+ - Integration references: API, DMS, OBD, PSD2, GDPR
378
+ - Structural sections: "Preliminary Remarks", "Use Cases" that often hide real requirements
379
+ - Configuration patterns: "configurable", "editable", "campo obligatorio"
380
+
381
+ Each match includes confidence (high/medium/low), suggested categories, and reason.
382
+ Focus on "high" confidence matches — they are very likely real requirements.
383
+
384
+ Supports auto-detection of Spanish (ES) and English (EN) documents.`, {
385
+ text: z.string().describe("Text content to scan (from parse_pdf chunks)"),
386
+ startPage: z.number().optional().default(1).describe("Start page number for reference"),
387
+ endPage: z.number().optional().default(1).describe("End page number for reference"),
388
+ language: z.enum(["es", "en", "auto"]).optional().default("auto").describe("Language: 'es', 'en', or 'auto'"),
389
+ minConfidence: z.enum(["high", "medium", "low"]).optional().default("medium").describe("Minimum confidence level to return"),
390
+ }, async ({ text, startPage, endPage, language, minConfidence }) => {
391
+ try {
392
+ const detectedLang = language === "auto" ? detectLanguage(text) : language;
393
+ const allMatches = scanForImplicitRequirements(text, startPage, endPage, language);
394
+ // Filter by minimum confidence
395
+ const confidenceOrder = { high: 3, medium: 2, low: 1 };
396
+ const minLevel = confidenceOrder[minConfidence];
397
+ const filtered = allMatches.filter(m => confidenceOrder[m.confidence] >= minLevel);
398
+ // Format output
399
+ const summary = [
400
+ `🔎 Scanned ${text.length} characters (pages ${startPage}-${endPage})`,
401
+ `📝 Language detected: ${detectedLang}`,
402
+ `📊 Found: ${filtered.length} potential implicit requirements (${allMatches.length} total, filtered ≥${minConfidence})`,
403
+ "",
404
+ ];
405
+ for (const match of filtered) {
406
+ const icon = match.confidence === "high" ? "🔴" : match.confidence === "medium" ? "🟡" : "⚪";
407
+ summary.push(`${icon} [${match.confidence}] [${match.patternType}] ${match.reason}`);
408
+ summary.push(` 📄 "${match.text.substring(0, 120)}..."`);
409
+ summary.push(` 📂 Suggested categories: ${match.suggestedCategories.join(", ")}`);
410
+ summary.push("");
411
+ }
412
+ if (filtered.length === 0) {
413
+ summary.push("✅ No implicit requirements detected at this confidence level.");
414
+ }
415
+ return {
416
+ content: [{
417
+ type: "text",
418
+ text: summary.join("\n"),
419
+ }],
420
+ };
421
+ }
422
+ catch (error) {
423
+ return {
424
+ content: [{ type: "text", text: `❌ Error scanning: ${error.message}` }],
425
+ isError: true,
426
+ };
427
+ }
428
+ });
344
429
  // ─── Tool: write_summary (IDE-driven) ───────────────────────────────
345
430
  server.tool("write_summary", `Writes a README.md summary file and/or a VALORACION.md estimation file to the requirements directory.
346
431
  Use this after all requirements have been written to generate an index.`, {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type WarningSeverity = "error" | "warning" | "suggestion";
2
+ export interface RequirementWarning {
3
+ severity: WarningSeverity;
4
+ type: "granularity" | "missing_layer" | "vague_criteria" | "cross_reference";
5
+ message: string;
6
+ detail?: string;
7
+ }
8
+ export interface RequirementAnalysis {
9
+ warnings: RequirementWarning[];
10
+ score: number;
11
+ summary: string;
12
+ }
13
+ export declare function analyzeRequirement(content: string, category: string, outputDir: string): RequirementAnalysis;
14
+ export declare function formatWarnings(analysis: RequirementAnalysis): string;
15
+ //# sourceMappingURL=requirement-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirement-analyzer.d.ts","sourceRoot":"","sources":["../src/requirement-analyzer.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,aAAa,GAAG,eAAe,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACnB;AAsQD,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAClB,mBAAmB,CAkCrB;AAID,wBAAgB,cAAc,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,CAgBpE"}
@@ -0,0 +1,277 @@
1
+ // ─── Requirement Analyzer ───────────────────────────────────────────
2
+ //
3
+ // Analyzes requirement content before writing to detect:
4
+ // 1. Sub-items that should be separate requirements (granularity)
5
+ // 2. Missing layer coverage (e.g. backend CRUD without BO)
6
+ // 3. Vague acceptance criteria (user-story-level vs specific)
7
+ // 4. Cross-reference suggestions
8
+ import fs from "node:fs";
9
+ import path from "node:path";
10
+ // ─── CRUD / Sub-requirement Detection ───────────────────────────────
11
+ const CRUD_PATTERNS = [
12
+ /crear\s+y\s+gestionar/i,
13
+ /create\s+and\s+manage/i,
14
+ /crud\b/i,
15
+ /listar.*crear.*editar.*eliminar/i,
16
+ /list.*create.*edit.*delete/i,
17
+ /gestión\s+de\s+\w+/i,
18
+ /management\s+of\s+\w+/i,
19
+ /configurar\s+y\s+gestionar/i,
20
+ /configure\s+and\s+manage/i,
21
+ ];
22
+ const SUB_REQUIREMENT_INDICATORS = [
23
+ // Pattern: "- **Something**: verb + object" (bold label with description)
24
+ /^-\s+\*\*([^*]+)\*\*:\s*(.+)/gm,
25
+ // Pattern: "- Something: verb + object" (plain label with description)
26
+ /^-\s+([A-Z][^:]{3,30}):\s*((?:crear|gestionar|configurar|listar|CRUD|manage|create|configure|list).+)/gim,
27
+ ];
28
+ function detectSubRequirements(content) {
29
+ const warnings = [];
30
+ const lines = content.split("\n");
31
+ for (const line of lines) {
32
+ const trimmed = line.trim();
33
+ // Check for bold-labeled items that look like standalone requirements
34
+ const boldMatch = trimmed.match(/^-\s+\*\*([^*]+)\*\*\s*[:—]\s*(.+)/);
35
+ if (boldMatch) {
36
+ const [, label, description] = boldMatch;
37
+ const descLower = description.toLowerCase();
38
+ // Does it contain CRUD-like verbs?
39
+ const hasCrud = CRUD_PATTERNS.some(p => p.test(descLower));
40
+ // Does it look substantial enough to be its own requirement?
41
+ const isSubstantial = description.length > 30 || hasCrud;
42
+ if (isSubstantial && hasCrud) {
43
+ warnings.push({
44
+ severity: "warning",
45
+ type: "granularity",
46
+ message: `"${label}" podría ser un requisito separado`,
47
+ detail: `El ítem "${label}: ${description.substring(0, 80)}..." contiene operaciones CRUD propias. Considere extraerlo como un requisito independiente para mayor especificidad y trazabilidad.`,
48
+ });
49
+ }
50
+ }
51
+ }
52
+ return warnings;
53
+ }
54
+ // ─── Missing Layer Detection ────────────────────────────────────────
55
+ const BO_INDICATORS = [
56
+ /fleet\s*manager/i, /super\s*admin/i, /control\s*room/i,
57
+ /back\s*office/i, /panel\s*admin/i, /gestionar/i, /administrar/i,
58
+ /configurar/i, /crud/i, /crear.*desde.*backend/i,
59
+ /menú\s+de\s+gestión/i, /management\s+menu/i,
60
+ ];
61
+ const FRONTEND_INDICATORS = [
62
+ /driver\s*portal/i, /portal\s*web/i, /el\s+conductor/i,
63
+ /el\s+driver/i, /usuario\s+final/i, /end.?user/i,
64
+ /web\s*portal/i, /driver\s*web/i,
65
+ ];
66
+ const MOBILE_INDICATORS = [
67
+ /\bapp\b/i, /ios/i, /android/i, /móvil/i, /mobile/i,
68
+ /bluetooth/i, /ble\b/i, /push\s*notif/i, /pantalla/i,
69
+ ];
70
+ const BACKEND_INDICATORS = [
71
+ /api\b/i, /endpoint/i, /rest\b/i, /lógica\s+de\s+negocio/i,
72
+ /business\s+logic/i, /base\s+de\s+datos/i, /database/i,
73
+ /email\s+automát/i, /automatic\s+email/i,
74
+ ];
75
+ function detectMissingLayers(content, category) {
76
+ const warnings = [];
77
+ const lower = content.toLowerCase();
78
+ // If writing a backend requirement with CRUD content → suggest BO
79
+ if (category === "backend") {
80
+ const hasBoSignals = BO_INDICATORS.some(p => p.test(content));
81
+ if (hasBoSignals) {
82
+ warnings.push({
83
+ severity: "suggestion",
84
+ type: "missing_layer",
85
+ message: "Este requisito backend menciona gestión/admin → ¿existe el correspondiente requisito BO?",
86
+ detail: "El contenido menciona actores de administración (Fleet Manager, Super Admin, etc.) o verbos de gestión (configurar, gestionar, CRUD). Asegúrate de crear también un requisito en la categoría 'bo' para la interfaz de administración.",
87
+ });
88
+ }
89
+ const hasFrontendSignals = FRONTEND_INDICATORS.some(p => p.test(content));
90
+ if (hasFrontendSignals) {
91
+ warnings.push({
92
+ severity: "suggestion",
93
+ type: "missing_layer",
94
+ message: "Este requisito backend menciona driver portal → ¿existe el correspondiente requisito frontend?",
95
+ });
96
+ }
97
+ const hasMobileSignals = MOBILE_INDICATORS.some(p => p.test(content));
98
+ if (hasMobileSignals) {
99
+ warnings.push({
100
+ severity: "suggestion",
101
+ type: "missing_layer",
102
+ message: "Este requisito backend menciona app/mobile → ¿existe el correspondiente requisito mobile?",
103
+ });
104
+ }
105
+ }
106
+ // If writing a BO requirement → check backend exists
107
+ if (category === "bo") {
108
+ const hasBackendSignals = BACKEND_INDICATORS.some(p => p.test(content));
109
+ if (hasBackendSignals) {
110
+ warnings.push({
111
+ severity: "suggestion",
112
+ type: "missing_layer",
113
+ message: "Este requisito BO necesita APIs backend → ¿existe el correspondiente requisito backend?",
114
+ });
115
+ }
116
+ }
117
+ // If writing mobile → check backend
118
+ if (category === "mobile") {
119
+ warnings.push({
120
+ severity: "suggestion",
121
+ type: "missing_layer",
122
+ message: "Los requisitos mobile siempre necesitan backend → ¿existe el correspondiente requisito backend?",
123
+ });
124
+ }
125
+ return warnings;
126
+ }
127
+ // ─── Acceptance Criteria Quality ────────────────────────────────────
128
+ const VAGUE_PATTERNS = [
129
+ /funcional$/i,
130
+ /disponible$/i,
131
+ /implementad[oa]$/i,
132
+ /correcto$/i,
133
+ /^se puede/i,
134
+ /^it works/i,
135
+ /^funciona/i,
136
+ /^works correctly/i,
137
+ ];
138
+ const SPECIFIC_INDICATORS = [
139
+ /\d+/, // Contains numbers
140
+ /error.*mensaje|message.*error/i, // Error handling
141
+ /cuando.*entonces|when.*then/i, // Condition-action
142
+ /validate|validar/i, // Validation
143
+ /no puede|must not|cannot/i, // Negative constraint
144
+ /formato|format|patrón|pattern/i, // Format specification
145
+ /antes de|después de|before|after/i, // Temporal
146
+ ];
147
+ function analyzeAcceptanceCriteria(content) {
148
+ const warnings = [];
149
+ // Extract criteria lines
150
+ const criteriaLines = content.match(/- \[ \] .+/g) || [];
151
+ if (criteriaLines.length === 0) {
152
+ warnings.push({
153
+ severity: "warning",
154
+ type: "vague_criteria",
155
+ message: "No se encontraron criterios de aceptación (formato '- [ ] ...')",
156
+ });
157
+ return warnings;
158
+ }
159
+ let vagueCount = 0;
160
+ for (const line of criteriaLines) {
161
+ const criterion = line.replace(/- \[ \] /, "").trim();
162
+ // Check if too short
163
+ if (criterion.length < 20) {
164
+ vagueCount++;
165
+ continue;
166
+ }
167
+ // Check for vague patterns
168
+ const isVague = VAGUE_PATTERNS.some(p => p.test(criterion));
169
+ const isSpecific = SPECIFIC_INDICATORS.some(p => p.test(criterion));
170
+ if (isVague && !isSpecific) {
171
+ vagueCount++;
172
+ warnings.push({
173
+ severity: "suggestion",
174
+ type: "vague_criteria",
175
+ message: `Criterio genérico: "${criterion.substring(0, 60)}..."`,
176
+ detail: "Considera añadir condiciones específicas, valores concretos, o formato Given/When/Then para mayor especificidad.",
177
+ });
178
+ }
179
+ }
180
+ if (vagueCount > criteriaLines.length / 2) {
181
+ warnings.push({
182
+ severity: "warning",
183
+ type: "vague_criteria",
184
+ message: `${vagueCount} de ${criteriaLines.length} criterios parecen demasiado genéricos (tipo historia de usuario). Añade condiciones concretas, valores numéricos, o acciones específicas.`,
185
+ });
186
+ }
187
+ return warnings;
188
+ }
189
+ // ─── Cross-Reference Suggestions ────────────────────────────────────
190
+ function findCrossReferences(content, category, outputDir) {
191
+ const warnings = [];
192
+ // Check if outputDir exists
193
+ if (!fs.existsSync(outputDir))
194
+ return warnings;
195
+ // Look for references to other requirement IDs in content
196
+ const idRefs = content.match(/ACS_[A-Z]{2}_\d{2}/g) || [];
197
+ const uniqueRefs = [...new Set(idRefs)];
198
+ // Check if referenced requirements exist
199
+ for (const ref of uniqueRefs) {
200
+ const found = findRequirementFile(outputDir, ref);
201
+ if (!found) {
202
+ warnings.push({
203
+ severity: "suggestion",
204
+ type: "cross_reference",
205
+ message: `Referencia a "${ref}" encontrada pero no existe como fichero de requisito`,
206
+ });
207
+ }
208
+ }
209
+ return warnings;
210
+ }
211
+ function findRequirementFile(outputDir, reqId) {
212
+ try {
213
+ const subdirs = fs.readdirSync(outputDir, { withFileTypes: true });
214
+ for (const entry of subdirs) {
215
+ if (!entry.isDirectory())
216
+ continue;
217
+ const catDir = path.join(outputDir, entry.name);
218
+ const files = fs.readdirSync(catDir);
219
+ if (files.some(f => f.includes(reqId)))
220
+ return true;
221
+ }
222
+ }
223
+ catch {
224
+ // Ignore errors
225
+ }
226
+ return false;
227
+ }
228
+ // ─── Main Analysis Function ─────────────────────────────────────────
229
+ export function analyzeRequirement(content, category, outputDir) {
230
+ const allWarnings = [
231
+ ...detectSubRequirements(content),
232
+ ...detectMissingLayers(content, category),
233
+ ...analyzeAcceptanceCriteria(content),
234
+ ...findCrossReferences(content, category, outputDir),
235
+ ];
236
+ // Calculate quality score
237
+ const errorCount = allWarnings.filter(w => w.severity === "error").length;
238
+ const warningCount = allWarnings.filter(w => w.severity === "warning").length;
239
+ const suggestionCount = allWarnings.filter(w => w.severity === "suggestion").length;
240
+ let score = 100;
241
+ score -= errorCount * 20;
242
+ score -= warningCount * 10;
243
+ score -= suggestionCount * 3;
244
+ score = Math.max(0, Math.min(100, score));
245
+ // Build summary
246
+ const parts = [];
247
+ if (errorCount > 0)
248
+ parts.push(`❌ ${errorCount} error(s)`);
249
+ if (warningCount > 0)
250
+ parts.push(`⚠️ ${warningCount} warning(s)`);
251
+ if (suggestionCount > 0)
252
+ parts.push(`💡 ${suggestionCount} suggestion(s)`);
253
+ const summary = parts.length > 0
254
+ ? `Quality: ${score}/100 — ${parts.join(", ")}`
255
+ : `Quality: ${score}/100 — ✅ No issues detected`;
256
+ return {
257
+ warnings: allWarnings,
258
+ score,
259
+ summary,
260
+ };
261
+ }
262
+ // ─── Format Warnings for Output ─────────────────────────────────────
263
+ export function formatWarnings(analysis) {
264
+ if (analysis.warnings.length === 0) {
265
+ return `\n📊 ${analysis.summary}`;
266
+ }
267
+ const lines = [`\n📊 ${analysis.summary}\n`];
268
+ for (const w of analysis.warnings) {
269
+ const icon = w.severity === "error" ? "❌" : w.severity === "warning" ? "⚠️" : "💡";
270
+ lines.push(`${icon} [${w.type}] ${w.message}`);
271
+ if (w.detail) {
272
+ lines.push(` → ${w.detail}`);
273
+ }
274
+ }
275
+ return lines.join("\n");
276
+ }
277
+ //# sourceMappingURL=requirement-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirement-analyzer.js","sourceRoot":"","sources":["../src/requirement-analyzer.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -80,4 +80,6 @@ export interface OllamaResponse {
80
80
  response: string;
81
81
  done: boolean;
82
82
  }
83
+ export type { HeuristicMatch, Language, Confidence } from "./heuristics.js";
84
+ export type { RequirementWarning, RequirementAnalysis, WarningSeverity } from "./requirement-analyzer.js";
83
85
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gherk/requirements-extractor",
3
- "version": "1.4.0",
4
- "description": "MCP server that extracts, classifies and generates structured requirements from PDF documents using Ollama LLM",
3
+ "version": "1.5.0",
4
+ "description": "MCP server that extracts, classifies and generates structured requirements from PDF documents with heuristic scanning and active validation",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {