@gherk/requirements-extractor 1.0.0 → 1.0.2
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 +2 -2
- package/dist/extractor.d.ts.map +1 -1
- package/dist/extractor.js +26 -5
- package/dist/extractor.js.map +1 -1
- package/dist/index.js +65 -89
- package/dist/index.js.map +1 -1
- package/dist/job-manager.d.ts +54 -0
- package/dist/job-manager.d.ts.map +1 -0
- package/dist/job-manager.js +88 -0
- package/dist/job-manager.js.map +1 -0
- package/dist/markdown.d.ts +9 -1
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js +22 -18
- package/dist/markdown.js.map +1 -1
- package/dist/prompts.d.ts +1 -0
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +37 -17
- package/dist/prompts.js.map +1 -1
- package/dist/test-e2e.js +9 -2
- package/dist/test-e2e.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -14
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/dist/extractor.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { ExtractionConfig, ExtractionResult } from "./types.js";
|
|
1
|
+
import type { ExtractionCallbacks, ExtractionConfig, ExtractionResult } from "./types.js";
|
|
2
2
|
/**
|
|
3
3
|
* Main extraction pipeline.
|
|
4
4
|
* Processes a PDF through 3 passes: Identify → Classify → Generate
|
|
5
5
|
* Files are written incrementally in Pass 3 to survive crashes.
|
|
6
6
|
*/
|
|
7
|
-
export declare function extractRequirements(config: ExtractionConfig,
|
|
7
|
+
export declare function extractRequirements(config: ExtractionConfig, callbacks?: ExtractionCallbacks): Promise<ExtractionResult>;
|
|
8
8
|
//# sourceMappingURL=extractor.d.ts.map
|
package/dist/extractor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AAkBA,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,CAgP3B"}
|
package/dist/extractor.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { parsePdf } from "./pdf-parser.js";
|
|
2
2
|
import { generate, generateJson } from "./ollama-client.js";
|
|
3
3
|
import { identifySystemPrompt, identifyUserPrompt, classifySystemPrompt, classifyUserPrompt, generateSystemPrompt, generateUserPrompt, } from "./prompts.js";
|
|
4
|
-
import { assignSequences, generateId, ensureOutputDirs, writeSingleRequirement, writeRequirements, } from "./markdown.js";
|
|
4
|
+
import { assignSequences, generateId, ensureOutputDirs, writeSingleRequirement, writeRequirements, toSingleJsonRequirement, } from "./markdown.js";
|
|
5
5
|
/**
|
|
6
6
|
* Main extraction pipeline.
|
|
7
7
|
* Processes a PDF through 3 passes: Identify → Classify → Generate
|
|
8
8
|
* Files are written incrementally in Pass 3 to survive crashes.
|
|
9
9
|
*/
|
|
10
|
-
export async function extractRequirements(config,
|
|
11
|
-
const {
|
|
10
|
+
export async function extractRequirements(config, callbacks = {}) {
|
|
11
|
+
const { onProgress, onIdentified, onClassified, onRequirement } = callbacks;
|
|
12
|
+
const { pdfPath, outputDir, projectPrefix = "ACS", categories, model, ollamaUrl, outputFormat = "markdown", filterCategories, maxPerCategory, } = config;
|
|
12
13
|
// We import DEFAULT_CATEGORIES dynamically to avoid circular dep
|
|
13
14
|
const { DEFAULT_CATEGORIES } = await import("./types.js");
|
|
14
15
|
const cats = categories || DEFAULT_CATEGORIES;
|
|
@@ -49,6 +50,7 @@ export async function extractRequirements(config, onProgress) {
|
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
52
|
log(`✅ Pass 1 complete: ${allRaw.length} requirements identified`);
|
|
53
|
+
onIdentified?.(allRaw.length);
|
|
52
54
|
if (allRaw.length === 0) {
|
|
53
55
|
return {
|
|
54
56
|
success: false,
|
|
@@ -95,11 +97,28 @@ export async function extractRequirements(config, onProgress) {
|
|
|
95
97
|
category: classifiedMap[req.id_suggestion] || "backend",
|
|
96
98
|
}));
|
|
97
99
|
// Assign sequential numbers and filenames
|
|
98
|
-
|
|
99
|
-
// ─── Step 4:
|
|
100
|
+
let sequenced = assignSequences(mergedForSequencing, cats, projectPrefix);
|
|
101
|
+
// ─── Step 4: Filter by category (if requested) ──────────────────
|
|
102
|
+
if (filterCategories && filterCategories.length > 0) {
|
|
103
|
+
const before = sequenced.length;
|
|
104
|
+
sequenced = sequenced.filter((r) => filterCategories.includes(r.category));
|
|
105
|
+
log(`🔎 Filter: keeping ${filterCategories.join(", ")} → ${sequenced.length}/${before} requirements`);
|
|
106
|
+
}
|
|
107
|
+
// ─── Step 4b: Limit per category (if requested) ─────────────────
|
|
108
|
+
if (maxPerCategory && maxPerCategory > 0) {
|
|
109
|
+
const before = sequenced.length;
|
|
110
|
+
const countByCategory = {};
|
|
111
|
+
sequenced = sequenced.filter((r) => {
|
|
112
|
+
countByCategory[r.category] = (countByCategory[r.category] || 0) + 1;
|
|
113
|
+
return countByCategory[r.category] <= maxPerCategory;
|
|
114
|
+
});
|
|
115
|
+
log(`✂️ Max ${maxPerCategory}/category → ${sequenced.length}/${before} requirements`);
|
|
116
|
+
}
|
|
117
|
+
// Create output directories
|
|
100
118
|
ensureOutputDirs(outputDir, cats);
|
|
101
119
|
// ─── Step 5: Pass 3 — Generate & Write Incrementally ─────────────
|
|
102
120
|
log(`📝 Pass 3: Generating markdown for ${sequenced.length} requirements...`);
|
|
121
|
+
onClassified?.(sequenced.length);
|
|
103
122
|
const generated = [];
|
|
104
123
|
const files = [];
|
|
105
124
|
const errors = [];
|
|
@@ -155,6 +174,8 @@ export async function extractRequirements(config, onProgress) {
|
|
|
155
174
|
errors.push(`Failed to write ${fullId}`);
|
|
156
175
|
}
|
|
157
176
|
}
|
|
177
|
+
// Notify caller of new requirement (for async job system)
|
|
178
|
+
onRequirement?.(toSingleJsonRequirement(genReq, cats), i, sequenced.length);
|
|
158
179
|
}
|
|
159
180
|
log(`✅ Pass 3 complete: ${generated.length} files generated`);
|
|
160
181
|
// ─── Step 6: Write README + JSON (final summary) ─────────────────
|
package/dist/extractor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACH,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACH,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,95 +7,91 @@ import path from "node:path";
|
|
|
7
7
|
import { extractRequirements } from "./extractor.js";
|
|
8
8
|
import { checkOllama } from "./ollama-client.js";
|
|
9
9
|
import { DEFAULT_CATEGORIES } from "./types.js";
|
|
10
|
+
import { jobManager } from "./job-manager.js";
|
|
10
11
|
// ─── MCP Server ─────────────────────────────────────────────────────
|
|
11
12
|
const server = new McpServer({
|
|
12
13
|
name: "mcp-requirements-extractor",
|
|
13
14
|
version: "1.0.0",
|
|
14
15
|
});
|
|
16
|
+
const VALID_CATEGORIES = ["backend", "frontend", "mobile", "infra", "devops", "non-functional"];
|
|
15
17
|
// ─── Tool: extract_requirements ─────────────────────────────────────
|
|
16
|
-
server.tool("extract_requirements", `Extracts requirements from a PDF document
|
|
18
|
+
server.tool("extract_requirements", `Extracts requirements from a PDF document and generates structured documentation.
|
|
19
|
+
Runs asynchronously — returns a jobId immediately. Use get_extraction_progress to poll for results.
|
|
17
20
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
2. Classify each requirement into its correct layer
|
|
21
|
-
3. Generate detailed markdown documentation for each one
|
|
22
|
-
|
|
23
|
-
The output follows a standardized template with metadata, objectives, technical descriptions (with Mermaid diagrams), considerations, and acceptance criteria.`, {
|
|
21
|
+
Pipeline: 1. Identify requirements → 2. Classify by layer → 3. Generate markdown/JSON
|
|
22
|
+
Categories: backend, frontend, mobile, infra, devops, non-functional`, {
|
|
24
23
|
pdfPath: z.string().describe("Absolute path to the PDF file to analyze"),
|
|
25
|
-
outputDir: z.string().describe("Absolute path to the output directory
|
|
26
|
-
projectPrefix: z.string().optional().default("ACS").describe("Project prefix for requirement IDs (e.g., 'ACS'
|
|
27
|
-
outputFormat: z.enum(["markdown", "json", "both"]).optional().default("markdown").describe("Output format:
|
|
24
|
+
outputDir: z.string().describe("Absolute path to the output directory"),
|
|
25
|
+
projectPrefix: z.string().optional().default("ACS").describe("Project prefix for requirement IDs (e.g., 'ACS' → ACS_BE_01)"),
|
|
26
|
+
outputFormat: z.enum(["markdown", "json", "both"]).optional().default("markdown").describe("Output format: markdown files, json, or both"),
|
|
27
|
+
filterCategories: z.array(z.enum(VALID_CATEGORIES)).optional().describe("Only generate for these categories. Omit for all."),
|
|
28
28
|
model: z.string().optional().default("qwen3:8b").describe("Ollama model to use"),
|
|
29
29
|
ollamaUrl: z.string().optional().default("http://localhost:11434").describe("Ollama API base URL"),
|
|
30
|
-
}, async ({ pdfPath, outputDir, projectPrefix, outputFormat, model, ollamaUrl }) => {
|
|
30
|
+
}, async ({ pdfPath, outputDir, projectPrefix, outputFormat, filterCategories, model, ollamaUrl }) => {
|
|
31
31
|
// Validate PDF exists
|
|
32
32
|
if (!fs.existsSync(pdfPath)) {
|
|
33
33
|
return {
|
|
34
|
-
content: [
|
|
35
|
-
{
|
|
36
|
-
type: "text",
|
|
37
|
-
text: `❌ Error: PDF file not found: ${pdfPath}`,
|
|
38
|
-
},
|
|
39
|
-
],
|
|
34
|
+
content: [{ type: "text", text: `❌ PDF not found: ${pdfPath}` }],
|
|
40
35
|
};
|
|
41
36
|
}
|
|
42
37
|
// Check Ollama is running
|
|
43
38
|
const ollamaCheck = await checkOllama({ model, baseUrl: ollamaUrl });
|
|
44
39
|
if (!ollamaCheck.available) {
|
|
45
40
|
return {
|
|
46
|
-
content: [
|
|
47
|
-
{
|
|
48
|
-
type: "text",
|
|
49
|
-
text: `❌ Error: Ollama not available. ${ollamaCheck.error}`,
|
|
50
|
-
},
|
|
51
|
-
],
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
// Run extraction
|
|
55
|
-
const progressMessages = [];
|
|
56
|
-
try {
|
|
57
|
-
const result = await extractRequirements({
|
|
58
|
-
pdfPath,
|
|
59
|
-
outputDir,
|
|
60
|
-
projectPrefix,
|
|
61
|
-
outputFormat,
|
|
62
|
-
model,
|
|
63
|
-
ollamaUrl,
|
|
64
|
-
}, (msg) => progressMessages.push(msg));
|
|
65
|
-
const categoryReport = Object.entries(result.byCategory)
|
|
66
|
-
.map(([cat, count]) => {
|
|
67
|
-
const catInfo = DEFAULT_CATEGORIES.find((c) => c.id === cat);
|
|
68
|
-
return ` - ${catInfo?.label || cat}: ${count} requisitos`;
|
|
69
|
-
})
|
|
70
|
-
.join("\n");
|
|
71
|
-
const summary = `✅ Extraction complete!
|
|
72
|
-
|
|
73
|
-
📊 Results:
|
|
74
|
-
- Total requirements: ${result.totalRequirements}
|
|
75
|
-
- Output directory: ${result.outputDir}
|
|
76
|
-
|
|
77
|
-
📂 By category:
|
|
78
|
-
${categoryReport}
|
|
79
|
-
|
|
80
|
-
📄 Files generated: ${result.files.length}
|
|
81
|
-
${result.errors.length > 0 ? `\n⚠️ Errors:\n${result.errors.join("\n")}` : ""}
|
|
82
|
-
|
|
83
|
-
📋 Progress log:
|
|
84
|
-
${progressMessages.join("\n")}`;
|
|
85
|
-
return {
|
|
86
|
-
content: [{ type: "text", text: summary }],
|
|
41
|
+
content: [{ type: "text", text: `❌ Ollama not available. ${ollamaCheck.error}` }],
|
|
87
42
|
};
|
|
88
43
|
}
|
|
89
|
-
|
|
44
|
+
// Create job and start extraction in background
|
|
45
|
+
const job = jobManager.createJob(outputDir);
|
|
46
|
+
// Fire and forget — extraction runs in background
|
|
47
|
+
extractRequirements({ pdfPath, outputDir, projectPrefix, outputFormat, filterCategories, model, ollamaUrl }, {
|
|
48
|
+
onProgress: (msg) => jobManager.updatePhase(job.id, msg),
|
|
49
|
+
onIdentified: (count) => jobManager.setIdentifiedCount(job.id, count),
|
|
50
|
+
onClassified: (count) => jobManager.setToGenerateCount(job.id, count),
|
|
51
|
+
onRequirement: (req) => jobManager.pushRequirement(job.id, req),
|
|
52
|
+
})
|
|
53
|
+
.then(() => jobManager.completeJob(job.id))
|
|
54
|
+
.catch((e) => jobManager.failJob(job.id, String(e)));
|
|
55
|
+
return {
|
|
56
|
+
content: [{
|
|
57
|
+
type: "text",
|
|
58
|
+
text: JSON.stringify({
|
|
59
|
+
jobId: job.id,
|
|
60
|
+
status: "running",
|
|
61
|
+
message: "Extraction started. Use get_extraction_progress to poll for results.",
|
|
62
|
+
}),
|
|
63
|
+
}],
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
// ─── Tool: get_extraction_progress ──────────────────────────────────
|
|
67
|
+
server.tool("get_extraction_progress", `Poll the progress of a running extraction job.
|
|
68
|
+
Returns new requirements since the 'since' index, allowing incremental consumption.
|
|
69
|
+
Call repeatedly to get results as they are generated, one by one.`, {
|
|
70
|
+
jobId: z.string().describe("Job ID returned by extract_requirements"),
|
|
71
|
+
since: z.number().optional().default(0).describe("Return requirements generated AFTER this index (0-based). Track this to avoid re-fetching."),
|
|
72
|
+
}, async ({ jobId, since }) => {
|
|
73
|
+
const progress = jobManager.getProgress(jobId, since);
|
|
74
|
+
if (!progress) {
|
|
90
75
|
return {
|
|
91
|
-
content: [
|
|
92
|
-
{
|
|
93
|
-
type: "text",
|
|
94
|
-
text: `❌ Extraction failed: ${e}\n\nProgress:\n${progressMessages.join("\n")}`,
|
|
95
|
-
},
|
|
96
|
-
],
|
|
76
|
+
content: [{ type: "text", text: `❌ Job not found: ${jobId}` }],
|
|
97
77
|
};
|
|
98
78
|
}
|
|
79
|
+
return {
|
|
80
|
+
content: [{
|
|
81
|
+
type: "text",
|
|
82
|
+
text: JSON.stringify(progress),
|
|
83
|
+
}],
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
// ─── Tool: list_jobs ────────────────────────────────────────────────
|
|
87
|
+
server.tool("list_jobs", "Lists all extraction jobs (running and completed).", {}, async () => {
|
|
88
|
+
const jobs = jobManager.listJobs();
|
|
89
|
+
return {
|
|
90
|
+
content: [{
|
|
91
|
+
type: "text",
|
|
92
|
+
text: JSON.stringify(jobs),
|
|
93
|
+
}],
|
|
94
|
+
};
|
|
99
95
|
});
|
|
100
96
|
// ─── Tool: list_requirements ────────────────────────────────────────
|
|
101
97
|
server.tool("list_requirements", "Lists all requirement files in a directory, organized by category.", {
|
|
@@ -103,12 +99,7 @@ server.tool("list_requirements", "Lists all requirement files in a directory, or
|
|
|
103
99
|
}, async ({ requirementsDir }) => {
|
|
104
100
|
if (!fs.existsSync(requirementsDir)) {
|
|
105
101
|
return {
|
|
106
|
-
content: [
|
|
107
|
-
{
|
|
108
|
-
type: "text",
|
|
109
|
-
text: `❌ Directory not found: ${requirementsDir}`,
|
|
110
|
-
},
|
|
111
|
-
],
|
|
102
|
+
content: [{ type: "text", text: `❌ Directory not found: ${requirementsDir}` }],
|
|
112
103
|
};
|
|
113
104
|
}
|
|
114
105
|
let output = `📋 Requirements in ${requirementsDir}\n\n`;
|
|
@@ -149,12 +140,7 @@ server.tool("get_requirement", "Returns the full content of a specific requireme
|
|
|
149
140
|
}, async ({ requirementsDir, requirementId }) => {
|
|
150
141
|
if (!fs.existsSync(requirementsDir)) {
|
|
151
142
|
return {
|
|
152
|
-
content: [
|
|
153
|
-
{
|
|
154
|
-
type: "text",
|
|
155
|
-
text: `❌ Directory not found: ${requirementsDir}`,
|
|
156
|
-
},
|
|
157
|
-
],
|
|
143
|
+
content: [{ type: "text", text: `❌ Directory not found: ${requirementsDir}` }],
|
|
158
144
|
};
|
|
159
145
|
}
|
|
160
146
|
// Search for the file
|
|
@@ -170,23 +156,13 @@ server.tool("get_requirement", "Returns the full content of a specific requireme
|
|
|
170
156
|
file.toLowerCase() === searchId) {
|
|
171
157
|
const content = fs.readFileSync(path.join(catDir, file), "utf-8");
|
|
172
158
|
return {
|
|
173
|
-
content: [
|
|
174
|
-
{
|
|
175
|
-
type: "text",
|
|
176
|
-
text: `📄 **${entry.name}/${file}**\n\n${content}`,
|
|
177
|
-
},
|
|
178
|
-
],
|
|
159
|
+
content: [{ type: "text", text: `📄 **${entry.name}/${file}**\n\n${content}` }],
|
|
179
160
|
};
|
|
180
161
|
}
|
|
181
162
|
}
|
|
182
163
|
}
|
|
183
164
|
return {
|
|
184
|
-
content: [
|
|
185
|
-
{
|
|
186
|
-
type: "text",
|
|
187
|
-
text: `❌ Requirement "${requirementId}" not found in ${requirementsDir}`,
|
|
188
|
-
},
|
|
189
|
-
],
|
|
165
|
+
content: [{ type: "text", text: `❌ Requirement "${requirementId}" not found in ${requirementsDir}` }],
|
|
190
166
|
};
|
|
191
167
|
});
|
|
192
168
|
// ─── Start Server ───────────────────────────────────────────────────
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { JsonRequirement } from "./types.js";
|
|
2
|
+
export type JobStatus = "running" | "completed" | "failed";
|
|
3
|
+
export interface ExtractionJob {
|
|
4
|
+
id: string;
|
|
5
|
+
status: JobStatus;
|
|
6
|
+
startedAt: Date;
|
|
7
|
+
finishedAt?: Date;
|
|
8
|
+
/** Total requirements identified (set after Pass 1) */
|
|
9
|
+
totalIdentified: number;
|
|
10
|
+
/** Total requirements to generate (after filtering, set after Pass 2) */
|
|
11
|
+
totalToGenerate: number;
|
|
12
|
+
/** Requirements generated so far */
|
|
13
|
+
generated: JsonRequirement[];
|
|
14
|
+
/** Current phase description */
|
|
15
|
+
phase: string;
|
|
16
|
+
/** Error message if failed */
|
|
17
|
+
error?: string;
|
|
18
|
+
/** Output directory */
|
|
19
|
+
outputDir: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ProgressResponse {
|
|
22
|
+
jobId: string;
|
|
23
|
+
status: JobStatus;
|
|
24
|
+
phase: string;
|
|
25
|
+
totalIdentified: number;
|
|
26
|
+
totalToGenerate: number;
|
|
27
|
+
done: number;
|
|
28
|
+
finished: boolean;
|
|
29
|
+
/** New requirements since `since` index */
|
|
30
|
+
new: JsonRequirement[];
|
|
31
|
+
error?: string;
|
|
32
|
+
}
|
|
33
|
+
declare class JobManager {
|
|
34
|
+
private jobs;
|
|
35
|
+
createJob(outputDir: string): ExtractionJob;
|
|
36
|
+
getJob(id: string): ExtractionJob | undefined;
|
|
37
|
+
updatePhase(id: string, phase: string): void;
|
|
38
|
+
setIdentifiedCount(id: string, count: number): void;
|
|
39
|
+
setToGenerateCount(id: string, count: number): void;
|
|
40
|
+
pushRequirement(id: string, req: JsonRequirement): void;
|
|
41
|
+
completeJob(id: string): void;
|
|
42
|
+
failJob(id: string, error: string): void;
|
|
43
|
+
getProgress(id: string, since?: number): ProgressResponse | null;
|
|
44
|
+
listJobs(): Array<{
|
|
45
|
+
id: string;
|
|
46
|
+
status: JobStatus;
|
|
47
|
+
phase: string;
|
|
48
|
+
done: number;
|
|
49
|
+
total: number;
|
|
50
|
+
}>;
|
|
51
|
+
}
|
|
52
|
+
export declare const jobManager: JobManager;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=job-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-manager.d.ts","sourceRoot":"","sources":["../src/job-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,eAAe,EAAE,MAAM,YAAY,CAAC;AAKxE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,eAAe,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,GAAG,EAAE,eAAe,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,cAAM,UAAU;IACZ,OAAO,CAAC,IAAI,CAAyC;IAErD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa;IAgB3C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI7C,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5C,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKnD,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKnD,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,IAAI;IAKvD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAS7B,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAUxC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,gBAAgB,GAAG,IAAI;IAiBnE,QAAQ,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CASnG;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
// ─── Job Manager (singleton) ─────────────────────────────────────────
|
|
3
|
+
class JobManager {
|
|
4
|
+
jobs = new Map();
|
|
5
|
+
createJob(outputDir) {
|
|
6
|
+
const id = crypto.randomUUID().slice(0, 8);
|
|
7
|
+
const job = {
|
|
8
|
+
id,
|
|
9
|
+
status: "running",
|
|
10
|
+
startedAt: new Date(),
|
|
11
|
+
totalIdentified: 0,
|
|
12
|
+
totalToGenerate: 0,
|
|
13
|
+
generated: [],
|
|
14
|
+
phase: "Starting...",
|
|
15
|
+
outputDir,
|
|
16
|
+
};
|
|
17
|
+
this.jobs.set(id, job);
|
|
18
|
+
return job;
|
|
19
|
+
}
|
|
20
|
+
getJob(id) {
|
|
21
|
+
return this.jobs.get(id);
|
|
22
|
+
}
|
|
23
|
+
updatePhase(id, phase) {
|
|
24
|
+
const job = this.jobs.get(id);
|
|
25
|
+
if (job)
|
|
26
|
+
job.phase = phase;
|
|
27
|
+
}
|
|
28
|
+
setIdentifiedCount(id, count) {
|
|
29
|
+
const job = this.jobs.get(id);
|
|
30
|
+
if (job)
|
|
31
|
+
job.totalIdentified = count;
|
|
32
|
+
}
|
|
33
|
+
setToGenerateCount(id, count) {
|
|
34
|
+
const job = this.jobs.get(id);
|
|
35
|
+
if (job)
|
|
36
|
+
job.totalToGenerate = count;
|
|
37
|
+
}
|
|
38
|
+
pushRequirement(id, req) {
|
|
39
|
+
const job = this.jobs.get(id);
|
|
40
|
+
if (job)
|
|
41
|
+
job.generated.push(req);
|
|
42
|
+
}
|
|
43
|
+
completeJob(id) {
|
|
44
|
+
const job = this.jobs.get(id);
|
|
45
|
+
if (job) {
|
|
46
|
+
job.status = "completed";
|
|
47
|
+
job.finishedAt = new Date();
|
|
48
|
+
job.phase = "Done";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
failJob(id, error) {
|
|
52
|
+
const job = this.jobs.get(id);
|
|
53
|
+
if (job) {
|
|
54
|
+
job.status = "failed";
|
|
55
|
+
job.finishedAt = new Date();
|
|
56
|
+
job.error = error;
|
|
57
|
+
job.phase = "Failed";
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
getProgress(id, since = 0) {
|
|
61
|
+
const job = this.jobs.get(id);
|
|
62
|
+
if (!job)
|
|
63
|
+
return null;
|
|
64
|
+
return {
|
|
65
|
+
jobId: job.id,
|
|
66
|
+
status: job.status,
|
|
67
|
+
phase: job.phase,
|
|
68
|
+
totalIdentified: job.totalIdentified,
|
|
69
|
+
totalToGenerate: job.totalToGenerate,
|
|
70
|
+
done: job.generated.length,
|
|
71
|
+
finished: job.status !== "running",
|
|
72
|
+
new: job.generated.slice(since),
|
|
73
|
+
error: job.error,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
listJobs() {
|
|
77
|
+
return Array.from(this.jobs.values()).map((j) => ({
|
|
78
|
+
id: j.id,
|
|
79
|
+
status: j.status,
|
|
80
|
+
phase: j.phase,
|
|
81
|
+
done: j.generated.length,
|
|
82
|
+
total: j.totalToGenerate,
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Singleton
|
|
87
|
+
export const jobManager = new JobManager();
|
|
88
|
+
//# sourceMappingURL=job-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-manager.js","sourceRoot":"","sources":["../src/job-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/markdown.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Category, ClassifiedRequirement, ExtractionResult, GeneratedRequirement, OutputFormat } from "./types.js";
|
|
1
|
+
import type { Category, ClassifiedRequirement, ExtractionResult, GeneratedRequirement, JsonRequirement, OutputFormat } from "./types.js";
|
|
2
2
|
/**
|
|
3
3
|
* Generate the filename for a requirement.
|
|
4
4
|
*/
|
|
@@ -20,6 +20,14 @@ export declare function writeSingleRequirement(req: GeneratedRequirement, output
|
|
|
20
20
|
* Write all generated requirements to disk.
|
|
21
21
|
*/
|
|
22
22
|
export declare function writeRequirements(requirements: GeneratedRequirement[], outputDir: string, categories: Category[], outputFormat?: OutputFormat): ExtractionResult;
|
|
23
|
+
/**
|
|
24
|
+
* Convert generated requirements to a structured JSON array.
|
|
25
|
+
*/
|
|
26
|
+
export declare function toJsonRequirements(requirements: GeneratedRequirement[], categories: Category[]): JsonRequirement[];
|
|
27
|
+
/**
|
|
28
|
+
* Convert a single generated requirement to JSON format.
|
|
29
|
+
*/
|
|
30
|
+
export declare function toSingleJsonRequirement(req: GeneratedRequirement, categories: Category[]): JsonRequirement;
|
|
23
31
|
/**
|
|
24
32
|
* Assign sequential numbers per category and generate filenames.
|
|
25
33
|
*/
|
package/dist/markdown.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,QAAQ,EACR,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,QAAQ,EACR,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,YAAY,EACf,MAAM,YAAY,CAAC;AAmBpB;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACd,MAAM,CAIR;AAED;;GAEG;AACH,wBAAgB,UAAU,CACtB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,GACZ,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,QAAQ,EAAE,GACvB,IAAI,CAKN;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAClC,GAAG,EAAE,oBAAoB,EACzB,SAAS,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAYf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC7B,YAAY,EAAE,oBAAoB,EAAE,EACpC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,QAAQ,EAAE,EACtB,YAAY,GAAE,YAAyB,GACxC,gBAAgB,CA2DlB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,YAAY,EAAE,oBAAoB,EAAE,EACpC,UAAU,EAAE,QAAQ,EAAE,GACvB,eAAe,EAAE,CAEnB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACnC,GAAG,EAAE,oBAAoB,EACzB,UAAU,EAAE,QAAQ,EAAE,GACvB,eAAe,CAoBjB;AA8CD;;GAEG;AACH,wBAAgB,eAAe,CAC3B,UAAU,EAAE,KAAK,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC,EACF,UAAU,EAAE,QAAQ,EAAE,EACtB,aAAa,EAAE,MAAM,GACtB,qBAAqB,EAAE,CAoBzB"}
|
package/dist/markdown.js
CHANGED
|
@@ -117,24 +117,28 @@ export function writeRequirements(requirements, outputDir, categories, outputFor
|
|
|
117
117
|
/**
|
|
118
118
|
* Convert generated requirements to a structured JSON array.
|
|
119
119
|
*/
|
|
120
|
-
function toJsonRequirements(requirements, categories) {
|
|
121
|
-
return requirements.map((req) =>
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
120
|
+
export function toJsonRequirements(requirements, categories) {
|
|
121
|
+
return requirements.map((req) => toSingleJsonRequirement(req, categories));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Convert a single generated requirement to JSON format.
|
|
125
|
+
*/
|
|
126
|
+
export function toSingleJsonRequirement(req, categories) {
|
|
127
|
+
const cat = categories.find((c) => c.id === req.category);
|
|
128
|
+
const fullId = `${req.prefix}_${String(req.seq).padStart(2, "0")}`;
|
|
129
|
+
// Extract acceptance criteria from markdown (lines starting with - [ ])
|
|
130
|
+
const criteriaMatches = req.markdown.match(/^- \[ \] .+$/gm) || [];
|
|
131
|
+
const acceptance_criteria = criteriaMatches.map((line) => line.replace(/^- \[ \] /, "").trim());
|
|
132
|
+
return {
|
|
133
|
+
id: fullId,
|
|
134
|
+
title: req.title,
|
|
135
|
+
category: req.category,
|
|
136
|
+
category_label: cat?.label || req.category,
|
|
137
|
+
type: req.category === "non-functional" ? "No Funcional" : "Funcional",
|
|
138
|
+
page_range: req.page_range,
|
|
139
|
+
description: req.markdown,
|
|
140
|
+
acceptance_criteria,
|
|
141
|
+
};
|
|
138
142
|
}
|
|
139
143
|
/**
|
|
140
144
|
* Generate a README.md index for the output directory.
|
package/dist/markdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
|
package/dist/prompts.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export declare function classifyUserPrompt(requirements: Array<{
|
|
|
6
6
|
id_suggestion: string;
|
|
7
7
|
title: string;
|
|
8
8
|
summary: string;
|
|
9
|
+
raw_text: string;
|
|
9
10
|
}>, categories: Category[]): string;
|
|
10
11
|
export declare function generateSystemPrompt(): string;
|
|
11
12
|
export declare function generateUserPrompt(req: {
|
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,IAAI,MAAM,CAY7C;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAiBhG;AAID,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,
|
|
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,IAAI,MAAM,CAY7C;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAiBhG;AAID,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,CAiCnE;AAED,wBAAgB,kBAAkB,CAC9B,YAAY,EAAE,KAAK,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,EAChG,UAAU,EAAE,QAAQ,EAAE,GACvB,MAAM,CAwBR;AAID,wBAAgB,oBAAoB,IAAI,MAAM,CAY7C;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,CA4DR"}
|
package/dist/prompts.js
CHANGED
|
@@ -35,37 +35,57 @@ export function classifySystemPrompt(categories) {
|
|
|
35
35
|
const catDescriptions = categories
|
|
36
36
|
.map((c) => `- "${c.id}": ${c.label} — ${c.description}`)
|
|
37
37
|
.join("\n");
|
|
38
|
-
return `Eres un arquitecto de software
|
|
38
|
+
return `Eres un arquitecto de software clasificando requisitos de un proyecto en capas técnicas.
|
|
39
39
|
|
|
40
|
-
CATEGORÍAS
|
|
40
|
+
CATEGORÍAS:
|
|
41
41
|
${catDescriptions}
|
|
42
42
|
|
|
43
|
-
REGLAS:
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
|
|
43
|
+
REGLAS DE CLASIFICACIÓN (aplicar en ESTE ORDEN de prioridad):
|
|
44
|
+
|
|
45
|
+
1. **"mobile"** → Si el requisito es específico de apps móviles: iOS, Android, Bluetooth, GPS del dispositivo, notificaciones push, cámara, escáner QR, app nativa
|
|
46
|
+
- Ejemplos: "App nativa del usuario", "Notificaciones push", "Escaneo de QR desde el móvil"
|
|
47
|
+
|
|
48
|
+
2. **"frontend"** → Si el requisito involucra CUALQUIER interfaz web o pantalla visual: dashboards, CRUDs, portales, formularios, menús, configuración visual, subida de documentos, templates, gestión desde interfaz, reportes visuales, paneles de administración
|
|
49
|
+
- Ejemplos: "Dashboard operativo", "CRUD de entidades", "Subida de documentos", "Panel de gestión", "Menú de configuración"
|
|
50
|
+
|
|
51
|
+
3. **"infra"** → Si el requisito trata sobre: base de datos, esquemas de datos, migraciones, modelos de datos, conexiones a BD, almacenamiento de ficheros, colas de mensajes, caché, estructura de datos persistente
|
|
52
|
+
- Ejemplos: "Esquema de base de datos", "Modelo de datos", "Configuración de Redis", "Migración de tablas"
|
|
53
|
+
|
|
54
|
+
4. **"devops"** → Si el requisito trata sobre: CI/CD, entornos (UAT/PRD/staging), despliegue, Docker, Kubernetes, monitorización de sistemas, pipelines, servidores, hosting, DNS
|
|
55
|
+
- Ejemplos: "Entorno UAT", "Pipeline de despliegue", "Docker", "Monitorización del sistema"
|
|
56
|
+
|
|
57
|
+
5. **"non-functional"** → Si el requisito trata sobre: seguridad, cifrado, rendimiento, escalabilidad, calidad de código, SLAs, auditoría, privacidad GDPR, accesibilidad, testing, confidencialidad, acuerdos legales
|
|
58
|
+
- Ejemplos: "Cifrado de datos", "GDPR compliance", "SLA de disponibilidad", "Acuerdo de confidencialidad"
|
|
59
|
+
|
|
60
|
+
6. **"backend"** → SOLO si NO encaja en ninguna categoría anterior. Exclusivamente para: API REST puras sin pantalla, lógica de negocio interna, algoritmos, integraciones con sistemas externos, sincronización entre sistemas, webhooks, reglas de negocio automáticas
|
|
61
|
+
- Ejemplos: "API de autenticación", "Sincronización con sistema externo", "Motor de asignación", "Integración con pasarela de pago"
|
|
62
|
+
|
|
63
|
+
⚠️ REGLA DE ORO: Si el título o resumen contiene "Management", "Configuration", "Menu", "Dashboard", "Upload", "Template", "Settings", "CRUD", "Monitor", "List", "Rules", "Access", "Profile", "gestión" → es "frontend", NO "backend". Las pantallas y gestión son FRONTEND.
|
|
51
64
|
|
|
52
65
|
Responde ÚNICAMENTE con un JSON array.`;
|
|
53
66
|
}
|
|
54
67
|
export function classifyUserPrompt(requirements, categories) {
|
|
55
68
|
const reqList = requirements
|
|
56
|
-
.map((r, i) => `${i + 1}. [${r.id_suggestion}] ${r.title}: ${r.summary}`)
|
|
69
|
+
.map((r, i) => `${i + 1}. [${r.id_suggestion}] "${r.title}": ${r.summary}${r.raw_text ? `\n Contexto: ${r.raw_text.substring(0, 200)}` : ""}`)
|
|
57
70
|
.join("\n");
|
|
58
71
|
const catIds = categories.map((c) => `"${c.id}"`).join(", ");
|
|
59
|
-
return `Clasifica cada
|
|
72
|
+
return `Clasifica cada requisito en UNA categoría: ${catIds}
|
|
60
73
|
|
|
61
74
|
REQUISITOS:
|
|
62
75
|
${reqList}
|
|
63
76
|
|
|
64
|
-
Responde SOLO con un JSON array
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
77
|
+
Responde SOLO con un JSON array. Ejemplo:
|
|
78
|
+
[
|
|
79
|
+
{"id_suggestion": "auth_api", "category": "backend"},
|
|
80
|
+
{"id_suggestion": "admin_dashboard", "category": "frontend"},
|
|
81
|
+
{"id_suggestion": "entity_crud", "category": "frontend"},
|
|
82
|
+
{"id_suggestion": "user_management", "category": "frontend"},
|
|
83
|
+
{"id_suggestion": "push_notifications", "category": "mobile"},
|
|
84
|
+
{"id_suggestion": "db_schema", "category": "infra"},
|
|
85
|
+
{"id_suggestion": "uat_environment", "category": "devops"},
|
|
86
|
+
{"id_suggestion": "gdpr_compliance", "category": "non-functional"},
|
|
87
|
+
{"id_suggestion": "external_sync", "category": "backend"}
|
|
88
|
+
]`;
|
|
69
89
|
}
|
|
70
90
|
// ─── Pass 3: Generate Markdown ──────────────────────────────────────
|
|
71
91
|
export function generateSystemPrompt() {
|
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;IAChC,OAAO;;;;;;;;;;wFAU6E,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAe;IACpF,OAAO,2CAA2C,SAAS,IAAI,OAAO;;;;;;;;;;;EAWxE,SAAS;;;;0HAI+G,SAAS,IAAI,OAAO,gDAAgD,CAAC;AAC/L,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,oBAAoB,CAAC,UAAsB;IACvD,MAAM,eAAe,GAAG,UAAU;SAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;SACxD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhB,OAAO;;;EAGT,eAAe
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,uEAAuE;AAEvE,MAAM,UAAU,oBAAoB;IAChC,OAAO;;;;;;;;;;wFAU6E,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAe;IACpF,OAAO,2CAA2C,SAAS,IAAI,OAAO;;;;;;;;;;;EAWxE,SAAS;;;;0HAI+G,SAAS,IAAI,OAAO,gDAAgD,CAAC;AAC/L,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,oBAAoB,CAAC,UAAsB;IACvD,MAAM,eAAe,GAAG,UAAU;SAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;SACxD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhB,OAAO;;;EAGT,eAAe;;;;;;;;;;;;;;;;;;;;;;;;uCAwBsB,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,YAAgG,EAChG,UAAsB;IAEtB,MAAM,OAAO,GAAG,YAAY;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,aAAa,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;SAC/I,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7D,OAAO,8CAA8C,MAAM;;;EAG7D,OAAO;;;;;;;;;;;;;EAaP,CAAC;AACH,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,oBAAoB;IAChC,OAAO;;;;;;;;;;kEAUuD,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,GAQC;IAED,OAAO;;;QAGH,GAAG,CAAC,EAAE;YACF,GAAG,CAAC,KAAK;aACR,GAAG,CAAC,OAAO;aACX,GAAG,CAAC,aAAa;UACpB,GAAG,CAAC,IAAI;uBACK,GAAG,CAAC,UAAU;oBACjB,GAAG,CAAC,QAAQ;;;;IAI5B,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE;;;;wBAIf,GAAG,CAAC,EAAE;iBACb,GAAG,CAAC,KAAK;eACX,GAAG,CAAC,IAAI;kBACL,GAAG,CAAC,aAAa;iBAClB,GAAG,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4KAqC6I,CAAC;AAC7K,CAAC"}
|
package/dist/test-e2e.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// End-to-end test: Run the full extraction pipeline
|
|
1
|
+
// End-to-end test: Run the full extraction pipeline
|
|
2
2
|
import { extractRequirements } from "./extractor.js";
|
|
3
3
|
import { checkOllama } from "./ollama-client.js";
|
|
4
4
|
async function e2e() {
|
|
@@ -19,7 +19,14 @@ async function e2e() {
|
|
|
19
19
|
outputDir,
|
|
20
20
|
projectPrefix: "ACS",
|
|
21
21
|
outputFormat: "both",
|
|
22
|
-
},
|
|
22
|
+
}, {
|
|
23
|
+
onProgress: (msg) => console.log(msg),
|
|
24
|
+
onIdentified: (count) => console.log(`\n📊 Identified ${count} requirements\n`),
|
|
25
|
+
onClassified: (count) => console.log(`\n📊 Will generate ${count} requirements\n`),
|
|
26
|
+
onRequirement: (req, idx, total) => {
|
|
27
|
+
console.log(` 📦 [${idx + 1}/${total}] ${req.id} → ${req.category} — ${req.title}`);
|
|
28
|
+
},
|
|
29
|
+
});
|
|
23
30
|
console.log("\n=== RESULT ===");
|
|
24
31
|
console.log(JSON.stringify(result, null, 2));
|
|
25
32
|
}
|
package/dist/test-e2e.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-e2e.js","sourceRoot":"","sources":["../src/test-e2e.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"test-e2e.js","sourceRoot":"","sources":["../src/test-e2e.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,KAAK,UAAU,GAAG;IACd,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,eAAe;IACf,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,uBAAuB,CAAC;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,8BAA8B,CAAC;IAEpE,OAAO,CAAC,GAAG,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACpC;QACI,OAAO;QACP,SAAS;QACT,aAAa,EAAE,KAAK;QACpB,YAAY,EAAE,MAAM;KACvB,EACD;QACI,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QACrC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,iBAAiB,CAAC;QAC/E,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,iBAAiB,CAAC;QAClF,aAAa,EAAE,CAAC,GAAoB,EAAE,GAAW,EAAE,KAAa,EAAE,EAAE;YAChE,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACzF,CAAC;KACJ,CACJ,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACd,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -30,6 +30,10 @@ export interface ExtractionConfig {
|
|
|
30
30
|
model?: string;
|
|
31
31
|
ollamaUrl?: string;
|
|
32
32
|
outputFormat?: OutputFormat;
|
|
33
|
+
/** If set, only generate requirements for these category IDs (e.g. ["frontend", "mobile"]) */
|
|
34
|
+
filterCategories?: string[];
|
|
35
|
+
/** If set, limit to this many requirements per category (useful for testing) */
|
|
36
|
+
maxPerCategory?: number;
|
|
33
37
|
}
|
|
34
38
|
export interface JsonRequirement {
|
|
35
39
|
id: string;
|
|
@@ -49,6 +53,12 @@ export interface ExtractionResult {
|
|
|
49
53
|
files: string[];
|
|
50
54
|
errors: string[];
|
|
51
55
|
}
|
|
56
|
+
export interface ExtractionCallbacks {
|
|
57
|
+
onProgress?: (message: string) => void;
|
|
58
|
+
onIdentified?: (totalRaw: number) => void;
|
|
59
|
+
onClassified?: (totalToGenerate: number) => void;
|
|
60
|
+
onRequirement?: (req: JsonRequirement, index: number, total: number) => void;
|
|
61
|
+
}
|
|
52
62
|
export interface PdfChunk {
|
|
53
63
|
text: string;
|
|
54
64
|
startPage: number;
|
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,EAqCxC,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,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;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD,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,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,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,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;CACjC;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
|
@@ -4,31 +4,37 @@ export const DEFAULT_CATEGORIES = [
|
|
|
4
4
|
id: "backend",
|
|
5
5
|
label: "Backend",
|
|
6
6
|
prefix: "BE",
|
|
7
|
-
description: "APIs REST, servicios, lógica de negocio server-side,
|
|
7
|
+
description: "APIs REST, servicios, lógica de negocio server-side, integraciones con terceros, webhooks",
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
10
|
id: "frontend",
|
|
11
|
-
label: "Frontend
|
|
12
|
-
prefix: "
|
|
13
|
-
description: "
|
|
11
|
+
label: "Frontend",
|
|
12
|
+
prefix: "FE",
|
|
13
|
+
description: "Interfaces web: pantallas, dashboards, CRUDs, formularios, vistas, portales, paneles de administración, navegación",
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
|
-
id: "
|
|
17
|
-
label: "
|
|
18
|
-
prefix: "
|
|
19
|
-
description: "
|
|
16
|
+
id: "mobile",
|
|
17
|
+
label: "Mobile",
|
|
18
|
+
prefix: "MB",
|
|
19
|
+
description: "Aplicaciones móviles iOS y Android: pantallas, Bluetooth, GPS, notificaciones push, cámara",
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
|
-
id: "
|
|
23
|
-
label: "
|
|
24
|
-
prefix: "
|
|
25
|
-
description: "
|
|
22
|
+
id: "infra",
|
|
23
|
+
label: "Infraestructura",
|
|
24
|
+
prefix: "IF",
|
|
25
|
+
description: "Base de datos, esquemas, migraciones, conexiones, almacenamiento, colas de mensajes, caché",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: "devops",
|
|
29
|
+
label: "DevOps",
|
|
30
|
+
prefix: "DO",
|
|
31
|
+
description: "CI/CD, entornos (UAT/PRD/staging), despliegue, contenedores, monitorización de sistemas",
|
|
26
32
|
},
|
|
27
33
|
{
|
|
28
34
|
id: "non-functional",
|
|
29
35
|
label: "No Funcionales",
|
|
30
|
-
prefix: "
|
|
31
|
-
description: "
|
|
36
|
+
prefix: "NF",
|
|
37
|
+
description: "Seguridad, rendimiento, escalabilidad, calidad, SLAs, auditoría, privacidad GDPR, accesibilidad",
|
|
32
38
|
},
|
|
33
39
|
];
|
|
34
40
|
//# sourceMappingURL=types.js.map
|
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,
|
|
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,oHAAoH;KACpI;IACD;QACI,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,4FAA4F;KAC5G;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