tryassay 0.34.0 → 0.35.1
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/dist/bayesian/__tests__/bas-calculator.test.d.ts +1 -0
- package/dist/bayesian/__tests__/bas-calculator.test.js +63 -0
- package/dist/bayesian/__tests__/bas-calculator.test.js.map +1 -0
- package/dist/bayesian/__tests__/structural-entropy.test.d.ts +1 -0
- package/dist/bayesian/__tests__/structural-entropy.test.js +21 -0
- package/dist/bayesian/__tests__/structural-entropy.test.js.map +1 -0
- package/dist/bayesian/bas-calculator.d.ts +41 -0
- package/dist/bayesian/bas-calculator.js +198 -0
- package/dist/bayesian/bas-calculator.js.map +1 -0
- package/dist/bayesian/index.d.ts +3 -0
- package/dist/bayesian/index.js +3 -0
- package/dist/bayesian/index.js.map +1 -0
- package/dist/bayesian/structural-entropy.d.ts +12 -0
- package/dist/bayesian/structural-entropy.js +37 -0
- package/dist/bayesian/structural-entropy.js.map +1 -0
- package/dist/bayesian/types.d.ts +37 -0
- package/dist/bayesian/types.js +6 -0
- package/dist/bayesian/types.js.map +1 -0
- package/dist/cli.js +28 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/assess-formal.test.d.ts +1 -0
- package/dist/commands/__tests__/assess-formal.test.js +72 -0
- package/dist/commands/__tests__/assess-formal.test.js.map +1 -0
- package/dist/commands/activate.d.ts +1 -0
- package/dist/commands/activate.js +48 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/assess.js +100 -5
- package/dist/commands/assess.js.map +1 -1
- package/dist/commands/bas-score.d.ts +13 -0
- package/dist/commands/bas-score.js +310 -0
- package/dist/commands/bas-score.js.map +1 -0
- package/dist/commands/bounty-watch.js.map +1 -1
- package/dist/commands/hunt.js +32 -0
- package/dist/commands/hunt.js.map +1 -1
- package/dist/commands/runtime.js +11 -10
- package/dist/commands/runtime.js.map +1 -1
- package/dist/commands/stream-verify.d.ts +16 -0
- package/dist/commands/stream-verify.js +228 -0
- package/dist/commands/stream-verify.js.map +1 -0
- package/dist/commands/watch.js.map +1 -1
- package/dist/hunt/__tests__/deep-dive.test.js.map +1 -1
- package/dist/hunt/__tests__/e2e.test.js.map +1 -1
- package/dist/hunt/__tests__/finding-to-template.test.js +10 -1
- package/dist/hunt/__tests__/finding-to-template.test.js.map +1 -1
- package/dist/hunt/__tests__/orchestrator.test.js.map +1 -1
- package/dist/hunt/__tests__/templates.test.js +2 -2
- package/dist/hunt/__tests__/triage.test.js.map +1 -1
- package/dist/hunt/deep-dive.js +7 -7
- package/dist/hunt/deep-dive.js.map +1 -1
- package/dist/hunt/parse-utils.d.ts +1 -1
- package/dist/hunt/state.js.map +1 -1
- package/dist/hunt/templates/injection.js +1 -1
- package/dist/hunt/templates/injection.js.map +1 -1
- package/dist/hunt/triage.js +5 -5
- package/dist/hunt/triage.js.map +1 -1
- package/dist/lib/__tests__/arithmetic-quick-test.js +10 -9
- package/dist/lib/__tests__/arithmetic-quick-test.js.map +1 -1
- package/dist/lib/__tests__/arithmetic-real-llm-test.js +8 -8
- package/dist/lib/__tests__/arithmetic-real-llm-test.js.map +1 -1
- package/dist/lib/__tests__/formal-verifier-api-misuse.test.js +4 -3
- package/dist/lib/__tests__/formal-verifier-api-misuse.test.js.map +1 -1
- package/dist/lib/__tests__/formal-verifier-behavioral.test.d.ts +18 -0
- package/dist/lib/__tests__/formal-verifier-behavioral.test.js +576 -0
- package/dist/lib/__tests__/formal-verifier-behavioral.test.js.map +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-async.test.d.ts +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-async.test.js +154 -0
- package/dist/lib/__tests__/formal-verifier-claimless-async.test.js.map +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-quality.test.d.ts +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-quality.test.js +121 -0
- package/dist/lib/__tests__/formal-verifier-claimless-quality.test.js.map +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-realworld.test.d.ts +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-realworld.test.js +119 -0
- package/dist/lib/__tests__/formal-verifier-claimless-realworld.test.js.map +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless.test.d.ts +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless.test.js +667 -0
- package/dist/lib/__tests__/formal-verifier-claimless.test.js.map +1 -0
- package/dist/lib/__tests__/mr-gsm8k-benchmark.js +6 -6
- package/dist/lib/__tests__/mr-gsm8k-benchmark.js.map +1 -1
- package/dist/lib/__tests__/pr-harvester.test.js.map +1 -1
- package/dist/lib/assessment-reporter.d.ts +1 -1
- package/dist/lib/assessment-reporter.js +2 -1
- package/dist/lib/assessment-reporter.js.map +1 -1
- package/dist/lib/chain-analyzer.d.ts +4 -3
- package/dist/lib/chain-analyzer.js.map +1 -1
- package/dist/lib/formal-verifier.d.ts +20 -1
- package/dist/lib/formal-verifier.js +1182 -24
- package/dist/lib/formal-verifier.js.map +1 -1
- package/dist/lib/issue-reporter.d.ts +2 -1
- package/dist/lib/issue-reporter.js.map +1 -1
- package/dist/lib/remediation-generator.js.map +1 -1
- package/dist/lib/report-generator.js.map +1 -1
- package/dist/lib/rule-harvester/ground-truth.js +13 -2
- package/dist/lib/rule-harvester/ground-truth.js.map +1 -1
- package/dist/lib/rule-harvester/scanner.d.ts +1 -1
- package/dist/lib/user-config.d.ts +1 -0
- package/dist/lib/user-config.js.map +1 -1
- package/dist/realtime/__tests__/entropy-detector.test.d.ts +1 -0
- package/dist/realtime/__tests__/entropy-detector.test.js +200 -0
- package/dist/realtime/__tests__/entropy-detector.test.js.map +1 -0
- package/dist/realtime/__tests__/entropy-live-demo.d.ts +1 -0
- package/dist/realtime/__tests__/entropy-live-demo.js +103 -0
- package/dist/realtime/__tests__/entropy-live-demo.js.map +1 -0
- package/dist/realtime/__tests__/entropy-live.d.ts +8 -0
- package/dist/realtime/__tests__/entropy-live.js +114 -0
- package/dist/realtime/__tests__/entropy-live.js.map +1 -0
- package/dist/realtime/__tests__/streaming-checks.test.js +3 -4
- package/dist/realtime/__tests__/streaming-checks.test.js.map +1 -1
- package/dist/realtime/entropy-detector.d.ts +143 -0
- package/dist/realtime/entropy-detector.js +504 -0
- package/dist/realtime/entropy-detector.js.map +1 -0
- package/dist/realtime/mcp-server.d.ts +7 -1
- package/dist/realtime/mcp-server.js +378 -2
- package/dist/realtime/mcp-server.js.map +1 -1
- package/dist/realtime/stream-interceptor.d.ts +28 -0
- package/dist/realtime/stream-interceptor.js +204 -0
- package/dist/realtime/stream-interceptor.js.map +1 -1
- package/dist/realtime/streaming-checks.js +28 -0
- package/dist/realtime/streaming-checks.js.map +1 -1
- package/dist/realtime/streaming-verifier.d.ts +45 -0
- package/dist/realtime/streaming-verifier.js +98 -5
- package/dist/realtime/streaming-verifier.js.map +1 -1
- package/dist/realtime/types.d.ts +56 -0
- package/dist/runtime/agents/research-agent.js +10 -1
- package/dist/runtime/agents/research-agent.js.map +1 -1
- package/dist/runtime/agents/test-agent.js +10 -7
- package/dist/runtime/agents/test-agent.js.map +1 -1
- package/dist/runtime/composition-verifier.js +13 -3
- package/dist/runtime/composition-verifier.js.map +1 -1
- package/dist/runtime/fs-helpers.js.map +1 -1
- package/dist/runtime/prompt-safety-analyzer.js.map +1 -1
- package/dist/sdk/verified-generate.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/package.json +3 -2
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { runClaimlessChecks } from '../formal-verifier.js';
|
|
3
|
+
describe('runClaimlessChecks — async/error checks (12–15)', () => {
|
|
4
|
+
// ── Check 12: async forEach ──────────────────────────────────
|
|
5
|
+
describe('async forEach detection', () => {
|
|
6
|
+
it('detects array.forEach(async ...) pattern', () => {
|
|
7
|
+
const code = `
|
|
8
|
+
const items = [1, 2, 3];
|
|
9
|
+
items.forEach(async (item) => {
|
|
10
|
+
await saveItem(item);
|
|
11
|
+
});
|
|
12
|
+
`;
|
|
13
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
14
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('forEach'));
|
|
15
|
+
expect(matched.length).toBeGreaterThan(0);
|
|
16
|
+
expect(matched[0].severity).toBe('critical');
|
|
17
|
+
});
|
|
18
|
+
it('does not flag regular (non-async) forEach', () => {
|
|
19
|
+
const code = `
|
|
20
|
+
const items = [1, 2, 3];
|
|
21
|
+
items.forEach((item) => {
|
|
22
|
+
console.log(item);
|
|
23
|
+
});
|
|
24
|
+
`;
|
|
25
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
26
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('forEach'));
|
|
27
|
+
expect(matched).toHaveLength(0);
|
|
28
|
+
});
|
|
29
|
+
it('detects forEach with async keyword after whitespace', () => {
|
|
30
|
+
const code = `
|
|
31
|
+
data.forEach( async (x) => { await process(x); });
|
|
32
|
+
`;
|
|
33
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
34
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('forEach'));
|
|
35
|
+
expect(matched.length).toBeGreaterThan(0);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
// ── Check 13: Promise.all without error isolation ────────────
|
|
39
|
+
describe('Promise.all without error isolation', () => {
|
|
40
|
+
it('detects bare Promise.all without catch or try/catch', () => {
|
|
41
|
+
const code = `
|
|
42
|
+
async function loadAll() {
|
|
43
|
+
const results = await Promise.all([fetchA(), fetchB(), fetchC()]);
|
|
44
|
+
return results;
|
|
45
|
+
}
|
|
46
|
+
`;
|
|
47
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
48
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('Promise.all'));
|
|
49
|
+
expect(matched.length).toBeGreaterThan(0);
|
|
50
|
+
expect(matched[0].severity).toBe('high');
|
|
51
|
+
});
|
|
52
|
+
it('passes Promise.all wrapped in try/catch', () => {
|
|
53
|
+
const code = `
|
|
54
|
+
async function loadAll() {
|
|
55
|
+
try {
|
|
56
|
+
const results = await Promise.all([fetchA(), fetchB()]);
|
|
57
|
+
return results;
|
|
58
|
+
} catch (e) {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
`;
|
|
63
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
64
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('Promise.all'));
|
|
65
|
+
expect(matched).toHaveLength(0);
|
|
66
|
+
});
|
|
67
|
+
it('passes Promise.all with .catch on individual promises', () => {
|
|
68
|
+
const code = `
|
|
69
|
+
const results = await Promise.all([
|
|
70
|
+
fetchA().catch(() => null),
|
|
71
|
+
fetchB().catch(() => null),
|
|
72
|
+
]);
|
|
73
|
+
`;
|
|
74
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
75
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('Promise.all'));
|
|
76
|
+
expect(matched).toHaveLength(0);
|
|
77
|
+
});
|
|
78
|
+
it('does not flag Promise.allSettled', () => {
|
|
79
|
+
const code = `
|
|
80
|
+
const results = await Promise.allSettled([fetchA(), fetchB()]);
|
|
81
|
+
`;
|
|
82
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
83
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('Promise.all'));
|
|
84
|
+
expect(matched).toHaveLength(0);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
// ── Check 14: Missing await on fetch() ───────────────────────
|
|
88
|
+
describe('missing await on fetch()', () => {
|
|
89
|
+
it('detects const result = fetch(...) without await', () => {
|
|
90
|
+
const code = `
|
|
91
|
+
const response = fetch('/api/data');
|
|
92
|
+
`;
|
|
93
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
94
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('fetch()'));
|
|
95
|
+
expect(matched.length).toBeGreaterThan(0);
|
|
96
|
+
expect(matched[0].severity).toBe('high');
|
|
97
|
+
});
|
|
98
|
+
it('passes when await is present before fetch', () => {
|
|
99
|
+
const code = `
|
|
100
|
+
const response = await fetch('/api/data');
|
|
101
|
+
`;
|
|
102
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
103
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('fetch()'));
|
|
104
|
+
expect(matched).toHaveLength(0);
|
|
105
|
+
});
|
|
106
|
+
it('detects let assignment without await', () => {
|
|
107
|
+
const code = `
|
|
108
|
+
let res = fetch('https://example.com');
|
|
109
|
+
`;
|
|
110
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
111
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('fetch()'));
|
|
112
|
+
expect(matched.length).toBeGreaterThan(0);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
// ── Check 15: throw string instead of Error ──────────────────
|
|
116
|
+
describe('throw string literal detection', () => {
|
|
117
|
+
it('detects throw with double-quoted string', () => {
|
|
118
|
+
const code = `
|
|
119
|
+
function validate(x: number) {
|
|
120
|
+
if (x < 0) throw "value must be positive";
|
|
121
|
+
}
|
|
122
|
+
`;
|
|
123
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
124
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('throws a string'));
|
|
125
|
+
expect(matched.length).toBeGreaterThan(0);
|
|
126
|
+
expect(matched[0].severity).toBe('medium');
|
|
127
|
+
});
|
|
128
|
+
it('detects throw with single-quoted string', () => {
|
|
129
|
+
const code = `
|
|
130
|
+
if (!ok) throw 'something went wrong';
|
|
131
|
+
`;
|
|
132
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
133
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('throws a string'));
|
|
134
|
+
expect(matched.length).toBeGreaterThan(0);
|
|
135
|
+
});
|
|
136
|
+
it('does not flag throw new Error(...)', () => {
|
|
137
|
+
const code = `
|
|
138
|
+
if (!ok) throw new Error('something went wrong');
|
|
139
|
+
`;
|
|
140
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
141
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('throws a string'));
|
|
142
|
+
expect(matched).toHaveLength(0);
|
|
143
|
+
});
|
|
144
|
+
it('detects throw with template literal', () => {
|
|
145
|
+
const code = `
|
|
146
|
+
throw \`invalid value: \${x}\`;
|
|
147
|
+
`;
|
|
148
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
149
|
+
const matched = findings.filter(f => f.checkType === 'error_handling' && f.evidence.includes('throws a string'));
|
|
150
|
+
expect(matched.length).toBeGreaterThan(0);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=formal-verifier-claimless-async.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formal-verifier-claimless-async.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/formal-verifier-claimless-async.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { runClaimlessChecks } from '../formal-verifier.js';
|
|
3
|
+
describe('runClaimlessChecks — quality checks (16–19)', () => {
|
|
4
|
+
// ── Check 16: console.log in production code ──────────────
|
|
5
|
+
describe('console.log in production code', () => {
|
|
6
|
+
it('detects console.log in production code', () => {
|
|
7
|
+
const code = `
|
|
8
|
+
function processOrder(order) {
|
|
9
|
+
console.log("processing", order);
|
|
10
|
+
return saveOrder(order);
|
|
11
|
+
}
|
|
12
|
+
`;
|
|
13
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
14
|
+
const consoleFinding = findings.filter(f => f.checkType === 'debug_artifact');
|
|
15
|
+
expect(consoleFinding.length).toBeGreaterThan(0);
|
|
16
|
+
expect(consoleFinding[0].severity).toBe('medium');
|
|
17
|
+
});
|
|
18
|
+
it('detects console.debug but not console.warn', () => {
|
|
19
|
+
const code = `
|
|
20
|
+
function load() {
|
|
21
|
+
console.debug("loading");
|
|
22
|
+
console.warn("slow");
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
26
|
+
const consoleFinding = findings.filter(f => f.checkType === 'debug_artifact');
|
|
27
|
+
// console.debug triggers, console.warn does NOT (warn is intentional)
|
|
28
|
+
expect(consoleFinding.length).toBeGreaterThanOrEqual(1);
|
|
29
|
+
});
|
|
30
|
+
it('still flags console.log in non-test files', () => {
|
|
31
|
+
// Note: the new check 13 does NOT skip test files — it flags all console.log/debug
|
|
32
|
+
// This is simpler and more correct (tests in the test file below cover this behavior)
|
|
33
|
+
const code = `
|
|
34
|
+
function processOrder(order) {
|
|
35
|
+
console.log("processing", order);
|
|
36
|
+
return saveOrder(order);
|
|
37
|
+
}
|
|
38
|
+
`;
|
|
39
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
40
|
+
const consoleFinding = findings.filter(f => f.checkType === 'debug_artifact');
|
|
41
|
+
expect(consoleFinding.length).toBeGreaterThan(0);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
// ── Check 17: Loose equality == ───────────────────────────
|
|
45
|
+
describe('loose equality ==', () => {
|
|
46
|
+
it('detects loose equality with null', () => {
|
|
47
|
+
const code = `
|
|
48
|
+
function check(val) {
|
|
49
|
+
if (val == null) return;
|
|
50
|
+
if (val == undefined) return;
|
|
51
|
+
}
|
|
52
|
+
`;
|
|
53
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
54
|
+
const eqFindings = findings.filter(f => f.checkType === 'equality_check');
|
|
55
|
+
expect(eqFindings.length).toBeGreaterThan(0);
|
|
56
|
+
expect(eqFindings[0].severity).toBe('medium');
|
|
57
|
+
});
|
|
58
|
+
it('does not flag strict equality ===', () => {
|
|
59
|
+
const code = `
|
|
60
|
+
function check(val) {
|
|
61
|
+
if (val === null) return;
|
|
62
|
+
if (val === undefined) return;
|
|
63
|
+
if (val !== undefined) return;
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
67
|
+
const eqFindings = findings.filter(f => f.checkType === 'equality_check');
|
|
68
|
+
expect(eqFindings).toHaveLength(0);
|
|
69
|
+
});
|
|
70
|
+
it('does not flag == inside comments', () => {
|
|
71
|
+
const code = `
|
|
72
|
+
// if x == null then do something
|
|
73
|
+
const x = 1;
|
|
74
|
+
`;
|
|
75
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
76
|
+
const eqFindings = findings.filter(f => f.checkType === 'equality_check');
|
|
77
|
+
expect(eqFindings).toHaveLength(0);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
// ── Check 18: parseInt without radix ──────────────────────
|
|
81
|
+
describe('parseInt without radix', () => {
|
|
82
|
+
it('detects parseInt without second argument', () => {
|
|
83
|
+
const code = `
|
|
84
|
+
const num = parseInt(value);
|
|
85
|
+
`;
|
|
86
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
87
|
+
const parseFinding = findings.filter(f => f.checkType === 'api_misuse' && f.evidence.includes('parseInt'));
|
|
88
|
+
expect(parseFinding.length).toBeGreaterThan(0);
|
|
89
|
+
expect(parseFinding[0].severity).toBe('medium');
|
|
90
|
+
});
|
|
91
|
+
it('does not flag parseInt with radix', () => {
|
|
92
|
+
const code = `
|
|
93
|
+
const num = parseInt(value, 10);
|
|
94
|
+
`;
|
|
95
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
96
|
+
const parseFinding = findings.filter(f => f.checkType === 'api_misuse' && f.evidence.includes('parseInt'));
|
|
97
|
+
expect(parseFinding).toHaveLength(0);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
// ── Check 19: Array.sort without comparator ───────────────
|
|
101
|
+
describe('Array.sort without comparator', () => {
|
|
102
|
+
it('detects .sort() with empty parens', () => {
|
|
103
|
+
const code = `
|
|
104
|
+
const sorted = numbers.sort();
|
|
105
|
+
`;
|
|
106
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
107
|
+
const sortFinding = findings.filter(f => f.checkType === 'api_misuse' && f.evidence.includes('.sort()'));
|
|
108
|
+
expect(sortFinding.length).toBeGreaterThan(0);
|
|
109
|
+
expect(sortFinding[0].severity).toBe('medium');
|
|
110
|
+
});
|
|
111
|
+
it('does not flag .sort() with a comparator', () => {
|
|
112
|
+
const code = `
|
|
113
|
+
const sorted = numbers.sort((a, b) => a - b);
|
|
114
|
+
`;
|
|
115
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
116
|
+
const sortFinding = findings.filter(f => f.checkType === 'api_misuse' && f.evidence.includes('.sort()'));
|
|
117
|
+
expect(sortFinding).toHaveLength(0);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=formal-verifier-claimless-quality.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formal-verifier-claimless-quality.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/formal-verifier-claimless-quality.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { runClaimlessChecks } from '../formal-verifier.js';
|
|
3
|
+
describe('runClaimlessChecks — real-world regression tests', () => {
|
|
4
|
+
describe('type_annotation tuning', () => {
|
|
5
|
+
it('does not flag export default function (React component pattern)', () => {
|
|
6
|
+
const code = `
|
|
7
|
+
export default function Dashboard({ data }: Props) {
|
|
8
|
+
return <div>{data.title}</div>;
|
|
9
|
+
}
|
|
10
|
+
`;
|
|
11
|
+
const findings = runClaimlessChecks(code, 'tsx');
|
|
12
|
+
const typeFindings = findings.filter(f => f.checkType === 'type_annotation');
|
|
13
|
+
expect(typeFindings).toHaveLength(0);
|
|
14
|
+
});
|
|
15
|
+
it('does not flag tsx files at all for type_annotation', () => {
|
|
16
|
+
const code = `
|
|
17
|
+
export function UserCard({ name }: { name: string }) {
|
|
18
|
+
return <span>{name}</span>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function fetchData(id: string) {
|
|
22
|
+
return await api.get(id);
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
const findings = runClaimlessChecks(code, 'tsx');
|
|
26
|
+
const typeFindings = findings.filter(f => f.checkType === 'type_annotation');
|
|
27
|
+
expect(typeFindings).toHaveLength(0);
|
|
28
|
+
});
|
|
29
|
+
it('does not flag Next.js route handlers (GET, POST, etc.)', () => {
|
|
30
|
+
const code = `
|
|
31
|
+
export async function GET(request: Request) {
|
|
32
|
+
return Response.json({ ok: true });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function POST(request: Request) {
|
|
36
|
+
const body = await request.json();
|
|
37
|
+
return Response.json(body);
|
|
38
|
+
}
|
|
39
|
+
`;
|
|
40
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
41
|
+
const typeFindings = findings.filter(f => f.checkType === 'type_annotation');
|
|
42
|
+
expect(typeFindings).toHaveLength(0);
|
|
43
|
+
});
|
|
44
|
+
it('still flags named exports missing return type in .ts files', () => {
|
|
45
|
+
const code = `
|
|
46
|
+
export function processData(input: string) {
|
|
47
|
+
return input.trim().split(',');
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
51
|
+
const typeFindings = findings.filter(f => f.checkType === 'type_annotation');
|
|
52
|
+
expect(typeFindings.length).toBeGreaterThan(0);
|
|
53
|
+
});
|
|
54
|
+
it('still flags named async exports missing return type in .ts files', () => {
|
|
55
|
+
const code = `
|
|
56
|
+
export async function loadUser(id: string) {
|
|
57
|
+
return await db.users.findOne(id);
|
|
58
|
+
}
|
|
59
|
+
`;
|
|
60
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
61
|
+
const typeFindings = findings.filter(f => f.checkType === 'type_annotation');
|
|
62
|
+
expect(typeFindings.length).toBeGreaterThan(0);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('debug_artifact tuning', () => {
|
|
66
|
+
it('does not flag files with many console.log calls (CLI/logger pattern)', () => {
|
|
67
|
+
const code = `
|
|
68
|
+
function main() {
|
|
69
|
+
console.log("Starting server...");
|
|
70
|
+
console.log("Loading config...");
|
|
71
|
+
console.log("Connecting to database...");
|
|
72
|
+
console.log("Initializing routes...");
|
|
73
|
+
console.log("Server ready on port 3000");
|
|
74
|
+
console.log("Press Ctrl+C to stop");
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
78
|
+
const debugFindings = findings.filter(f => f.checkType === 'debug_artifact');
|
|
79
|
+
expect(debugFindings).toHaveLength(0);
|
|
80
|
+
});
|
|
81
|
+
it('does not flag files with exactly 6 console.log calls (above threshold)', () => {
|
|
82
|
+
const lines = Array.from({ length: 6 }, (_, i) => ` console.log("message ${i}");`).join('\n');
|
|
83
|
+
const code = `function run() {\n${lines}\n}`;
|
|
84
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
85
|
+
const debugFindings = findings.filter(f => f.checkType === 'debug_artifact');
|
|
86
|
+
expect(debugFindings).toHaveLength(0);
|
|
87
|
+
});
|
|
88
|
+
it('still flags files with few console.log calls (likely debug leftovers)', () => {
|
|
89
|
+
const code = `
|
|
90
|
+
function handleSubmit(data: FormData) {
|
|
91
|
+
console.log("debug:", data);
|
|
92
|
+
return saveToDb(data);
|
|
93
|
+
}
|
|
94
|
+
`;
|
|
95
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
96
|
+
const debugFindings = findings.filter(f => f.checkType === 'debug_artifact');
|
|
97
|
+
expect(debugFindings.length).toBeGreaterThan(0);
|
|
98
|
+
});
|
|
99
|
+
it('still flags exactly 5 console.log calls (at threshold)', () => {
|
|
100
|
+
const lines = Array.from({ length: 5 }, (_, i) => ` console.log("debug ${i}");`).join('\n');
|
|
101
|
+
const code = `function run() {\n${lines}\n}`;
|
|
102
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
103
|
+
const debugFindings = findings.filter(f => f.checkType === 'debug_artifact');
|
|
104
|
+
expect(debugFindings).toHaveLength(5);
|
|
105
|
+
});
|
|
106
|
+
it('still flags console.debug calls in small files', () => {
|
|
107
|
+
const code = `
|
|
108
|
+
function fetchUser(id: string) {
|
|
109
|
+
console.debug("fetching user", id);
|
|
110
|
+
return users.get(id);
|
|
111
|
+
}
|
|
112
|
+
`;
|
|
113
|
+
const findings = runClaimlessChecks(code, 'typescript');
|
|
114
|
+
const debugFindings = findings.filter(f => f.checkType === 'debug_artifact');
|
|
115
|
+
expect(debugFindings.length).toBeGreaterThan(0);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=formal-verifier-claimless-realworld.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formal-verifier-claimless-realworld.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/formal-verifier-claimless-realworld.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|