@nanocollective/sentinel 0.1.0-alpha.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.
- package/LICENSE +22 -0
- package/README.md +66 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +254 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/parse.d.ts +13 -0
- package/dist/config/parse.d.ts.map +1 -0
- package/dist/config/parse.js +271 -0
- package/dist/config/parse.js.map +1 -0
- package/dist/config/repo-override.d.ts +13 -0
- package/dist/config/repo-override.d.ts.map +1 -0
- package/dist/config/repo-override.js +128 -0
- package/dist/config/repo-override.js.map +1 -0
- package/dist/config/types.d.ts +86 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +8 -0
- package/dist/config/types.js.map +1 -0
- package/dist/dedup/hash.d.ts +10 -0
- package/dist/dedup/hash.d.ts.map +1 -0
- package/dist/dedup/hash.js +18 -0
- package/dist/dedup/hash.js.map +1 -0
- package/dist/dedup/markers.d.ts +13 -0
- package/dist/dedup/markers.d.ts.map +1 -0
- package/dist/dedup/markers.js +42 -0
- package/dist/dedup/markers.js.map +1 -0
- package/dist/dedup/plan.d.ts +45 -0
- package/dist/dedup/plan.d.ts.map +1 -0
- package/dist/dedup/plan.js +83 -0
- package/dist/dedup/plan.js.map +1 -0
- package/dist/dedup/reconcile.d.ts +29 -0
- package/dist/dedup/reconcile.d.ts.map +1 -0
- package/dist/dedup/reconcile.js +73 -0
- package/dist/dedup/reconcile.js.map +1 -0
- package/dist/findings/types.d.ts +53 -0
- package/dist/findings/types.d.ts.map +1 -0
- package/dist/findings/types.js +28 -0
- package/dist/findings/types.js.map +1 -0
- package/dist/findings/validate.d.ts +36 -0
- package/dist/findings/validate.d.ts.map +1 -0
- package/dist/findings/validate.js +178 -0
- package/dist/findings/validate.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/init/args.d.ts +20 -0
- package/dist/init/args.d.ts.map +1 -0
- package/dist/init/args.js +80 -0
- package/dist/init/args.js.map +1 -0
- package/dist/init/plan.d.ts +9 -0
- package/dist/init/plan.d.ts.map +1 -0
- package/dist/init/plan.js +17 -0
- package/dist/init/plan.js.map +1 -0
- package/dist/init/scaffold.d.ts +17 -0
- package/dist/init/scaffold.d.ts.map +1 -0
- package/dist/init/scaffold.js +27 -0
- package/dist/init/scaffold.js.map +1 -0
- package/dist/init/templates.d.ts +28 -0
- package/dist/init/templates.d.ts.map +1 -0
- package/dist/init/templates.js +187 -0
- package/dist/init/templates.js.map +1 -0
- package/dist/init/types.d.ts +29 -0
- package/dist/init/types.d.ts.map +1 -0
- package/dist/init/types.js +15 -0
- package/dist/init/types.js.map +1 -0
- package/dist/issues/body.d.ts +12 -0
- package/dist/issues/body.d.ts.map +1 -0
- package/dist/issues/body.js +53 -0
- package/dist/issues/body.js.map +1 -0
- package/dist/issues/file.d.ts +24 -0
- package/dist/issues/file.d.ts.map +1 -0
- package/dist/issues/file.js +61 -0
- package/dist/issues/file.js.map +1 -0
- package/dist/issues/gh-client.d.ts +21 -0
- package/dist/issues/gh-client.d.ts.map +1 -0
- package/dist/issues/gh-client.js +133 -0
- package/dist/issues/gh-client.js.map +1 -0
- package/dist/issues/types.d.ts +85 -0
- package/dist/issues/types.d.ts.map +1 -0
- package/dist/issues/types.js +8 -0
- package/dist/issues/types.js.map +1 -0
- package/dist/orchestrator/audit.d.ts +14 -0
- package/dist/orchestrator/audit.d.ts.map +1 -0
- package/dist/orchestrator/audit.js +47 -0
- package/dist/orchestrator/audit.js.map +1 -0
- package/dist/orchestrator/auto-fix.d.ts +31 -0
- package/dist/orchestrator/auto-fix.d.ts.map +1 -0
- package/dist/orchestrator/auto-fix.js +59 -0
- package/dist/orchestrator/auto-fix.js.map +1 -0
- package/dist/orchestrator/extract.d.ts +14 -0
- package/dist/orchestrator/extract.d.ts.map +1 -0
- package/dist/orchestrator/extract.js +70 -0
- package/dist/orchestrator/extract.js.map +1 -0
- package/dist/orchestrator/nanocoder-runner.d.ts +33 -0
- package/dist/orchestrator/nanocoder-runner.d.ts.map +1 -0
- package/dist/orchestrator/nanocoder-runner.js +125 -0
- package/dist/orchestrator/nanocoder-runner.js.map +1 -0
- package/dist/orchestrator/types.d.ts +51 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +8 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/prompt/build.d.ts +14 -0
- package/dist/prompt/build.d.ts.map +1 -0
- package/dist/prompt/build.js +123 -0
- package/dist/prompt/build.js.map +1 -0
- package/dist/prompt/types.d.ts +34 -0
- package/dist/prompt/types.d.ts.map +1 -0
- package/dist/prompt/types.js +8 -0
- package/dist/prompt/types.js.map +1 -0
- package/dist/rule-packs/dependencies.d.ts +20 -0
- package/dist/rule-packs/dependencies.d.ts.map +1 -0
- package/dist/rule-packs/dependencies.js +58 -0
- package/dist/rule-packs/dependencies.js.map +1 -0
- package/dist/rule-packs/glob.d.ts +23 -0
- package/dist/rule-packs/glob.d.ts.map +1 -0
- package/dist/rule-packs/glob.js +66 -0
- package/dist/rule-packs/glob.js.map +1 -0
- package/dist/rule-packs/parse.d.ts +21 -0
- package/dist/rule-packs/parse.d.ts.map +1 -0
- package/dist/rule-packs/parse.js +230 -0
- package/dist/rule-packs/parse.js.map +1 -0
- package/dist/rule-packs/types.d.ts +55 -0
- package/dist/rule-packs/types.d.ts.map +1 -0
- package/dist/rule-packs/types.js +10 -0
- package/dist/rule-packs/types.js.map +1 -0
- package/dist/run/audit.d.ts +20 -0
- package/dist/run/audit.d.ts.map +1 -0
- package/dist/run/audit.js +28 -0
- package/dist/run/audit.js.map +1 -0
- package/dist/run/clone.d.ts +23 -0
- package/dist/run/clone.d.ts.map +1 -0
- package/dist/run/clone.js +51 -0
- package/dist/run/clone.js.map +1 -0
- package/dist/run/preview.d.ts +34 -0
- package/dist/run/preview.d.ts.map +1 -0
- package/dist/run/preview.js +68 -0
- package/dist/run/preview.js.map +1 -0
- package/dist/run/report.d.ts +10 -0
- package/dist/run/report.d.ts.map +1 -0
- package/dist/run/report.js +73 -0
- package/dist/run/report.js.map +1 -0
- package/dist/run/run.d.ts +74 -0
- package/dist/run/run.d.ts.map +1 -0
- package/dist/run/run.js +131 -0
- package/dist/run/run.js.map +1 -0
- package/dist/run/select.d.ts +14 -0
- package/dist/run/select.d.ts.map +1 -0
- package/dist/run/select.js +31 -0
- package/dist/run/select.js.map +1 -0
- package/dist/run/sources.d.ts +11 -0
- package/dist/run/sources.d.ts.map +1 -0
- package/dist/run/sources.js +106 -0
- package/dist/run/sources.js.map +1 -0
- package/dist/run/types.d.ts +55 -0
- package/dist/run/types.d.ts.map +1 -0
- package/dist/run/types.js +7 -0
- package/dist/run/types.js.map +1 -0
- package/dist/suppression/apply.d.ts +33 -0
- package/dist/suppression/apply.d.ts.map +1 -0
- package/dist/suppression/apply.js +55 -0
- package/dist/suppression/apply.js.map +1 -0
- package/package.json +118 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../source/run/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for selecting pack files and the file patterns to gather. A pack
|
|
3
|
+
* file is an enabled `.md` whose path contains no underscore-prefixed segment —
|
|
4
|
+
* the `_starter/` convention that keeps template packs from loading.
|
|
5
|
+
*/
|
|
6
|
+
import type { RulePack } from '../rule-packs/types.js';
|
|
7
|
+
/** True if a rule-packs-relative path is an enabled pack file. */
|
|
8
|
+
export declare function isEnabledPackPath(relativePath: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* The union of applies_to path globs across packs. Returns an empty list if any
|
|
11
|
+
* pack applies to the whole repository (empty paths), meaning "gather all".
|
|
12
|
+
*/
|
|
13
|
+
export declare function unionPatterns(packs: RulePack[]): string[];
|
|
14
|
+
//# sourceMappingURL=select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../source/run/select.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,wBAAwB,CAAC;AAErD,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAO/D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAWzD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for selecting pack files and the file patterns to gather. A pack
|
|
3
|
+
* file is an enabled `.md` whose path contains no underscore-prefixed segment —
|
|
4
|
+
* the `_starter/` convention that keeps template packs from loading.
|
|
5
|
+
*/
|
|
6
|
+
/** True if a rule-packs-relative path is an enabled pack file. */
|
|
7
|
+
export function isEnabledPackPath(relativePath) {
|
|
8
|
+
if (!relativePath.endsWith('.md')) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
return relativePath
|
|
12
|
+
.split('/')
|
|
13
|
+
.every(segment => segment.length > 0 && !segment.startsWith('_'));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The union of applies_to path globs across packs. Returns an empty list if any
|
|
17
|
+
* pack applies to the whole repository (empty paths), meaning "gather all".
|
|
18
|
+
*/
|
|
19
|
+
export function unionPatterns(packs) {
|
|
20
|
+
const patterns = new Set();
|
|
21
|
+
for (const pack of packs) {
|
|
22
|
+
if (pack.manifest.appliesTo.paths.length === 0) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
for (const pattern of pack.manifest.appliesTo.paths) {
|
|
26
|
+
patterns.add(pattern);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return [...patterns];
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../source/run/select.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,kEAAkE;AAClE,MAAM,UAAU,iBAAiB,CAAC,YAAoB;IACrD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,YAAY;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAiB;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,CAAC;QACX,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACrD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real filesystem implementations of RepoFiles and PackLoader. Paths come from
|
|
3
|
+
* the operator's own config repo and the repositories they chose to audit, not
|
|
4
|
+
* untrusted input, so the fs reads are annotated nosemgrep.
|
|
5
|
+
*/
|
|
6
|
+
import type { PackLoader, RepoFiles } from './types.js';
|
|
7
|
+
/** Read repository files and single files from the local filesystem. */
|
|
8
|
+
export declare const fsRepoFiles: RepoFiles;
|
|
9
|
+
/** Load and parse the enabled rule packs from a directory. */
|
|
10
|
+
export declare const fsPackLoader: PackLoader;
|
|
11
|
+
//# sourceMappingURL=sources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../source/run/sources.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAc,UAAU,EAAE,SAAS,EAAC,MAAM,YAAY,CAAC;AAiDnE,wEAAwE;AACxE,eAAO,MAAM,WAAW,EAAE,SA2BzB,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,YAAY,EAAE,UAoB1B,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real filesystem implementations of RepoFiles and PackLoader. Paths come from
|
|
3
|
+
* the operator's own config repo and the repositories they chose to audit, not
|
|
4
|
+
* untrusted input, so the fs reads are annotated nosemgrep.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
7
|
+
import { join, relative, sep } from 'node:path';
|
|
8
|
+
import { matchesGlob } from '../rule-packs/glob.js';
|
|
9
|
+
import { parseRulePack } from '../rule-packs/parse.js';
|
|
10
|
+
import { isEnabledPackPath } from './select.js';
|
|
11
|
+
const IGNORED_DIRS = new Set([
|
|
12
|
+
'.git',
|
|
13
|
+
'node_modules',
|
|
14
|
+
'dist',
|
|
15
|
+
'build',
|
|
16
|
+
'coverage',
|
|
17
|
+
'.next',
|
|
18
|
+
'out',
|
|
19
|
+
'vendor',
|
|
20
|
+
'target',
|
|
21
|
+
]);
|
|
22
|
+
/** Skip files larger than this — likely generated or binary, and token-heavy. */
|
|
23
|
+
const MAX_FILE_BYTES = 512 * 1024;
|
|
24
|
+
/** Recursively list files under root, skipping noise directories. */
|
|
25
|
+
function walkFiles(root) {
|
|
26
|
+
const out = [];
|
|
27
|
+
const stack = [root];
|
|
28
|
+
while (stack.length > 0) {
|
|
29
|
+
const dir = stack.pop();
|
|
30
|
+
let entries;
|
|
31
|
+
try {
|
|
32
|
+
entries = readdirSync(dir); // nosemgrep
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
/* c8 ignore next 2 -- unreadable directory */
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
const full = join(dir, entry);
|
|
40
|
+
const stats = statSync(full); // nosemgrep
|
|
41
|
+
if (stats.isDirectory()) {
|
|
42
|
+
if (!IGNORED_DIRS.has(entry)) {
|
|
43
|
+
stack.push(full);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else if (stats.isFile()) {
|
|
47
|
+
out.push(full);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
function toPosix(path) {
|
|
54
|
+
return path.split(sep).join('/');
|
|
55
|
+
}
|
|
56
|
+
/** Read repository files and single files from the local filesystem. */
|
|
57
|
+
export const fsRepoFiles = {
|
|
58
|
+
async read(repoDir, patterns) {
|
|
59
|
+
const files = [];
|
|
60
|
+
for (const full of walkFiles(repoDir)) {
|
|
61
|
+
const relativePath = toPosix(relative(repoDir, full));
|
|
62
|
+
if (patterns.length > 0 &&
|
|
63
|
+
!patterns.some(pattern => matchesGlob(pattern, relativePath))) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (statSync(full).size > MAX_FILE_BYTES) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
files.push({ path: relativePath, content: readFileSync(full, 'utf8') }); // nosemgrep
|
|
70
|
+
}
|
|
71
|
+
files.sort((a, b) => a.path.localeCompare(b.path));
|
|
72
|
+
return files;
|
|
73
|
+
},
|
|
74
|
+
async readText(path) {
|
|
75
|
+
try {
|
|
76
|
+
return readFileSync(path, 'utf8'); // nosemgrep
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
/** Load and parse the enabled rule packs from a directory. */
|
|
84
|
+
export const fsPackLoader = {
|
|
85
|
+
async load(packsDir) {
|
|
86
|
+
const result = { packs: [], errors: [] };
|
|
87
|
+
if (!existsSync(packsDir)) {
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
for (const full of walkFiles(packsDir)) {
|
|
91
|
+
const relativePath = toPosix(relative(packsDir, full));
|
|
92
|
+
if (!isEnabledPackPath(relativePath)) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const parsed = parseRulePack(readFileSync(full, 'utf8')); // nosemgrep
|
|
96
|
+
if (parsed.valid && parsed.pack) {
|
|
97
|
+
result.packs.push(parsed.pack);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
result.errors.push({ file: relativePath, errors: parsed.errors });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../source/run/sources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for `sentinel run`, the audit runtime. The orchestrator (run.ts)
|
|
3
|
+
* depends on these injectable sources so the whole pipeline is testable with
|
|
4
|
+
* fakes; the real filesystem/gh/nanocoder implementations live at the edges.
|
|
5
|
+
*/
|
|
6
|
+
import type { Finding } from '../findings/types.js';
|
|
7
|
+
import type { ValidationError } from '../findings/validate.js';
|
|
8
|
+
import type { SourceFile } from '../prompt/types.js';
|
|
9
|
+
import type { RulePack, RulePackError } from '../rule-packs/types.js';
|
|
10
|
+
/** Reads repository source files and single files from disk (injectable). */
|
|
11
|
+
export interface RepoFiles {
|
|
12
|
+
/** Read files under `repoDir` matching any of the glob patterns. An empty
|
|
13
|
+
* pattern list means the whole repository. */
|
|
14
|
+
read(repoDir: string, patterns: string[]): Promise<SourceFile[]>;
|
|
15
|
+
/** Read a single file's text, or null if it does not exist. */
|
|
16
|
+
readText(path: string): Promise<string | null>;
|
|
17
|
+
}
|
|
18
|
+
/** A pack that failed to parse while loading the rule-packs directory. */
|
|
19
|
+
export interface PackLoadError {
|
|
20
|
+
file: string;
|
|
21
|
+
errors: RulePackError[];
|
|
22
|
+
}
|
|
23
|
+
/** The result of loading the rule-packs directory. */
|
|
24
|
+
export interface LoadedPacks {
|
|
25
|
+
packs: RulePack[];
|
|
26
|
+
errors: PackLoadError[];
|
|
27
|
+
}
|
|
28
|
+
/** Loads and parses the enabled rule packs from a directory (injectable). */
|
|
29
|
+
export interface PackLoader {
|
|
30
|
+
load(packsDir: string): Promise<LoadedPacks>;
|
|
31
|
+
}
|
|
32
|
+
/** The outcome of one pack's audit pass against one repository. */
|
|
33
|
+
export interface PackOutcome {
|
|
34
|
+
pack: string;
|
|
35
|
+
version: string;
|
|
36
|
+
findings: Finding[];
|
|
37
|
+
attempts: number;
|
|
38
|
+
ok: boolean;
|
|
39
|
+
errors: ValidationError[];
|
|
40
|
+
runError?: string;
|
|
41
|
+
/** The raw model output, kept for diagnosing a failed audit. */
|
|
42
|
+
raw?: string;
|
|
43
|
+
}
|
|
44
|
+
/** All pack outcomes for one repository. */
|
|
45
|
+
export interface RepoOutcome {
|
|
46
|
+
repo: string;
|
|
47
|
+
packs: PackOutcome[];
|
|
48
|
+
/** Packs named by the target but missing from the rule-packs directory. */
|
|
49
|
+
missingPacks: string[];
|
|
50
|
+
}
|
|
51
|
+
/** Everything one run produced. */
|
|
52
|
+
export interface RunOutcome {
|
|
53
|
+
repos: RepoOutcome[];
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../source/run/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAC,QAAQ,EAAE,aAAa,EAAC,MAAM,wBAAwB,CAAC;AAEpE,6EAA6E;AAC7E,MAAM,WAAW,SAAS;IACzB;kDAC8C;IAC9C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC/C;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,sDAAsD;AACtD,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IAC1B,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC7C;AAED,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,2EAA2E;IAC3E,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,mCAAmC;AACnC,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,WAAW,EAAE,CAAC;CACrB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for `sentinel run`, the audit runtime. The orchestrator (run.ts)
|
|
3
|
+
* depends on these injectable sources so the whole pipeline is testable with
|
|
4
|
+
* fakes; the real filesystem/gh/nanocoder implementations live at the edges.
|
|
5
|
+
*/
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../source/run/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The third suppression layer: the opt-in per-repo `sentinel.yaml` override
|
|
3
|
+
* (see docs/findings/index.md#suppression). It can lower or raise the filing
|
|
4
|
+
* threshold for one repo and declare systematic-noise exemptions matched by
|
|
5
|
+
* rule and/or path glob. The content-hash floor and the label layer live in the
|
|
6
|
+
* dedup planner; this is the escape hatch layered on top.
|
|
7
|
+
*/
|
|
8
|
+
import type { RepoOverride, SentinelConfig, Suppression } from '../config/types.js';
|
|
9
|
+
import type { Finding, Severity } from '../findings/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* A finding matches a suppression when its rule matches (if the suppression
|
|
12
|
+
* names one) and its file matches (if the suppression lists paths). Rule and
|
|
13
|
+
* path patterns are globs, so `solana-anchor/*` or `programs/vault/**` work.
|
|
14
|
+
*/
|
|
15
|
+
export declare function matchesSuppression(finding: Finding, suppression: Suppression): boolean;
|
|
16
|
+
/** True if any of the override's suppressions match the finding. */
|
|
17
|
+
export declare function isSuppressed(finding: Finding, override: RepoOverride): boolean;
|
|
18
|
+
/** The effect of applying a per-repo override to a run's findings. */
|
|
19
|
+
export interface OverrideOutcome {
|
|
20
|
+
/** Findings that survive the override, in input order. */
|
|
21
|
+
kept: Finding[];
|
|
22
|
+
/** Findings removed by a suppression rule. */
|
|
23
|
+
suppressed: Finding[];
|
|
24
|
+
/** The threshold to file at: the override's, or the org default. */
|
|
25
|
+
threshold: Severity;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Apply a per-repo override to a run's findings: partition out the suppressed
|
|
29
|
+
* ones and resolve the effective severity threshold. With no override, every
|
|
30
|
+
* finding is kept and the org threshold stands.
|
|
31
|
+
*/
|
|
32
|
+
export declare function applyRepoOverride(findings: Finding[], config: SentinelConfig, override?: RepoOverride): OverrideOutcome;
|
|
33
|
+
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../source/suppression/apply.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACX,YAAY,EACZ,cAAc,EACd,WAAW,EACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAC,OAAO,EAAE,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAG5D;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,GACtB,OAAO,CAcT;AAED,oEAAoE;AACpE,wBAAgB,YAAY,CAC3B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,YAAY,GACpB,OAAO,CAIT;AAED,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC/B,0DAA0D;IAC1D,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,8CAA8C;IAC9C,UAAU,EAAE,OAAO,EAAE,CAAC;IACtB,oEAAoE;IACpE,SAAS,EAAE,QAAQ,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,cAAc,EACtB,QAAQ,CAAC,EAAE,YAAY,GACrB,eAAe,CAgBjB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The third suppression layer: the opt-in per-repo `sentinel.yaml` override
|
|
3
|
+
* (see docs/findings/index.md#suppression). It can lower or raise the filing
|
|
4
|
+
* threshold for one repo and declare systematic-noise exemptions matched by
|
|
5
|
+
* rule and/or path glob. The content-hash floor and the label layer live in the
|
|
6
|
+
* dedup planner; this is the escape hatch layered on top.
|
|
7
|
+
*/
|
|
8
|
+
import { matchesGlob } from '../rule-packs/glob.js';
|
|
9
|
+
/**
|
|
10
|
+
* A finding matches a suppression when its rule matches (if the suppression
|
|
11
|
+
* names one) and its file matches (if the suppression lists paths). Rule and
|
|
12
|
+
* path patterns are globs, so `solana-anchor/*` or `programs/vault/**` work.
|
|
13
|
+
*/
|
|
14
|
+
export function matchesSuppression(finding, suppression) {
|
|
15
|
+
const hasRule = suppression.rule !== undefined && suppression.rule.length > 0;
|
|
16
|
+
const hasPaths = suppression.paths.length > 0;
|
|
17
|
+
// Defensive: a suppression with neither clause never matches anything.
|
|
18
|
+
if (!hasRule && !hasPaths) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const ruleMatches = hasRule
|
|
22
|
+
? matchesGlob(suppression.rule, finding.rule)
|
|
23
|
+
: true;
|
|
24
|
+
const pathMatches = hasPaths
|
|
25
|
+
? suppression.paths.some(pattern => matchesGlob(pattern, finding.file))
|
|
26
|
+
: true;
|
|
27
|
+
return ruleMatches && pathMatches;
|
|
28
|
+
}
|
|
29
|
+
/** True if any of the override's suppressions match the finding. */
|
|
30
|
+
export function isSuppressed(finding, override) {
|
|
31
|
+
return override.suppress.some(suppression => matchesSuppression(finding, suppression));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Apply a per-repo override to a run's findings: partition out the suppressed
|
|
35
|
+
* ones and resolve the effective severity threshold. With no override, every
|
|
36
|
+
* finding is kept and the org threshold stands.
|
|
37
|
+
*/
|
|
38
|
+
export function applyRepoOverride(findings, config, override) {
|
|
39
|
+
const threshold = override?.severityThreshold ?? config.severityThreshold;
|
|
40
|
+
if (!override || override.suppress.length === 0) {
|
|
41
|
+
return { kept: findings, suppressed: [], threshold };
|
|
42
|
+
}
|
|
43
|
+
const kept = [];
|
|
44
|
+
const suppressed = [];
|
|
45
|
+
for (const finding of findings) {
|
|
46
|
+
if (isSuppressed(finding, override)) {
|
|
47
|
+
suppressed.push(finding);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
kept.push(finding);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { kept, suppressed, threshold };
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../source/suppression/apply.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CACjC,OAAgB,EAChB,WAAwB;IAExB,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9C,uEAAuE;IACvE,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,WAAW,GAAG,OAAO;QAC1B,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,IAAc,EAAE,OAAO,CAAC,IAAI,CAAC;QACvD,CAAC,CAAC,IAAI,CAAC;IACR,MAAM,WAAW,GAAG,QAAQ;QAC3B,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC,CAAC,IAAI,CAAC;IACR,OAAO,WAAW,IAAI,WAAW,CAAC;AACnC,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAC3B,OAAgB,EAChB,QAAsB;IAEtB,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAC3C,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,CACxC,CAAC;AACH,CAAC;AAYD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAChC,QAAmB,EACnB,MAAsB,EACtB,QAAuB;IAEvB,MAAM,SAAS,GAAG,QAAQ,EAAE,iBAAiB,IAAI,MAAM,CAAC,iBAAiB,CAAC;IAC1E,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,EAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAC,CAAC;IACpD,CAAC;IAED,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAc,EAAE,CAAC;IACjC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,IAAI,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YACrC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACF,CAAC;IACD,OAAO,EAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAC,CAAC;AACtC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nanocollective/sentinel",
|
|
3
|
+
"version": "0.1.0-alpha.0",
|
|
4
|
+
"description": "An installable, Nanocoder-driven workflow that runs continuous, configurable security and code audits across a GitHub organisation's repositories and files findings as issues.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"security",
|
|
7
|
+
"audit",
|
|
8
|
+
"sast",
|
|
9
|
+
"github-actions",
|
|
10
|
+
"nanocoder",
|
|
11
|
+
"local-first",
|
|
12
|
+
"code-review",
|
|
13
|
+
"typescript"
|
|
14
|
+
],
|
|
15
|
+
"author": "Nano Collective",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "https://github.com/Nano-Collective/sentinel.git"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://github.com/Nano-Collective/sentinel#readme",
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/Nano-Collective/sentinel/issues"
|
|
24
|
+
},
|
|
25
|
+
"type": "module",
|
|
26
|
+
"main": "dist/index.js",
|
|
27
|
+
"types": "dist/index.d.ts",
|
|
28
|
+
"bin": {
|
|
29
|
+
"sentinel": "dist/cli.js"
|
|
30
|
+
},
|
|
31
|
+
"packageManager": "pnpm@11.0.9",
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=22"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"README.md",
|
|
41
|
+
"LICENSE"
|
|
42
|
+
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc && tsc-alias && chmod +x dist/cli.js",
|
|
45
|
+
"dev": "tsc --watch",
|
|
46
|
+
"start": "node dist/cli.js",
|
|
47
|
+
"prepublishOnly": "pnpm build",
|
|
48
|
+
"test:all": "./scripts/test.sh",
|
|
49
|
+
"test:ava": "ava",
|
|
50
|
+
"test:ava:coverage": "c8 ava",
|
|
51
|
+
"test:format": "biome check --no-errors-on-unmatched .",
|
|
52
|
+
"test:types": "tsc --noEmit",
|
|
53
|
+
"test:lint": "biome lint .",
|
|
54
|
+
"test:lint:fix": "biome check --write --unsafe .",
|
|
55
|
+
"test:knip": "knip",
|
|
56
|
+
"test:audit": "pnpm audit --audit-level=high --ignore-unfixable",
|
|
57
|
+
"test:security": "semgrep scan --config auto --error",
|
|
58
|
+
"format": "biome check --write .",
|
|
59
|
+
"format:check": "biome check .",
|
|
60
|
+
"prepare": "husky"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"yaml": "^2.8.3"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@biomejs/biome": "^2.5.0",
|
|
67
|
+
"@types/node": "^25.9.3",
|
|
68
|
+
"ava": "^7.0.0",
|
|
69
|
+
"c8": "^11.0.0",
|
|
70
|
+
"husky": "^9.1.7",
|
|
71
|
+
"knip": "^6.0.0",
|
|
72
|
+
"lint-staged": "^17.0.7",
|
|
73
|
+
"tsc-alias": "^1.8.16",
|
|
74
|
+
"tsx": "^4.20.6",
|
|
75
|
+
"typescript": "^5.0.3"
|
|
76
|
+
},
|
|
77
|
+
"lint-staged": {
|
|
78
|
+
"*.{js,ts,jsx,tsx,json,md}": [
|
|
79
|
+
"biome check --write --no-errors-on-unmatched"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
"ava": {
|
|
83
|
+
"extensions": {
|
|
84
|
+
"ts": "module"
|
|
85
|
+
},
|
|
86
|
+
"nodeArguments": [
|
|
87
|
+
"--import=tsx",
|
|
88
|
+
"--no-warnings"
|
|
89
|
+
],
|
|
90
|
+
"files": [
|
|
91
|
+
"source/**/*.spec.ts",
|
|
92
|
+
"!source/**/*-helpers.ts",
|
|
93
|
+
"!source/**/test-helpers.ts"
|
|
94
|
+
],
|
|
95
|
+
"workerThreads": false,
|
|
96
|
+
"serial": true,
|
|
97
|
+
"environmentVariables": {
|
|
98
|
+
"NODE_ENV": "test"
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"c8": {
|
|
102
|
+
"exclude": [
|
|
103
|
+
"source/cli.ts",
|
|
104
|
+
"source/index.ts",
|
|
105
|
+
"source/**/*.spec.ts"
|
|
106
|
+
],
|
|
107
|
+
"reporter": [
|
|
108
|
+
"text",
|
|
109
|
+
"json-summary",
|
|
110
|
+
"lcov"
|
|
111
|
+
],
|
|
112
|
+
"check-coverage": true,
|
|
113
|
+
"lines": 80,
|
|
114
|
+
"functions": 0,
|
|
115
|
+
"branches": 0,
|
|
116
|
+
"statements": 0
|
|
117
|
+
}
|
|
118
|
+
}
|