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,267 @@
1
+ import { resolve, basename } from 'node:path';
2
+ import { stat, mkdir, writeFile } from 'node:fs/promises';
3
+ import { execSync } from 'node:child_process';
4
+ import { indexCodebase } from '../lib/codebase-indexer.js';
5
+ import { extractInventory } from '../lib/inventory-extractor.js';
6
+ import { generateRequirement } from '../lib/requirements-generator.js';
7
+ import { extractClaims } from '../lib/claim-extractor.js';
8
+ import { verifyClaims } from '../lib/code-verifier.js';
9
+ import { generateAssessmentReport } from '../lib/assessment-reporter.js';
10
+ import { publishAssessment } from '../lib/publisher.js';
11
+ const OUTPUT_DIR = '.assay-assessment';
12
+ const DEFAULT_API_URL = 'https://tryassay.ai';
13
+ const DEFAULT_CONCURRENCY = 5;
14
+ // ── Concurrency limiter ──────────────────────────────────────────────
15
+ async function withConcurrency(items, limit, fn) {
16
+ const active = [];
17
+ let idx = 0;
18
+ for (const item of items) {
19
+ const currentIdx = idx++;
20
+ const p = fn(item, currentIdx).then(() => {
21
+ active.splice(active.indexOf(p), 1);
22
+ });
23
+ active.push(p);
24
+ if (active.length >= limit) {
25
+ await Promise.race(active);
26
+ }
27
+ }
28
+ await Promise.all(active);
29
+ }
30
+ // ── Markdown format helpers ──────────────────────────────────────────
31
+ function formatRequirementMarkdown(req) {
32
+ const lines = [
33
+ `## ${req.id}: ${req.route}`,
34
+ ``,
35
+ `**Domain:** ${req.domain}`,
36
+ `**Component:** ${req.component}`,
37
+ ];
38
+ if (req.guard)
39
+ lines.push(`**Guard:** ${req.guard}`);
40
+ if (req.roles.length > 0)
41
+ lines.push(`**Roles:** ${req.roles.join(', ')}`);
42
+ if (req.tables.length > 0) {
43
+ lines.push(``, `### Database Tables`);
44
+ for (const t of req.tables)
45
+ lines.push(`- ${t}`);
46
+ }
47
+ if (req.behaviors.length > 0) {
48
+ lines.push(``, `### Behaviors`);
49
+ req.behaviors.forEach((b, i) => lines.push(`${i + 1}. ${b}`));
50
+ }
51
+ if (req.scaffoldingFlags.length > 0) {
52
+ lines.push(``, `### Scaffolding Flags`);
53
+ for (const f of req.scaffoldingFlags)
54
+ lines.push(`- ${f}`);
55
+ }
56
+ lines.push('');
57
+ return lines.join('\n');
58
+ }
59
+ function formatRequirementAsText(req) {
60
+ const lines = [
61
+ `Route: ${req.route}`,
62
+ `ID: ${req.id}`,
63
+ `Domain: ${req.domain}`,
64
+ `Component: ${req.component}`,
65
+ ];
66
+ if (req.guard)
67
+ lines.push(`Guard: ${req.guard}`);
68
+ if (req.roles.length > 0)
69
+ lines.push(`Roles: ${req.roles.join(', ')}`);
70
+ if (req.tables.length > 0)
71
+ lines.push(`Database Tables: ${req.tables.join(', ')}`);
72
+ if (req.behaviors.length > 0) {
73
+ lines.push(``, `Behaviors:`);
74
+ req.behaviors.forEach((b, i) => lines.push(` ${i + 1}. ${b}`));
75
+ }
76
+ if (req.scaffoldingFlags.length > 0) {
77
+ lines.push(``, `Scaffolding Issues:`);
78
+ for (const f of req.scaffoldingFlags)
79
+ lines.push(` - ${f}`);
80
+ }
81
+ return lines.join('\n');
82
+ }
83
+ function formatVerificationMarkdown(req, verifications) {
84
+ const lines = [
85
+ `## ${req.id}: ${req.route} — Verification Results`,
86
+ ``,
87
+ `| # | Claim | Verdict | Evidence | Reasoning |`,
88
+ `|---|-------|---------|----------|-----------|`,
89
+ ];
90
+ verifications.forEach((v, i) => {
91
+ const evidenceStr = v.evidence.length > 0
92
+ ? v.evidence.map((e) => `${e.file}${e.lineNumber ? ':' + e.lineNumber : ''}`).join(', ')
93
+ : '—';
94
+ // Escape pipe characters in table cells
95
+ const claimText = v.claim.replace(/\|/g, '\\|');
96
+ const reasonText = v.reasoning.replace(/\|/g, '\\|');
97
+ const evidenceText = evidenceStr.replace(/\|/g, '\\|');
98
+ lines.push(`| ${i + 1} | ${claimText} | ${v.verdict} | ${evidenceText} | ${reasonText} |`);
99
+ });
100
+ lines.push('');
101
+ return lines.join('\n');
102
+ }
103
+ // ── Per-route pipeline ───────────────────────────────────────────────
104
+ async function processRoute(route, routeIndex, index, outputDir) {
105
+ const routeId = `ROUTE-${String(routeIndex + 1).padStart(3, '0')}`;
106
+ const routeSlug = route.path.replace(/\//g, '-').replace(/^-/, '') || 'root';
107
+ // Step A: Generate requirement
108
+ const { requirement, inputTokens: reqIn, outputTokens: reqOut } = await generateRequirement(route, index);
109
+ requirement.id = routeId;
110
+ // Write requirement markdown
111
+ const reqMd = formatRequirementMarkdown(requirement);
112
+ await writeFile(resolve(outputDir, `requirements/${requirement.domain}-${routeSlug}.md`), reqMd);
113
+ // Step B: Extract claims from the requirement text
114
+ const reqText = formatRequirementAsText(requirement);
115
+ const { claims, inputTokens: claimIn, outputTokens: claimOut } = await extractClaims(reqText);
116
+ // Re-prefix claim IDs to be unique per route
117
+ claims.forEach((c, i) => {
118
+ c.id = `${routeId}-CLAIM-${String(i + 1).padStart(3, '0')}`;
119
+ });
120
+ // Step C: Verify claims against codebase
121
+ const { verifications, inputTokens: verIn, outputTokens: verOut } = await verifyClaims(claims, index);
122
+ // Write verification results
123
+ const verMd = formatVerificationMarkdown(requirement, verifications);
124
+ await writeFile(resolve(outputDir, `verifications/${requirement.domain}-${routeSlug}-verified.md`), verMd);
125
+ // Collect bugs (FAIL + PARTIAL verdicts)
126
+ const bugs = verifications.filter((v) => v.verdict === 'FAIL' || v.verdict === 'PARTIAL');
127
+ return {
128
+ result: { requirement, claims, verifications, bugs },
129
+ inputTokens: reqIn + claimIn + verIn,
130
+ outputTokens: reqOut + claimOut + verOut,
131
+ };
132
+ }
133
+ function isGitUrl(input) {
134
+ return input.startsWith('https://github.com/') ||
135
+ input.startsWith('git@') ||
136
+ input.startsWith('https://gitlab.com/');
137
+ }
138
+ async function resolveTarget(input) {
139
+ if (isGitUrl(input)) {
140
+ const repoName = input.split('/').pop()?.replace('.git', '') || 'repo';
141
+ const clonePath = resolve(`/tmp/assay-assess-${repoName}-${Date.now()}`);
142
+ console.log(`Cloning ${input}...`);
143
+ execSync(`git clone --depth 1 ${input} ${clonePath}`, { stdio: 'pipe' });
144
+ return { path: clonePath, repoUrl: input, repoName, cloned: true };
145
+ }
146
+ const targetPath = resolve(input);
147
+ const info = await stat(targetPath);
148
+ if (!info.isDirectory()) {
149
+ throw new Error(`Not a directory: ${targetPath}`);
150
+ }
151
+ return { path: targetPath, repoUrl: 'local', repoName: basename(targetPath), cloned: false };
152
+ }
153
+ export async function assessCommand(target, options) {
154
+ console.log('\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557');
155
+ console.log('\u2551 Assay Assessment \u2014 Loop 1 \u2551');
156
+ console.log('\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n');
157
+ const { path, repoUrl, repoName, cloned } = await resolveTarget(target);
158
+ console.log(`Target: ${repoName} (${path})\n`);
159
+ const config = {
160
+ targetPath: path,
161
+ publish: options.publish || false,
162
+ apiUrl: options.apiUrl || DEFAULT_API_URL,
163
+ domains: options.domain?.split(',').map(d => d.trim()),
164
+ concurrency: parseInt(options.concurrency || String(DEFAULT_CONCURRENCY), 10),
165
+ };
166
+ // Create output directory structure
167
+ const outputDir = resolve(path, OUTPUT_DIR);
168
+ await mkdir(resolve(outputDir, 'inventory'), { recursive: true });
169
+ await mkdir(resolve(outputDir, 'requirements'), { recursive: true });
170
+ await mkdir(resolve(outputDir, 'verifications'), { recursive: true });
171
+ // Step 1: Index codebase
172
+ console.log('[1/8] Indexing codebase...');
173
+ const index = await indexCodebase(config.targetPath);
174
+ console.log(` \u2713 ${index.totalFiles} files, ${index.frameworks.join(', ') || 'unknown framework'}`);
175
+ // Step 2: Build inventory
176
+ console.log('[2/8] Building inventory...');
177
+ const { inventory, inputTokens: invTokensIn, outputTokens: invTokensOut } = await extractInventory(index, console.log);
178
+ console.log(` \u2713 ${inventory.routes.length} routes, ${inventory.tables.length} tables, ${inventory.permissions.length} permission systems`);
179
+ // Write inventory to output
180
+ await writeFile(resolve(outputDir, 'inventory/routes.json'), JSON.stringify(inventory.routes, null, 2));
181
+ await writeFile(resolve(outputDir, 'inventory/tables.json'), JSON.stringify(inventory.tables, null, 2));
182
+ await writeFile(resolve(outputDir, 'inventory/permissions.json'), JSON.stringify(inventory.permissions, null, 2));
183
+ // Steps 3-5: Process each route (requirements → claims → verification)
184
+ // Routes are processed in parallel with concurrency limit.
185
+ const totalRoutes = inventory.routes.length;
186
+ let completedRoutes = 0;
187
+ let totalInputTokens = invTokensIn;
188
+ let totalOutputTokens = invTokensOut;
189
+ const routeResults = new Array(totalRoutes);
190
+ process.stdout.write(`[3-5/8] Processing routes... 0/${totalRoutes}`);
191
+ await withConcurrency(inventory.routes, config.concurrency, async (route, idx) => {
192
+ const { result, inputTokens, outputTokens } = await processRoute(route, idx, index, outputDir);
193
+ routeResults[idx] = result;
194
+ totalInputTokens += inputTokens;
195
+ totalOutputTokens += outputTokens;
196
+ completedRoutes++;
197
+ process.stdout.write(`\r[3-5/8] Processing routes... ${completedRoutes}/${totalRoutes}`);
198
+ });
199
+ process.stdout.write('\n');
200
+ // Summarise results
201
+ const allVerifications = routeResults.flatMap((r) => r.verifications);
202
+ const allBugs = routeResults.flatMap((r) => r.bugs);
203
+ const allClaims = routeResults.flatMap((r) => r.claims);
204
+ const verdictCounts = {
205
+ pass: allVerifications.filter((v) => v.verdict === 'PASS').length,
206
+ partial: allVerifications.filter((v) => v.verdict === 'PARTIAL').length,
207
+ fail: allVerifications.filter((v) => v.verdict === 'FAIL').length,
208
+ na: allVerifications.filter((v) => v.verdict === 'N/A').length,
209
+ };
210
+ console.log(` ✓ ${totalRoutes} routes processed`);
211
+ console.log(` ✓ ${allClaims.length} claims extracted`);
212
+ console.log(` ✓ Verdicts: ${verdictCounts.pass} PASS, ${verdictCounts.partial} PARTIAL, ${verdictCounts.fail} FAIL, ${verdictCounts.na} N/A`);
213
+ console.log(` ✓ ${allBugs.length} bugs found (FAIL + PARTIAL)`);
214
+ console.log(` ✓ Tokens: ${totalInputTokens.toLocaleString()} in / ${totalOutputTokens.toLocaleString()} out`);
215
+ // Write summary JSON for downstream consumption (report generation, publish)
216
+ const summaryData = {
217
+ repoName,
218
+ repoUrl,
219
+ frameworks: index.frameworks,
220
+ totalRoutes,
221
+ totalClaims: allClaims.length,
222
+ verdicts: verdictCounts,
223
+ bugs: allBugs.length,
224
+ routeResults: routeResults.map((r) => ({
225
+ routeId: r.requirement.id,
226
+ route: r.requirement.route,
227
+ domain: r.requirement.domain,
228
+ claimCount: r.claims.length,
229
+ bugCount: r.bugs.length,
230
+ verdicts: {
231
+ pass: r.verifications.filter((v) => v.verdict === 'PASS').length,
232
+ partial: r.verifications.filter((v) => v.verdict === 'PARTIAL').length,
233
+ fail: r.verifications.filter((v) => v.verdict === 'FAIL').length,
234
+ na: r.verifications.filter((v) => v.verdict === 'N/A').length,
235
+ },
236
+ })),
237
+ inputTokens: totalInputTokens,
238
+ outputTokens: totalOutputTokens,
239
+ completedAt: new Date().toISOString(),
240
+ };
241
+ await writeFile(resolve(outputDir, 'assessment-summary.json'), JSON.stringify(summaryData, null, 2));
242
+ console.log('[6/8] Generating report...');
243
+ const assessmentResult = await generateAssessmentReport(routeResults, repoName, repoUrl, index.frameworks, { input: totalInputTokens, output: totalOutputTokens }, outputDir, (msg) => console.log(` ${msg}`));
244
+ // Update token totals with executive summary generation cost
245
+ totalInputTokens = assessmentResult.inputTokens;
246
+ totalOutputTokens = assessmentResult.outputTokens;
247
+ const { bugs: bugCounts } = assessmentResult;
248
+ const totalBugCount = bugCounts.critical + bugCounts.high + bugCounts.medium + bugCounts.low;
249
+ console.log(` Results: ${assessmentResult.totalClaims} claims | ${assessmentResult.verdicts.pass} verified | ${assessmentResult.verdicts.partial} partial | ${assessmentResult.verdicts.fail} falsified`);
250
+ console.log(` Bugs found: ${totalBugCount} (${bugCounts.critical} critical, ${bugCounts.high} high, ${bugCounts.medium} medium, ${bugCounts.low} low)`);
251
+ console.log(` Score: ${assessmentResult.score}/100`);
252
+ if (config.publish) {
253
+ console.log('\n[7/8] Publishing to tryassay.ai...');
254
+ try {
255
+ const dashboardUrl = await publishAssessment(assessmentResult, config.apiUrl, (msg) => console.log(` ${msg}`));
256
+ console.log(`\n Dashboard: ${dashboardUrl}\n`);
257
+ }
258
+ catch (err) {
259
+ console.error(`\n Publishing failed: ${err instanceof Error ? err.message : err}`);
260
+ console.log(' Results are still available locally in .assay-assessment/\n');
261
+ }
262
+ }
263
+ console.log(`\n✓ Assessment complete. Output: ${outputDir}`);
264
+ console.log(` ${totalBugCount} bugs across ${totalRoutes} routes (${allClaims.length} claims verified)`);
265
+ console.log(` Score: ${assessmentResult.score}/100`);
266
+ }
267
+ //# sourceMappingURL=assess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assess.js","sourceRoot":"","sources":["../../src/commands/assess.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function describeCommand(options: {
2
+ url?: string[];
3
+ }): Promise<void>;
@@ -0,0 +1,114 @@
1
+ import { writeFile, mkdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { getAssayDir } from '../lib/config.js';
4
+ import { exists } from '../lib/fs-utils.js';
5
+ function getSourcesDir(cwd = process.cwd()) {
6
+ return join(getAssayDir(cwd), 'sources');
7
+ }
8
+ async function fetchPage(url) {
9
+ const response = await fetch(url, {
10
+ headers: {
11
+ 'User-Agent': 'Mozilla/5.0 (compatible; Assay-Auditor/1.0; +https://tryassay.ai)',
12
+ Accept: 'text/html,application/xhtml+xml,text/plain',
13
+ },
14
+ });
15
+ if (!response.ok) {
16
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
17
+ }
18
+ const contentType = response.headers.get('content-type') || '';
19
+ const text = await response.text();
20
+ // If it's HTML, strip tags to get meaningful text
21
+ if (contentType.includes('html')) {
22
+ return stripHtml(text);
23
+ }
24
+ return text;
25
+ }
26
+ function stripHtml(html) {
27
+ // Remove script, style, nav, footer, header elements entirely
28
+ let text = html
29
+ .replace(/<script[\s\S]*?<\/script>/gi, '')
30
+ .replace(/<style[\s\S]*?<\/style>/gi, '')
31
+ .replace(/<nav[\s\S]*?<\/nav>/gi, '')
32
+ .replace(/<footer[\s\S]*?<\/footer>/gi, '');
33
+ // Convert common block elements to newlines
34
+ text = text
35
+ .replace(/<\/?(h[1-6]|p|div|section|article|li|tr|br|hr)[^>]*>/gi, '\n')
36
+ .replace(/<\/?(ul|ol|table|thead|tbody)[^>]*>/gi, '\n');
37
+ // Remove all remaining tags
38
+ text = text.replace(/<[^>]+>/g, '');
39
+ // Decode common HTML entities
40
+ text = text
41
+ .replace(/&amp;/g, '&')
42
+ .replace(/&lt;/g, '<')
43
+ .replace(/&gt;/g, '>')
44
+ .replace(/&quot;/g, '"')
45
+ .replace(/&#39;/g, "'")
46
+ .replace(/&nbsp;/g, ' ')
47
+ .replace(/&#x27;/g, "'")
48
+ .replace(/&#x2F;/g, '/')
49
+ .replace(/&mdash;/g, '—')
50
+ .replace(/&ndash;/g, '–')
51
+ .replace(/&hellip;/g, '...')
52
+ .replace(/&#\d+;/g, '');
53
+ // Clean up whitespace
54
+ text = text
55
+ .split('\n')
56
+ .map((line) => line.trim())
57
+ .filter((line) => line.length > 0)
58
+ .join('\n');
59
+ return text;
60
+ }
61
+ function slugifyUrl(url) {
62
+ try {
63
+ const parsed = new URL(url);
64
+ return (parsed.hostname + parsed.pathname)
65
+ .replace(/[^a-z0-9]+/gi, '-')
66
+ .replace(/^-|-$/g, '')
67
+ .slice(0, 80);
68
+ }
69
+ catch {
70
+ return url.replace(/[^a-z0-9]+/gi, '-').slice(0, 80);
71
+ }
72
+ }
73
+ export async function describeCommand(options) {
74
+ const urls = options.url;
75
+ if (!urls || urls.length === 0) {
76
+ console.error(' Error: At least one --url is required.');
77
+ console.error(' Usage: assay describe --url https://example.com/tos');
78
+ process.exit(1);
79
+ }
80
+ const sourcesDir = getSourcesDir();
81
+ if (!(await exists(sourcesDir))) {
82
+ await mkdir(sourcesDir, { recursive: true });
83
+ }
84
+ console.log(`\n Assay — Fetching source documents`);
85
+ console.log(` ─────────────────────────────────────\n`);
86
+ const saved = [];
87
+ for (const url of urls) {
88
+ console.log(` Fetching: ${url}`);
89
+ try {
90
+ const content = await fetchPage(url);
91
+ const slug = slugifyUrl(url);
92
+ const filename = `${slug}.txt`;
93
+ const filepath = join(sourcesDir, filename);
94
+ // Prepend source URL as metadata
95
+ const withMeta = `# Source: ${url}\n# Fetched: ${new Date().toISOString()}\n\n${content}`;
96
+ await writeFile(filepath, withMeta, 'utf-8');
97
+ const lineCount = content.split('\n').length;
98
+ console.log(` Saved: .assay/sources/${filename} (${lineCount} lines)`);
99
+ saved.push(filename);
100
+ }
101
+ catch (err) {
102
+ console.error(` Error fetching ${url}: ${err instanceof Error ? err.message : err}`);
103
+ }
104
+ }
105
+ if (saved.length === 0) {
106
+ console.error('\n No documents fetched successfully.');
107
+ process.exit(1);
108
+ }
109
+ console.log(`\n ─────────────────────────────────────`);
110
+ console.log(` Fetched ${saved.length} document(s) to .assay/sources/`);
111
+ console.log(`\n Next: Run \`assay extract --source <filename>\` to extract claims.`);
112
+ console.log(` Or: Run \`assay hallucinate\` to generate a hallucinated spec instead.\n`);
113
+ }
114
+ //# sourceMappingURL=describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/commands/describe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function extractCommand(options: {
2
+ iteration?: string;
3
+ source?: string;
4
+ }): Promise<void>;
@@ -0,0 +1,144 @@
1
+ import { readdir, readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { getAssayDir, getIterationsDir } from '../lib/config.js';
4
+ import { exists } from '../lib/fs-utils.js';
5
+ import { extractClaims } from '../lib/claim-extractor.js';
6
+ async function findLatestIteration(iterDir) {
7
+ if (!(await exists(iterDir)))
8
+ return null;
9
+ const entries = await readdir(iterDir, { withFileTypes: true });
10
+ const nums = entries
11
+ .filter((e) => e.isDirectory())
12
+ .map((e) => parseInt(e.name, 10))
13
+ .filter((n) => !isNaN(n));
14
+ return nums.length === 0 ? null : Math.max(...nums);
15
+ }
16
+ async function findHallucinatedDoc(iterPath) {
17
+ const entries = await readdir(iterPath);
18
+ const doc = entries.find((e) => e.startsWith('hallucinated-') && e.endsWith('.md'));
19
+ if (!doc)
20
+ return null;
21
+ const type = doc.replace('hallucinated-', '').replace('.md', '');
22
+ return { path: join(iterPath, doc), type };
23
+ }
24
+ export async function extractCommand(options) {
25
+ const iterDir = getIterationsDir();
26
+ let content;
27
+ let docType;
28
+ let iteration;
29
+ let iterPath;
30
+ let claimsPath;
31
+ if (options.source) {
32
+ // Extract from a described source document
33
+ const sourcesDir = join(getAssayDir(), 'sources');
34
+ const sourcePath = join(sourcesDir, options.source);
35
+ if (!(await exists(sourcePath))) {
36
+ console.error(` Error: Source file not found: ${sourcePath}`);
37
+ console.error(` Run \`assay describe --url <url>\` first.`);
38
+ process.exit(1);
39
+ }
40
+ content = await readFile(sourcePath, 'utf-8');
41
+ docType = 'source';
42
+ // Create a new iteration for source-based extraction
43
+ const latest = await findLatestIteration(iterDir);
44
+ iteration = (latest ?? 0) + 1;
45
+ iterPath = join(iterDir, String(iteration));
46
+ await mkdir(iterPath, { recursive: true });
47
+ claimsPath = join(iterPath, 'claims.json');
48
+ console.log(`\n Assay — Extracting claims from source (iteration ${iteration})`);
49
+ console.log(` Source: ${options.source}`);
50
+ console.log(` ─────────────────────────────────────\n`);
51
+ }
52
+ else {
53
+ // Extract from a hallucinated document
54
+ if (options.iteration) {
55
+ iteration = parseInt(options.iteration, 10);
56
+ if (isNaN(iteration)) {
57
+ console.error(` Error: Invalid iteration "${options.iteration}". Must be a number.`);
58
+ process.exit(1);
59
+ }
60
+ }
61
+ else {
62
+ const latest = await findLatestIteration(iterDir);
63
+ if (latest === null) {
64
+ console.error(' Error: No iterations found. Run `assay hallucinate` first.');
65
+ process.exit(1);
66
+ }
67
+ iteration = latest;
68
+ }
69
+ iterPath = join(iterDir, String(iteration));
70
+ if (!(await exists(iterPath))) {
71
+ console.error(` Error: Iteration ${iteration} not found at ${iterPath}`);
72
+ process.exit(1);
73
+ }
74
+ claimsPath = join(iterPath, 'claims.json');
75
+ if (await exists(claimsPath)) {
76
+ const existing = JSON.parse(await readFile(claimsPath, 'utf-8'));
77
+ console.log(`\n Warning: claims.json already exists for iteration ${iteration}`);
78
+ console.log(` (${existing.totalClaims} claims, ${existing.testableClaims} testable)`);
79
+ console.log(` Overwriting...\n`);
80
+ }
81
+ const doc = await findHallucinatedDoc(iterPath);
82
+ if (!doc) {
83
+ console.error(` Error: No hallucinated-*.md found in iteration ${iteration}.`);
84
+ process.exit(1);
85
+ }
86
+ docType = doc.type;
87
+ content = await readFile(doc.path, 'utf-8');
88
+ console.log(`\n Assay — Extracting claims (iteration ${iteration})`);
89
+ console.log(` Source: hallucinated-${doc.type}.md`);
90
+ console.log(` ─────────────────────────────────────\n`);
91
+ }
92
+ // Extract claims
93
+ const startTime = Date.now();
94
+ const { claims, inputTokens, outputTokens } = await extractClaims(content, (msg) => console.log(` ${msg}`));
95
+ const durationMs = Date.now() - startTime;
96
+ const testableClaims = claims.filter((c) => c.testable).length;
97
+ // Build extraction result
98
+ const result = {
99
+ iteration,
100
+ documentType: docType,
101
+ claims,
102
+ totalClaims: claims.length,
103
+ testableClaims,
104
+ extractedAt: new Date().toISOString(),
105
+ };
106
+ // Save claims.json
107
+ await writeFile(claimsPath, JSON.stringify(result, null, 2) + '\n', 'utf-8');
108
+ // Update meta.json with actual extraction count
109
+ const metaPath = join(iterPath, 'meta.json');
110
+ if (await exists(metaPath)) {
111
+ const meta = JSON.parse(await readFile(metaPath, 'utf-8'));
112
+ meta.estimatedClaims = claims.length;
113
+ await writeFile(metaPath, JSON.stringify(meta, null, 2) + '\n', 'utf-8');
114
+ }
115
+ // Print category breakdown
116
+ const byCategory = new Map();
117
+ const bySeverity = new Map();
118
+ for (const claim of claims) {
119
+ byCategory.set(claim.category, (byCategory.get(claim.category) || 0) + 1);
120
+ bySeverity.set(claim.severity, (bySeverity.get(claim.severity) || 0) + 1);
121
+ }
122
+ // Print summary
123
+ console.log(`\n ─────────────────────────────────────`);
124
+ console.log(` Saved: .assay/iterations/${iteration}/claims.json`);
125
+ console.log(`\n Total claims: ${claims.length}`);
126
+ console.log(` Testable: ${testableClaims}`);
127
+ console.log(` Non-testable: ${claims.length - testableClaims}`);
128
+ console.log(`\n By category:`);
129
+ for (const [cat, count] of [...byCategory.entries()].sort((a, b) => b[1] - a[1])) {
130
+ console.log(` ${cat.padEnd(16)} ${count}`);
131
+ }
132
+ console.log(`\n By severity:`);
133
+ for (const [sev, count] of [...bySeverity.entries()].sort((a, b) => {
134
+ const order = ['critical', 'high', 'medium', 'low'];
135
+ return order.indexOf(a[0]) - order.indexOf(b[0]);
136
+ })) {
137
+ console.log(` ${sev.padEnd(16)} ${count}`);
138
+ }
139
+ console.log(`\n Input tokens: ${inputTokens.toLocaleString()}`);
140
+ console.log(` Output tokens: ${outputTokens.toLocaleString()}`);
141
+ console.log(` Duration: ${(durationMs / 1000).toFixed(1)}s`);
142
+ console.log(`\n Next: Run \`assay verify --repo /path/to/codebase\` to verify claims.\n`);
143
+ }
144
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function hallucinateCommand(options: {
2
+ type?: string;
3
+ }): Promise<void>;