@rigour-labs/core 6.5.1 → 6.5.3
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/context/automatic-index.d.ts +5 -0
- package/dist/context/automatic-index.js +24 -3
- package/dist/context/index-status.test.d.ts +1 -0
- package/dist/context/index-status.test.js +26 -0
- package/dist/deep/fact-extractor.js +2 -1
- package/dist/deep/fact-extractor.test.js +2 -1
- package/dist/gates/ast.js +4 -2
- package/dist/gates/coverage.js +4 -2
- package/dist/gates/dedupe-failures.test.d.ts +1 -0
- package/dist/gates/dedupe-failures.test.js +12 -0
- package/dist/gates/deprecated-dependencies.d.ts +27 -0
- package/dist/gates/deprecated-dependencies.js +104 -0
- package/dist/gates/deprecated-dependencies.test.d.ts +1 -0
- package/dist/gates/deprecated-dependencies.test.js +55 -0
- package/dist/gates/runner.d.ts +7 -1
- package/dist/gates/runner.js +25 -11
- package/dist/gates/security-patterns-data.js +2 -1
- package/dist/gates/security-patterns-owasp.test.js +15 -0
- package/dist/gates/semantic-bugs.js +1 -1
- package/dist/gates/unindexed-reads/coverage.d.ts +15 -0
- package/dist/gates/unindexed-reads/coverage.js +24 -0
- package/dist/gates/unindexed-reads/index.d.ts +20 -0
- package/dist/gates/unindexed-reads/index.js +98 -0
- package/dist/gates/unindexed-reads/queries.d.ts +17 -0
- package/dist/gates/unindexed-reads/queries.js +147 -0
- package/dist/gates/unindexed-reads/queries.test.d.ts +1 -0
- package/dist/gates/unindexed-reads/queries.test.js +54 -0
- package/dist/gates/unindexed-reads/schema.d.ts +38 -0
- package/dist/gates/unindexed-reads/schema.js +256 -0
- package/dist/gates/unindexed-reads/schema.test.d.ts +1 -0
- package/dist/gates/unindexed-reads/schema.test.js +81 -0
- package/dist/gates/unindexed-reads/sql.d.ts +21 -0
- package/dist/gates/unindexed-reads/sql.js +131 -0
- package/dist/gates/unindexed-reads/unindexed-reads.test.d.ts +1 -0
- package/dist/gates/unindexed-reads/unindexed-reads.test.js +90 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +4 -1
- package/dist/inference/brain-placeholder.test.d.ts +1 -0
- package/dist/inference/brain-placeholder.test.js +28 -0
- package/dist/inference/llama-engine-checksum.test.d.ts +1 -0
- package/dist/inference/llama-engine-checksum.test.js +27 -0
- package/dist/inference/llama-engine.d.ts +4 -1
- package/dist/inference/llama-engine.js +15 -8
- package/dist/memory/recall.d.ts +37 -0
- package/dist/memory/recall.js +93 -0
- package/dist/memory/recall.test.d.ts +1 -0
- package/dist/memory/recall.test.js +36 -0
- package/dist/pattern-index/assess.d.ts +16 -0
- package/dist/pattern-index/assess.js +37 -0
- package/dist/pattern-index/embeddings.d.ts +19 -0
- package/dist/pattern-index/embeddings.js +16 -0
- package/dist/pattern-index/index.d.ts +3 -2
- package/dist/pattern-index/index.js +4 -2
- package/dist/pattern-index/indexer.js +19 -9
- package/dist/pattern-index/matcher.d.ts +6 -0
- package/dist/pattern-index/matcher.js +13 -3
- package/dist/pattern-index/pattern-reuse.test.d.ts +1 -0
- package/dist/pattern-index/pattern-reuse.test.js +76 -0
- package/dist/pattern-index/staleness.d.ts +2 -15
- package/dist/pattern-index/staleness.js +1 -78
- package/dist/pattern-index/types.d.ts +2 -0
- package/dist/review/agent-fixes.d.ts +4 -0
- package/dist/review/agent-fixes.js +10 -7
- package/dist/review/agent-fixes.test.js +4 -4
- package/dist/review/changed-lines.d.ts +2 -1
- package/dist/review/changed-lines.js +12 -2
- package/dist/review/check-outcomes.d.ts +31 -0
- package/dist/review/check-outcomes.js +81 -0
- package/dist/review/check-outcomes.test.d.ts +1 -0
- package/dist/review/check-outcomes.test.js +56 -0
- package/dist/review/migration-order.d.ts +5 -0
- package/dist/review/migration-order.js +70 -0
- package/dist/review/migration-order.test.d.ts +1 -0
- package/dist/review/migration-order.test.js +62 -0
- package/dist/review/quiet.d.ts +2 -0
- package/dist/review/quiet.js +12 -3
- package/dist/review/review.d.ts +4 -0
- package/dist/review/review.js +17 -5
- package/dist/review/review.test.js +36 -1
- package/dist/semantic/ast.d.ts +1 -0
- package/dist/semantic/ast.js +4 -0
- package/dist/semantic/learn/compile.js +3 -1
- package/dist/semantic/learn/learn.js +40 -5
- package/dist/semantic/types.d.ts +2 -0
- package/dist/services/context-scope-summary.test.d.ts +1 -0
- package/dist/services/context-scope-summary.test.js +17 -0
- package/dist/services/context-telemetry-service.js +2 -1
- package/dist/storage/context-telemetry.js +33 -19
- package/dist/storage/db.js +52 -1
- package/dist/storage/findings.js +1 -1
- package/dist/storage/fix-lessons.d.ts +13 -0
- package/dist/storage/fix-lessons.js +84 -0
- package/dist/storage/fix-lessons.test.d.ts +1 -0
- package/dist/storage/fix-lessons.test.js +61 -0
- package/dist/storage/index.d.ts +2 -1
- package/dist/storage/index.js +2 -1
- package/dist/storage/lessons.d.ts +16 -2
- package/dist/storage/lessons.js +27 -61
- package/dist/storage/lessons.test.js +1 -15
- package/dist/storage/local-memory.js +39 -5
- package/dist/storage/local-memory.test.d.ts +1 -0
- package/dist/storage/local-memory.test.js +55 -0
- package/dist/storage/patterns.d.ts +1 -1
- package/dist/storage/patterns.js +1 -1
- package/dist/storage/share-memory.test.d.ts +1 -0
- package/dist/storage/share-memory.test.js +34 -0
- package/dist/storage/team-vector-store.js +2 -1
- package/dist/storage/telemetry-scope.test.d.ts +1 -0
- package/dist/storage/telemetry-scope.test.js +38 -0
- package/dist/templates/universal-config.js +11 -0
- package/dist/types/index.d.ts +132 -0
- package/dist/types/index.js +15 -0
- package/dist/utils/glob-paths.d.ts +4 -0
- package/dist/utils/glob-paths.js +26 -0
- package/dist/utils/glob-paths.test.d.ts +1 -0
- package/dist/utils/glob-paths.test.js +40 -0
- package/dist/utils/scanner.js +4 -2
- package/dist/utils/scanner.test.js +2 -1
- package/package.json +7 -7
package/dist/types/index.d.ts
CHANGED
|
@@ -498,6 +498,36 @@ export declare const GatesSchema: z.ZodObject<{
|
|
|
498
498
|
custom_patterns?: string[] | undefined;
|
|
499
499
|
audit_log?: boolean | undefined;
|
|
500
500
|
}>>>;
|
|
501
|
+
unindexed_reads: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
502
|
+
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
503
|
+
migrations: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
504
|
+
}, "strip", z.ZodTypeAny, {
|
|
505
|
+
enabled: boolean;
|
|
506
|
+
migrations: string[];
|
|
507
|
+
}, {
|
|
508
|
+
enabled?: boolean | undefined;
|
|
509
|
+
migrations?: string[] | undefined;
|
|
510
|
+
}>>>;
|
|
511
|
+
deprecated_dependencies: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
512
|
+
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
513
|
+
registry: z.ZodOptional<z.ZodString>;
|
|
514
|
+
}, "strip", z.ZodTypeAny, {
|
|
515
|
+
enabled: boolean;
|
|
516
|
+
registry?: string | undefined;
|
|
517
|
+
}, {
|
|
518
|
+
enabled?: boolean | undefined;
|
|
519
|
+
registry?: string | undefined;
|
|
520
|
+
}>>>;
|
|
521
|
+
migration_order: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
522
|
+
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
523
|
+
dirs: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
524
|
+
}, "strip", z.ZodTypeAny, {
|
|
525
|
+
enabled: boolean;
|
|
526
|
+
dirs: string[];
|
|
527
|
+
}, {
|
|
528
|
+
enabled?: boolean | undefined;
|
|
529
|
+
dirs?: string[] | undefined;
|
|
530
|
+
}>>>;
|
|
501
531
|
semantic_bugs: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
502
532
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
503
533
|
rules: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
@@ -917,6 +947,18 @@ export declare const GatesSchema: z.ZodObject<{
|
|
|
917
947
|
custom_patterns: string[];
|
|
918
948
|
audit_log: boolean;
|
|
919
949
|
};
|
|
950
|
+
unindexed_reads: {
|
|
951
|
+
enabled: boolean;
|
|
952
|
+
migrations: string[];
|
|
953
|
+
};
|
|
954
|
+
deprecated_dependencies: {
|
|
955
|
+
enabled: boolean;
|
|
956
|
+
registry?: string | undefined;
|
|
957
|
+
};
|
|
958
|
+
migration_order: {
|
|
959
|
+
enabled: boolean;
|
|
960
|
+
dirs: string[];
|
|
961
|
+
};
|
|
920
962
|
semantic_bugs: {
|
|
921
963
|
enabled: boolean;
|
|
922
964
|
rules?: string[] | undefined;
|
|
@@ -1160,6 +1202,18 @@ export declare const GatesSchema: z.ZodObject<{
|
|
|
1160
1202
|
custom_patterns?: string[] | undefined;
|
|
1161
1203
|
audit_log?: boolean | undefined;
|
|
1162
1204
|
} | undefined;
|
|
1205
|
+
unindexed_reads?: {
|
|
1206
|
+
enabled?: boolean | undefined;
|
|
1207
|
+
migrations?: string[] | undefined;
|
|
1208
|
+
} | undefined;
|
|
1209
|
+
deprecated_dependencies?: {
|
|
1210
|
+
enabled?: boolean | undefined;
|
|
1211
|
+
registry?: string | undefined;
|
|
1212
|
+
} | undefined;
|
|
1213
|
+
migration_order?: {
|
|
1214
|
+
enabled?: boolean | undefined;
|
|
1215
|
+
dirs?: string[] | undefined;
|
|
1216
|
+
} | undefined;
|
|
1163
1217
|
semantic_bugs?: {
|
|
1164
1218
|
enabled?: boolean | undefined;
|
|
1165
1219
|
rules?: string[] | undefined;
|
|
@@ -1752,6 +1806,36 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
1752
1806
|
custom_patterns?: string[] | undefined;
|
|
1753
1807
|
audit_log?: boolean | undefined;
|
|
1754
1808
|
}>>>;
|
|
1809
|
+
unindexed_reads: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
1810
|
+
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1811
|
+
migrations: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
1812
|
+
}, "strip", z.ZodTypeAny, {
|
|
1813
|
+
enabled: boolean;
|
|
1814
|
+
migrations: string[];
|
|
1815
|
+
}, {
|
|
1816
|
+
enabled?: boolean | undefined;
|
|
1817
|
+
migrations?: string[] | undefined;
|
|
1818
|
+
}>>>;
|
|
1819
|
+
deprecated_dependencies: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
1820
|
+
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1821
|
+
registry: z.ZodOptional<z.ZodString>;
|
|
1822
|
+
}, "strip", z.ZodTypeAny, {
|
|
1823
|
+
enabled: boolean;
|
|
1824
|
+
registry?: string | undefined;
|
|
1825
|
+
}, {
|
|
1826
|
+
enabled?: boolean | undefined;
|
|
1827
|
+
registry?: string | undefined;
|
|
1828
|
+
}>>>;
|
|
1829
|
+
migration_order: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
1830
|
+
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1831
|
+
dirs: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
1832
|
+
}, "strip", z.ZodTypeAny, {
|
|
1833
|
+
enabled: boolean;
|
|
1834
|
+
dirs: string[];
|
|
1835
|
+
}, {
|
|
1836
|
+
enabled?: boolean | undefined;
|
|
1837
|
+
dirs?: string[] | undefined;
|
|
1838
|
+
}>>>;
|
|
1755
1839
|
semantic_bugs: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
1756
1840
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1757
1841
|
rules: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
@@ -2171,6 +2255,18 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
2171
2255
|
custom_patterns: string[];
|
|
2172
2256
|
audit_log: boolean;
|
|
2173
2257
|
};
|
|
2258
|
+
unindexed_reads: {
|
|
2259
|
+
enabled: boolean;
|
|
2260
|
+
migrations: string[];
|
|
2261
|
+
};
|
|
2262
|
+
deprecated_dependencies: {
|
|
2263
|
+
enabled: boolean;
|
|
2264
|
+
registry?: string | undefined;
|
|
2265
|
+
};
|
|
2266
|
+
migration_order: {
|
|
2267
|
+
enabled: boolean;
|
|
2268
|
+
dirs: string[];
|
|
2269
|
+
};
|
|
2174
2270
|
semantic_bugs: {
|
|
2175
2271
|
enabled: boolean;
|
|
2176
2272
|
rules?: string[] | undefined;
|
|
@@ -2414,6 +2510,18 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
2414
2510
|
custom_patterns?: string[] | undefined;
|
|
2415
2511
|
audit_log?: boolean | undefined;
|
|
2416
2512
|
} | undefined;
|
|
2513
|
+
unindexed_reads?: {
|
|
2514
|
+
enabled?: boolean | undefined;
|
|
2515
|
+
migrations?: string[] | undefined;
|
|
2516
|
+
} | undefined;
|
|
2517
|
+
deprecated_dependencies?: {
|
|
2518
|
+
enabled?: boolean | undefined;
|
|
2519
|
+
registry?: string | undefined;
|
|
2520
|
+
} | undefined;
|
|
2521
|
+
migration_order?: {
|
|
2522
|
+
enabled?: boolean | undefined;
|
|
2523
|
+
dirs?: string[] | undefined;
|
|
2524
|
+
} | undefined;
|
|
2417
2525
|
semantic_bugs?: {
|
|
2418
2526
|
enabled?: boolean | undefined;
|
|
2419
2527
|
rules?: string[] | undefined;
|
|
@@ -2712,6 +2820,18 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
2712
2820
|
custom_patterns: string[];
|
|
2713
2821
|
audit_log: boolean;
|
|
2714
2822
|
};
|
|
2823
|
+
unindexed_reads: {
|
|
2824
|
+
enabled: boolean;
|
|
2825
|
+
migrations: string[];
|
|
2826
|
+
};
|
|
2827
|
+
deprecated_dependencies: {
|
|
2828
|
+
enabled: boolean;
|
|
2829
|
+
registry?: string | undefined;
|
|
2830
|
+
};
|
|
2831
|
+
migration_order: {
|
|
2832
|
+
enabled: boolean;
|
|
2833
|
+
dirs: string[];
|
|
2834
|
+
};
|
|
2715
2835
|
semantic_bugs: {
|
|
2716
2836
|
enabled: boolean;
|
|
2717
2837
|
rules?: string[] | undefined;
|
|
@@ -2985,6 +3105,18 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
2985
3105
|
custom_patterns?: string[] | undefined;
|
|
2986
3106
|
audit_log?: boolean | undefined;
|
|
2987
3107
|
} | undefined;
|
|
3108
|
+
unindexed_reads?: {
|
|
3109
|
+
enabled?: boolean | undefined;
|
|
3110
|
+
migrations?: string[] | undefined;
|
|
3111
|
+
} | undefined;
|
|
3112
|
+
deprecated_dependencies?: {
|
|
3113
|
+
enabled?: boolean | undefined;
|
|
3114
|
+
registry?: string | undefined;
|
|
3115
|
+
} | undefined;
|
|
3116
|
+
migration_order?: {
|
|
3117
|
+
enabled?: boolean | undefined;
|
|
3118
|
+
dirs?: string[] | undefined;
|
|
3119
|
+
} | undefined;
|
|
2988
3120
|
semantic_bugs?: {
|
|
2989
3121
|
enabled?: boolean | undefined;
|
|
2990
3122
|
rules?: string[] | undefined;
|
package/dist/types/index.js
CHANGED
|
@@ -270,6 +270,21 @@ export const GatesSchema = z.object({
|
|
|
270
270
|
}).optional().default({}),
|
|
271
271
|
// v4.3+ Side-Effect Safety Analysis
|
|
272
272
|
// On by default: full scans of three real repositories reported no finding that was not a real defect.
|
|
273
|
+
// A supabase-js read no index can serve, proved from the repository's own migrations (advisory, off by default).
|
|
274
|
+
unindexed_reads: z.object({
|
|
275
|
+
enabled: z.boolean().optional().default(false),
|
|
276
|
+
migrations: z.array(z.string()).optional().default([]),
|
|
277
|
+
}).optional().default({}),
|
|
278
|
+
// A dependency whose installed version npm marks deprecated (advisory, off by default: it asks the registry).
|
|
279
|
+
deprecated_dependencies: z.object({
|
|
280
|
+
enabled: z.boolean().optional().default(false),
|
|
281
|
+
registry: z.string().optional(),
|
|
282
|
+
}).optional().default({}),
|
|
283
|
+
// A migration added on a branch that sorts before the newest one on the base (advisory, off by default).
|
|
284
|
+
migration_order: z.object({
|
|
285
|
+
enabled: z.boolean().optional().default(false),
|
|
286
|
+
dirs: z.array(z.string()).optional().default(['**/supabase/migrations']),
|
|
287
|
+
}).optional().default({}),
|
|
273
288
|
semantic_bugs: z.object({
|
|
274
289
|
enabled: z.boolean().optional().default(true),
|
|
275
290
|
rules: z.array(z.string()).optional(),
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Ignore entries: a plain path also ignores everything under it. Matched only, never listed. */
|
|
2
|
+
export declare function withDirectoryForms(patterns: string[]): string[];
|
|
3
|
+
/** Search patterns: a plain path that is a directory becomes `dir/**`; files and globs stay. */
|
|
4
|
+
export declare function directoriesAsGlobs(cwd: string, patterns: string[]): string[];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { isDynamicPattern } from 'globby';
|
|
4
|
+
/*
|
|
5
|
+
* globby's default directory expansion stats every pattern and ignore entry,
|
|
6
|
+
* and throws ENOTDIR when one runs through a file: `.git/**` in a git
|
|
7
|
+
* worktree, where `.git` is a file. Rigour turns it off
|
|
8
|
+
* (`expandDirectories: false`) and expands plain paths itself, as before:
|
|
9
|
+
* a directory `legacy` also means `legacy/**`.
|
|
10
|
+
*/
|
|
11
|
+
/** Ignore entries: a plain path also ignores everything under it. Matched only, never listed. */
|
|
12
|
+
export function withDirectoryForms(patterns) {
|
|
13
|
+
return patterns.flatMap(pattern => isDynamicPattern(pattern) ? [pattern] : [pattern, `${pattern.replace(/\/+$/, '')}/**`]);
|
|
14
|
+
}
|
|
15
|
+
/** Search patterns: a plain path that is a directory becomes `dir/**`; files and globs stay. */
|
|
16
|
+
export function directoriesAsGlobs(cwd, patterns) {
|
|
17
|
+
return patterns.map(pattern => !isDynamicPattern(pattern) && isDirectory(path.resolve(cwd, pattern)) ? `${pattern.replace(/\/+$/, '')}/**` : pattern);
|
|
18
|
+
}
|
|
19
|
+
function isDirectory(target) {
|
|
20
|
+
try {
|
|
21
|
+
return fs.statSync(target).isDirectory();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { FileScanner } from './scanner.js';
|
|
6
|
+
import { directoriesAsGlobs, withDirectoryForms } from './glob-paths.js';
|
|
7
|
+
let root;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
root = fs.mkdtempSync(path.join(os.tmpdir(), 'glob-paths-'));
|
|
10
|
+
fs.mkdirSync(path.join(root, 'src'));
|
|
11
|
+
fs.mkdirSync(path.join(root, 'legacy'));
|
|
12
|
+
fs.writeFileSync(path.join(root, 'src', 'a.ts'), 'export const a = 1;\n');
|
|
13
|
+
fs.writeFileSync(path.join(root, 'legacy', 'old.ts'), 'export const b = 2;\n');
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => fs.rmSync(root, { recursive: true, force: true }));
|
|
16
|
+
describe('withDirectoryForms', () => {
|
|
17
|
+
it('adds the directory form to plain paths and leaves globs alone', () => {
|
|
18
|
+
expect(withDirectoryForms(['legacy', 'build/', '.git/**', '**/*.min.js'])).toEqual(['legacy', 'legacy/**', 'build/', 'build/**', '.git/**', '**/*.min.js']);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('directoriesAsGlobs', () => {
|
|
22
|
+
it('turns a directory into dir/** and leaves files, missing paths and globs alone', () => {
|
|
23
|
+
expect(directoriesAsGlobs(root, ['src', 'src/a.ts', 'missing', '**/*.ts'])).toEqual(['src/**', 'src/a.ts', 'missing', '**/*.ts']);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('FileScanner in a git worktree', () => {
|
|
27
|
+
it('scans when .git is a file and the config ignores .git/**', async () => {
|
|
28
|
+
fs.writeFileSync(path.join(root, '.git'), 'gitdir: /elsewhere/.git/worktrees/x\n');
|
|
29
|
+
const files = await FileScanner.findFiles({ cwd: root, patterns: ['**/*.ts'], ignore: ['.git/**'] });
|
|
30
|
+
expect(files.sort()).toEqual(['legacy/old.ts', 'src/a.ts']);
|
|
31
|
+
});
|
|
32
|
+
it('finds a file or a whole directory named by a plain path', async () => {
|
|
33
|
+
expect(await FileScanner.findFiles({ cwd: root, patterns: ['src/a.ts'] })).toEqual(['src/a.ts']);
|
|
34
|
+
expect(await FileScanner.findFiles({ cwd: root, patterns: ['legacy'] })).toEqual(['legacy/old.ts']);
|
|
35
|
+
});
|
|
36
|
+
it('still ignores a whole directory named by a plain path', async () => {
|
|
37
|
+
const files = await FileScanner.findFiles({ cwd: root, patterns: ['**/*.ts'], ignore: ['legacy'] });
|
|
38
|
+
expect(files).toEqual(['src/a.ts']);
|
|
39
|
+
});
|
|
40
|
+
});
|
package/dist/utils/scanner.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { globby } from 'globby';
|
|
2
2
|
import fs from 'fs-extra';
|
|
3
3
|
import path from 'path';
|
|
4
|
+
import { directoriesAsGlobs, withDirectoryForms } from './glob-paths.js';
|
|
4
5
|
/**
|
|
5
6
|
* Glob patterns use `/` as the separator and `\` as the escape character.
|
|
6
7
|
* Only on Windows can a backslash be a path separator, and even there one
|
|
@@ -33,9 +34,10 @@ export class FileScanner {
|
|
|
33
34
|
const userIgnore = options.ignore || [];
|
|
34
35
|
const ignore = [...new Set([...this.DEFAULT_IGNORE, ...userIgnore])].map(toGlobSeparators);
|
|
35
36
|
const normalizedCwd = options.cwd.replace(/\\/g, '/');
|
|
36
|
-
return globby(patterns, {
|
|
37
|
+
return globby(directoriesAsGlobs(normalizedCwd, patterns), {
|
|
37
38
|
cwd: normalizedCwd,
|
|
38
|
-
ignore: ignore,
|
|
39
|
+
ignore: withDirectoryForms(ignore),
|
|
40
|
+
expandDirectories: false,
|
|
39
41
|
});
|
|
40
42
|
}
|
|
41
43
|
/**
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from 'vitest';
|
|
2
2
|
import { FileScanner } from './scanner.js';
|
|
3
3
|
import { globby } from 'globby';
|
|
4
|
-
vi.mock('globby', () => ({
|
|
4
|
+
vi.mock('globby', async (importOriginal) => ({
|
|
5
|
+
isDynamicPattern: (await importOriginal()).isDynamicPattern,
|
|
5
6
|
globby: vi.fn(),
|
|
6
7
|
}));
|
|
7
8
|
describe('FileScanner', () => {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rigour-labs/core",
|
|
3
|
-
"version": "6.5.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "6.5.3",
|
|
4
|
+
"description": "Rigour's review engine: deterministic gates on changed lines, rules and lessons learned from your team's fixes, and per-check precision from what you fix versus dismiss, across TypeScript, JavaScript, Python, Go, Ruby and C#.",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=22"
|
|
7
7
|
},
|
|
@@ -70,11 +70,11 @@
|
|
|
70
70
|
"pg": "^8.16.3",
|
|
71
71
|
"sqlite3": "^5.1.7",
|
|
72
72
|
"openai": "^4.104.0",
|
|
73
|
-
"@rigour-labs/brain-darwin-arm64": "6.5.
|
|
74
|
-
"@rigour-labs/brain-
|
|
75
|
-
"@rigour-labs/brain-
|
|
76
|
-
"@rigour-labs/brain-linux-
|
|
77
|
-
"@rigour-labs/brain-win-x64": "6.5.
|
|
73
|
+
"@rigour-labs/brain-darwin-arm64": "6.5.3",
|
|
74
|
+
"@rigour-labs/brain-darwin-x64": "6.5.3",
|
|
75
|
+
"@rigour-labs/brain-linux-x64": "6.5.3",
|
|
76
|
+
"@rigour-labs/brain-linux-arm64": "6.5.3",
|
|
77
|
+
"@rigour-labs/brain-win-x64": "6.5.3"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
80
|
"@types/fs-extra": "^11.0.4",
|