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.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +553 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +80 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/assess.d.ts +6 -0
  7. package/dist/commands/assess.js +267 -0
  8. package/dist/commands/assess.js.map +1 -0
  9. package/dist/commands/describe.d.ts +3 -0
  10. package/dist/commands/describe.js +114 -0
  11. package/dist/commands/describe.js.map +1 -0
  12. package/dist/commands/extract.d.ts +4 -0
  13. package/dist/commands/extract.js +144 -0
  14. package/dist/commands/extract.js.map +1 -0
  15. package/dist/commands/hallucinate.d.ts +3 -0
  16. package/dist/commands/hallucinate.js +100 -0
  17. package/dist/commands/hallucinate.js.map +1 -0
  18. package/dist/commands/init.d.ts +1 -0
  19. package/dist/commands/init.js +39 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/regenerate.d.ts +3 -0
  22. package/dist/commands/regenerate.js +158 -0
  23. package/dist/commands/regenerate.js.map +1 -0
  24. package/dist/commands/remediate.d.ts +5 -0
  25. package/dist/commands/remediate.js +155 -0
  26. package/dist/commands/remediate.js.map +1 -0
  27. package/dist/commands/report.d.ts +3 -0
  28. package/dist/commands/report.js +84 -0
  29. package/dist/commands/report.js.map +1 -0
  30. package/dist/commands/reverse.d.ts +9 -0
  31. package/dist/commands/reverse.js +115 -0
  32. package/dist/commands/reverse.js.map +1 -0
  33. package/dist/commands/verify.d.ts +4 -0
  34. package/dist/commands/verify.js +112 -0
  35. package/dist/commands/verify.js.map +1 -0
  36. package/dist/lib/anthropic.d.ts +13 -0
  37. package/dist/lib/anthropic.js +60 -0
  38. package/dist/lib/anthropic.js.map +1 -0
  39. package/dist/lib/assessment-reporter.d.ts +5 -0
  40. package/dist/lib/assessment-reporter.js +266 -0
  41. package/dist/lib/assessment-reporter.js.map +1 -0
  42. package/dist/lib/claim-extractor.d.ts +6 -0
  43. package/dist/lib/claim-extractor.js +138 -0
  44. package/dist/lib/claim-extractor.js.map +1 -0
  45. package/dist/lib/code-verifier.d.ts +7 -0
  46. package/dist/lib/code-verifier.js +265 -0
  47. package/dist/lib/code-verifier.js.map +1 -0
  48. package/dist/lib/codebase-indexer.d.ts +15 -0
  49. package/dist/lib/codebase-indexer.js +156 -0
  50. package/dist/lib/codebase-indexer.js.map +1 -0
  51. package/dist/lib/config.d.ts +7 -0
  52. package/dist/lib/config.js +38 -0
  53. package/dist/lib/config.js.map +1 -0
  54. package/dist/lib/constraint-engine.d.ts +2 -0
  55. package/dist/lib/constraint-engine.js +337 -0
  56. package/dist/lib/constraint-engine.js.map +1 -0
  57. package/dist/lib/fs-utils.d.ts +1 -0
  58. package/dist/lib/fs-utils.js +11 -0
  59. package/dist/lib/fs-utils.js.map +1 -0
  60. package/dist/lib/guided-generator.d.ts +2 -0
  61. package/dist/lib/guided-generator.js +195 -0
  62. package/dist/lib/guided-generator.js.map +1 -0
  63. package/dist/lib/inventory-extractor.d.ts +7 -0
  64. package/dist/lib/inventory-extractor.js +238 -0
  65. package/dist/lib/inventory-extractor.js.map +1 -0
  66. package/dist/lib/prompts.d.ts +3 -0
  67. package/dist/lib/prompts.js +50 -0
  68. package/dist/lib/prompts.js.map +1 -0
  69. package/dist/lib/publisher.d.ts +2 -0
  70. package/dist/lib/publisher.js +71 -0
  71. package/dist/lib/publisher.js.map +1 -0
  72. package/dist/lib/remediation-generator.d.ts +2 -0
  73. package/dist/lib/remediation-generator.js +136 -0
  74. package/dist/lib/remediation-generator.js.map +1 -0
  75. package/dist/lib/remediator.d.ts +7 -0
  76. package/dist/lib/remediator.js +209 -0
  77. package/dist/lib/remediator.js.map +1 -0
  78. package/dist/lib/report-generator.d.ts +8 -0
  79. package/dist/lib/report-generator.js +190 -0
  80. package/dist/lib/report-generator.js.map +1 -0
  81. package/dist/lib/requirements-generator.d.ts +14 -0
  82. package/dist/lib/requirements-generator.js +311 -0
  83. package/dist/lib/requirements-generator.js.map +1 -0
  84. package/dist/lib/spec-synthesizer.d.ts +2 -0
  85. package/dist/lib/spec-synthesizer.js +136 -0
  86. package/dist/lib/spec-synthesizer.js.map +1 -0
  87. package/dist/lib/system-prompts.d.ts +12 -0
  88. package/dist/lib/system-prompts.js +254 -0
  89. package/dist/lib/system-prompts.js.map +1 -0
  90. package/dist/types.d.ts +243 -0
  91. package/dist/types.js +2 -0
  92. package/dist/types.js.map +1 -0
  93. 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":"AACA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAWxD,MAAM,aAAa,GAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AACpF,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAEvE,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+DAgCoC,CAAC;AAYhE,SAAS,wBAAwB,CAAC,OAAe;IAC/C,IAAI,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE9B,qBAAqB;IACrB,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACxB,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IACD,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3B,oBAAoB;IACpB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACrB,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QACpD,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAc,CAAC;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,mBAAwC,EACxC,oBAAyC,EACzC,MAAe,EACf,KAAoB,EACpB,UAAkC;IAElC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzD,0CAA0C;IAC1C,MAAM,MAAM,GAAmF;QAC7F;YACE,KAAK,EAAE,MAAM;YACb,aAAa,EAAE,mBAAmB;YAClC,QAAQ,EAAE,yEAAyE;SACpF;QACD;YACE,KAAK,EAAE,SAAS;YAChB,aAAa,EAAE,oBAAoB;YACnC,QAAQ,EAAE,oFAAoF;SAC/F;KACF,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;YAChE,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;YAExE,UAAU,EAAE,CACV,GAAG,KAAK,CAAC,KAAK,UAAU,QAAQ,IAAI,YAAY,gCAAgC,KAAK,CAAC,MAAM,YAAY,CACzG,CAAC;YAEF,6CAA6C;YAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;YACtC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAC3B,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,qBAAqB;YACrB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC/C,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAChE,IAAI,OAAO,EAAE,CAAC;oBACZ,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YAED,gBAAgB;YAChB,IAAI,eAAe,GAAG,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC3C,MAAM,SAAS,GACb,OAAO,CAAC,MAAM,GAAG,MAAM;oBACrB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,mBAAmB;oBAChD,CAAC,CAAC,OAAO,CAAC;gBACd,eAAe,IAAI,eAAe,IAAI,SAAS,SAAS,IAAI,CAAC;YAC/D,CAAC;YAED,IAAI,eAAe,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;gBACrC,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,2BAA2B,CAAC;YACpF,CAAC;YAED,gCAAgC;YAChC,MAAM,SAAS,GAAG,KAAK;iBACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACtC,OAAO;oBACL,GAAG,CAAC,CAAC,OAAO,KAAK,KAAK,EAAE,QAAQ,IAAI,QAAQ,KAAK,KAAK,EAAE,QAAQ,IAAI,eAAe,IAAI;oBACvF,YAAY,CAAC,CAAC,KAAK,EAAE;oBACrB,cAAc,CAAC,CAAC,OAAO,EAAE;oBACzB,gBAAgB,CAAC,CAAC,SAAS,EAAE;iBAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC,CAAC;iBACD,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhB,UAAU,EAAE,CACV,GAAG,KAAK,CAAC,KAAK,UAAU,QAAQ,IAAI,YAAY,mCAAmC,CACpF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC5C,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,kBAAkB;gBAC1B,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,KAAK,CAAC,QAAQ;4BACd,EAAE;4BACF,+BAA+B;4BAC/B,SAAS;4BACT,EAAE;4BACF,qBAAqB;4BACrB,OAAO;4BACP,EAAE;4BACF,wBAAwB;4BACxB,eAAe;yBAChB,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;iBACF;aACF,CAAC,CAAC;YAEH,gBAAgB,IAAI,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;YAChD,iBAAiB,IAAI,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;YAElD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO;iBAClC,MAAM,CAAC,CAAC,CAAC,EAA4B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAC1D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,EAAE,CAAC,CAAC;YAEZ,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;gBAExD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;oBAC3B,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK;wBAAE,SAAS;oBAEzC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACxC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;oBAClE,IAAI,CAAC,YAAY;wBAAE,SAAS;oBAE5B,WAAW,EAAE,CAAC;oBACd,MAAM,EAAE,GAAG,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;oBAEzD,KAAK,CAAC,IAAI,CAAC;wBACT,EAAE;wBACF,OAAO,EAAE,GAAG,CAAC,OAAO;wBACpB,OAAO,EAAE,YAAY,CAAC,OAA6B;wBACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,IAAI,QAAQ,CAAkB;wBACxD,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,IAAI,eAAe,CAAkB;wBAC/D,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;wBAClC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,MAA2B,CAAC;4BAC7D,CAAC,CAAE,GAAG,CAAC,MAA4B;4BACnC,CAAC,CAAC,QAAQ;wBACZ,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;wBAClE,eAAe,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,eAA+C,CAAC;4BAC1F,CAAC,CAAE,GAAG,CAAC,eAAsD;4BAC7D,CAAC,CAAC,QAAQ;wBACZ,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE;qBACrC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU,EAAE,CAAC,qDAAqD,KAAK,CAAC,KAAK,UAAU,QAAQ,EAAE,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAClE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE5E,0BAA0B;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACxD,CAAC;IAED,OAAO;QACL,KAAK;QACL,WAAW,EAAE,gBAAgB;QAC7B,YAAY,EAAE,iBAAiB;KAChC,CAAC;AACJ,CAAC"}
@@ -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":"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"}
@@ -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
+ }>;