specweave 0.30.16 → 0.30.18
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/CLAUDE.md +43 -0
- package/dist/src/cli/commands/plan/increment-detector.js +2 -2
- package/dist/src/cli/commands/plan/increment-detector.js.map +1 -1
- package/dist/src/cli/commands/plan/plan-orchestrator.js +1 -1
- package/dist/src/cli/commands/plan/plan-orchestrator.js.map +1 -1
- package/dist/src/cli/commands/plan/plan-validator.js +1 -1
- package/dist/src/cli/commands/plan/plan-validator.js.map +1 -1
- package/dist/src/cli/workers/living-docs-worker.js +80 -44
- package/dist/src/cli/workers/living-docs-worker.js.map +1 -1
- package/dist/src/core/increment/active-increment-manager.js +1 -1
- package/dist/src/core/increment/active-increment-manager.js.map +1 -1
- package/dist/src/core/increment/metadata-manager.d.ts +1 -1
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +7 -7
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +12 -18
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +49 -24
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +207 -96
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/llm/index.d.ts +1 -0
- package/dist/src/core/llm/index.d.ts.map +1 -1
- package/dist/src/core/llm/index.js +2 -0
- package/dist/src/core/llm/index.js.map +1 -1
- package/dist/src/core/llm/providers/anthropic-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/anthropic-provider.js +15 -26
- package/dist/src/core/llm/providers/anthropic-provider.js.map +1 -1
- package/dist/src/core/llm/providers/azure-openai-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/azure-openai-provider.js +13 -5
- package/dist/src/core/llm/providers/azure-openai-provider.js.map +1 -1
- package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/bedrock-provider.js +12 -8
- package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -1
- package/dist/src/core/llm/providers/claude-code-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/claude-code-provider.js +15 -25
- package/dist/src/core/llm/providers/claude-code-provider.js.map +1 -1
- package/dist/src/core/llm/providers/ollama-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/ollama-provider.js +12 -9
- package/dist/src/core/llm/providers/ollama-provider.js.map +1 -1
- package/dist/src/core/llm/providers/openai-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/openai-provider.js +13 -6
- package/dist/src/core/llm/providers/openai-provider.js.map +1 -1
- package/dist/src/core/llm/providers/vertex-ai-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/vertex-ai-provider.js +12 -8
- package/dist/src/core/llm/providers/vertex-ai-provider.js.map +1 -1
- package/dist/src/utils/feature-id-collision.d.ts +28 -0
- package/dist/src/utils/feature-id-collision.d.ts.map +1 -1
- package/dist/src/utils/feature-id-collision.js +83 -0
- package/dist/src/utils/feature-id-collision.js.map +1 -1
- package/dist/src/utils/llm-json-extractor.d.ts +105 -0
- package/dist/src/utils/llm-json-extractor.d.ts.map +1 -0
- package/dist/src/utils/llm-json-extractor.js +336 -0
- package/dist/src/utils/llm-json-extractor.js.map +1 -0
- package/dist/src/utils/structure-level-detector.d.ts +105 -0
- package/dist/src/utils/structure-level-detector.d.ts.map +1 -0
- package/dist/src/utils/structure-level-detector.js +388 -0
- package/dist/src/utils/structure-level-detector.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/commands/specweave-increment.md +57 -9
- package/plugins/specweave/commands/specweave-qa.md +34 -4
- package/plugins/specweave/commands/specweave-sync-specs.md +37 -6
- package/plugins/specweave/commands/specweave-validate.md +41 -1
- package/plugins/specweave/hooks/hooks.json +10 -0
- package/plugins/specweave/hooks/spec-project-validator.sh +111 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +1 -1
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -1
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +1 -1
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +7 -7
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -1
- package/plugins/specweave/skills/increment-planner/SKILL.md +109 -10
- package/plugins/specweave/skills/increment-planner/templates/spec-multi-project.md +2 -0
- package/plugins/specweave/skills/increment-planner/templates/spec-single-project.md +1 -0
- package/plugins/specweave/skills/increment-quality-judge-v2/SKILL.md +41 -2
- package/plugins/specweave/skills/multi-project-spec-mapper/SKILL.md +24 -1
- package/plugins/specweave/skills/spec-generator/SKILL.md +18 -0
- package/plugins/specweave/skills/specweave-framework/SKILL.md +25 -0
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +14 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +21 -0
|
@@ -110,4 +110,32 @@ export declare function findNextAvailableUSId(projectSpecsPath: string, options?
|
|
|
110
110
|
* @returns true if either US-XXX or US-XXXE exists
|
|
111
111
|
*/
|
|
112
112
|
export declare function isUSIdUsed(number: number, projectSpecsPath: string): boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Validate increment number uniqueness
|
|
115
|
+
*
|
|
116
|
+
* CRITICAL (2025-12-04): Prevents duplicate increment numbers like:
|
|
117
|
+
* - 0101-judge-llm-command
|
|
118
|
+
* - 0101-llm-json-extraction-hardening
|
|
119
|
+
*
|
|
120
|
+
* This causes chain shifts in living docs sync because each sync sees
|
|
121
|
+
* the other's FS folder as a "collision".
|
|
122
|
+
*
|
|
123
|
+
* @param incrementNumber - Numeric prefix to validate (e.g., 101 for 0101-xxx)
|
|
124
|
+
* @param incrementsPath - Path to increments folder
|
|
125
|
+
* @returns Object with validation result and existing increment name if duplicate found
|
|
126
|
+
*/
|
|
127
|
+
export declare function validateIncrementNumberUnique(incrementNumber: number, incrementsPath: string): {
|
|
128
|
+
isUnique: boolean;
|
|
129
|
+
existingIncrement?: string;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Scan for duplicate increment numbers in the increments folder
|
|
133
|
+
*
|
|
134
|
+
* Returns all increment numbers that appear more than once.
|
|
135
|
+
* Useful for detecting existing duplicates that need cleanup.
|
|
136
|
+
*
|
|
137
|
+
* @param incrementsPath - Path to increments folder
|
|
138
|
+
* @returns Map of increment number to array of full increment names
|
|
139
|
+
*/
|
|
140
|
+
export declare function findDuplicateIncrementNumbers(incrementsPath: string): Map<number, string[]>;
|
|
113
141
|
//# sourceMappingURL=feature-id-collision.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-id-collision.d.ts","sourceRoot":"","sources":["../../../src/utils/feature-id-collision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,CA+EjB;AA2DD;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAuDR;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CA4B3H;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAqDR;AAsBD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CA8B5E"}
|
|
1
|
+
{"version":3,"file":"feature-id-collision.d.ts","sourceRoot":"","sources":["../../../src/utils/feature-id-collision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,CA+EjB;AA2DD;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAuDR;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CA4B3H;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAqDR;AAsBD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CA8B5E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,6BAA6B,CAC3C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,CAgCnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,GACrB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAmCvB"}
|
|
@@ -371,4 +371,87 @@ export function isUSIdUsed(number, projectSpecsPath) {
|
|
|
371
371
|
}
|
|
372
372
|
return usedIds.has(number);
|
|
373
373
|
}
|
|
374
|
+
/**
|
|
375
|
+
* Validate increment number uniqueness
|
|
376
|
+
*
|
|
377
|
+
* CRITICAL (2025-12-04): Prevents duplicate increment numbers like:
|
|
378
|
+
* - 0101-judge-llm-command
|
|
379
|
+
* - 0101-llm-json-extraction-hardening
|
|
380
|
+
*
|
|
381
|
+
* This causes chain shifts in living docs sync because each sync sees
|
|
382
|
+
* the other's FS folder as a "collision".
|
|
383
|
+
*
|
|
384
|
+
* @param incrementNumber - Numeric prefix to validate (e.g., 101 for 0101-xxx)
|
|
385
|
+
* @param incrementsPath - Path to increments folder
|
|
386
|
+
* @returns Object with validation result and existing increment name if duplicate found
|
|
387
|
+
*/
|
|
388
|
+
export function validateIncrementNumberUnique(incrementNumber, incrementsPath) {
|
|
389
|
+
if (!fs.existsSync(incrementsPath)) {
|
|
390
|
+
return { isUnique: true };
|
|
391
|
+
}
|
|
392
|
+
const paddedNumber = incrementNumber.toString().padStart(4, '0');
|
|
393
|
+
const pattern = new RegExp(`^${paddedNumber}-`);
|
|
394
|
+
try {
|
|
395
|
+
const entries = fs.readdirSync(incrementsPath, { withFileTypes: true });
|
|
396
|
+
for (const entry of entries) {
|
|
397
|
+
if (entry.isDirectory() && entry.name !== '_archive' && pattern.test(entry.name)) {
|
|
398
|
+
return { isUnique: false, existingIncrement: entry.name };
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// Also check archive
|
|
402
|
+
const archivePath = path.join(incrementsPath, '_archive');
|
|
403
|
+
if (fs.existsSync(archivePath)) {
|
|
404
|
+
const archiveEntries = fs.readdirSync(archivePath, { withFileTypes: true });
|
|
405
|
+
for (const entry of archiveEntries) {
|
|
406
|
+
if (entry.isDirectory() && pattern.test(entry.name)) {
|
|
407
|
+
return { isUnique: false, existingIncrement: `_archive/${entry.name}` };
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
// Error reading - assume unique to avoid blocking
|
|
414
|
+
}
|
|
415
|
+
return { isUnique: true };
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Scan for duplicate increment numbers in the increments folder
|
|
419
|
+
*
|
|
420
|
+
* Returns all increment numbers that appear more than once.
|
|
421
|
+
* Useful for detecting existing duplicates that need cleanup.
|
|
422
|
+
*
|
|
423
|
+
* @param incrementsPath - Path to increments folder
|
|
424
|
+
* @returns Map of increment number to array of full increment names
|
|
425
|
+
*/
|
|
426
|
+
export function findDuplicateIncrementNumbers(incrementsPath) {
|
|
427
|
+
const duplicates = new Map();
|
|
428
|
+
if (!fs.existsSync(incrementsPath)) {
|
|
429
|
+
return duplicates;
|
|
430
|
+
}
|
|
431
|
+
const numberToNames = new Map();
|
|
432
|
+
try {
|
|
433
|
+
const entries = fs.readdirSync(incrementsPath, { withFileTypes: true });
|
|
434
|
+
for (const entry of entries) {
|
|
435
|
+
if (!entry.isDirectory() || entry.name === '_archive')
|
|
436
|
+
continue;
|
|
437
|
+
const match = entry.name.match(/^(\d{4})-/);
|
|
438
|
+
if (match) {
|
|
439
|
+
const num = parseInt(match[1], 10);
|
|
440
|
+
const existing = numberToNames.get(num) || [];
|
|
441
|
+
existing.push(entry.name);
|
|
442
|
+
numberToNames.set(num, existing);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// Filter to only duplicates
|
|
446
|
+
for (const [num, names] of numberToNames) {
|
|
447
|
+
if (names.length > 1) {
|
|
448
|
+
duplicates.set(num, names);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
catch {
|
|
453
|
+
// Error reading folder
|
|
454
|
+
}
|
|
455
|
+
return duplicates;
|
|
456
|
+
}
|
|
374
457
|
//# sourceMappingURL=feature-id-collision.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-id-collision.js","sourceRoot":"","sources":["../../../src/utils/feature-id-collision.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"feature-id-collision.js","sourceRoot":"","sources":["../../../src/utils/feature-id-collision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM JSON Extractor - Robust JSON parsing from LLM responses
|
|
3
|
+
*
|
|
4
|
+
* Handles common LLM output patterns:
|
|
5
|
+
* - "Based on the analysis, here is the JSON: {...}"
|
|
6
|
+
* - "```json\n{...}\n```"
|
|
7
|
+
* - "Here's what I found:\n{...}"
|
|
8
|
+
* - Pure JSON responses
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - 4-level extraction strategy (pure -> code blocks -> regex -> array)
|
|
12
|
+
* - Input sanitization (BOM, trailing commas)
|
|
13
|
+
* - Schema-aware correction prompts
|
|
14
|
+
* - Required field validation
|
|
15
|
+
* - Retry-with-correction prompting
|
|
16
|
+
*/
|
|
17
|
+
import { Logger } from './logger.js';
|
|
18
|
+
/**
|
|
19
|
+
* Result of JSON extraction attempt
|
|
20
|
+
*/
|
|
21
|
+
export interface ExtractionResult<T = unknown> {
|
|
22
|
+
success: boolean;
|
|
23
|
+
data: T | null;
|
|
24
|
+
rawResponse: string;
|
|
25
|
+
extractedJson: string | null;
|
|
26
|
+
error: string | null;
|
|
27
|
+
/** How the JSON was extracted */
|
|
28
|
+
extractionMethod: 'pure' | 'code-block' | 'regex' | 'failed';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Options for JSON extraction
|
|
32
|
+
*/
|
|
33
|
+
export interface ExtractionOptions {
|
|
34
|
+
/** Required fields to validate in the parsed JSON */
|
|
35
|
+
requiredFields?: string[];
|
|
36
|
+
/** Schema for correction prompts (recommended for retry flows) */
|
|
37
|
+
schema?: Record<string, unknown>;
|
|
38
|
+
/** Logger instance */
|
|
39
|
+
logger?: Logger;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Extract JSON from an LLM response that may contain prose
|
|
43
|
+
*
|
|
44
|
+
* Tries multiple extraction strategies in order:
|
|
45
|
+
* 1. Direct parse (pure JSON)
|
|
46
|
+
* 2. Remove markdown code blocks
|
|
47
|
+
* 3. Find JSON object via regex (handles prose around JSON)
|
|
48
|
+
* 4. Find JSON array via regex
|
|
49
|
+
*/
|
|
50
|
+
export declare function extractJson<T = unknown>(response: string, options?: ExtractionOptions): ExtractionResult<T>;
|
|
51
|
+
/**
|
|
52
|
+
* Generate a correction prompt for retry after failed JSON extraction
|
|
53
|
+
*
|
|
54
|
+
* @param originalPrompt - The original prompt that was sent
|
|
55
|
+
* @param failedResponse - The failed response from the LLM
|
|
56
|
+
* @param schema - Optional schema to show expected structure (recommended)
|
|
57
|
+
*/
|
|
58
|
+
export declare function generateCorrectionPrompt(originalPrompt: string, failedResponse: string, schema?: Record<string, unknown>): string;
|
|
59
|
+
/**
|
|
60
|
+
* Extract required field names from a JSON schema object
|
|
61
|
+
*
|
|
62
|
+
* Handles common schema patterns:
|
|
63
|
+
* - Simple objects: extracts top-level keys
|
|
64
|
+
* - Objects with "type" descriptors: extracts keys
|
|
65
|
+
*
|
|
66
|
+
* @param schema - The schema object passed to analyzeStructured (any object type)
|
|
67
|
+
* @returns Array of required field names
|
|
68
|
+
*/
|
|
69
|
+
export declare function extractRequiredFieldsFromSchema(schema: unknown): string[];
|
|
70
|
+
/**
|
|
71
|
+
* Build a prompt that strongly encourages JSON-only output
|
|
72
|
+
*
|
|
73
|
+
* Uses multiple techniques:
|
|
74
|
+
* 1. Leading instruction (most important position)
|
|
75
|
+
* 2. Schema definition
|
|
76
|
+
* 3. Trailing reminder
|
|
77
|
+
*/
|
|
78
|
+
export declare function buildJsonPrompt(context: string, schema: Record<string, string>, instruction: string): string;
|
|
79
|
+
/**
|
|
80
|
+
* Retry wrapper that attempts extraction with correction prompts
|
|
81
|
+
*
|
|
82
|
+
* Uses schema-aware correction prompts for better retry success.
|
|
83
|
+
*/
|
|
84
|
+
export declare function extractJsonWithRetry<T = unknown>(sendPrompt: (prompt: string) => Promise<string>, originalPrompt: string, options?: ExtractionOptions & {
|
|
85
|
+
maxRetries?: number;
|
|
86
|
+
}): Promise<ExtractionResult<T>>;
|
|
87
|
+
/**
|
|
88
|
+
* Create a structured output analyzer with built-in retry
|
|
89
|
+
*
|
|
90
|
+
* This is the recommended way to get structured JSON from LLMs.
|
|
91
|
+
* Combines prompt building, extraction, validation, and retry.
|
|
92
|
+
*
|
|
93
|
+
* @param analyze - Function that sends prompt to LLM and returns response
|
|
94
|
+
* @param schema - Expected schema (used for prompt, validation, and correction)
|
|
95
|
+
* @param options - Configuration options
|
|
96
|
+
*/
|
|
97
|
+
export declare function analyzeStructuredWithRetry<T = unknown>(analyze: (prompt: string) => Promise<string>, prompt: string, schema: Record<string, unknown>, options?: {
|
|
98
|
+
maxRetries?: number;
|
|
99
|
+
logger?: Logger;
|
|
100
|
+
}): Promise<{
|
|
101
|
+
success: boolean;
|
|
102
|
+
data: T | null;
|
|
103
|
+
error: string | null;
|
|
104
|
+
}>;
|
|
105
|
+
//# sourceMappingURL=llm-json-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-json-extractor.d.ts","sourceRoot":"","sources":["../../../src/utils/llm-json-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CAAC,CAAC,CAAC,CAkFrB;AA6HD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CA4BR;AAED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,OAAO,GACd,MAAM,EAAE,CAQV;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,WAAW,EAAE,MAAM,GAClB,MAAM,CAmBR;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,GAAG,OAAO,EACpD,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAC/C,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,iBAAiB,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CA6B9B;AAED;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAAC,CAAC,GAAG,OAAO,EAC1D,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAC5C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GACL,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAmBrE"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM JSON Extractor - Robust JSON parsing from LLM responses
|
|
3
|
+
*
|
|
4
|
+
* Handles common LLM output patterns:
|
|
5
|
+
* - "Based on the analysis, here is the JSON: {...}"
|
|
6
|
+
* - "```json\n{...}\n```"
|
|
7
|
+
* - "Here's what I found:\n{...}"
|
|
8
|
+
* - Pure JSON responses
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - 4-level extraction strategy (pure -> code blocks -> regex -> array)
|
|
12
|
+
* - Input sanitization (BOM, trailing commas)
|
|
13
|
+
* - Schema-aware correction prompts
|
|
14
|
+
* - Required field validation
|
|
15
|
+
* - Retry-with-correction prompting
|
|
16
|
+
*/
|
|
17
|
+
import { consoleLogger } from './logger.js';
|
|
18
|
+
/**
|
|
19
|
+
* Extract JSON from an LLM response that may contain prose
|
|
20
|
+
*
|
|
21
|
+
* Tries multiple extraction strategies in order:
|
|
22
|
+
* 1. Direct parse (pure JSON)
|
|
23
|
+
* 2. Remove markdown code blocks
|
|
24
|
+
* 3. Find JSON object via regex (handles prose around JSON)
|
|
25
|
+
* 4. Find JSON array via regex
|
|
26
|
+
*/
|
|
27
|
+
export function extractJson(response, options = {}) {
|
|
28
|
+
const logger = options.logger ?? consoleLogger;
|
|
29
|
+
const result = {
|
|
30
|
+
success: false,
|
|
31
|
+
data: null,
|
|
32
|
+
rawResponse: response,
|
|
33
|
+
extractedJson: null,
|
|
34
|
+
error: null,
|
|
35
|
+
extractionMethod: 'failed'
|
|
36
|
+
};
|
|
37
|
+
if (!response || typeof response !== 'string') {
|
|
38
|
+
result.error = 'Empty or invalid response';
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
// Sanitize input: strip BOM and normalize
|
|
42
|
+
const sanitized = sanitizeInput(response);
|
|
43
|
+
const trimmed = sanitized.trim();
|
|
44
|
+
// Strategy 1: Direct parse (pure JSON) - with trailing comma fallback
|
|
45
|
+
const directParsed = tryParseJson(trimmed);
|
|
46
|
+
if (directParsed !== null && validateParsedJson(directParsed, options.requiredFields)) {
|
|
47
|
+
result.success = true;
|
|
48
|
+
result.data = directParsed;
|
|
49
|
+
result.extractedJson = trimmed;
|
|
50
|
+
result.extractionMethod = 'pure';
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
// Strategy 2: Remove markdown code blocks
|
|
54
|
+
const codeBlockPatterns = [
|
|
55
|
+
/^```(?:json)?\s*\n?([\s\S]*?)\n?```$/m, // Full code block
|
|
56
|
+
/```(?:json)?\s*\n?([\s\S]*?)\n?```/, // Code block anywhere
|
|
57
|
+
];
|
|
58
|
+
for (const pattern of codeBlockPatterns) {
|
|
59
|
+
const match = trimmed.match(pattern);
|
|
60
|
+
if (match?.[1]) {
|
|
61
|
+
const codeBlockContent = match[1].trim();
|
|
62
|
+
const parsed = tryParseJson(codeBlockContent);
|
|
63
|
+
if (parsed !== null && validateParsedJson(parsed, options.requiredFields)) {
|
|
64
|
+
result.success = true;
|
|
65
|
+
result.data = parsed;
|
|
66
|
+
result.extractedJson = codeBlockContent;
|
|
67
|
+
result.extractionMethod = 'code-block';
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Strategy 3: Find JSON object via regex (handles "Based on... here is: {...}")
|
|
73
|
+
// Find the outermost balanced braces
|
|
74
|
+
const jsonObject = findBalancedJson(trimmed, '{', '}');
|
|
75
|
+
if (jsonObject) {
|
|
76
|
+
const parsed = tryParseJson(jsonObject);
|
|
77
|
+
if (parsed !== null && validateParsedJson(parsed, options.requiredFields)) {
|
|
78
|
+
result.success = true;
|
|
79
|
+
result.data = parsed;
|
|
80
|
+
result.extractedJson = jsonObject;
|
|
81
|
+
result.extractionMethod = 'regex';
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Strategy 4: Find JSON array
|
|
86
|
+
const jsonArray = findBalancedJson(trimmed, '[', ']');
|
|
87
|
+
if (jsonArray) {
|
|
88
|
+
const parsed = tryParseJson(jsonArray);
|
|
89
|
+
if (parsed !== null && validateParsedJson(parsed, options.requiredFields)) {
|
|
90
|
+
result.success = true;
|
|
91
|
+
result.data = parsed;
|
|
92
|
+
result.extractedJson = jsonArray;
|
|
93
|
+
result.extractionMethod = 'regex';
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// All strategies failed
|
|
98
|
+
result.error = generateErrorMessage(trimmed);
|
|
99
|
+
logger.debug?.(`JSON extraction failed: ${result.error}`);
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Find balanced JSON by matching opening/closing brackets
|
|
104
|
+
* Handles nested structures and strings with escaped characters
|
|
105
|
+
*/
|
|
106
|
+
function findBalancedJson(text, openChar, closeChar) {
|
|
107
|
+
const startIdx = text.indexOf(openChar);
|
|
108
|
+
if (startIdx === -1)
|
|
109
|
+
return null;
|
|
110
|
+
let depth = 0;
|
|
111
|
+
let inString = false;
|
|
112
|
+
let escapeNext = false;
|
|
113
|
+
for (let i = startIdx; i < text.length; i++) {
|
|
114
|
+
const char = text[i];
|
|
115
|
+
if (escapeNext) {
|
|
116
|
+
escapeNext = false;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (char === '\\' && inString) {
|
|
120
|
+
escapeNext = true;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (char === '"') {
|
|
124
|
+
inString = !inString;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (!inString) {
|
|
128
|
+
if (char === openChar) {
|
|
129
|
+
depth++;
|
|
130
|
+
}
|
|
131
|
+
else if (char === closeChar) {
|
|
132
|
+
depth--;
|
|
133
|
+
if (depth === 0) {
|
|
134
|
+
return text.slice(startIdx, i + 1);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Validate parsed JSON has required fields
|
|
143
|
+
*/
|
|
144
|
+
function validateParsedJson(parsed, requiredFields) {
|
|
145
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
if (!requiredFields || requiredFields.length === 0) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
const obj = parsed;
|
|
152
|
+
return requiredFields.every(field => field in obj);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Sanitize LLM response input before JSON extraction
|
|
156
|
+
*
|
|
157
|
+
* Handles common issues:
|
|
158
|
+
* - UTF-8 BOM character
|
|
159
|
+
* - Trailing commas in arrays/objects (common LLM mistake)
|
|
160
|
+
*/
|
|
161
|
+
function sanitizeInput(input) {
|
|
162
|
+
// Strip UTF-8 BOM if present
|
|
163
|
+
let sanitized = input.replace(/^\uFEFF/, '');
|
|
164
|
+
return sanitized;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Clean trailing commas from JSON string
|
|
168
|
+
* Called after extraction but before parsing
|
|
169
|
+
*/
|
|
170
|
+
function cleanTrailingCommas(json) {
|
|
171
|
+
// Remove trailing commas before ] or }
|
|
172
|
+
// Be careful not to modify strings - only do this on extracted JSON
|
|
173
|
+
return json.replace(/,\s*([}\]])/g, '$1');
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Try to parse JSON with trailing comma cleanup as fallback
|
|
177
|
+
*/
|
|
178
|
+
function tryParseJson(json) {
|
|
179
|
+
try {
|
|
180
|
+
return JSON.parse(json);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Try with trailing comma cleanup
|
|
184
|
+
try {
|
|
185
|
+
const cleaned = cleanTrailingCommas(json);
|
|
186
|
+
return JSON.parse(cleaned);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Generate helpful error message for failed extraction
|
|
195
|
+
*/
|
|
196
|
+
function generateErrorMessage(response) {
|
|
197
|
+
const preview = response.slice(0, 100).replace(/\n/g, ' ');
|
|
198
|
+
if (response.toLowerCase().startsWith('based on')) {
|
|
199
|
+
return `Model returned prose instead of JSON. Response starts with: "${preview}..."`;
|
|
200
|
+
}
|
|
201
|
+
if (response.toLowerCase().includes('i apologize') || response.toLowerCase().includes('sorry')) {
|
|
202
|
+
return `Model returned an apology/error message instead of JSON. Response starts with: "${preview}..."`;
|
|
203
|
+
}
|
|
204
|
+
if (response.includes('{')) {
|
|
205
|
+
return `Found JSON-like content but parsing failed. Response starts with: "${preview}..."`;
|
|
206
|
+
}
|
|
207
|
+
return `No valid JSON found in response. Response starts with: "${preview}..."`;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Generate a correction prompt for retry after failed JSON extraction
|
|
211
|
+
*
|
|
212
|
+
* @param originalPrompt - The original prompt that was sent
|
|
213
|
+
* @param failedResponse - The failed response from the LLM
|
|
214
|
+
* @param schema - Optional schema to show expected structure (recommended)
|
|
215
|
+
*/
|
|
216
|
+
export function generateCorrectionPrompt(originalPrompt, failedResponse, schema) {
|
|
217
|
+
// Build schema example - either from provided schema or use default
|
|
218
|
+
let schemaExample;
|
|
219
|
+
if (schema && Object.keys(schema).length > 0) {
|
|
220
|
+
// Use provided schema
|
|
221
|
+
schemaExample = JSON.stringify(schema, null, 2);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// Fallback to generic example (backward compatible)
|
|
225
|
+
schemaExample = `{
|
|
226
|
+
"purpose": "...",
|
|
227
|
+
"keyConcepts": [...],
|
|
228
|
+
"dependencies": [...],
|
|
229
|
+
"complexity": "low|medium|high",
|
|
230
|
+
"suggestedDocs": [...],
|
|
231
|
+
"architecturalNotes": "..."
|
|
232
|
+
}`;
|
|
233
|
+
}
|
|
234
|
+
return `Your previous response was not valid JSON. I need ONLY a JSON object, with no explanations or prose.
|
|
235
|
+
|
|
236
|
+
INCORRECT (what you sent):
|
|
237
|
+
${failedResponse.slice(0, 200)}${failedResponse.length > 200 ? '...' : ''}
|
|
238
|
+
|
|
239
|
+
CORRECT format - respond with ONLY this JSON structure, nothing else before or after:
|
|
240
|
+
${schemaExample}
|
|
241
|
+
|
|
242
|
+
Now provide ONLY the JSON for: ${originalPrompt.slice(0, 500)}`;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Extract required field names from a JSON schema object
|
|
246
|
+
*
|
|
247
|
+
* Handles common schema patterns:
|
|
248
|
+
* - Simple objects: extracts top-level keys
|
|
249
|
+
* - Objects with "type" descriptors: extracts keys
|
|
250
|
+
*
|
|
251
|
+
* @param schema - The schema object passed to analyzeStructured (any object type)
|
|
252
|
+
* @returns Array of required field names
|
|
253
|
+
*/
|
|
254
|
+
export function extractRequiredFieldsFromSchema(schema) {
|
|
255
|
+
if (!schema || typeof schema !== 'object') {
|
|
256
|
+
return [];
|
|
257
|
+
}
|
|
258
|
+
// For simple schemas like { purpose: "...", complexity: "..." }
|
|
259
|
+
// Return all top-level keys
|
|
260
|
+
return Object.keys(schema);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Build a prompt that strongly encourages JSON-only output
|
|
264
|
+
*
|
|
265
|
+
* Uses multiple techniques:
|
|
266
|
+
* 1. Leading instruction (most important position)
|
|
267
|
+
* 2. Schema definition
|
|
268
|
+
* 3. Trailing reminder
|
|
269
|
+
*/
|
|
270
|
+
export function buildJsonPrompt(context, schema, instruction) {
|
|
271
|
+
const schemaExample = JSON.stringify(Object.fromEntries(Object.entries(schema).map(([k, v]) => [k, v])), null, 2);
|
|
272
|
+
return `IMPORTANT: Respond with ONLY valid JSON. No explanations, no markdown, no text before or after.
|
|
273
|
+
|
|
274
|
+
${instruction}
|
|
275
|
+
|
|
276
|
+
${context}
|
|
277
|
+
|
|
278
|
+
Required JSON schema:
|
|
279
|
+
${schemaExample}
|
|
280
|
+
|
|
281
|
+
Remember: Output ONLY the JSON object. Any text outside the JSON will cause errors.`;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Retry wrapper that attempts extraction with correction prompts
|
|
285
|
+
*
|
|
286
|
+
* Uses schema-aware correction prompts for better retry success.
|
|
287
|
+
*/
|
|
288
|
+
export async function extractJsonWithRetry(sendPrompt, originalPrompt, options = {}) {
|
|
289
|
+
const maxRetries = options.maxRetries ?? 2;
|
|
290
|
+
const logger = options.logger ?? consoleLogger;
|
|
291
|
+
let lastResult;
|
|
292
|
+
let currentPrompt = originalPrompt;
|
|
293
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
294
|
+
if (attempt > 0) {
|
|
295
|
+
logger.debug?.(`JSON extraction retry ${attempt}/${maxRetries}`);
|
|
296
|
+
}
|
|
297
|
+
const response = await sendPrompt(currentPrompt);
|
|
298
|
+
lastResult = extractJson(response, options);
|
|
299
|
+
if (lastResult.success) {
|
|
300
|
+
if (attempt > 0) {
|
|
301
|
+
logger.debug?.(`JSON extraction succeeded on retry ${attempt}`);
|
|
302
|
+
}
|
|
303
|
+
return lastResult;
|
|
304
|
+
}
|
|
305
|
+
// Generate schema-aware correction prompt for next attempt
|
|
306
|
+
if (attempt < maxRetries) {
|
|
307
|
+
currentPrompt = generateCorrectionPrompt(originalPrompt, response, options.schema);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return lastResult;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Create a structured output analyzer with built-in retry
|
|
314
|
+
*
|
|
315
|
+
* This is the recommended way to get structured JSON from LLMs.
|
|
316
|
+
* Combines prompt building, extraction, validation, and retry.
|
|
317
|
+
*
|
|
318
|
+
* @param analyze - Function that sends prompt to LLM and returns response
|
|
319
|
+
* @param schema - Expected schema (used for prompt, validation, and correction)
|
|
320
|
+
* @param options - Configuration options
|
|
321
|
+
*/
|
|
322
|
+
export async function analyzeStructuredWithRetry(analyze, prompt, schema, options = {}) {
|
|
323
|
+
const requiredFields = extractRequiredFieldsFromSchema(schema);
|
|
324
|
+
const result = await extractJsonWithRetry(analyze, prompt, {
|
|
325
|
+
requiredFields,
|
|
326
|
+
schema,
|
|
327
|
+
maxRetries: options.maxRetries ?? 2,
|
|
328
|
+
logger: options.logger
|
|
329
|
+
});
|
|
330
|
+
return {
|
|
331
|
+
success: result.success,
|
|
332
|
+
data: result.data,
|
|
333
|
+
error: result.error
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=llm-json-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-json-extractor.js","sourceRoot":"","sources":["../../../src/utils/llm-json-extractor.ts"],"names":[],"mappings":"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"}
|