@grec0/memory-bank-mcp 0.1.3 ā 0.1.4
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.
|
@@ -362,7 +362,7 @@ ${chunk.content}
|
|
|
362
362
|
return doc;
|
|
363
363
|
}
|
|
364
364
|
/**
|
|
365
|
-
* Generates all project documents
|
|
365
|
+
* Generates all project documents (in parallel for speed)
|
|
366
366
|
*/
|
|
367
367
|
async generateAllDocuments(chunks, force = false) {
|
|
368
368
|
const result = {
|
|
@@ -374,54 +374,65 @@ ${chunk.content}
|
|
|
374
374
|
totalOutputTokens: 0,
|
|
375
375
|
errors: [],
|
|
376
376
|
};
|
|
377
|
-
// Get previous progress if exists
|
|
377
|
+
// Get previous progress if exists (read before parallel generation)
|
|
378
378
|
let previousProgress;
|
|
379
379
|
const progressPath = path.join(this.options.docsPath, "progress.md");
|
|
380
380
|
if (fs.existsSync(progressPath)) {
|
|
381
381
|
previousProgress = fs.readFileSync(progressPath, "utf-8");
|
|
382
382
|
}
|
|
383
|
-
//
|
|
384
|
-
const
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
"
|
|
390
|
-
"
|
|
383
|
+
// Prepare chunks for activeContext (recent only)
|
|
384
|
+
const recentChunks = [...chunks]
|
|
385
|
+
.sort((a, b) => b.timestamp - a.timestamp)
|
|
386
|
+
.slice(0, Math.min(30, chunks.length));
|
|
387
|
+
// All document types to generate
|
|
388
|
+
const docTypes = [
|
|
389
|
+
"techContext",
|
|
390
|
+
"projectBrief",
|
|
391
|
+
"systemPatterns",
|
|
392
|
+
"productContext",
|
|
393
|
+
"activeContext",
|
|
394
|
+
"progress",
|
|
391
395
|
];
|
|
392
|
-
|
|
396
|
+
console.error(`\nš Generating ${docTypes.length} documents in PARALLEL...`);
|
|
397
|
+
// Generate all documents in parallel
|
|
398
|
+
const generationPromises = docTypes.map(async (docType) => {
|
|
393
399
|
try {
|
|
394
|
-
// For activeContext, use only recent chunks
|
|
395
|
-
|
|
396
|
-
if (docType === "activeContext") {
|
|
397
|
-
// Sort by timestamp and take most recent
|
|
398
|
-
docChunks = [...chunks]
|
|
399
|
-
.sort((a, b) => b.timestamp - a.timestamp)
|
|
400
|
-
.slice(0, Math.min(30, chunks.length));
|
|
401
|
-
}
|
|
400
|
+
// For activeContext, use only recent chunks
|
|
401
|
+
const docChunks = docType === "activeContext" ? recentChunks : chunks;
|
|
402
402
|
const existingMetadata = this.metadataCache.get(docType);
|
|
403
403
|
const isNew = !existingMetadata;
|
|
404
404
|
const doc = await this.generateDocument(docType, docChunks, force, docType === "progress" ? previousProgress : undefined);
|
|
405
|
-
|
|
406
|
-
result.totalReasoningTokens += doc.metadata.reasoningTokens;
|
|
407
|
-
result.totalOutputTokens += doc.metadata.outputTokens;
|
|
408
|
-
if (isNew) {
|
|
409
|
-
result.documentsGenerated.push(docType);
|
|
410
|
-
}
|
|
411
|
-
else {
|
|
412
|
-
result.documentsUpdated.push(docType);
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
else {
|
|
416
|
-
result.documentsSkipped.push(docType);
|
|
417
|
-
}
|
|
405
|
+
return { docType, doc, isNew, error: null };
|
|
418
406
|
}
|
|
419
407
|
catch (error) {
|
|
408
|
+
return { docType, doc: null, isNew: false, error: error };
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
// Wait for all documents to complete
|
|
412
|
+
const results = await Promise.all(generationPromises);
|
|
413
|
+
// Process results
|
|
414
|
+
for (const { docType, doc, isNew, error } of results) {
|
|
415
|
+
if (error) {
|
|
420
416
|
console.error(`Error generating ${docType}: ${error.message}`);
|
|
421
417
|
result.errors.push(`${docType}: ${error.message}`);
|
|
422
418
|
result.success = false;
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
if (doc) {
|
|
422
|
+
result.totalReasoningTokens += doc.metadata.reasoningTokens;
|
|
423
|
+
result.totalOutputTokens += doc.metadata.outputTokens;
|
|
424
|
+
if (isNew) {
|
|
425
|
+
result.documentsGenerated.push(docType);
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
result.documentsUpdated.push(docType);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
result.documentsSkipped.push(docType);
|
|
423
433
|
}
|
|
424
434
|
}
|
|
435
|
+
console.error(`\nā
Parallel generation complete: ${result.documentsGenerated.length + result.documentsUpdated.length} docs, ${result.totalReasoningTokens} reasoning + ${result.totalOutputTokens} output tokens`);
|
|
425
436
|
return result;
|
|
426
437
|
}
|
|
427
438
|
/**
|
|
@@ -462,42 +473,53 @@ ${chunk.content}
|
|
|
462
473
|
totalOutputTokens: 0,
|
|
463
474
|
errors: [],
|
|
464
475
|
};
|
|
465
|
-
// Get previous progress
|
|
476
|
+
// Get previous progress (read before parallel generation)
|
|
466
477
|
let previousProgress;
|
|
467
478
|
const progressPath = path.join(this.options.docsPath, "progress.md");
|
|
468
479
|
if (fs.existsSync(progressPath)) {
|
|
469
480
|
previousProgress = fs.readFileSync(progressPath, "utf-8");
|
|
470
481
|
}
|
|
471
|
-
|
|
482
|
+
// Prepare recent chunks for activeContext
|
|
483
|
+
const recentChunks = [...chunks]
|
|
484
|
+
.sort((a, b) => b.timestamp - a.timestamp)
|
|
485
|
+
.slice(0, Math.min(30, chunks.length));
|
|
486
|
+
console.error(`\nš Updating ${docsToUpdate.length} documents in PARALLEL...`);
|
|
487
|
+
// Generate docs in parallel
|
|
488
|
+
const updatePromises = docsToUpdate.map(async (docType) => {
|
|
472
489
|
try {
|
|
473
|
-
|
|
474
|
-
if (docType === "activeContext") {
|
|
475
|
-
docChunks = [...chunks]
|
|
476
|
-
.sort((a, b) => b.timestamp - a.timestamp)
|
|
477
|
-
.slice(0, Math.min(30, chunks.length));
|
|
478
|
-
}
|
|
490
|
+
const docChunks = docType === "activeContext" ? recentChunks : chunks;
|
|
479
491
|
const existingMetadata = this.metadataCache.get(docType);
|
|
480
492
|
const isNew = !existingMetadata;
|
|
481
493
|
const doc = await this.generateDocument(docType, docChunks, true, // Force update for changed docs
|
|
482
494
|
docType === "progress" ? previousProgress : undefined);
|
|
483
|
-
|
|
484
|
-
result.totalReasoningTokens += doc.metadata.reasoningTokens;
|
|
485
|
-
result.totalOutputTokens += doc.metadata.outputTokens;
|
|
486
|
-
if (isNew) {
|
|
487
|
-
result.documentsGenerated.push(docType);
|
|
488
|
-
}
|
|
489
|
-
else {
|
|
490
|
-
result.documentsUpdated.push(docType);
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
else {
|
|
494
|
-
result.documentsSkipped.push(docType);
|
|
495
|
-
}
|
|
495
|
+
return { docType, doc, isNew, error: null };
|
|
496
496
|
}
|
|
497
497
|
catch (error) {
|
|
498
|
+
return { docType, doc: null, isNew: false, error: error };
|
|
499
|
+
}
|
|
500
|
+
});
|
|
501
|
+
// Wait for all
|
|
502
|
+
const updateResults = await Promise.all(updatePromises);
|
|
503
|
+
// Process results
|
|
504
|
+
for (const { docType, doc, isNew, error } of updateResults) {
|
|
505
|
+
if (error) {
|
|
498
506
|
console.error(`Error updating ${docType}: ${error.message}`);
|
|
499
507
|
result.errors.push(`${docType}: ${error.message}`);
|
|
500
508
|
result.success = false;
|
|
509
|
+
continue;
|
|
510
|
+
}
|
|
511
|
+
if (doc) {
|
|
512
|
+
result.totalReasoningTokens += doc.metadata.reasoningTokens;
|
|
513
|
+
result.totalOutputTokens += doc.metadata.outputTokens;
|
|
514
|
+
if (isNew) {
|
|
515
|
+
result.documentsGenerated.push(docType);
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
result.documentsUpdated.push(docType);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
result.documentsSkipped.push(docType);
|
|
501
523
|
}
|
|
502
524
|
}
|
|
503
525
|
// Mark docs we didn't update as skipped
|