@gherk/requirements-extractor 1.2.0 → 1.4.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.
- package/dist/extractor.d.ts.map +1 -1
- package/dist/extractor.js +15 -9
- package/dist/extractor.js.map +1 -1
- package/dist/index.js +231 -36
- package/dist/index.js.map +1 -1
- package/dist/llm-client.d.ts +28 -0
- package/dist/llm-client.d.ts.map +1 -0
- package/dist/llm-client.js +164 -0
- package/dist/llm-client.js.map +1 -0
- package/dist/prompts.d.ts +4 -4
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +106 -37
- package/dist/prompts.js.map +1 -1
- package/dist/scraper.d.ts +9 -0
- package/dist/scraper.d.ts.map +1 -0
- package/dist/scraper.js +79 -0
- package/dist/scraper.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -2
- package/dist/types.js.map +1 -1
- package/package.json +7 -2
package/dist/extractor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAIR,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAGnB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,gBAAgB,EACxB,SAAS,GAAE,mBAAwB,GACpC,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAIR,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAGnB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,gBAAgB,EACxB,SAAS,GAAE,mBAAwB,GACpC,OAAO,CAAC,gBAAgB,CAAC,CAkS3B"}
|
package/dist/extractor.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parsePdf } from "./pdf-parser.js";
|
|
2
2
|
import * as path from "path";
|
|
3
|
-
import { generate, generateJson } from "./
|
|
3
|
+
import { generate, generateJson } from "./llm-client.js";
|
|
4
4
|
import { identifySystemPrompt, identifyUserPrompt, classifySystemPrompt, classifyUserPrompt, generateSystemPrompt, generateUserPrompt, gherkinSystemPrompt, gherkinUserPrompt, } from "./prompts.js";
|
|
5
5
|
import { assignSequences, generateId, ensureOutputDirs, writeSingleRequirement, writeRequirements, toSingleJsonRequirement, } from "./markdown.js";
|
|
6
6
|
/**
|
|
@@ -10,13 +10,15 @@ import { assignSequences, generateId, ensureOutputDirs, writeSingleRequirement,
|
|
|
10
10
|
*/
|
|
11
11
|
export async function extractRequirements(config, callbacks = {}) {
|
|
12
12
|
const { onProgress, onIdentified, onClassified, onRequirement } = callbacks;
|
|
13
|
-
const { pdfPath, outputDir, projectPrefix = "ACS", categories, model, ollamaUrl, outputFormat = "markdown", filterCategories, maxPerCategory, } = config;
|
|
13
|
+
const { pdfPath, outputDir, projectPrefix = "ACS", categories, model, ollamaUrl, provider = "ollama", apiKey, outputFormat = "markdown", filterCategories, maxPerCategory, context, } = config;
|
|
14
14
|
// We import DEFAULT_CATEGORIES dynamically to avoid circular dep
|
|
15
15
|
const { DEFAULT_CATEGORIES } = await import("./types.js");
|
|
16
16
|
const cats = categories || DEFAULT_CATEGORIES;
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
const llmOpts = {
|
|
18
|
+
provider: provider,
|
|
19
|
+
model: model || (provider === "openai" ? "gpt-4o-mini" : "qwen3:8b"),
|
|
20
|
+
baseUrl: ollamaUrl || (provider === "openai" ? "https://api.openai.com/v1" : "http://localhost:11434"),
|
|
21
|
+
apiKey,
|
|
20
22
|
temperature: 0.3,
|
|
21
23
|
numCtx: 16384,
|
|
22
24
|
};
|
|
@@ -35,7 +37,8 @@ export async function extractRequirements(config, callbacks = {}) {
|
|
|
35
37
|
const chunk = chunks[i];
|
|
36
38
|
log(` Chunk ${i + 1}/${chunks.length} (pages ${chunk.startPage}-${chunk.endPage})`);
|
|
37
39
|
try {
|
|
38
|
-
const identified = await generateJson(identifyUserPrompt(chunk.text, chunk.startPage, chunk.endPage), identifySystemPrompt(),
|
|
40
|
+
const identified = await generateJson(identifyUserPrompt(chunk.text, chunk.startPage, chunk.endPage), identifySystemPrompt(context), // Pass context
|
|
41
|
+
llmOpts);
|
|
39
42
|
if (Array.isArray(identified)) {
|
|
40
43
|
for (const req of identified) {
|
|
41
44
|
if (!req.page_range) {
|
|
@@ -72,7 +75,8 @@ export async function extractRequirements(config, callbacks = {}) {
|
|
|
72
75
|
const totalBatches = Math.ceil(allRaw.length / batchSize);
|
|
73
76
|
log(` Batch ${batchNum}/${totalBatches} (${batch.length} requirements)`);
|
|
74
77
|
try {
|
|
75
|
-
const classified = await generateJson(classifyUserPrompt(batch, cats), classifySystemPrompt(cats),
|
|
78
|
+
const classified = await generateJson(classifyUserPrompt(batch, cats), classifySystemPrompt(cats, context), // Pass context
|
|
79
|
+
llmOpts);
|
|
76
80
|
if (Array.isArray(classified)) {
|
|
77
81
|
for (const c of classified) {
|
|
78
82
|
// Support both `categories: [...]` and legacy `category: "..."`
|
|
@@ -146,7 +150,8 @@ export async function extractRequirements(config, callbacks = {}) {
|
|
|
146
150
|
page_range: req.page_range,
|
|
147
151
|
section_label: allCatLabels,
|
|
148
152
|
type: req.category === "non-functional" ? "No Funcional" : "Funcional",
|
|
149
|
-
}), generateSystemPrompt(),
|
|
153
|
+
}), generateSystemPrompt(context), // Pass context
|
|
154
|
+
llmOpts);
|
|
150
155
|
// Clean up wrapping code blocks
|
|
151
156
|
markdown = raw.trim();
|
|
152
157
|
if (markdown.startsWith("```markdown")) {
|
|
@@ -177,7 +182,8 @@ export async function extractRequirements(config, callbacks = {}) {
|
|
|
177
182
|
summary: req.summary,
|
|
178
183
|
category: req.category,
|
|
179
184
|
acceptance_criteria: [], // We don't have parsed ACs easily available here, relying on summary
|
|
180
|
-
}), gherkinSystemPrompt(),
|
|
185
|
+
}), gherkinSystemPrompt(context), // Pass context
|
|
186
|
+
llmOpts);
|
|
181
187
|
gherkin = gherkinRaw.trim();
|
|
182
188
|
if (gherkin.startsWith("```gherkin")) {
|
|
183
189
|
gherkin = gherkin
|
package/dist/extractor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,9 @@ import { z } from "zod";
|
|
|
5
5
|
import fs from "node:fs";
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import { extractRequirements } from "./extractor.js";
|
|
8
|
-
import {
|
|
8
|
+
import { ScraperService } from "./scraper.js";
|
|
9
|
+
import { checkProvider } from "./llm-client.js";
|
|
10
|
+
import { parsePdf } from "./pdf-parser.js";
|
|
9
11
|
import { DEFAULT_CATEGORIES } from "./types.js";
|
|
10
12
|
import { jobManager } from "./job-manager.js";
|
|
11
13
|
// ─── MCP Server ─────────────────────────────────────────────────────
|
|
@@ -13,69 +15,119 @@ const server = new McpServer({
|
|
|
13
15
|
name: "mcp-requirements-extractor",
|
|
14
16
|
version: "1.0.0",
|
|
15
17
|
});
|
|
16
|
-
const VALID_CATEGORIES = ["backend", "frontend", "mobile", "infra", "devops", "non-functional"];
|
|
18
|
+
const VALID_CATEGORIES = ["backend", "frontend", "bo", "mobile", "infra", "devops", "non-functional"];
|
|
17
19
|
// ─── Tool: extract_requirements ─────────────────────────────────────
|
|
20
|
+
// Initialize Scraper
|
|
21
|
+
const scraperService = new ScraperService();
|
|
18
22
|
server.tool("extract_requirements", `Extracts requirements from a PDF document and generates structured documentation.
|
|
19
23
|
Runs asynchronously — returns a jobId immediately. Use get_extraction_progress to poll for results.
|
|
20
24
|
|
|
21
25
|
Pipeline: 1. Identify requirements → 2. Classify by layer → 3. Generate markdown/JSON
|
|
22
|
-
Categories: backend, frontend, mobile, infra, devops, non-functional`, {
|
|
26
|
+
Categories: backend, frontend, bo, mobile, infra, devops, non-functional`, {
|
|
23
27
|
pdfPath: z.string().describe("Absolute path to the PDF file to analyze"),
|
|
24
28
|
outputDir: z.string().describe("Absolute path to the output directory"),
|
|
25
29
|
projectPrefix: z.string().optional().default("ACS").describe("Project prefix for requirement IDs (e.g., 'ACS' → ACS_BE_01)"),
|
|
26
30
|
outputFormat: z.enum(["markdown", "json", "both"]).optional().default("markdown").describe("Output format: markdown files, json, or both"),
|
|
27
31
|
filterCategories: z.array(z.enum(VALID_CATEGORIES)).optional().describe("Only generate for these categories. Omit for all."),
|
|
28
|
-
model: z.string().optional().default("qwen3:8b").describe("Ollama
|
|
29
|
-
ollamaUrl: z.string().optional().default("http://localhost:11434").describe("Ollama API base URL"),
|
|
30
|
-
|
|
32
|
+
model: z.string().optional().default("qwen3:8b").describe("Model to use (e.g., 'qwen3:8b' for Ollama, 'gpt-4o-mini' for OpenAI)"),
|
|
33
|
+
ollamaUrl: z.string().optional().default("http://localhost:11434").describe("Ollama API base URL (only used when provider is 'ollama')"),
|
|
34
|
+
provider: z.enum(["ollama", "openai"]).optional().default("ollama").describe("LLM provider: 'ollama' (local) or 'openai' (any OpenAI-compatible API: OpenAI, Groq, Together, Mistral, etc.)"),
|
|
35
|
+
apiKey: z.string().optional().describe("API key for cloud providers (required when provider is 'openai')"),
|
|
36
|
+
context: z.string().optional().describe("Optional extra context (e.g. library documentation)"),
|
|
37
|
+
urls: z.array(z.string()).optional().describe("Optional list of URLs to scrape for documentation"),
|
|
38
|
+
}, async ({ pdfPath, outputDir, projectPrefix, outputFormat, filterCategories, model, ollamaUrl, provider, apiKey, context, urls }) => {
|
|
31
39
|
// Validate PDF exists
|
|
32
40
|
if (!fs.existsSync(pdfPath)) {
|
|
33
41
|
return {
|
|
34
42
|
content: [{ type: "text", text: `❌ PDF not found: ${pdfPath}` }],
|
|
35
43
|
};
|
|
36
44
|
}
|
|
37
|
-
//
|
|
38
|
-
const ollamaCheck = await checkOllama({ model, baseUrl: ollamaUrl });
|
|
39
|
-
if (!ollamaCheck.available) {
|
|
40
|
-
return {
|
|
41
|
-
content: [{ type: "text", text: `❌ Ollama not available. ${ollamaCheck.error}` }],
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
// Create job and start extraction in background
|
|
45
|
+
// Create job
|
|
45
46
|
const job = jobManager.createJob(outputDir);
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
.then(async () => {
|
|
54
|
-
// Determine if we should generate JSON from markdown
|
|
55
|
-
if (outputFormat === "json" || outputFormat === "both") {
|
|
56
|
-
try {
|
|
57
|
-
const { generateJsonFromMarkdown } = await import("./jsonify.js");
|
|
58
|
-
await generateJsonFromMarkdown(outputDir);
|
|
59
|
-
jobManager.updatePhase(job.id, "JSON generation complete.");
|
|
47
|
+
// Start background process
|
|
48
|
+
(async () => {
|
|
49
|
+
try {
|
|
50
|
+
// 1. Check Ollama
|
|
51
|
+
const ollamaCheck = await checkProvider({ provider, model, baseUrl: ollamaUrl, apiKey });
|
|
52
|
+
if (!ollamaCheck.available) {
|
|
53
|
+
throw new Error(`LLM provider not available: ${ollamaCheck.error}`);
|
|
60
54
|
}
|
|
61
|
-
|
|
62
|
-
|
|
55
|
+
// 2. Scrape URLs (if any)
|
|
56
|
+
let combinedContext = context || "";
|
|
57
|
+
if (urls && urls.length > 0) {
|
|
58
|
+
jobManager.updatePhase(job.id, "Scraping documentation...");
|
|
59
|
+
try {
|
|
60
|
+
const scraped = await scraperService.scrapeUrls(urls);
|
|
61
|
+
if (scraped) {
|
|
62
|
+
combinedContext = combinedContext
|
|
63
|
+
? `${combinedContext}\n\n${scraped}`
|
|
64
|
+
: scraped;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
console.error(`Scraping warning: ${err.message}`);
|
|
69
|
+
// Continue even if scraping fails
|
|
70
|
+
}
|
|
63
71
|
}
|
|
72
|
+
// 3. Run Extraction
|
|
73
|
+
jobManager.updatePhase(job.id, "Starting extraction...");
|
|
74
|
+
await extractRequirements({
|
|
75
|
+
pdfPath,
|
|
76
|
+
outputDir,
|
|
77
|
+
projectPrefix,
|
|
78
|
+
outputFormat,
|
|
79
|
+
filterCategories,
|
|
80
|
+
model,
|
|
81
|
+
ollamaUrl,
|
|
82
|
+
provider,
|
|
83
|
+
apiKey,
|
|
84
|
+
context: combinedContext,
|
|
85
|
+
urls,
|
|
86
|
+
}, {
|
|
87
|
+
onProgress: (msg) => jobManager.updatePhase(job.id, msg),
|
|
88
|
+
onIdentified: (count) => jobManager.setIdentifiedCount(job.id, count),
|
|
89
|
+
onClassified: (count) => jobManager.setToGenerateCount(job.id, count),
|
|
90
|
+
onRequirement: (req) => jobManager.pushRequirement(job.id, req),
|
|
91
|
+
});
|
|
92
|
+
jobManager.completeJob(job.id);
|
|
64
93
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error(`Job ${job.id} failed:`, error);
|
|
96
|
+
jobManager.failJob(job.id, error.message || String(error));
|
|
97
|
+
}
|
|
98
|
+
})();
|
|
68
99
|
return {
|
|
69
100
|
content: [{
|
|
70
101
|
type: "text",
|
|
71
102
|
text: JSON.stringify({
|
|
72
103
|
jobId: job.id,
|
|
73
|
-
status: "
|
|
74
|
-
message: "Extraction started. Use get_extraction_progress to
|
|
75
|
-
|
|
104
|
+
status: "queued",
|
|
105
|
+
message: "Extraction started in background. Use get_extraction_progress to monitor.",
|
|
106
|
+
outputDir
|
|
107
|
+
}, null, 2),
|
|
76
108
|
}],
|
|
77
109
|
};
|
|
78
110
|
});
|
|
111
|
+
// ─── Tool: scrape_documentation ─────────────────────────────────────
|
|
112
|
+
server.tool("scrape_documentation", "Scrapes content from a list of URLs and returns it as Markdown.", {
|
|
113
|
+
urls: z.array(z.string()).describe("List of URLs to scrape"),
|
|
114
|
+
}, async ({ urls }) => {
|
|
115
|
+
if (!urls || urls.length === 0) {
|
|
116
|
+
return { content: [{ type: "text", text: "" }] };
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
const content = await scraperService.scrapeUrls(urls);
|
|
120
|
+
return {
|
|
121
|
+
content: [{ type: "text", text: content }],
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
return {
|
|
126
|
+
content: [{ type: "text", text: `Error scraping URLs: ${error.message}` }],
|
|
127
|
+
isError: true,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
});
|
|
79
131
|
// ─── Tool: get_extraction_progress ──────────────────────────────────
|
|
80
132
|
server.tool("get_extraction_progress", `Poll the progress of a running extraction job.
|
|
81
133
|
Returns new requirements since the 'since' index, allowing incremental consumption.
|
|
@@ -178,6 +230,149 @@ server.tool("get_requirement", "Returns the full content of a specific requireme
|
|
|
178
230
|
content: [{ type: "text", text: `❌ Requirement "${requirementId}" not found in ${requirementsDir}` }],
|
|
179
231
|
};
|
|
180
232
|
});
|
|
233
|
+
// ─── Tool: parse_pdf (IDE-driven) ───────────────────────────────────
|
|
234
|
+
server.tool("parse_pdf", `Parses a PDF file and returns its text content split into page-based chunks.
|
|
235
|
+
Use this to read the PDF content so YOU (the IDE AI) can analyze, identify, and classify requirements yourself.
|
|
236
|
+
Each chunk contains ~5 pages of text. Process them sequentially to extract requirements.
|
|
237
|
+
|
|
238
|
+
IMPORTANT — MULTI-LAYER DECOMPOSITION:
|
|
239
|
+
When analyzing requirements, remember that a SINGLE requirement from the PDF often needs to be decomposed into MULTIPLE layer-specific requirement files. For each requirement you identify, ask yourself:
|
|
240
|
+
- Does it need a REST API, business logic, data storage, emails, or integrations? → Write a "backend" requirement
|
|
241
|
+
- Does an admin/fleet manager MANAGE or CONFIGURE it in a web panel? → Write a "bo" (Back Office) requirement
|
|
242
|
+
- Does the end-user (driver/client) SEE or USE it in a web portal? → Write a "frontend" requirement
|
|
243
|
+
- Does the user interact with it on a mobile app (iOS/Android)? → Write a "mobile" requirement
|
|
244
|
+
|
|
245
|
+
Categories: backend, bo, frontend, mobile, infra, devops, non-functional
|
|
246
|
+
Use write_requirement to save each decomposed requirement to its category directory.`, {
|
|
247
|
+
pdfPath: z.string().describe("Absolute path to the PDF file"),
|
|
248
|
+
pagesPerChunk: z.number().optional().default(5).describe("Number of pages per chunk (default: 5)"),
|
|
249
|
+
chunkIndex: z.number().optional().describe("If set, return only this specific chunk (0-based). Omit to get all chunks."),
|
|
250
|
+
}, async ({ pdfPath, pagesPerChunk, chunkIndex }) => {
|
|
251
|
+
if (!fs.existsSync(pdfPath)) {
|
|
252
|
+
return {
|
|
253
|
+
content: [{ type: "text", text: `❌ PDF not found: ${pdfPath}` }],
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
try {
|
|
257
|
+
const chunks = await parsePdf(pdfPath, pagesPerChunk);
|
|
258
|
+
if (chunkIndex !== undefined) {
|
|
259
|
+
if (chunkIndex < 0 || chunkIndex >= chunks.length) {
|
|
260
|
+
return {
|
|
261
|
+
content: [{ type: "text", text: `❌ Chunk index ${chunkIndex} out of range (0-${chunks.length - 1})` }],
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
const chunk = chunks[chunkIndex];
|
|
265
|
+
return {
|
|
266
|
+
content: [{
|
|
267
|
+
type: "text",
|
|
268
|
+
text: JSON.stringify({
|
|
269
|
+
totalChunks: chunks.length,
|
|
270
|
+
chunkIndex,
|
|
271
|
+
startPage: chunk.startPage,
|
|
272
|
+
endPage: chunk.endPage,
|
|
273
|
+
text: chunk.text,
|
|
274
|
+
}),
|
|
275
|
+
}],
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
// Return all chunks with metadata
|
|
279
|
+
return {
|
|
280
|
+
content: [{
|
|
281
|
+
type: "text",
|
|
282
|
+
text: JSON.stringify({
|
|
283
|
+
totalChunks: chunks.length,
|
|
284
|
+
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
|
+
})),
|
|
291
|
+
}),
|
|
292
|
+
}],
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
return {
|
|
297
|
+
content: [{ type: "text", text: `❌ Error parsing PDF: ${error.message}` }],
|
|
298
|
+
isError: true,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
// ─── Tool: write_requirement (IDE-driven) ───────────────────────────
|
|
303
|
+
server.tool("write_requirement", `Writes a requirement markdown file to the correct category directory.
|
|
304
|
+
Use this after YOU (the IDE AI) have generated the requirement content.
|
|
305
|
+
|
|
306
|
+
The file will be saved as: {outputDir}/{category}/{filename}
|
|
307
|
+
It also creates the category directory if it doesn't exist.
|
|
308
|
+
|
|
309
|
+
IMPORTANT: A single requirement from the source PDF often results in MULTIPLE calls to this tool — one per layer/category.
|
|
310
|
+
For example, "Booking Management" might generate:
|
|
311
|
+
- backend/ACS_BE_07_bookings.md (API + business logic)
|
|
312
|
+
- bo/ACS_BO_07_bookings_management.md (admin CRUD + agenda)
|
|
313
|
+
- mobile/ACS_MB_01_booking_creation.md (driver app flow)
|
|
314
|
+
- frontend/ACS_FE_01_booking_portal.md (driver web portal)
|
|
315
|
+
|
|
316
|
+
Expected markdown format:
|
|
317
|
+
- Header: # {ID} — {TITLE IN UPPERCASE}
|
|
318
|
+
- Metadata table with Identificador, Título, Tipo, Sección, Página
|
|
319
|
+
- Sections: Objetivo, Descripción Técnica (with Mermaid diagrams), Consideraciones Técnicas, Criterios de Aceptación (checkboxes)`, {
|
|
320
|
+
outputDir: z.string().describe("Absolute path to the requirements output directory"),
|
|
321
|
+
category: z.enum(["backend", "frontend", "mobile", "bo", "infra", "devops", "non-functional", "no-funcionales"]).describe("Category subdirectory"),
|
|
322
|
+
filename: z.string().describe("Filename (e.g., 'ACS_BE_01_auth.md')"),
|
|
323
|
+
content: z.string().describe("Full markdown content of the requirement"),
|
|
324
|
+
}, async ({ outputDir, category, filename, content }) => {
|
|
325
|
+
try {
|
|
326
|
+
const catDir = path.join(outputDir, category);
|
|
327
|
+
fs.mkdirSync(catDir, { recursive: true });
|
|
328
|
+
const filePath = path.join(catDir, filename);
|
|
329
|
+
fs.writeFileSync(filePath, content, "utf-8");
|
|
330
|
+
return {
|
|
331
|
+
content: [{
|
|
332
|
+
type: "text",
|
|
333
|
+
text: `✅ Written: ${category}/${filename} (${content.length} bytes)`,
|
|
334
|
+
}],
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
return {
|
|
339
|
+
content: [{ type: "text", text: `❌ Error writing file: ${error.message}` }],
|
|
340
|
+
isError: true,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
// ─── Tool: write_summary (IDE-driven) ───────────────────────────────
|
|
345
|
+
server.tool("write_summary", `Writes a README.md summary file and/or a VALORACION.md estimation file to the requirements directory.
|
|
346
|
+
Use this after all requirements have been written to generate an index.`, {
|
|
347
|
+
outputDir: z.string().describe("Absolute path to the requirements directory"),
|
|
348
|
+
readmeContent: z.string().describe("Full markdown content for README.md"),
|
|
349
|
+
valoracionContent: z.string().optional().describe("Optional: Full markdown content for VALORACION.md (estimation/valuation document)"),
|
|
350
|
+
}, async ({ outputDir, readmeContent, valoracionContent }) => {
|
|
351
|
+
try {
|
|
352
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
353
|
+
const files = [];
|
|
354
|
+
const readmePath = path.join(outputDir, "README.md");
|
|
355
|
+
fs.writeFileSync(readmePath, readmeContent, "utf-8");
|
|
356
|
+
files.push("README.md");
|
|
357
|
+
if (valoracionContent) {
|
|
358
|
+
const valPath = path.join(outputDir, "VALORACION.md");
|
|
359
|
+
fs.writeFileSync(valPath, valoracionContent, "utf-8");
|
|
360
|
+
files.push("VALORACION.md");
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
content: [{
|
|
364
|
+
type: "text",
|
|
365
|
+
text: `✅ Written: ${files.join(", ")} to ${outputDir}`,
|
|
366
|
+
}],
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
return {
|
|
371
|
+
content: [{ type: "text", text: `❌ Error writing summary: ${error.message}` }],
|
|
372
|
+
isError: true,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
});
|
|
181
376
|
// ─── Start Server ───────────────────────────────────────────────────
|
|
182
377
|
async function main() {
|
|
183
378
|
const transport = new StdioServerTransport();
|
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,28 @@
|
|
|
1
|
+
export type LlmProvider = "ollama" | "openai";
|
|
2
|
+
export interface LlmOptions {
|
|
3
|
+
provider?: LlmProvider;
|
|
4
|
+
model?: string;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
apiKey?: string;
|
|
7
|
+
temperature?: number;
|
|
8
|
+
numCtx?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Send a prompt to the configured LLM provider and get the full response.
|
|
12
|
+
*/
|
|
13
|
+
export declare function generate(prompt: string, systemPrompt: string, options?: LlmOptions): Promise<string>;
|
|
14
|
+
/**
|
|
15
|
+
* Send a prompt and parse the response as JSON.
|
|
16
|
+
* Retries up to maxRetries times if JSON parsing fails.
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateJson<T>(prompt: string, systemPrompt: string, options?: LlmOptions, maxRetries?: number): Promise<T>;
|
|
19
|
+
/**
|
|
20
|
+
* Check if the configured provider is available.
|
|
21
|
+
* For Ollama: pings the server and checks model availability.
|
|
22
|
+
* For OpenAI: returns available (since we can't easily pre-check cloud APIs).
|
|
23
|
+
*/
|
|
24
|
+
export declare function checkProvider(options?: LlmOptions): Promise<{
|
|
25
|
+
available: boolean;
|
|
26
|
+
error?: string;
|
|
27
|
+
}>;
|
|
28
|
+
//# sourceMappingURL=llm-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../src/llm-client.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9C,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAwBD;;GAEG;AACH,wBAAsB,QAAQ,CAC1B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,UAAe,GACzB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,UAAe,EACxB,UAAU,GAAE,MAAU,GACvB,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAC/B,OAAO,GAAE,UAAe,GACzB,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAWjD"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// ─── Defaults ───────────────────────────────────────────────────────
|
|
2
|
+
const DEFAULTS = {
|
|
3
|
+
ollama: {
|
|
4
|
+
baseUrl: "http://localhost:11434",
|
|
5
|
+
model: "qwen3:8b",
|
|
6
|
+
},
|
|
7
|
+
openai: {
|
|
8
|
+
baseUrl: "https://api.openai.com/v1",
|
|
9
|
+
model: "gpt-4o-mini",
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
// ─── Unified Generate ───────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Send a prompt to the configured LLM provider and get the full response.
|
|
15
|
+
*/
|
|
16
|
+
export async function generate(prompt, systemPrompt, options = {}) {
|
|
17
|
+
const provider = options.provider || "ollama";
|
|
18
|
+
if (provider === "openai") {
|
|
19
|
+
return generateOpenAI(prompt, systemPrompt, options);
|
|
20
|
+
}
|
|
21
|
+
return generateOllama(prompt, systemPrompt, options);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Send a prompt and parse the response as JSON.
|
|
25
|
+
* Retries up to maxRetries times if JSON parsing fails.
|
|
26
|
+
*/
|
|
27
|
+
export async function generateJson(prompt, systemPrompt, options = {}, maxRetries = 2) {
|
|
28
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
29
|
+
const raw = await generate(prompt, systemPrompt, options);
|
|
30
|
+
try {
|
|
31
|
+
const jsonStr = extractJson(raw);
|
|
32
|
+
return JSON.parse(jsonStr);
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
if (attempt === maxRetries) {
|
|
36
|
+
throw new Error(`Failed to parse JSON after ${maxRetries + 1} attempts. Last response:\n${raw}`);
|
|
37
|
+
}
|
|
38
|
+
console.error(`[llm] JSON parse failed (attempt ${attempt + 1}), retrying...`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
throw new Error("Unreachable");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if the configured provider is available.
|
|
45
|
+
* For Ollama: pings the server and checks model availability.
|
|
46
|
+
* For OpenAI: returns available (since we can't easily pre-check cloud APIs).
|
|
47
|
+
*/
|
|
48
|
+
export async function checkProvider(options = {}) {
|
|
49
|
+
const provider = options.provider || "ollama";
|
|
50
|
+
if (provider === "openai") {
|
|
51
|
+
if (!options.apiKey) {
|
|
52
|
+
return { available: false, error: "API key is required for OpenAI provider" };
|
|
53
|
+
}
|
|
54
|
+
return { available: true };
|
|
55
|
+
}
|
|
56
|
+
return checkOllama(options);
|
|
57
|
+
}
|
|
58
|
+
// ─── Ollama Implementation ──────────────────────────────────────────
|
|
59
|
+
async function generateOllama(prompt, systemPrompt, options) {
|
|
60
|
+
const { model = DEFAULTS.ollama.model, baseUrl = DEFAULTS.ollama.baseUrl, temperature = 0.3, numCtx = 16384, } = options;
|
|
61
|
+
const url = `${baseUrl}/api/generate`;
|
|
62
|
+
const body = {
|
|
63
|
+
model,
|
|
64
|
+
prompt,
|
|
65
|
+
system: systemPrompt,
|
|
66
|
+
stream: false,
|
|
67
|
+
options: {
|
|
68
|
+
temperature,
|
|
69
|
+
num_ctx: numCtx,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
const response = await fetch(url, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: { "Content-Type": "application/json" },
|
|
75
|
+
body: JSON.stringify(body),
|
|
76
|
+
});
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
const errorText = await response.text();
|
|
79
|
+
throw new Error(`Ollama error (${response.status}): ${errorText}`);
|
|
80
|
+
}
|
|
81
|
+
const data = (await response.json());
|
|
82
|
+
return data.response;
|
|
83
|
+
}
|
|
84
|
+
async function checkOllama(options) {
|
|
85
|
+
const { baseUrl = DEFAULTS.ollama.baseUrl, model = DEFAULTS.ollama.model } = options;
|
|
86
|
+
try {
|
|
87
|
+
const response = await fetch(`${baseUrl}/api/tags`);
|
|
88
|
+
if (!response.ok) {
|
|
89
|
+
return { available: false, error: `Ollama returned ${response.status}` };
|
|
90
|
+
}
|
|
91
|
+
const data = (await response.json());
|
|
92
|
+
const modelExists = data.models.some((m) => m.name === model || m.name.startsWith(`${model}:`));
|
|
93
|
+
if (!modelExists) {
|
|
94
|
+
return {
|
|
95
|
+
available: false,
|
|
96
|
+
error: `Model "${model}" not found. Available: ${data.models.map((m) => m.name).join(", ")}`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return { available: true };
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
return {
|
|
103
|
+
available: false,
|
|
104
|
+
error: `Cannot connect to Ollama at ${baseUrl}. Is it running?`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// ─── OpenAI-Compatible Implementation ───────────────────────────────
|
|
109
|
+
async function generateOpenAI(prompt, systemPrompt, options) {
|
|
110
|
+
const { model = DEFAULTS.openai.model, baseUrl = DEFAULTS.openai.baseUrl, apiKey, temperature = 0.3, } = options;
|
|
111
|
+
if (!apiKey) {
|
|
112
|
+
throw new Error("API key is required for OpenAI provider. Pass apiKey in options.");
|
|
113
|
+
}
|
|
114
|
+
// Normalize base URL: strip trailing slash, ensure no /chat/completions
|
|
115
|
+
const cleanBase = baseUrl.replace(/\/+$/, "");
|
|
116
|
+
const url = `${cleanBase}/chat/completions`;
|
|
117
|
+
const body = {
|
|
118
|
+
model,
|
|
119
|
+
messages: [
|
|
120
|
+
{ role: "system", content: systemPrompt },
|
|
121
|
+
{ role: "user", content: prompt },
|
|
122
|
+
],
|
|
123
|
+
temperature,
|
|
124
|
+
};
|
|
125
|
+
const response = await fetch(url, {
|
|
126
|
+
method: "POST",
|
|
127
|
+
headers: {
|
|
128
|
+
"Content-Type": "application/json",
|
|
129
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
130
|
+
},
|
|
131
|
+
body: JSON.stringify(body),
|
|
132
|
+
});
|
|
133
|
+
if (!response.ok) {
|
|
134
|
+
const errorText = await response.text();
|
|
135
|
+
throw new Error(`OpenAI API error (${response.status}): ${errorText}`);
|
|
136
|
+
}
|
|
137
|
+
const data = (await response.json());
|
|
138
|
+
if (!data.choices || data.choices.length === 0) {
|
|
139
|
+
throw new Error("OpenAI API returned no choices");
|
|
140
|
+
}
|
|
141
|
+
let content = data.choices[0].message.content;
|
|
142
|
+
// Remove thinking tags (qwen3 / deepseek style)
|
|
143
|
+
content = content.replace(/<think>[\s\S]*?<\/think>\s*/g, "").trim();
|
|
144
|
+
return content;
|
|
145
|
+
}
|
|
146
|
+
// ─── JSON Extraction Helper ─────────────────────────────────────────
|
|
147
|
+
/**
|
|
148
|
+
* Extract JSON from a string that may contain markdown code blocks.
|
|
149
|
+
*/
|
|
150
|
+
function extractJson(text) {
|
|
151
|
+
// Try to find JSON in a code block
|
|
152
|
+
const codeBlockMatch = text.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
|
|
153
|
+
if (codeBlockMatch) {
|
|
154
|
+
return codeBlockMatch[1].trim();
|
|
155
|
+
}
|
|
156
|
+
// Try to find a JSON array or object directly
|
|
157
|
+
const jsonMatch = text.match(/([\[\{][\s\S]*[\]\}])/);
|
|
158
|
+
if (jsonMatch) {
|
|
159
|
+
return jsonMatch[1].trim();
|
|
160
|
+
}
|
|
161
|
+
// Return as-is and let JSON.parse handle the error
|
|
162
|
+
return text.trim();
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=llm-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../src/llm-client.ts"],"names":[],"mappings":"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"}
|
package/dist/prompts.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { Category } from "./types.js";
|
|
2
|
-
export declare function identifySystemPrompt(): string;
|
|
2
|
+
export declare function identifySystemPrompt(context?: string): string;
|
|
3
3
|
export declare function identifyUserPrompt(chunkText: string, startPage: number, endPage: number): string;
|
|
4
|
-
export declare function classifySystemPrompt(categories: Category[]): string;
|
|
4
|
+
export declare function classifySystemPrompt(categories: Category[], context?: string): string;
|
|
5
5
|
export declare function classifyUserPrompt(requirements: Array<{
|
|
6
6
|
id_suggestion: string;
|
|
7
7
|
title: string;
|
|
8
8
|
summary: string;
|
|
9
9
|
raw_text: string;
|
|
10
10
|
}>, categories: Category[]): string;
|
|
11
|
-
export declare function generateSystemPrompt(): string;
|
|
11
|
+
export declare function generateSystemPrompt(context?: string): string;
|
|
12
12
|
export declare function generateUserPrompt(req: {
|
|
13
13
|
id: string;
|
|
14
14
|
title: string;
|
|
@@ -18,7 +18,7 @@ export declare function generateUserPrompt(req: {
|
|
|
18
18
|
section_label: string;
|
|
19
19
|
type: string;
|
|
20
20
|
}): string;
|
|
21
|
-
export declare function gherkinSystemPrompt(): string;
|
|
21
|
+
export declare function gherkinSystemPrompt(context?: string): string;
|
|
22
22
|
export declare function gherkinUserPrompt(req: {
|
|
23
23
|
id: string;
|
|
24
24
|
title: string;
|
package/dist/prompts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,wBAAgB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAwB7D;AAED,wBAAgB,kBAAkB,CAC9B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAChB,MAAM,CAyBR;AAID,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CA+ErF;AAED,wBAAgB,kBAAkB,CAC9B,YAAY,EAAE,KAAK,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC,EACF,UAAU,EAAE,QAAQ,EAAE,GACvB,MAAM,CA+BR;AAKD,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAkC7D;AAED,wBAAgB,kBAAkB,CAC9B,GAAG,EAAE;IACD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CAChB,GACF,MAAM,CA6DR;AAID,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAc5D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,EAAE,CAAC;CACjC,GAAG,MAAM,CAuBT"}
|
package/dist/prompts.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ─── Pass 1: Identify Requirements ──────────────────────────────────
|
|
2
|
-
export function identifySystemPrompt() {
|
|
2
|
+
export function identifySystemPrompt(context) {
|
|
3
3
|
return `Eres un analista de requisitos software experto.
|
|
4
4
|
|
|
5
5
|
Tu tarea es leer un fragmento de un documento PDF y extraer TODOS los requisitos explícitos que aparezcan en el texto.
|
|
@@ -13,12 +13,15 @@ REGLAS IMPORTANTES:
|
|
|
13
13
|
- Incluye requisitos funcionales y no funcionales
|
|
14
14
|
- NO inventes información que no esté explícitamente en el texto
|
|
15
15
|
- Si no hay requisitos claros, responde con un array vacío: []
|
|
16
|
+
- Si el documento menciona login, perfiles de usuario, acceso restringido por rol o credenciales, identifica la autenticación como un REQUISITO PROPIO (no lo metas en otros requisitos)
|
|
16
17
|
|
|
17
18
|
FORMATO DE RESPUESTA:
|
|
18
19
|
- Devuelve SOLO un JSON array válido
|
|
19
20
|
- Usa solo comillas dobles (")
|
|
20
21
|
- No incluyas texto adicional, comentarios ni markdown
|
|
21
22
|
|
|
23
|
+
${context ? `CONTEXTO ADICIONAL:\n${context}` : ""}
|
|
24
|
+
|
|
22
25
|
Responde ÚNICAMENTE con el JSON array.`;
|
|
23
26
|
}
|
|
24
27
|
export function identifyUserPrompt(chunkText, startPage, endPage) {
|
|
@@ -48,49 +51,84 @@ Responde SOLO con el JSON array. Ejemplo:
|
|
|
48
51
|
]`;
|
|
49
52
|
}
|
|
50
53
|
// ─── Pass 2: Classify Requirements ──────────────────────────────────
|
|
51
|
-
export function classifySystemPrompt(categories) {
|
|
54
|
+
export function classifySystemPrompt(categories, context) {
|
|
52
55
|
const catDescriptions = categories
|
|
53
56
|
.map((c) => `- "${c.id}": ${c.label} — ${c.description}`)
|
|
54
57
|
.join("\n");
|
|
55
58
|
return `Eres un ARQUITECTO DE SOFTWARE PRINCIPAL con 20 años de experiencia en sistemas distribuidos. Tu capacidad de análisis es legendaria.
|
|
56
|
-
Tu misión es
|
|
59
|
+
Tu misión es DESCOMPONER cada requisito en TODAS las capas arquitectónicas que necesita implementación.
|
|
57
60
|
|
|
58
61
|
CONTEXTO:
|
|
59
|
-
Estás analizando un sistema moderno
|
|
62
|
+
Estás analizando un sistema moderno con: APIs backend, un panel de Back Office (BO) para administradores, un portal web para usuarios finales (Frontend), y aplicaciones móviles (iOS/Android). La MAYORÍA de los requisitos son "Full Stack" y tocan VARIAS capas simultáneamente.
|
|
60
63
|
|
|
61
64
|
TUS HERRAMIENTAS (CATEGORÍAS):
|
|
62
65
|
${catDescriptions}
|
|
63
66
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
-
|
|
87
|
-
|
|
88
|
-
|
|
67
|
+
⚠️ REGLA CRÍTICA — DISTINCIÓN ENTRE "bo" Y "frontend":
|
|
68
|
+
- "bo" (Back Office) = Panel de GESTIÓN/ADMINISTRACIÓN para perfiles internos: Super Admin, Fleet Manager, Control Room, Company Manager. Aquí se CONFIGURAN, GESTIONAN y MONITORIZAN los datos del sistema.
|
|
69
|
+
- "frontend" = Portal/Web del USUARIO FINAL (driver, cliente). Aquí el usuario final CONSUME el servicio: ve su perfil, hace reservas, ve sus viajes, paga.
|
|
70
|
+
- Si un requisito habla de "gestionar", "configurar", "administrar", "crear desde el back end" → es "bo".
|
|
71
|
+
- Si un requisito habla de "el usuario/driver ve", "el driver reserva", "portal del conductor" → es "frontend".
|
|
72
|
+
- MUCHOS requisitos tendrán AMBOS: el admin lo configura en BO y el usuario lo consume en frontend/mobile.
|
|
73
|
+
|
|
74
|
+
MODELO MENTAL DE DESCOMPOSICIÓN MULTI-CAPA:
|
|
75
|
+
|
|
76
|
+
1. **ANÁLISIS DE IMPACTO POR CAPA** (pregúntate para CADA requisito):
|
|
77
|
+
- ¿Necesita APIs, lógica de negocio, almacenamiento de datos, emails, integraciones? → "backend"
|
|
78
|
+
- ¿Un administrador lo GESTIONA/CONFIGURA en un panel web? → "bo"
|
|
79
|
+
- ¿El usuario final lo VE/USA en un portal web? → "frontend"
|
|
80
|
+
- ¿El usuario lo USA en una app móvil iOS/Android? → "mobile"
|
|
81
|
+
- ¿Habla de entornos, CI/CD, contenedores? → "devops"
|
|
82
|
+
- ¿Habla de seguridad, rendimiento, SLAs, GDPR? → "non-functional"
|
|
83
|
+
- ¿Habla de base de datos, esquemas, migraciones? → "infra"
|
|
84
|
+
|
|
85
|
+
2. **REGLA DE ORO — LA MAYORÍA DE REQUISITOS SON MULTI-CAPA**:
|
|
86
|
+
Un requisito funcional casi SIEMPRE toca varias capas. NO te limites a una sola categoría.
|
|
87
|
+
|
|
88
|
+
EJEMPLOS CONCRETOS:
|
|
89
|
+
- "Gestión de Bookings (crear, modificar, eliminar reservas)":
|
|
90
|
+
→ backend: API REST de bookings, lógica de validación, motor de reglas
|
|
91
|
+
→ bo: CRUD de bookings para Fleet Manager, agenda de reservas, vista de estados
|
|
92
|
+
→ mobile: Pantalla de reserva en la app, selección de zona/fecha/categoría
|
|
93
|
+
→ frontend: Misma funcionalidad de reserva en el portal web del driver
|
|
94
|
+
→ Resultado: ["backend", "bo", "mobile", "frontend"]
|
|
95
|
+
|
|
96
|
+
- "Smart Allocation (asignación inteligente de vehículos)":
|
|
97
|
+
→ backend: Motor de reglas de asignación, algoritmo de matching
|
|
98
|
+
→ bo: Configuración de preferencias EV/ICV a nivel empresa, reglas de prioridad
|
|
99
|
+
→ Resultado: ["backend", "bo"]
|
|
100
|
+
|
|
101
|
+
- "Perfiles de Conductores (Business y Private)":
|
|
102
|
+
→ backend: Modelo de datos, flags de perfil, validación de licencias
|
|
103
|
+
→ bo: Gestión de drivers, activar/desactivar, validar licencias, CSV bulk
|
|
104
|
+
→ mobile: Completar perfil en app, ver datos de su perfil
|
|
105
|
+
→ frontend: Completar perfil en portal web
|
|
106
|
+
→ Resultado: ["backend", "bo", "mobile", "frontend"]
|
|
107
|
+
|
|
108
|
+
- "Financial Settings (VAT, Charge Types, Payment Gateway)":
|
|
109
|
+
→ backend: Invoice Engine, integración con pasarela de pago, contabilidad
|
|
110
|
+
→ bo: Configuración de VAT codes, charge types, payment gateway, templates de factura
|
|
111
|
+
→ Resultado: ["backend", "bo"]
|
|
112
|
+
|
|
113
|
+
- "White Label / Look & Feel":
|
|
114
|
+
→ backend: API de configuración L&F por fleet/company
|
|
115
|
+
→ bo: Configuración de L&F en el panel admin
|
|
116
|
+
→ mobile: Renderizado del L&F en la app
|
|
117
|
+
→ frontend: Renderizado del L&F en el portal web
|
|
118
|
+
→ Resultado: ["backend", "bo", "mobile", "frontend"]
|
|
119
|
+
|
|
120
|
+
3. **PRIORIDAD EN EL ARRAY**:
|
|
121
|
+
- Ordena las categorías por PESO del desarrollo.
|
|
122
|
+
- Si es 60% panel admin y 30% API y 10% app → ["bo", "backend", "mobile"]
|
|
123
|
+
- Si es 70% app móvil y 30% API → ["mobile", "backend"]
|
|
124
|
+
|
|
125
|
+
${context ? `CONTEXTO ADICIONAL:\n${context}` : ""}
|
|
89
126
|
|
|
90
127
|
TU SALIDA:
|
|
91
128
|
- Devuelve un JSON array de objetos.
|
|
92
129
|
- Propiedad "categories": Array de strings EN ORDEN DE IMPORTANCIA.
|
|
93
|
-
-
|
|
130
|
+
- INCLUYE TODAS las capas que necesitan implementación, no solo la principal.
|
|
131
|
+
- Sé exhaustivo y preciso. La descomposición multi-capa es OBLIGATORIA cuando aplica.`;
|
|
94
132
|
}
|
|
95
133
|
export function classifyUserPrompt(requirements, categories) {
|
|
96
134
|
const reqList = requirements
|
|
@@ -99,21 +137,28 @@ export function classifyUserPrompt(requirements, categories) {
|
|
|
99
137
|
Contexto Original: "${r.raw_text ? r.raw_text.substring(0, 300).replace(/\n/g, " ") : "N/A"}"`)
|
|
100
138
|
.join("\n\n");
|
|
101
139
|
const catIds = categories.map((c) => `"${c.id}"`).join(", ");
|
|
102
|
-
return `Analiza estos requisitos y
|
|
140
|
+
return `Analiza estos requisitos y DESCOMPONLOS en TODAS sus capas arquitectónicas.
|
|
103
141
|
Categorías válidas: ${catIds}
|
|
104
142
|
|
|
143
|
+
RECUERDA:
|
|
144
|
+
- "bo" = panel admin (Super Admin, Fleet Manager, Control Room)
|
|
145
|
+
- "frontend" = portal web del usuario final (driver, cliente)
|
|
146
|
+
- La mayoría de requisitos DEBEN tener múltiples categorías
|
|
147
|
+
|
|
105
148
|
REQUISITOS A ANALIZAR:
|
|
106
149
|
${reqList}
|
|
107
150
|
|
|
108
151
|
Responde SOLO con el JSON array. Ejemplo:
|
|
109
152
|
[
|
|
110
|
-
{ "id_suggestion": "
|
|
111
|
-
{ "id_suggestion": "
|
|
112
|
-
{ "id_suggestion": "
|
|
153
|
+
{ "id_suggestion": "booking_management", "categories": ["backend", "bo", "mobile", "frontend"] },
|
|
154
|
+
{ "id_suggestion": "smart_allocation", "categories": ["backend", "bo"] },
|
|
155
|
+
{ "id_suggestion": "driver_profiles", "categories": ["backend", "bo", "mobile", "frontend"] },
|
|
156
|
+
{ "id_suggestion": "financial_settings", "categories": ["backend", "bo"] },
|
|
157
|
+
{ "id_suggestion": "uat_environment", "categories": ["devops", "infra"] }
|
|
113
158
|
]`;
|
|
114
159
|
}
|
|
115
160
|
// ─── Pass 3: Generate Markdown ──────────────────────────────────────
|
|
116
|
-
export function generateSystemPrompt() {
|
|
161
|
+
export function generateSystemPrompt(context) {
|
|
117
162
|
return `Eres un documentalista técnico experto. Tu tarea es generar documentación de requisitos en formato Markdown siguiendo un template específico.
|
|
118
163
|
|
|
119
164
|
REGLAS:
|
|
@@ -124,6 +169,28 @@ REGLAS:
|
|
|
124
169
|
- Sé específico y técnico, no genérico
|
|
125
170
|
- NO inventes funcionalidades que no estén en el resumen
|
|
126
171
|
|
|
172
|
+
REGLAS ESPECÍFICAS POR CAPA:
|
|
173
|
+
|
|
174
|
+
📡 BACKEND:
|
|
175
|
+
- SIEMPRE incluye una subsección "### Endpoints API" dentro de la Descripción Técnica
|
|
176
|
+
- Lista TODOS los endpoints REST necesarios con método HTTP, path, descripción y códigos de respuesta
|
|
177
|
+
- Formato: \`METHOD /api/v1/resource\` — Descripción
|
|
178
|
+
- Ejemplo:
|
|
179
|
+
| Método | Endpoint | Descripción |
|
|
180
|
+
|--------|----------|-------------|
|
|
181
|
+
| GET | \`/api/v1/bookings\` | Listar reservas con filtros |
|
|
182
|
+
| POST | \`/api/v1/bookings\` | Crear nueva reserva |
|
|
183
|
+
| PATCH | \`/api/v1/bookings/:id\` | Modificar reserva existente |
|
|
184
|
+
| DELETE | \`/api/v1/bookings/:id\` | Cancelar reserva |
|
|
185
|
+
|
|
186
|
+
🔐 AUTENTICACIÓN (solo cuando el requisito ES de autenticación/login/perfiles):
|
|
187
|
+
Cuando generes un requisito que trata ESPECÍFICAMENTE de autenticación, login o gestión de sesión, usa estas estrategias por capa:
|
|
188
|
+
- BACKEND: Endpoints de auth (\`POST /api/v1/auth/login\`, \`POST /api/v1/auth/refresh\`). Emite cookie httpOnly para clientes web y JWT para clientes mobile.
|
|
189
|
+
- FRONTEND / BO (Web): Cookie httpOnly + Secure + SameSite=Strict + CSRF token. NO JWT en localStorage.
|
|
190
|
+
- MOBILE (iOS/Android): JWT (access + refresh tokens). Access token en memoria, refresh token en **Keychain (iOS)** / **Keystore (Android)**. NO AsyncStorage/SharedPreferences para tokens.
|
|
191
|
+
|
|
192
|
+
${context ? `CONTEXTO ADICIONAL / DOCUMENTACIÓN:\n${context}` : ""}
|
|
193
|
+
|
|
127
194
|
Devuelve SOLO el contenido Markdown, sin wrapping en code blocks.`;
|
|
128
195
|
}
|
|
129
196
|
export function generateUserPrompt(req) {
|
|
@@ -189,7 +256,7 @@ También incluye tablas para configuraciones, campos o comparativas]
|
|
|
189
256
|
Ahora genera la documentación COMPLETA para este requisito. Recuerda: en español, con diagramas mermaid relevantes, sé específico basándote en el resumen y texto original.`;
|
|
190
257
|
}
|
|
191
258
|
// ─── Pass 3b: Generate Gherkin Feature ──────────────────────────────
|
|
192
|
-
export function gherkinSystemPrompt() {
|
|
259
|
+
export function gherkinSystemPrompt(context) {
|
|
193
260
|
return `You are a BDD expert generating Gherkin feature files from software requirements.
|
|
194
261
|
|
|
195
262
|
RULES:
|
|
@@ -200,7 +267,9 @@ RULES:
|
|
|
200
267
|
- Use descriptive scenario names
|
|
201
268
|
- Be specific — use concrete examples, not generic placeholders
|
|
202
269
|
- Return ONLY the .feature file content, no wrapping code blocks
|
|
203
|
-
- Include relevant tags (@backend, @frontend, @mobile, @api, etc.)
|
|
270
|
+
- Include relevant tags (@backend, @frontend, @mobile, @api, etc.)
|
|
271
|
+
|
|
272
|
+
${context ? `EXTRA CONTEXT:\n${context}` : ""}`;
|
|
204
273
|
}
|
|
205
274
|
export function gherkinUserPrompt(req) {
|
|
206
275
|
const criteriaList = req.acceptance_criteria.length > 0
|
package/dist/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,uEAAuE;AAEvE,MAAM,UAAU,oBAAoB;
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scraper.d.ts","sourceRoot":"","sources":["../src/scraper.ts"],"names":[],"mappings":"AAOA,qBAAa,cAAc;IACvB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAS;;YAgBX,cAAc;IAQ5B,OAAO,CAAC,YAAY;IAKP,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CA0D3D"}
|
package/dist/scraper.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import * as cheerio from "cheerio";
|
|
3
|
+
import TurndownService from "turndown";
|
|
4
|
+
import * as fs from "fs/promises";
|
|
5
|
+
import * as path from "path";
|
|
6
|
+
import * as crypto from "crypto";
|
|
7
|
+
export class ScraperService {
|
|
8
|
+
turndownService;
|
|
9
|
+
cacheDir;
|
|
10
|
+
constructor() {
|
|
11
|
+
this.turndownService = new TurndownService({
|
|
12
|
+
headingStyle: "atx",
|
|
13
|
+
codeBlockStyle: "fenced",
|
|
14
|
+
});
|
|
15
|
+
// Cache directory in .gherk/cache/scraper
|
|
16
|
+
this.cacheDir = path.join(process.env.HOME || process.env.USERPROFILE || ".", ".gherk", "cache", "scraper");
|
|
17
|
+
}
|
|
18
|
+
async ensureCacheDir() {
|
|
19
|
+
try {
|
|
20
|
+
await fs.mkdir(this.cacheDir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
console.error("Failed to create cache directory:", error);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
getCachePath(url) {
|
|
27
|
+
const hash = crypto.createHash("md5").update(url).digest("hex");
|
|
28
|
+
return path.join(this.cacheDir, `${hash}.md`);
|
|
29
|
+
}
|
|
30
|
+
async scrapeUrls(urls) {
|
|
31
|
+
if (!urls || urls.length === 0)
|
|
32
|
+
return "";
|
|
33
|
+
await this.ensureCacheDir();
|
|
34
|
+
const results = [];
|
|
35
|
+
console.error(`[Scraper] Processing ${urls.length} URLs...`);
|
|
36
|
+
for (const url of urls) {
|
|
37
|
+
try {
|
|
38
|
+
const cachePath = this.getCachePath(url);
|
|
39
|
+
// Check cache
|
|
40
|
+
try {
|
|
41
|
+
const cached = await fs.readFile(cachePath, "utf-8");
|
|
42
|
+
console.error(`[Scraper] Cache hit for ${url}`);
|
|
43
|
+
results.push(`--- DOCUMENTATION FROM: ${url} ---\n\n${cached}`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Cache miss, proceed to fetch
|
|
48
|
+
}
|
|
49
|
+
console.error(`[Scraper] Fetching ${url}...`);
|
|
50
|
+
const response = await axios.get(url, {
|
|
51
|
+
headers: {
|
|
52
|
+
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
53
|
+
},
|
|
54
|
+
timeout: 10000,
|
|
55
|
+
});
|
|
56
|
+
const html = response.data;
|
|
57
|
+
const $ = cheerio.load(html);
|
|
58
|
+
// Remove clutter
|
|
59
|
+
$("script, style, nav, footer, header, aside, .sidebar, .nav, .menu, .ad").remove();
|
|
60
|
+
// Extract main content if possible
|
|
61
|
+
let contentHtml = $("main").html() || $("article").html() || $("body").html() || "";
|
|
62
|
+
if (!contentHtml) {
|
|
63
|
+
console.error(`[Scraper] No content found for ${url}`);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const markdown = this.turndownService.turndown(contentHtml);
|
|
67
|
+
// Save to cache
|
|
68
|
+
await fs.writeFile(cachePath, markdown);
|
|
69
|
+
results.push(`--- DOCUMENTATION FROM: ${url} ---\n\n${markdown}`);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error(`[Scraper] Failed to fetch ${url}: ${error.message}`);
|
|
73
|
+
results.push(`--- ERROR FETCHING ${url}: ${error.message} ---`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return results.join("\n\n");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=scraper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scraper.js","sourceRoot":"","sources":["../src/scraper.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export interface GeneratedRequirement extends ClassifiedRequirement {
|
|
|
24
24
|
gherkin?: string;
|
|
25
25
|
}
|
|
26
26
|
export type OutputFormat = "markdown" | "json" | "both";
|
|
27
|
+
export type LlmProvider = "ollama" | "openai";
|
|
27
28
|
export interface ExtractionConfig {
|
|
28
29
|
pdfPath: string;
|
|
29
30
|
outputDir: string;
|
|
@@ -31,7 +32,13 @@ export interface ExtractionConfig {
|
|
|
31
32
|
categories?: Category[];
|
|
32
33
|
model?: string;
|
|
33
34
|
ollamaUrl?: string;
|
|
35
|
+
/** LLM provider: "ollama" (local) or "openai" (any OpenAI-compatible cloud API) */
|
|
36
|
+
provider?: LlmProvider;
|
|
37
|
+
/** API key for cloud providers (required when provider is "openai") */
|
|
38
|
+
apiKey?: string;
|
|
34
39
|
outputFormat?: OutputFormat;
|
|
40
|
+
context?: string;
|
|
41
|
+
urls?: string[];
|
|
35
42
|
/** If set, only generate requirements for these category IDs (e.g. ["frontend", "mobile"]) */
|
|
36
43
|
filterCategories?: string[];
|
|
37
44
|
/** If set, limit to this many requirements per category (useful for testing) */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,kBAAkB,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,kBAAkB,EAAE,QAAQ,EA2CxC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,8FAA8F;IAC9F,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAChC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,YAAY,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAChF;AAED,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACjB"}
|
package/dist/types.js
CHANGED
|
@@ -10,13 +10,19 @@ export const DEFAULT_CATEGORIES = [
|
|
|
10
10
|
id: "frontend",
|
|
11
11
|
label: "Frontend",
|
|
12
12
|
prefix: "FE",
|
|
13
|
-
description: "
|
|
13
|
+
description: "Portal web del USUARIO FINAL (driver, cliente): login, perfil, reservas, historial de viajes, pagos, documentos. NO incluye paneles de administración.",
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "bo",
|
|
17
|
+
label: "Back Office",
|
|
18
|
+
prefix: "BO",
|
|
19
|
+
description: "Panel web de ADMINISTRACIÓN/GESTIÓN interna: CRUDs de gestión, dashboards operativos, configuración de reglas, gestión de flotas/empresas/usuarios por perfiles admin (Super Admin, Fleet Manager, Control Room). NO es la interfaz del usuario final.",
|
|
14
20
|
},
|
|
15
21
|
{
|
|
16
22
|
id: "mobile",
|
|
17
23
|
label: "Mobile",
|
|
18
24
|
prefix: "MB",
|
|
19
|
-
description: "Aplicaciones móviles iOS y Android: pantallas, Bluetooth, GPS, notificaciones push, cámara",
|
|
25
|
+
description: "Aplicaciones móviles iOS y Android: pantallas, flujos de booking, apertura de vehículos por Bluetooth/BLE, GPS, notificaciones push, cámara, PIN, estado del viaje en tiempo real",
|
|
20
26
|
},
|
|
21
27
|
{
|
|
22
28
|
id: "infra",
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wEAAwE;AASxE,MAAM,CAAC,MAAM,kBAAkB,GAAe;IAC1C;QACI,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,2FAA2F;KAC3G;IACD;QACI,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wEAAwE;AASxE,MAAM,CAAC,MAAM,kBAAkB,GAAe;IAC1C;QACI,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,2FAA2F;KAC3G;IACD;QACI,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,wJAAwJ;KACxK;IACD;QACI,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,aAAa;QACpB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,wPAAwP;KACxQ;IACD;QACI,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,mLAAmL;KACnM;IACD;QACI,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,iBAAiB;QACxB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,4FAA4F;KAC5G;IACD;QACI,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,yFAAyF;KACzG;IACD;QACI,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,iGAAiG;KACjH;CACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gherk/requirements-extractor",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "MCP server that extracts, classifies and generates structured requirements from PDF documents using Ollama LLM",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -22,11 +22,16 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
25
|
-
"
|
|
25
|
+
"axios": "^1.13.5",
|
|
26
|
+
"cheerio": "^1.2.0",
|
|
27
|
+
"pdf-parse": "^1.1.1",
|
|
28
|
+
"turndown": "^7.2.2"
|
|
26
29
|
},
|
|
27
30
|
"devDependencies": {
|
|
31
|
+
"@types/cheerio": "^0.22.35",
|
|
28
32
|
"@types/node": "^22.0.0",
|
|
29
33
|
"@types/pdf-parse": "^1.1.4",
|
|
34
|
+
"@types/turndown": "^5.0.6",
|
|
30
35
|
"typescript": "^5.7.0"
|
|
31
36
|
}
|
|
32
37
|
}
|