tryassay 0.1.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/LICENSE +21 -0
- package/README.md +553 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/assess.d.ts +6 -0
- package/dist/commands/assess.js +267 -0
- package/dist/commands/assess.js.map +1 -0
- package/dist/commands/describe.d.ts +3 -0
- package/dist/commands/describe.js +114 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/extract.d.ts +4 -0
- package/dist/commands/extract.js +144 -0
- package/dist/commands/extract.js.map +1 -0
- package/dist/commands/hallucinate.d.ts +3 -0
- package/dist/commands/hallucinate.js +100 -0
- package/dist/commands/hallucinate.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +39 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/regenerate.d.ts +3 -0
- package/dist/commands/regenerate.js +158 -0
- package/dist/commands/regenerate.js.map +1 -0
- package/dist/commands/remediate.d.ts +5 -0
- package/dist/commands/remediate.js +155 -0
- package/dist/commands/remediate.js.map +1 -0
- package/dist/commands/report.d.ts +3 -0
- package/dist/commands/report.js +84 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/reverse.d.ts +9 -0
- package/dist/commands/reverse.js +115 -0
- package/dist/commands/reverse.js.map +1 -0
- package/dist/commands/verify.d.ts +4 -0
- package/dist/commands/verify.js +112 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/lib/anthropic.d.ts +13 -0
- package/dist/lib/anthropic.js +60 -0
- package/dist/lib/anthropic.js.map +1 -0
- package/dist/lib/assessment-reporter.d.ts +5 -0
- package/dist/lib/assessment-reporter.js +266 -0
- package/dist/lib/assessment-reporter.js.map +1 -0
- package/dist/lib/claim-extractor.d.ts +6 -0
- package/dist/lib/claim-extractor.js +138 -0
- package/dist/lib/claim-extractor.js.map +1 -0
- package/dist/lib/code-verifier.d.ts +7 -0
- package/dist/lib/code-verifier.js +265 -0
- package/dist/lib/code-verifier.js.map +1 -0
- package/dist/lib/codebase-indexer.d.ts +15 -0
- package/dist/lib/codebase-indexer.js +156 -0
- package/dist/lib/codebase-indexer.js.map +1 -0
- package/dist/lib/config.d.ts +7 -0
- package/dist/lib/config.js +38 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constraint-engine.d.ts +2 -0
- package/dist/lib/constraint-engine.js +337 -0
- package/dist/lib/constraint-engine.js.map +1 -0
- package/dist/lib/fs-utils.d.ts +1 -0
- package/dist/lib/fs-utils.js +11 -0
- package/dist/lib/fs-utils.js.map +1 -0
- package/dist/lib/guided-generator.d.ts +2 -0
- package/dist/lib/guided-generator.js +195 -0
- package/dist/lib/guided-generator.js.map +1 -0
- package/dist/lib/inventory-extractor.d.ts +7 -0
- package/dist/lib/inventory-extractor.js +238 -0
- package/dist/lib/inventory-extractor.js.map +1 -0
- package/dist/lib/prompts.d.ts +3 -0
- package/dist/lib/prompts.js +50 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/publisher.d.ts +2 -0
- package/dist/lib/publisher.js +71 -0
- package/dist/lib/publisher.js.map +1 -0
- package/dist/lib/remediation-generator.d.ts +2 -0
- package/dist/lib/remediation-generator.js +136 -0
- package/dist/lib/remediation-generator.js.map +1 -0
- package/dist/lib/remediator.d.ts +7 -0
- package/dist/lib/remediator.js +209 -0
- package/dist/lib/remediator.js.map +1 -0
- package/dist/lib/report-generator.d.ts +8 -0
- package/dist/lib/report-generator.js +190 -0
- package/dist/lib/report-generator.js.map +1 -0
- package/dist/lib/requirements-generator.d.ts +14 -0
- package/dist/lib/requirements-generator.js +311 -0
- package/dist/lib/requirements-generator.js.map +1 -0
- package/dist/lib/spec-synthesizer.d.ts +2 -0
- package/dist/lib/spec-synthesizer.js +136 -0
- package/dist/lib/spec-synthesizer.js.map +1 -0
- package/dist/lib/system-prompts.d.ts +12 -0
- package/dist/lib/system-prompts.js +254 -0
- package/dist/lib/system-prompts.js.map +1 -0
- package/dist/types.d.ts +243 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { getClient, MODEL } from './anthropic.js';
|
|
2
|
+
import { readFileContent } from './codebase-indexer.js';
|
|
3
|
+
const VALID_ACTIONS = ['add', 'modify', 'remove', 'configure'];
|
|
4
|
+
const VALID_EFFORTS = ['trivial', 'small', 'medium', 'large'];
|
|
5
|
+
const REMEDIATION_SYSTEM = `You are a senior software engineer generating code-level fix tasks for a codebase that does not fully implement its specification.
|
|
6
|
+
|
|
7
|
+
For each failed or partially-implemented claim, produce a remediation task with:
|
|
8
|
+
- claimId: the original claim ID
|
|
9
|
+
- title: one-line fix description (imperative, e.g. "Add AES-256 encryption for data at rest")
|
|
10
|
+
- description: detailed guidance (2-4 sentences)
|
|
11
|
+
- action: one of "add" (new code/file), "modify" (change existing), "remove" (delete dead/wrong code), "configure" (env/config change)
|
|
12
|
+
- targetFiles: array of file paths to change or create
|
|
13
|
+
- estimatedEffort: "trivial" (< 10 lines), "small" (10-50 lines), "medium" (50-200 lines), "large" (> 200 lines)
|
|
14
|
+
- codeGuidance: specific code-level instructions (mention functions, modules, patterns to use)
|
|
15
|
+
|
|
16
|
+
OUTPUT FORMAT:
|
|
17
|
+
Return a JSON array of task objects:
|
|
18
|
+
[
|
|
19
|
+
{
|
|
20
|
+
"claimId": "CLAIM-001",
|
|
21
|
+
"title": "Add rate limiting middleware",
|
|
22
|
+
"description": "The API lacks rate limiting. Add express-rate-limit middleware to all public endpoints.",
|
|
23
|
+
"action": "add",
|
|
24
|
+
"targetFiles": ["src/middleware/rate-limit.ts", "src/app.ts"],
|
|
25
|
+
"estimatedEffort": "small",
|
|
26
|
+
"codeGuidance": "Create rate-limit.ts exporting a configurable middleware using express-rate-limit. Apply it in app.ts before route handlers. Use 100 req/15min for authenticated, 20 req/15min for unauthenticated."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
Rules:
|
|
31
|
+
- Be specific about files, functions, and patterns
|
|
32
|
+
- targetFiles should reference actual files from the codebase when modifying, or proposed new paths when adding
|
|
33
|
+
- codeGuidance should be actionable enough for a developer to implement without guessing
|
|
34
|
+
- For PARTIAL verdicts, focus on what's missing rather than what exists
|
|
35
|
+
- For FAIL verdicts, provide the full implementation approach
|
|
36
|
+
|
|
37
|
+
Return ONLY the JSON array. No markdown fences, no commentary.`;
|
|
38
|
+
function parseRemediationResponse(rawText) {
|
|
39
|
+
let jsonText = rawText.trim();
|
|
40
|
+
// Remove code fences
|
|
41
|
+
if (jsonText.startsWith('```')) {
|
|
42
|
+
const firstNewline = jsonText.indexOf('\n');
|
|
43
|
+
if (firstNewline !== -1) {
|
|
44
|
+
jsonText = jsonText.slice(firstNewline + 1);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const lastFence = jsonText.lastIndexOf('```');
|
|
48
|
+
if (lastFence !== -1) {
|
|
49
|
+
jsonText = jsonText.slice(0, lastFence);
|
|
50
|
+
}
|
|
51
|
+
jsonText = jsonText.trim();
|
|
52
|
+
// Handle truncation
|
|
53
|
+
if (!jsonText.endsWith(']')) {
|
|
54
|
+
const lastBrace = jsonText.lastIndexOf('}');
|
|
55
|
+
if (lastBrace !== -1) {
|
|
56
|
+
jsonText = jsonText.slice(0, lastBrace + 1) + ']';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const parsed = JSON.parse(jsonText);
|
|
60
|
+
if (!Array.isArray(parsed))
|
|
61
|
+
return [];
|
|
62
|
+
return parsed;
|
|
63
|
+
}
|
|
64
|
+
const BATCH_SIZE = 15;
|
|
65
|
+
export async function generateRemediationTasks(failedVerifications, partialVerifications, claims, index, onProgress) {
|
|
66
|
+
const client = getClient();
|
|
67
|
+
const claimMap = new Map(claims.map((c) => [c.id, c]));
|
|
68
|
+
const tasks = [];
|
|
69
|
+
let totalInputTokens = 0;
|
|
70
|
+
let totalOutputTokens = 0;
|
|
71
|
+
let taskCounter = 0;
|
|
72
|
+
const treeStr = index.fileTree.slice(0, 2000).join('\n');
|
|
73
|
+
// Process FAIL claims first, then PARTIAL
|
|
74
|
+
const groups = [
|
|
75
|
+
{
|
|
76
|
+
label: 'FAIL',
|
|
77
|
+
verifications: failedVerifications,
|
|
78
|
+
emphasis: 'These claims are NOT implemented. Provide full implementation guidance.',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
label: 'PARTIAL',
|
|
82
|
+
verifications: partialVerifications,
|
|
83
|
+
emphasis: 'These claims are PARTIALLY implemented. Focus on what is MISSING, not what exists.',
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
for (const group of groups) {
|
|
87
|
+
if (group.verifications.length === 0)
|
|
88
|
+
continue;
|
|
89
|
+
for (let i = 0; i < group.verifications.length; i += BATCH_SIZE) {
|
|
90
|
+
const batch = group.verifications.slice(i, i + BATCH_SIZE);
|
|
91
|
+
const batchNum = Math.floor(i / BATCH_SIZE) + 1;
|
|
92
|
+
const totalBatches = Math.ceil(group.verifications.length / BATCH_SIZE);
|
|
93
|
+
onProgress?.(`${group.label} batch ${batchNum}/${totalBatches}: reading evidence files for ${batch.length} claims...`);
|
|
94
|
+
// Collect all evidence files from this batch
|
|
95
|
+
const uniqueFiles = new Set();
|
|
96
|
+
for (const v of batch) {
|
|
97
|
+
for (const e of v.evidence) {
|
|
98
|
+
uniqueFiles.add(e.file);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Read file contents
|
|
102
|
+
const fileContents = new Map();
|
|
103
|
+
for (const filePath of uniqueFiles) {
|
|
104
|
+
const content = await readFileContent(index.rootPath, filePath);
|
|
105
|
+
if (content) {
|
|
106
|
+
fileContents.set(filePath, content);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Build context
|
|
110
|
+
let evidenceContext = '';
|
|
111
|
+
for (const [path, content] of fileContents) {
|
|
112
|
+
const truncated = content.length > 10_000
|
|
113
|
+
? content.slice(0, 10_000) + '\n[... truncated]'
|
|
114
|
+
: content;
|
|
115
|
+
evidenceContext += `\n--- FILE: ${path} ---\n${truncated}\n`;
|
|
116
|
+
}
|
|
117
|
+
if (evidenceContext.length > 100_000) {
|
|
118
|
+
evidenceContext = evidenceContext.slice(0, 100_000) + '\n[... context truncated]';
|
|
119
|
+
}
|
|
120
|
+
// Build claim+verification list
|
|
121
|
+
const claimList = batch
|
|
122
|
+
.map((v) => {
|
|
123
|
+
const claim = claimMap.get(v.claimId);
|
|
124
|
+
return [
|
|
125
|
+
`${v.claimId} [${claim?.severity || 'medium'}, ${claim?.category || 'functionality'}]:`,
|
|
126
|
+
` Claim: ${v.claim}`,
|
|
127
|
+
` Verdict: ${v.verdict}`,
|
|
128
|
+
` Reasoning: ${v.reasoning}`,
|
|
129
|
+
].join('\n');
|
|
130
|
+
})
|
|
131
|
+
.join('\n\n');
|
|
132
|
+
onProgress?.(`${group.label} batch ${batchNum}/${totalBatches}: generating remediation tasks...`);
|
|
133
|
+
const response = await client.messages.create({
|
|
134
|
+
model: MODEL,
|
|
135
|
+
max_tokens: 8_000,
|
|
136
|
+
system: REMEDIATION_SYSTEM,
|
|
137
|
+
messages: [
|
|
138
|
+
{
|
|
139
|
+
role: 'user',
|
|
140
|
+
content: [
|
|
141
|
+
group.emphasis,
|
|
142
|
+
'',
|
|
143
|
+
'Claims requiring remediation:',
|
|
144
|
+
claimList,
|
|
145
|
+
'',
|
|
146
|
+
'Codebase file tree:',
|
|
147
|
+
treeStr,
|
|
148
|
+
'',
|
|
149
|
+
'Relevant source files:',
|
|
150
|
+
evidenceContext,
|
|
151
|
+
].join('\n'),
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
});
|
|
155
|
+
totalInputTokens += response.usage.input_tokens;
|
|
156
|
+
totalOutputTokens += response.usage.output_tokens;
|
|
157
|
+
const responseText = response.content
|
|
158
|
+
.filter((b) => b.type === 'text')
|
|
159
|
+
.map((b) => b.text)
|
|
160
|
+
.join('');
|
|
161
|
+
try {
|
|
162
|
+
const rawTasks = parseRemediationResponse(responseText);
|
|
163
|
+
for (const raw of rawTasks) {
|
|
164
|
+
if (!raw.claimId || !raw.title)
|
|
165
|
+
continue;
|
|
166
|
+
const claim = claimMap.get(raw.claimId);
|
|
167
|
+
const verification = batch.find((v) => v.claimId === raw.claimId);
|
|
168
|
+
if (!verification)
|
|
169
|
+
continue;
|
|
170
|
+
taskCounter++;
|
|
171
|
+
const id = `REM-${String(taskCounter).padStart(3, '0')}`;
|
|
172
|
+
tasks.push({
|
|
173
|
+
id,
|
|
174
|
+
claimId: raw.claimId,
|
|
175
|
+
verdict: verification.verdict,
|
|
176
|
+
severity: (claim?.severity || 'medium'),
|
|
177
|
+
category: (claim?.category || 'functionality'),
|
|
178
|
+
title: raw.title,
|
|
179
|
+
description: raw.description || '',
|
|
180
|
+
action: VALID_ACTIONS.includes(raw.action)
|
|
181
|
+
? raw.action
|
|
182
|
+
: 'modify',
|
|
183
|
+
targetFiles: Array.isArray(raw.targetFiles) ? raw.targetFiles : [],
|
|
184
|
+
estimatedEffort: VALID_EFFORTS.includes(raw.estimatedEffort)
|
|
185
|
+
? raw.estimatedEffort
|
|
186
|
+
: 'medium',
|
|
187
|
+
codeGuidance: raw.codeGuidance || '',
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
onProgress?.(`Warning: Failed to parse remediation response for ${group.label} batch ${batchNum}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Sort: critical first, then high, medium, low
|
|
197
|
+
const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
198
|
+
tasks.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
|
|
199
|
+
// Re-number after sorting
|
|
200
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
201
|
+
tasks[i].id = `REM-${String(i + 1).padStart(3, '0')}`;
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
tasks,
|
|
205
|
+
inputTokens: totalInputTokens,
|
|
206
|
+
outputTokens: totalOutputTokens,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=remediator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remediator.js","sourceRoot":"","sources":["../../src/lib/remediator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ExtractionResult, VerificationReport } from '../types.js';
|
|
2
|
+
interface ReportInput {
|
|
3
|
+
extraction: ExtractionResult;
|
|
4
|
+
verification: VerificationReport;
|
|
5
|
+
projectName?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function generateGapReport(input: ReportInput): string;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
export function generateGapReport(input) {
|
|
2
|
+
const { extraction, verification, projectName } = input;
|
|
3
|
+
const { verdicts, verifications } = verification;
|
|
4
|
+
const total = verifications.length;
|
|
5
|
+
const assessed = total - verdicts.na;
|
|
6
|
+
const complianceScore = assessed > 0
|
|
7
|
+
? ((verdicts.pass + verdicts.partial * 0.5) / assessed) * 100
|
|
8
|
+
: 0;
|
|
9
|
+
const claimMap = new Map(extraction.claims.map((c) => [c.id, c]));
|
|
10
|
+
const now = new Date().toISOString().split('T')[0];
|
|
11
|
+
const lines = [];
|
|
12
|
+
// --- Executive Summary ---
|
|
13
|
+
lines.push(`# Assay Gap Report — ${projectName || 'Audit Results'}`);
|
|
14
|
+
lines.push('');
|
|
15
|
+
lines.push(`*Generated: ${now}*`);
|
|
16
|
+
lines.push(`*Iteration: ${extraction.iteration}*`);
|
|
17
|
+
lines.push(`*Codebase: ${verification.codebasePath}*`);
|
|
18
|
+
lines.push('');
|
|
19
|
+
lines.push('---');
|
|
20
|
+
lines.push('');
|
|
21
|
+
lines.push('## Executive Summary');
|
|
22
|
+
lines.push('');
|
|
23
|
+
lines.push(`Assay extracted **${extraction.totalClaims} claims** from the ${extraction.documentType} document and verified each against the codebase.`);
|
|
24
|
+
lines.push('');
|
|
25
|
+
lines.push(`| Metric | Value |`);
|
|
26
|
+
lines.push(`|--------|-------|`);
|
|
27
|
+
lines.push(`| Total claims | ${total} |`);
|
|
28
|
+
lines.push(`| PASS | ${verdicts.pass} |`);
|
|
29
|
+
lines.push(`| PARTIAL | ${verdicts.partial} |`);
|
|
30
|
+
lines.push(`| FAIL | ${verdicts.fail} |`);
|
|
31
|
+
lines.push(`| N/A | ${verdicts.na} |`);
|
|
32
|
+
lines.push(`| **Compliance score** | **${complianceScore.toFixed(1)}%** |`);
|
|
33
|
+
lines.push('');
|
|
34
|
+
// Risk summary
|
|
35
|
+
const criticalFails = getVerificationsByVerdictAndSeverity(verifications, claimMap, 'FAIL', 'critical');
|
|
36
|
+
const highFails = getVerificationsByVerdictAndSeverity(verifications, claimMap, 'FAIL', 'high');
|
|
37
|
+
if (criticalFails.length > 0 || highFails.length > 0) {
|
|
38
|
+
lines.push(`**Risk Assessment:** ${criticalFails.length} critical and ${highFails.length} high-severity failures require immediate attention.`);
|
|
39
|
+
}
|
|
40
|
+
else if (verdicts.fail > 0) {
|
|
41
|
+
lines.push(`**Risk Assessment:** ${verdicts.fail} failures found, none at critical severity.`);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
lines.push(`**Risk Assessment:** No failures found. Claims are well-supported by codebase.`);
|
|
45
|
+
}
|
|
46
|
+
lines.push('');
|
|
47
|
+
// --- Methodology ---
|
|
48
|
+
lines.push('---');
|
|
49
|
+
lines.push('');
|
|
50
|
+
lines.push('## Methodology');
|
|
51
|
+
lines.push('');
|
|
52
|
+
lines.push('This report was generated using the LUCID methodology (Leveraging Unverified Claims Into Deliverables):');
|
|
53
|
+
lines.push('');
|
|
54
|
+
lines.push('1. **Extract** — Every declarative claim was identified from the document');
|
|
55
|
+
lines.push('2. **Classify** — Claims were categorized by type and severity');
|
|
56
|
+
lines.push('3. **Verify** — Each testable claim was evaluated against the actual codebase');
|
|
57
|
+
lines.push('4. **Report** — Results compiled with evidence and fix recommendations');
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push('**Verdicts:**');
|
|
60
|
+
lines.push('- **PASS** — Code fully implements the claim');
|
|
61
|
+
lines.push('- **PARTIAL** — Code partially implements the claim');
|
|
62
|
+
lines.push('- **FAIL** — Code does not implement the claim or contradicts it');
|
|
63
|
+
lines.push('- **N/A** — Claim cannot be verified from code alone');
|
|
64
|
+
lines.push('');
|
|
65
|
+
// --- Priority Matrix ---
|
|
66
|
+
lines.push('---');
|
|
67
|
+
lines.push('');
|
|
68
|
+
lines.push('## Priority Matrix');
|
|
69
|
+
lines.push('');
|
|
70
|
+
lines.push('| Severity | FAIL | PARTIAL | PASS | N/A |');
|
|
71
|
+
lines.push('|----------|------|---------|------|-----|');
|
|
72
|
+
for (const severity of ['critical', 'high', 'medium', 'low']) {
|
|
73
|
+
const counts = {
|
|
74
|
+
FAIL: getVerificationsByVerdictAndSeverity(verifications, claimMap, 'FAIL', severity).length,
|
|
75
|
+
PARTIAL: getVerificationsByVerdictAndSeverity(verifications, claimMap, 'PARTIAL', severity).length,
|
|
76
|
+
PASS: getVerificationsByVerdictAndSeverity(verifications, claimMap, 'PASS', severity).length,
|
|
77
|
+
'N/A': getVerificationsByVerdictAndSeverity(verifications, claimMap, 'N/A', severity).length,
|
|
78
|
+
};
|
|
79
|
+
lines.push(`| ${severity} | ${counts.FAIL} | ${counts.PARTIAL} | ${counts.PASS} | ${counts['N/A']} |`);
|
|
80
|
+
}
|
|
81
|
+
lines.push('');
|
|
82
|
+
// --- Detailed Findings ---
|
|
83
|
+
lines.push('---');
|
|
84
|
+
lines.push('');
|
|
85
|
+
lines.push('## Detailed Findings');
|
|
86
|
+
lines.push('');
|
|
87
|
+
// Group by section
|
|
88
|
+
const sections = new Map();
|
|
89
|
+
for (const v of verifications) {
|
|
90
|
+
const claim = claimMap.get(v.claimId);
|
|
91
|
+
const section = claim?.section || 'Unknown';
|
|
92
|
+
if (!sections.has(section))
|
|
93
|
+
sections.set(section, []);
|
|
94
|
+
sections.get(section).push(v);
|
|
95
|
+
}
|
|
96
|
+
for (const [section, sectionVerifications] of sections) {
|
|
97
|
+
lines.push(`### ${section}`);
|
|
98
|
+
lines.push('');
|
|
99
|
+
// Sort: FAIL first, then PARTIAL, then PASS, then N/A
|
|
100
|
+
const verdictOrder = { FAIL: 0, PARTIAL: 1, PASS: 2, 'N/A': 3 };
|
|
101
|
+
sectionVerifications.sort((a, b) => (verdictOrder[a.verdict] ?? 4) - (verdictOrder[b.verdict] ?? 4));
|
|
102
|
+
for (const v of sectionVerifications) {
|
|
103
|
+
const claim = claimMap.get(v.claimId);
|
|
104
|
+
const icon = verdictIcon(v.verdict);
|
|
105
|
+
lines.push(`${icon} **${v.claimId}** [${claim?.severity || 'medium'}] — ${v.claim || claim?.text || ''}`);
|
|
106
|
+
if (v.reasoning) {
|
|
107
|
+
lines.push(`> ${v.reasoning}`);
|
|
108
|
+
}
|
|
109
|
+
if (v.evidence.length > 0) {
|
|
110
|
+
for (const e of v.evidence) {
|
|
111
|
+
const loc = e.lineNumber ? `${e.file}:${e.lineNumber}` : e.file;
|
|
112
|
+
lines.push(`> \`${loc}\`: \`${e.snippet.trim().slice(0, 120)}\``);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
lines.push('');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// --- Fix Recommendations ---
|
|
119
|
+
const fails = verifications.filter((v) => v.verdict === 'FAIL');
|
|
120
|
+
const partials = verifications.filter((v) => v.verdict === 'PARTIAL');
|
|
121
|
+
if (fails.length > 0 || partials.length > 0) {
|
|
122
|
+
lines.push('---');
|
|
123
|
+
lines.push('');
|
|
124
|
+
lines.push('## Fix Recommendations');
|
|
125
|
+
lines.push('');
|
|
126
|
+
if (criticalFails.length > 0) {
|
|
127
|
+
lines.push('### Immediate (Critical)');
|
|
128
|
+
lines.push('');
|
|
129
|
+
for (const v of criticalFails) {
|
|
130
|
+
lines.push(`- [ ] **${v.claimId}**: ${v.claim}`);
|
|
131
|
+
}
|
|
132
|
+
lines.push('');
|
|
133
|
+
}
|
|
134
|
+
if (highFails.length > 0) {
|
|
135
|
+
lines.push('### High Priority');
|
|
136
|
+
lines.push('');
|
|
137
|
+
for (const v of highFails) {
|
|
138
|
+
lines.push(`- [ ] **${v.claimId}**: ${v.claim}`);
|
|
139
|
+
}
|
|
140
|
+
lines.push('');
|
|
141
|
+
}
|
|
142
|
+
const mediumFails = getVerificationsByVerdictAndSeverity(verifications, claimMap, 'FAIL', 'medium');
|
|
143
|
+
if (mediumFails.length > 0) {
|
|
144
|
+
lines.push('### Medium Priority');
|
|
145
|
+
lines.push('');
|
|
146
|
+
for (const v of mediumFails) {
|
|
147
|
+
lines.push(`- [ ] **${v.claimId}**: ${v.claim}`);
|
|
148
|
+
}
|
|
149
|
+
lines.push('');
|
|
150
|
+
}
|
|
151
|
+
if (partials.length > 0) {
|
|
152
|
+
lines.push('### Partial Implementations (Quick Wins)');
|
|
153
|
+
lines.push('');
|
|
154
|
+
for (const v of partials) {
|
|
155
|
+
lines.push(`- [ ] **${v.claimId}**: ${v.claim}`);
|
|
156
|
+
}
|
|
157
|
+
lines.push('');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// --- Footer ---
|
|
161
|
+
lines.push('---');
|
|
162
|
+
lines.push('');
|
|
163
|
+
lines.push(`*Report generated by Assay v0.1.0 — powered by the LUCID methodology (Leveraging Unverified Claims Into Deliverables)*`);
|
|
164
|
+
lines.push(`*https://tryassay.ai*`);
|
|
165
|
+
lines.push('');
|
|
166
|
+
return lines.join('\n');
|
|
167
|
+
}
|
|
168
|
+
function verdictIcon(verdict) {
|
|
169
|
+
switch (verdict) {
|
|
170
|
+
case 'PASS':
|
|
171
|
+
return '[PASS]';
|
|
172
|
+
case 'PARTIAL':
|
|
173
|
+
return '[PARTIAL]';
|
|
174
|
+
case 'FAIL':
|
|
175
|
+
return '[FAIL]';
|
|
176
|
+
case 'N/A':
|
|
177
|
+
return '[N/A]';
|
|
178
|
+
default:
|
|
179
|
+
return `[${verdict}]`;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function getVerificationsByVerdictAndSeverity(verifications, claimMap, verdict, severity) {
|
|
183
|
+
return verifications.filter((v) => {
|
|
184
|
+
if (v.verdict !== verdict)
|
|
185
|
+
return false;
|
|
186
|
+
const claim = claimMap.get(v.claimId);
|
|
187
|
+
return claim?.severity === severity;
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=report-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-generator.js","sourceRoot":"","sources":["../../src/lib/report-generator.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IACxD,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,YAAY,CAAC;IACjD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC;IACnC,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC;IACrC,MAAM,eAAe,GACnB,QAAQ,GAAG,CAAC;QACV,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,GAAG;QAC7D,CAAC,CAAC,CAAC,CAAC;IAER,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,4BAA4B;IAC5B,KAAK,CAAC,IAAI,CAAC,wBAAwB,WAAW,IAAI,eAAe,EAAE,CAAC,CAAC;IACrE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,eAAe,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,cAAc,YAAY,CAAC,YAAY,GAAG,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,UAAU,CAAC,WAAW,sBAAsB,UAAU,CAAC,YAAY,mDAAmD,CAAC,CAAC;IACxJ,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,8BAA8B,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,eAAe;IACf,MAAM,aAAa,GAAG,oCAAoC,CACxD,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAC5C,CAAC;IACF,MAAM,SAAS,GAAG,oCAAoC,CACpD,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CACxC,CAAC;IAEF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,wBAAwB,aAAa,CAAC,MAAM,iBAAiB,SAAS,CAAC,MAAM,sDAAsD,CAAC,CAAC;IAClJ,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,IAAI,6CAA6C,CAAC,CAAC;IACjG,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;IAC/F,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,sBAAsB;IACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,yGAAyG,CAAC,CAAC;IACtH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IACxF,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IAC5F,KAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IACrF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAClE,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACnE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,0BAA0B;IAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAEzD,KAAK,MAAM,QAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAU,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,oCAAoC,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM;YAC5F,OAAO,EAAE,oCAAoC,CAAC,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,MAAM;YAClG,IAAI,EAAE,oCAAoC,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM;YAC5F,KAAK,EAAE,oCAAoC,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM;SAC7F,CAAC;QACF,KAAK,CAAC,IAAI,CACR,KAAK,QAAQ,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,OAAO,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAC3F,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,4BAA4B;IAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,mBAAmB;IACnB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,IAAI,QAAQ,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,sDAAsD;QACtD,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAChE,oBAAoB,CAAC,IAAI,CACvB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAClE,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,oBAAoB,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAEpC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,OAAO,OAAO,KAAK,EAAE,QAAQ,IAAI,QAAQ,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YAE1G,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACjC,CAAC;YAED,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAChE,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;IAEtE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,MAAM,WAAW,GAAG,oCAAoC,CACtD,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAC1C,CAAC;QACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,wHAAwH,CAAC,CAAC;IACrI,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;QAClB,KAAK,KAAK;YACR,OAAO,OAAO,CAAC;QACjB;YACE,OAAO,IAAI,OAAO,GAAG,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,oCAAoC,CAC3C,aAAkC,EAClC,QAA4B,EAC5B,OAAe,EACf,QAAgB;IAEhB,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAChC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,KAAK,EAAE,QAAQ,KAAK,QAAQ,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CodebaseIndex } from './codebase-indexer.js';
|
|
2
|
+
import type { RouteInventoryItem, RouteRequirement } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generate a structured requirement for a single route.
|
|
5
|
+
*
|
|
6
|
+
* Reads the route's component file, follows 1 level of imports to gather
|
|
7
|
+
* related code (hooks, utilities), and sends all context to Claude to
|
|
8
|
+
* produce a RouteRequirement with behaviors and scaffolding flags.
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateRequirement(route: RouteInventoryItem, index: CodebaseIndex, onProgress?: (msg: string) => void): Promise<{
|
|
11
|
+
requirement: RouteRequirement;
|
|
12
|
+
inputTokens: number;
|
|
13
|
+
outputTokens: number;
|
|
14
|
+
}>;
|