@rigour-labs/core 6.3.1 → 6.4.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/README.md +1 -1
- package/dist/deep/changed-functions.d.ts +15 -0
- package/dist/deep/changed-functions.js +34 -0
- package/dist/deep/code-pass.d.ts +10 -0
- package/dist/deep/code-pass.js +37 -2
- package/dist/deep/code-pass.test.d.ts +1 -0
- package/dist/deep/code-pass.test.js +69 -0
- package/dist/deep/code-review-prompt.d.ts +1 -1
- package/dist/deep/code-review-prompt.js +3 -2
- package/dist/deep/diff-tests/calls.d.ts +8 -0
- package/dist/deep/diff-tests/calls.js +85 -0
- package/dist/deep/diff-tests/calls.test.d.ts +1 -0
- package/dist/deep/diff-tests/calls.test.js +33 -0
- package/dist/deep/diff-tests/run.d.ts +21 -0
- package/dist/deep/diff-tests/run.js +178 -0
- package/dist/deep/diff-tests/run.test.d.ts +1 -0
- package/dist/deep/diff-tests/run.test.js +58 -0
- package/dist/deep/reference-pack.d.ts +19 -0
- package/dist/deep/reference-pack.js +101 -0
- package/dist/deep/reference-pack.test.d.ts +1 -0
- package/dist/deep/reference-pack.test.js +46 -0
- package/dist/deep/review-context-export.d.ts +11 -0
- package/dist/deep/review-context-export.js +31 -0
- package/dist/deep/review-context-export.test.d.ts +1 -0
- package/dist/deep/review-context-export.test.js +32 -0
- package/dist/deep/self-check.d.ts +21 -0
- package/dist/deep/self-check.js +49 -0
- package/dist/firewall/trusted-control.d.ts +1 -2
- package/dist/gates/deep-analysis.d.ts +2 -0
- package/dist/gates/deep-analysis.js +12 -0
- package/dist/gates/deep-runner.js +2 -1
- package/dist/gates/hallucinated-imports/js-resolver.d.ts +7 -0
- package/dist/gates/hallucinated-imports/js-resolver.js +17 -1
- package/dist/gates/hallucinated-imports-sveltekit.test.js +24 -0
- package/dist/gates/semantic-bugs.js +4 -3
- package/dist/gates/semantic-bugs.test.js +11 -5
- package/dist/hooks/checker.d.ts +1 -2
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/stop-review.d.ts +25 -0
- package/dist/hooks/stop-review.js +31 -0
- package/dist/index.d.ts +26 -2
- package/dist/index.js +10 -6
- package/dist/inference/index.d.ts +1 -1
- package/dist/inference/index.js +3 -5
- package/dist/inference/local-model.test.d.ts +1 -0
- package/dist/inference/local-model.test.js +23 -0
- package/dist/inference/sidecar-provider.d.ts +10 -1
- package/dist/inference/sidecar-provider.js +28 -6
- package/dist/inference/types.d.ts +8 -1
- package/dist/inference/types.js +14 -0
- package/dist/inference/types.test.d.ts +1 -0
- package/dist/inference/types.test.js +19 -0
- package/dist/review/agent-fixes.d.ts +18 -0
- package/dist/review/agent-fixes.js +118 -0
- package/dist/review/agent-fixes.test.d.ts +1 -0
- package/dist/review/agent-fixes.test.js +32 -0
- package/dist/review/changed-lines.d.ts +19 -0
- package/dist/review/changed-lines.js +22 -0
- package/dist/review/diff-test-findings.d.ts +3 -0
- package/dist/review/diff-test-findings.js +41 -0
- package/dist/review/effectiveness.d.ts +34 -0
- package/dist/review/effectiveness.js +114 -0
- package/dist/review/effectiveness.test.d.ts +1 -0
- package/dist/review/effectiveness.test.js +42 -0
- package/dist/review/git-diff.d.ts +9 -0
- package/dist/review/git-diff.js +42 -0
- package/dist/review/review.d.ts +38 -0
- package/dist/review/review.js +52 -0
- package/dist/review/review.test.d.ts +1 -0
- package/dist/review/review.test.js +87 -0
- package/dist/semantic/benchmark.js +2 -2
- package/dist/semantic/benchmark.test.js +5 -1
- package/dist/semantic/engine.d.ts +3 -0
- package/dist/semantic/engine.js +8 -2
- package/dist/semantic/failure-handling.d.ts +12 -0
- package/dist/semantic/failure-handling.js +41 -0
- package/dist/semantic/intent/parallel-reads.js +2 -30
- package/dist/semantic/learn/learn.d.ts +2 -0
- package/dist/semantic/learn/learn.js +18 -0
- package/dist/semantic/project-facts.d.ts +25 -0
- package/dist/semantic/project-facts.js +104 -0
- package/dist/semantic/project-facts.test.d.ts +1 -0
- package/dist/semantic/project-facts.test.js +45 -0
- package/dist/semantic/rules/ecosystem/deps-codegen-undeclared-import.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/deps-codegen-undeclared-import.js +71 -0
- package/dist/semantic/rules/ecosystem/deps-internal-symbol.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/deps-internal-symbol.js +36 -0
- package/dist/semantic/rules/ecosystem/dom-self-query-in-component.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/dom-self-query-in-component.js +60 -0
- package/dist/semantic/rules/ecosystem/env-bare-browser-global.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/env-bare-browser-global.js +57 -0
- package/dist/semantic/rules/ecosystem/exports-condition-parity.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/exports-condition-parity.js +57 -0
- package/dist/semantic/rules/ecosystem/exports-forgotten-type.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/exports-forgotten-type.js +128 -0
- package/dist/semantic/rules/ecosystem/imports-barrel-cycle.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/imports-barrel-cycle.js +78 -0
- package/dist/semantic/rules/ecosystem/index.d.ts +15 -0
- package/dist/semantic/rules/ecosystem/index.js +22 -0
- package/dist/semantic/rules/ecosystem/paths-unnormalized-module-key.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/paths-unnormalized-module-key.js +87 -0
- package/dist/semantic/rules/ecosystem/react-inline-html-object.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/react-inline-html-object.js +30 -0
- package/dist/semantic/rules/ecosystem/shared.d.ts +18 -0
- package/dist/semantic/rules/ecosystem/shared.js +43 -0
- package/dist/semantic/rules/ecosystem/solid-jsx-and-conditional.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/solid-jsx-and-conditional.js +36 -0
- package/dist/semantic/rules/ecosystem/ts-internal-in-public-signature.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/ts-internal-in-public-signature.js +66 -0
- package/dist/semantic/rules/ecosystem/vite-rollup-only-hook-field.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/vite-rollup-only-hook-field.js +31 -0
- package/dist/semantic/rules/ecosystem/vue-static-computed.d.ts +2 -0
- package/dist/semantic/rules/ecosystem/vue-static-computed.js +51 -0
- package/dist/semantic/sites/call-sites.d.ts +25 -0
- package/dist/semantic/sites/call-sites.js +69 -0
- package/dist/semantic/sites/call-sites.test.d.ts +1 -0
- package/dist/semantic/sites/call-sites.test.js +46 -0
- package/dist/semantic/sites/export.d.ts +2 -0
- package/dist/semantic/sites/export.js +22 -0
- package/dist/semantic/types.d.ts +4 -0
- package/dist/services/engineering-knowledge-graph.d.ts +1 -2
- package/dist/templates/universal-config.js +2 -1
- package/dist/types/index.d.ts +31 -8
- package/dist/types/index.js +4 -2
- package/dist/utils/diff-removed.test.d.ts +1 -0
- package/dist/utils/diff-removed.test.js +29 -0
- package/dist/utils/diff.d.ts +12 -0
- package/dist/utils/diff.js +26 -0
- package/package.json +6 -6
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { exportCallSites } from './export.js';
|
|
6
|
+
let dir;
|
|
7
|
+
afterEach(() => { if (dir)
|
|
8
|
+
fs.rmSync(dir, { recursive: true, force: true }); dir = undefined; });
|
|
9
|
+
function sites(code) {
|
|
10
|
+
dir = fs.mkdtempSync(path.join(os.tmpdir(), 'call-sites-'));
|
|
11
|
+
fs.writeFileSync(path.join(dir, 'main.ts'), code);
|
|
12
|
+
return exportCallSites(dir, ['main.ts']).map(s => [s.function, s.callee, s.ordinal, s.handledBy]);
|
|
13
|
+
}
|
|
14
|
+
const DECLS = 'declare function a(): Promise<number>;\ndeclare function b(): Promise<number>;\n';
|
|
15
|
+
describe('findCallSites', () => {
|
|
16
|
+
it('reports awaited calls and says how each handles failure', () => {
|
|
17
|
+
expect(sites(`${DECLS}
|
|
18
|
+
export async function load() {
|
|
19
|
+
const x = await a();
|
|
20
|
+
try { await b(); } catch { return 0; }
|
|
21
|
+
const y = await a().catch(() => 0);
|
|
22
|
+
return x + y;
|
|
23
|
+
}`)).toEqual([
|
|
24
|
+
['load', 'a', 0, null],
|
|
25
|
+
['load', 'b', 0, 'try'],
|
|
26
|
+
['load', 'a', 1, 'call'],
|
|
27
|
+
]);
|
|
28
|
+
});
|
|
29
|
+
it('treats each element of Promise.all as a site, and allSettled as handled', () => {
|
|
30
|
+
expect(sites(`${DECLS}
|
|
31
|
+
export async function both() {
|
|
32
|
+
const [x, y] = await Promise.all([a(), b()]);
|
|
33
|
+
const settled = await Promise.allSettled([a()]);
|
|
34
|
+
return [x, y, settled];
|
|
35
|
+
}`)).toEqual([
|
|
36
|
+
['both', 'a', 0, null],
|
|
37
|
+
['both', 'b', 0, null],
|
|
38
|
+
['both', 'a', 1, 'all-settled'],
|
|
39
|
+
]);
|
|
40
|
+
});
|
|
41
|
+
it('counts a callee that catches and returns as handled', () => {
|
|
42
|
+
expect(sites(`${DECLS}
|
|
43
|
+
async function safeA() { try { return await a(); } catch { return 0; } }
|
|
44
|
+
export async function use() { return await safeA(); }`)).toContainEqual(['use', 'safeA', 0, 'call']);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call sites for a set of files, through the same program construction the
|
|
3
|
+
* semantic engine uses (project modules resolved, libraries skipped).
|
|
4
|
+
*/
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { loadProjectConfig, programBatches } from '../program.js';
|
|
7
|
+
import { findCallSites } from './call-sites.js';
|
|
8
|
+
const SOURCE = /\.(?:[cm]?[jt]s|[jt]sx)$/i;
|
|
9
|
+
export function exportCallSites(cwd, files) {
|
|
10
|
+
const roots = files.filter(f => SOURCE.test(f) && !/\.d\.[cm]?ts$/i.test(f)).map(f => path.resolve(cwd, f));
|
|
11
|
+
if (roots.length === 0)
|
|
12
|
+
return [];
|
|
13
|
+
const wanted = new Set(roots.map(r => path.normalize(r)));
|
|
14
|
+
const sites = [];
|
|
15
|
+
for (const program of programBatches(roots, loadProjectConfig(cwd).options)) {
|
|
16
|
+
for (const sourceFile of program.getSourceFiles()) {
|
|
17
|
+
if (wanted.delete(path.normalize(sourceFile.fileName)))
|
|
18
|
+
sites.push(...findCallSites(cwd, program.getTypeChecker(), sourceFile));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return sites;
|
|
22
|
+
}
|
package/dist/semantic/types.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type ts from 'typescript';
|
|
9
9
|
import type { Provenance, Severity } from '../types/index.js';
|
|
10
|
+
import type { ProjectFacts } from './project-facts.js';
|
|
10
11
|
import type { Summaries } from './summaries.js';
|
|
11
12
|
export interface SemanticFinding {
|
|
12
13
|
rule: string;
|
|
@@ -22,9 +23,12 @@ export interface SemanticFinding {
|
|
|
22
23
|
}
|
|
23
24
|
export interface RuleContext {
|
|
24
25
|
cwd: string;
|
|
26
|
+
program: ts.Program;
|
|
25
27
|
checker: ts.TypeChecker;
|
|
26
28
|
sourceFile: ts.SourceFile;
|
|
27
29
|
summaries: Summaries;
|
|
30
|
+
/** The file's own package: declared dependencies and compiler options. */
|
|
31
|
+
project: ProjectFacts;
|
|
28
32
|
}
|
|
29
33
|
export interface SemanticRule {
|
|
30
34
|
id: string;
|
|
@@ -27,7 +27,7 @@ export interface EngineeringKnowledgeGraph {
|
|
|
27
27
|
truncated: boolean;
|
|
28
28
|
counts: Record<string, number>;
|
|
29
29
|
}
|
|
30
|
-
interface GraphInput {
|
|
30
|
+
export interface GraphInput {
|
|
31
31
|
repository: {
|
|
32
32
|
id: string;
|
|
33
33
|
name: string;
|
|
@@ -65,4 +65,3 @@ interface GraphInput {
|
|
|
65
65
|
maxFiles?: number;
|
|
66
66
|
}
|
|
67
67
|
export declare function buildEngineeringKnowledgeGraph(input: GraphInput): EngineeringKnowledgeGraph;
|
|
68
|
-
export {};
|
|
@@ -235,7 +235,7 @@ export const UNIVERSAL_CONFIG = {
|
|
|
235
235
|
track_returns: true,
|
|
236
236
|
},
|
|
237
237
|
semantic_bugs: {
|
|
238
|
-
enabled:
|
|
238
|
+
enabled: true,
|
|
239
239
|
},
|
|
240
240
|
side_effect_analysis: {
|
|
241
241
|
enabled: true,
|
|
@@ -252,6 +252,7 @@ export const UNIVERSAL_CONFIG = {
|
|
|
252
252
|
deep: {
|
|
253
253
|
enabled: false,
|
|
254
254
|
pro: false,
|
|
255
|
+
max: false,
|
|
255
256
|
provider: 'local',
|
|
256
257
|
threads: 4,
|
|
257
258
|
temperature: 0.1,
|
package/dist/types/index.d.ts
CHANGED
|
@@ -577,6 +577,7 @@ export declare const GatesSchema: z.ZodObject<{
|
|
|
577
577
|
deep: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
578
578
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
579
579
|
pro: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
580
|
+
max: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
580
581
|
provider: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
581
582
|
api_key: z.ZodOptional<z.ZodString>;
|
|
582
583
|
api_base_url: z.ZodOptional<z.ZodString>;
|
|
@@ -618,6 +619,7 @@ export declare const GatesSchema: z.ZodObject<{
|
|
|
618
619
|
}, "strip", z.ZodTypeAny, {
|
|
619
620
|
enabled: boolean;
|
|
620
621
|
pro: boolean;
|
|
622
|
+
max: boolean;
|
|
621
623
|
provider: string;
|
|
622
624
|
threads: number;
|
|
623
625
|
temperature: number;
|
|
@@ -641,6 +643,7 @@ export declare const GatesSchema: z.ZodObject<{
|
|
|
641
643
|
}, {
|
|
642
644
|
enabled?: boolean | undefined;
|
|
643
645
|
pro?: boolean | undefined;
|
|
646
|
+
max?: boolean | undefined;
|
|
644
647
|
provider?: string | undefined;
|
|
645
648
|
api_key?: string | undefined;
|
|
646
649
|
api_base_url?: string | undefined;
|
|
@@ -666,6 +669,7 @@ export declare const GatesSchema: z.ZodObject<{
|
|
|
666
669
|
deep: {
|
|
667
670
|
enabled: boolean;
|
|
668
671
|
pro: boolean;
|
|
672
|
+
max: boolean;
|
|
669
673
|
provider: string;
|
|
670
674
|
threads: number;
|
|
671
675
|
temperature: number;
|
|
@@ -899,6 +903,7 @@ export declare const GatesSchema: z.ZodObject<{
|
|
|
899
903
|
deep?: {
|
|
900
904
|
enabled?: boolean | undefined;
|
|
901
905
|
pro?: boolean | undefined;
|
|
906
|
+
max?: boolean | undefined;
|
|
902
907
|
provider?: string | undefined;
|
|
903
908
|
api_key?: string | undefined;
|
|
904
909
|
api_base_url?: string | undefined;
|
|
@@ -1766,6 +1771,7 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
1766
1771
|
deep: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
1767
1772
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1768
1773
|
pro: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1774
|
+
max: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1769
1775
|
provider: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
1770
1776
|
api_key: z.ZodOptional<z.ZodString>;
|
|
1771
1777
|
api_base_url: z.ZodOptional<z.ZodString>;
|
|
@@ -1807,6 +1813,7 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
1807
1813
|
}, "strip", z.ZodTypeAny, {
|
|
1808
1814
|
enabled: boolean;
|
|
1809
1815
|
pro: boolean;
|
|
1816
|
+
max: boolean;
|
|
1810
1817
|
provider: string;
|
|
1811
1818
|
threads: number;
|
|
1812
1819
|
temperature: number;
|
|
@@ -1830,6 +1837,7 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
1830
1837
|
}, {
|
|
1831
1838
|
enabled?: boolean | undefined;
|
|
1832
1839
|
pro?: boolean | undefined;
|
|
1840
|
+
max?: boolean | undefined;
|
|
1833
1841
|
provider?: string | undefined;
|
|
1834
1842
|
api_key?: string | undefined;
|
|
1835
1843
|
api_base_url?: string | undefined;
|
|
@@ -1855,6 +1863,7 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
1855
1863
|
deep: {
|
|
1856
1864
|
enabled: boolean;
|
|
1857
1865
|
pro: boolean;
|
|
1866
|
+
max: boolean;
|
|
1858
1867
|
provider: string;
|
|
1859
1868
|
threads: number;
|
|
1860
1869
|
temperature: number;
|
|
@@ -2088,6 +2097,7 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
2088
2097
|
deep?: {
|
|
2089
2098
|
enabled?: boolean | undefined;
|
|
2090
2099
|
pro?: boolean | undefined;
|
|
2100
|
+
max?: boolean | undefined;
|
|
2091
2101
|
provider?: string | undefined;
|
|
2092
2102
|
api_key?: string | undefined;
|
|
2093
2103
|
api_base_url?: string | undefined;
|
|
@@ -2363,6 +2373,7 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
2363
2373
|
deep: {
|
|
2364
2374
|
enabled: boolean;
|
|
2365
2375
|
pro: boolean;
|
|
2376
|
+
max: boolean;
|
|
2366
2377
|
provider: string;
|
|
2367
2378
|
threads: number;
|
|
2368
2379
|
temperature: number;
|
|
@@ -2622,6 +2633,7 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
2622
2633
|
deep?: {
|
|
2623
2634
|
enabled?: boolean | undefined;
|
|
2624
2635
|
pro?: boolean | undefined;
|
|
2636
|
+
max?: boolean | undefined;
|
|
2625
2637
|
provider?: string | undefined;
|
|
2626
2638
|
api_key?: string | undefined;
|
|
2627
2639
|
api_base_url?: string | undefined;
|
|
@@ -3003,7 +3015,7 @@ export declare const ReportSchema: z.ZodObject<{
|
|
|
3003
3015
|
/** ok: every inference ran; partial: some failed; error: deep did not run. */
|
|
3004
3016
|
status: z.ZodOptional<z.ZodEnum<["ok", "partial", "error"]>>;
|
|
3005
3017
|
mode: z.ZodOptional<z.ZodEnum<["facts", "code"]>>;
|
|
3006
|
-
tier: z.ZodOptional<z.ZodEnum<["deep", "lite", "legacy", "cloud"]>>;
|
|
3018
|
+
tier: z.ZodOptional<z.ZodEnum<["deep", "lite", "legacy", "max", "cloud"]>>;
|
|
3007
3019
|
model: z.ZodOptional<z.ZodString>;
|
|
3008
3020
|
model_fallback: z.ZodOptional<z.ZodBoolean>;
|
|
3009
3021
|
total_ms: z.ZodOptional<z.ZodNumber>;
|
|
@@ -3018,7 +3030,7 @@ export declare const ReportSchema: z.ZodObject<{
|
|
|
3018
3030
|
status?: "ok" | "partial" | "error" | undefined;
|
|
3019
3031
|
mode?: "code" | "facts" | undefined;
|
|
3020
3032
|
error?: string | undefined;
|
|
3021
|
-
tier?: "deep" | "lite" | "legacy" | "cloud" | undefined;
|
|
3033
|
+
tier?: "deep" | "max" | "lite" | "legacy" | "cloud" | undefined;
|
|
3022
3034
|
model?: string | undefined;
|
|
3023
3035
|
model_fallback?: boolean | undefined;
|
|
3024
3036
|
total_ms?: number | undefined;
|
|
@@ -3032,7 +3044,7 @@ export declare const ReportSchema: z.ZodObject<{
|
|
|
3032
3044
|
status?: "ok" | "partial" | "error" | undefined;
|
|
3033
3045
|
mode?: "code" | "facts" | undefined;
|
|
3034
3046
|
error?: string | undefined;
|
|
3035
|
-
tier?: "deep" | "lite" | "legacy" | "cloud" | undefined;
|
|
3047
|
+
tier?: "deep" | "max" | "lite" | "legacy" | "cloud" | undefined;
|
|
3036
3048
|
model?: string | undefined;
|
|
3037
3049
|
model_fallback?: boolean | undefined;
|
|
3038
3050
|
total_ms?: number | undefined;
|
|
@@ -3049,7 +3061,7 @@ export declare const ReportSchema: z.ZodObject<{
|
|
|
3049
3061
|
status?: "ok" | "partial" | "error" | undefined;
|
|
3050
3062
|
mode?: "code" | "facts" | undefined;
|
|
3051
3063
|
error?: string | undefined;
|
|
3052
|
-
tier?: "deep" | "lite" | "legacy" | "cloud" | undefined;
|
|
3064
|
+
tier?: "deep" | "max" | "lite" | "legacy" | "cloud" | undefined;
|
|
3053
3065
|
model?: string | undefined;
|
|
3054
3066
|
model_fallback?: boolean | undefined;
|
|
3055
3067
|
total_ms?: number | undefined;
|
|
@@ -3078,7 +3090,7 @@ export declare const ReportSchema: z.ZodObject<{
|
|
|
3078
3090
|
status?: "ok" | "partial" | "error" | undefined;
|
|
3079
3091
|
mode?: "code" | "facts" | undefined;
|
|
3080
3092
|
error?: string | undefined;
|
|
3081
|
-
tier?: "deep" | "lite" | "legacy" | "cloud" | undefined;
|
|
3093
|
+
tier?: "deep" | "max" | "lite" | "legacy" | "cloud" | undefined;
|
|
3082
3094
|
model?: string | undefined;
|
|
3083
3095
|
model_fallback?: boolean | undefined;
|
|
3084
3096
|
total_ms?: number | undefined;
|
|
@@ -3109,7 +3121,7 @@ export declare const ReportSchema: z.ZodObject<{
|
|
|
3109
3121
|
status?: "ok" | "partial" | "error" | undefined;
|
|
3110
3122
|
mode?: "code" | "facts" | undefined;
|
|
3111
3123
|
error?: string | undefined;
|
|
3112
|
-
tier?: "deep" | "lite" | "legacy" | "cloud" | undefined;
|
|
3124
|
+
tier?: "deep" | "max" | "lite" | "legacy" | "cloud" | undefined;
|
|
3113
3125
|
model?: string | undefined;
|
|
3114
3126
|
model_fallback?: boolean | undefined;
|
|
3115
3127
|
total_ms?: number | undefined;
|
|
@@ -3157,7 +3169,7 @@ export declare const ReportSchema: z.ZodObject<{
|
|
|
3157
3169
|
status?: "ok" | "partial" | "error" | undefined;
|
|
3158
3170
|
mode?: "code" | "facts" | undefined;
|
|
3159
3171
|
error?: string | undefined;
|
|
3160
|
-
tier?: "deep" | "lite" | "legacy" | "cloud" | undefined;
|
|
3172
|
+
tier?: "deep" | "max" | "lite" | "legacy" | "cloud" | undefined;
|
|
3161
3173
|
model?: string | undefined;
|
|
3162
3174
|
model_fallback?: boolean | undefined;
|
|
3163
3175
|
total_ms?: number | undefined;
|
|
@@ -3199,10 +3211,14 @@ export declare const ReportSchema: z.ZodObject<{
|
|
|
3199
3211
|
}[];
|
|
3200
3212
|
}>;
|
|
3201
3213
|
export type Report = z.infer<typeof ReportSchema>;
|
|
3202
|
-
/** Options passed from CLI --deep / --pro / -k flags */
|
|
3214
|
+
/** Options passed from CLI --deep / --pro / --max / -k flags */
|
|
3203
3215
|
export interface DeepOptions {
|
|
3204
3216
|
enabled: boolean;
|
|
3205
3217
|
pro?: boolean;
|
|
3218
|
+
/** Local 7B model: the strongest free tier, for laptops with 16GB. */
|
|
3219
|
+
max?: boolean;
|
|
3220
|
+
/** A local GGUF to run instead of the tier's published model (evaluating a fine-tune before release). */
|
|
3221
|
+
modelPath?: string;
|
|
3206
3222
|
apiKey?: string;
|
|
3207
3223
|
provider?: string;
|
|
3208
3224
|
apiBaseUrl?: string;
|
|
@@ -3210,4 +3226,11 @@ export interface DeepOptions {
|
|
|
3210
3226
|
agents?: number;
|
|
3211
3227
|
maxFiles?: number;
|
|
3212
3228
|
focusLines?: Record<string, number[]>;
|
|
3229
|
+
/** Lines the change removed per file, anchored at the new-side line (from a diff). */
|
|
3230
|
+
removedLines?: Record<string, Array<{
|
|
3231
|
+
line: number;
|
|
3232
|
+
text: string[];
|
|
3233
|
+
}>>;
|
|
3234
|
+
/** What the change intends (a PR description): reference for the stronger tiers. */
|
|
3235
|
+
prBody?: string;
|
|
3213
3236
|
}
|
package/dist/types/index.js
CHANGED
|
@@ -266,8 +266,9 @@ export const GatesSchema = z.object({
|
|
|
266
266
|
audit_log: z.boolean().optional().default(true),
|
|
267
267
|
}).optional().default({}),
|
|
268
268
|
// v4.3+ Side-Effect Safety Analysis
|
|
269
|
+
// On by default: full scans of three real repositories reported no finding that was not a real defect.
|
|
269
270
|
semantic_bugs: z.object({
|
|
270
|
-
enabled: z.boolean().optional().default(
|
|
271
|
+
enabled: z.boolean().optional().default(true),
|
|
271
272
|
rules: z.array(z.string()).optional(),
|
|
272
273
|
}).optional().default({}),
|
|
273
274
|
side_effect_analysis: z.object({
|
|
@@ -301,6 +302,7 @@ export const GatesSchema = z.object({
|
|
|
301
302
|
deep: z.object({
|
|
302
303
|
enabled: z.boolean().optional().default(false),
|
|
303
304
|
pro: z.boolean().optional().default(false),
|
|
305
|
+
max: z.boolean().optional().default(false), // local Qwen2.5-Coder-7B (4.7GB); needs ~8GB free memory
|
|
304
306
|
provider: z.string().optional().default('local'), // 'local' for sidecar, or any cloud: 'claude', 'openai', 'gemini', 'groq', 'mistral', 'together', etc.
|
|
305
307
|
api_key: z.string().optional(),
|
|
306
308
|
api_base_url: z.string().optional(), // custom API base URL (for self-hosted, proxies, any OpenAI-compatible endpoint)
|
|
@@ -412,7 +414,7 @@ export const ReportSchema = z.object({
|
|
|
412
414
|
/** ok: every inference ran; partial: some failed; error: deep did not run. */
|
|
413
415
|
status: z.enum(['ok', 'partial', 'error']).optional(),
|
|
414
416
|
mode: z.enum(['facts', 'code']).optional(),
|
|
415
|
-
tier: z.enum(['deep', 'lite', 'legacy', 'cloud']).optional(),
|
|
417
|
+
tier: z.enum(['deep', 'lite', 'legacy', 'max', 'cloud']).optional(),
|
|
416
418
|
model: z.string().optional(),
|
|
417
419
|
model_fallback: z.boolean().optional(),
|
|
418
420
|
total_ms: z.number().optional(),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { parseDiff, removedByFile } from './diff.js';
|
|
3
|
+
const DIFF = `diff --git a/src/a.ts b/src/a.ts
|
|
4
|
+
--- a/src/a.ts
|
|
5
|
+
+++ b/src/a.ts
|
|
6
|
+
@@ -1,5 +1,4 @@
|
|
7
|
+
export function load(id: string) {
|
|
8
|
+
- if (!id) return null;
|
|
9
|
+
- audit(id);
|
|
10
|
+
+ audit(id ?? '');
|
|
11
|
+
return fetch(id);
|
|
12
|
+
}
|
|
13
|
+
@@ -20,2 +19,1 @@
|
|
14
|
+
-const legacy = true;
|
|
15
|
+
export const x = 1;
|
|
16
|
+
`;
|
|
17
|
+
describe('removedByFile', () => {
|
|
18
|
+
it('groups removed lines into blocks anchored at the new-side line', () => {
|
|
19
|
+
expect(removedByFile(DIFF)).toEqual({
|
|
20
|
+
'src/a.ts': [
|
|
21
|
+
{ line: 2, text: [' if (!id) return null;', ' audit(id);'] },
|
|
22
|
+
{ line: 19, text: ['const legacy = true;'] },
|
|
23
|
+
],
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
it('leaves added-line parsing unchanged', () => {
|
|
27
|
+
expect([...parseDiff(DIFF)['src/a.ts']]).toEqual([2]);
|
|
28
|
+
});
|
|
29
|
+
});
|
package/dist/utils/diff.d.ts
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
1
|
export declare function parseDiff(diff: string): Record<string, Set<number>>;
|
|
2
2
|
/** Changed lines as sorted arrays, the shape DeepOptions.focusLines takes. */
|
|
3
3
|
export declare function changedLinesByFile(mapping: Record<string, Set<number>>): Record<string, number[]>;
|
|
4
|
+
/** Lines a change removed, anchored at the new-side line where they were. */
|
|
5
|
+
export interface RemovedBlock {
|
|
6
|
+
/** New-side line the removal sits before (1-based). */
|
|
7
|
+
line: number;
|
|
8
|
+
text: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Removed lines per file, grouped into consecutive blocks. A reviewer needs
|
|
12
|
+
* what a change deleted as much as what it added: a dropped guard or a
|
|
13
|
+
* deleted call is invisible in the new file alone.
|
|
14
|
+
*/
|
|
15
|
+
export declare function removedByFile(diff: string): Record<string, RemovedBlock[]>;
|
package/dist/utils/diff.js
CHANGED
|
@@ -50,3 +50,29 @@ function readHunkHeader(state, line) {
|
|
|
50
50
|
export function changedLinesByFile(mapping) {
|
|
51
51
|
return Object.fromEntries(Object.entries(mapping).map(([file, lines]) => [file, [...lines].sort((a, b) => a - b)]));
|
|
52
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Removed lines per file, grouped into consecutive blocks. A reviewer needs
|
|
55
|
+
* what a change deleted as much as what it added: a dropped guard or a
|
|
56
|
+
* deleted call is invisible in the new file alone.
|
|
57
|
+
*/
|
|
58
|
+
export function removedByFile(diff) {
|
|
59
|
+
const removed = {};
|
|
60
|
+
const state = { mapping: {}, file: '', newLine: 0, oldLeft: 0, newLeft: 0 };
|
|
61
|
+
let open = null;
|
|
62
|
+
for (const line of diff.split('\n')) {
|
|
63
|
+
const inHunk = state.oldLeft > 0 || state.newLeft > 0;
|
|
64
|
+
if (inHunk && line.startsWith('-') && state.file) {
|
|
65
|
+
if (!open)
|
|
66
|
+
(removed[state.file] ??= []).push(open = { line: state.newLine, text: [] });
|
|
67
|
+
open.text.push(line.slice(1));
|
|
68
|
+
}
|
|
69
|
+
else if (!line.startsWith('\\')) {
|
|
70
|
+
open = null;
|
|
71
|
+
}
|
|
72
|
+
if (inHunk)
|
|
73
|
+
readHunkLine(state, line);
|
|
74
|
+
else
|
|
75
|
+
readHeaderLine(state, line);
|
|
76
|
+
}
|
|
77
|
+
return removed;
|
|
78
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rigour-labs/core",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.4.1",
|
|
4
4
|
"description": "AI-native quality gate engine with local Bayesian learning. AST analysis, drift detection, Fix Packet generation, and agent self-healing across TypeScript, JavaScript, Python, Go, Ruby, and C#.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://rigour.run",
|
|
@@ -67,11 +67,11 @@
|
|
|
67
67
|
"pg": "^8.16.3",
|
|
68
68
|
"sqlite3": "^5.1.7",
|
|
69
69
|
"openai": "^4.104.0",
|
|
70
|
-
"@rigour-labs/brain-darwin-
|
|
71
|
-
"@rigour-labs/brain-darwin-
|
|
72
|
-
"@rigour-labs/brain-linux-x64": "6.
|
|
73
|
-
"@rigour-labs/brain-
|
|
74
|
-
"@rigour-labs/brain-
|
|
70
|
+
"@rigour-labs/brain-darwin-arm64": "6.4.1",
|
|
71
|
+
"@rigour-labs/brain-darwin-x64": "6.4.1",
|
|
72
|
+
"@rigour-labs/brain-linux-x64": "6.4.1",
|
|
73
|
+
"@rigour-labs/brain-win-x64": "6.4.1",
|
|
74
|
+
"@rigour-labs/brain-linux-arm64": "6.4.1"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
77
|
"@types/fs-extra": "^11.0.4",
|