@nanocollective/sentinel 0.1.0-alpha.0 → 0.1.0-alpha.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/cli.js +52 -16
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/init/templates.d.ts.map +1 -1
- package/dist/init/templates.js +14 -1
- package/dist/init/templates.js.map +1 -1
- package/dist/observe/dashboard.d.ts +9 -0
- package/dist/observe/dashboard.d.ts.map +1 -0
- package/dist/observe/dashboard.js +87 -0
- package/dist/observe/dashboard.js.map +1 -0
- package/dist/observe/record.d.ts +11 -0
- package/dist/observe/record.d.ts.map +1 -0
- package/dist/observe/record.js +66 -0
- package/dist/observe/record.js.map +1 -0
- package/dist/observe/types.d.ts +48 -0
- package/dist/observe/types.d.ts.map +1 -0
- package/dist/observe/types.js +8 -0
- package/dist/observe/types.js.map +1 -0
- package/dist/run/clone.d.ts +9 -11
- package/dist/run/clone.d.ts.map +1 -1
- package/dist/run/clone.js +24 -32
- package/dist/run/clone.js.map +1 -1
- package/dist/run/expand.d.ts +26 -0
- package/dist/run/expand.d.ts.map +1 -0
- package/dist/run/expand.js +62 -0
- package/dist/run/expand.js.map +1 -0
- package/dist/run/repo-lister.d.ts +16 -0
- package/dist/run/repo-lister.d.ts.map +1 -0
- package/dist/run/repo-lister.js +46 -0
- package/dist/run/repo-lister.js.map +1 -0
- package/dist/run/run.d.ts +8 -0
- package/dist/run/run.d.ts.map +1 -1
- package/dist/run/run.js +14 -6
- package/dist/run/run.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -8,16 +8,19 @@
|
|
|
8
8
|
* The init command's logic lives in ./init; this file is the interactive glue
|
|
9
9
|
* (prompting, printing) and is excluded from coverage.
|
|
10
10
|
*/
|
|
11
|
-
import { readFileSync, writeFileSync } from 'node:fs';
|
|
11
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, } from 'node:fs';
|
|
12
12
|
import { dirname, join, resolve } from 'node:path';
|
|
13
13
|
import { createInterface } from 'node:readline/promises';
|
|
14
14
|
import { parseConfig } from './config/parse.js';
|
|
15
15
|
import { parseInitArgs } from './init/args.js';
|
|
16
16
|
import { scaffold } from './init/scaffold.js';
|
|
17
17
|
import { ghIssueClient } from './issues/gh-client.js';
|
|
18
|
+
import { renderDashboard } from './observe/dashboard.js';
|
|
19
|
+
import { buildRunRecord, recordFilename } from './observe/record.js';
|
|
18
20
|
import { nanocoderRunner } from './orchestrator/nanocoder-runner.js';
|
|
19
|
-
import {
|
|
21
|
+
import { prepareRepo } from './run/clone.js';
|
|
20
22
|
import { renderPreview } from './run/preview.js';
|
|
23
|
+
import { ghRepoLister } from './run/repo-lister.js';
|
|
21
24
|
import { renderReport } from './run/report.js';
|
|
22
25
|
import { runFromConfig, runLocal } from './run/run.js';
|
|
23
26
|
import { fsPackLoader, fsRepoFiles } from './run/sources.js';
|
|
@@ -147,6 +150,32 @@ function writeReport(markdown, output) {
|
|
|
147
150
|
console.log(markdown);
|
|
148
151
|
}
|
|
149
152
|
}
|
|
153
|
+
function writeRunRecord(record, recordsDir) {
|
|
154
|
+
mkdirSync(recordsDir, { recursive: true });
|
|
155
|
+
const path = join(recordsDir, recordFilename(record.timestamp));
|
|
156
|
+
writeFileSync(path, `${JSON.stringify(record, null, 2)}\n`);
|
|
157
|
+
console.log(`Wrote run record to ${path}`);
|
|
158
|
+
}
|
|
159
|
+
function writeDashboard(recordsDir, dashboardDir) {
|
|
160
|
+
const records = [];
|
|
161
|
+
if (existsSync(recordsDir)) {
|
|
162
|
+
for (const name of readdirSync(recordsDir)) {
|
|
163
|
+
if (!name.endsWith('.json')) {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
records.push(JSON.parse(readFileSync(join(recordsDir, name), 'utf8')));
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Skip a malformed record rather than fail the whole dashboard.
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
mkdirSync(dashboardDir, { recursive: true });
|
|
175
|
+
const path = join(dashboardDir, 'index.html');
|
|
176
|
+
writeFileSync(path, renderDashboard(records));
|
|
177
|
+
console.log(`Wrote dashboard to ${path}`);
|
|
178
|
+
}
|
|
150
179
|
async function runRun(argv) {
|
|
151
180
|
if (argv.includes('--help') || argv.includes('-h')) {
|
|
152
181
|
console.log(RUN_USAGE);
|
|
@@ -180,28 +209,19 @@ async function runRun(argv) {
|
|
|
180
209
|
}
|
|
181
210
|
const dryRun = flags.get('dry-run') === true;
|
|
182
211
|
const workspace = flagStr(flags, 'workspace') ?? '.';
|
|
183
|
-
|
|
184
|
-
if (flags.get('no-clone') !== true) {
|
|
185
|
-
const repos = parsed.config.targets
|
|
186
|
-
.map(target => target.repo)
|
|
187
|
-
.filter((repo) => Boolean(repo));
|
|
188
|
-
const ensured = ensureTargets(repos, workspace);
|
|
189
|
-
for (const repo of ensured.cloned) {
|
|
190
|
-
console.log(`cloned ${repo}`);
|
|
191
|
-
}
|
|
192
|
-
for (const { repo, error } of ensured.errors) {
|
|
193
|
-
console.error(`clone failed for ${repo}: ${error}`);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
212
|
+
const noClone = flags.get('no-clone') === true;
|
|
196
213
|
// The client is available whenever a token is present — a dry run uses it to
|
|
197
214
|
// read existing issues for the preview, a live run to file.
|
|
198
215
|
const hasToken = Boolean(process.env.GITHUB_TOKEN);
|
|
216
|
+
const now = new Date().toISOString();
|
|
199
217
|
const report = await runFromConfig(parsed.config, {
|
|
200
218
|
runner: nanocoderRunner,
|
|
201
219
|
files: fsRepoFiles,
|
|
202
220
|
packs: fsPackLoader,
|
|
203
221
|
client: hasToken ? ghIssueClient : undefined,
|
|
204
|
-
|
|
222
|
+
repoLister: ghRepoLister,
|
|
223
|
+
cloneRepo: noClone ? undefined : prepareRepo,
|
|
224
|
+
now,
|
|
205
225
|
}, {
|
|
206
226
|
workspaceDir: workspace,
|
|
207
227
|
packsDir: flagStr(flags, 'packs-dir') ?? join(dirname(configPath), 'rule-packs'),
|
|
@@ -217,6 +237,9 @@ async function runRun(argv) {
|
|
|
217
237
|
? renderPreview(report.previews)
|
|
218
238
|
: renderReport(report.outcome);
|
|
219
239
|
writeReport(markdown, output);
|
|
240
|
+
for (const error of report.targetErrors) {
|
|
241
|
+
console.error(`target: ${error}`);
|
|
242
|
+
}
|
|
220
243
|
if (report.filed) {
|
|
221
244
|
for (const { repo: repoName, result } of report.reconciled) {
|
|
222
245
|
console.log(`${repoName}: filed ${result.created.length}, touched ${result.touched}, resolved ${result.resolved}`);
|
|
@@ -228,6 +251,19 @@ async function runRun(argv) {
|
|
|
228
251
|
else {
|
|
229
252
|
console.log('No GITHUB_TOKEN — no issues filed.');
|
|
230
253
|
}
|
|
254
|
+
// Commit the durable run record and regenerate the static dashboard.
|
|
255
|
+
if (flags.get('no-record') !== true) {
|
|
256
|
+
const mode = dryRun
|
|
257
|
+
? 'dry-run'
|
|
258
|
+
: report.filed
|
|
259
|
+
? 'live'
|
|
260
|
+
: 'audit-only';
|
|
261
|
+
const recordsDir = flagStr(flags, 'records-dir') ?? 'runs';
|
|
262
|
+
writeRunRecord(buildRunRecord(report, now, mode), recordsDir);
|
|
263
|
+
if (flags.get('no-dashboard') !== true) {
|
|
264
|
+
writeDashboard(recordsDir, flagStr(flags, 'dashboard-dir') ?? 'dashboard');
|
|
265
|
+
}
|
|
266
|
+
}
|
|
231
267
|
return 0;
|
|
232
268
|
}
|
|
233
269
|
async function main(argv) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -24,6 +24,9 @@ export { buildIssueBody, buildIssueTitle } from './issues/body.js';
|
|
|
24
24
|
export { buildIssueContent, fileFindings, qualifyingFindings, targetRepoFor, } from './issues/file.js';
|
|
25
25
|
export { buildGhCloseArgs, buildGhEditArgs, buildGhIssueArgs, buildGhListArgs, ghIssueClient, parseIssueList, parseIssueUrl, } from './issues/gh-client.js';
|
|
26
26
|
export type { CreatedIssue, CreateIssueParams, ExistingIssue, FiledIssue, FilingContext, FilingError, FilingResult, GitHubClient, IssueContent, IssueQueryClient, ReconcileClient, } from './issues/types.js';
|
|
27
|
+
export { renderDashboard } from './observe/dashboard.js';
|
|
28
|
+
export { buildRunRecord, recordFilename } from './observe/record.js';
|
|
29
|
+
export type { FilingSummary, PackRunRecord, RepoRunRecord, RunMode, RunRecord, SeverityCounts, } from './observe/types.js';
|
|
27
30
|
export { runAudit } from './orchestrator/audit.js';
|
|
28
31
|
export { type AutoFixOptions, type AutoFixResult, buildAutoFixPrompt, runAuditWithAutoFix, } from './orchestrator/auto-fix.js';
|
|
29
32
|
export { extractJsonArray } from './orchestrator/extract.js';
|
|
@@ -37,8 +40,10 @@ export { globToRegExp, matchesAppliesTo, matchesGlob, } from './rule-packs/glob.
|
|
|
37
40
|
export { parseRulePack, splitFrontmatter } from './rule-packs/parse.js';
|
|
38
41
|
export type { AppliesTo, ParseResult, RulePack, RulePackError, RulePackManifest, } from './rule-packs/types.js';
|
|
39
42
|
export { auditPack, type PackAuditContext } from './run/audit.js';
|
|
40
|
-
export { buildCloneArgs, type
|
|
43
|
+
export { buildCloneArgs, type PrepareResult, prepareRepo, } from './run/clone.js';
|
|
44
|
+
export { type ExpandResult, expandTargets, type ResolvedRepoTarget, } from './run/expand.js';
|
|
41
45
|
export { type DryRunPreview, previewReconciliation, renderPreview, } from './run/preview.js';
|
|
46
|
+
export { buildRepoListArgs, ghRepoLister, parseRepoList, type RepoLister, } from './run/repo-lister.js';
|
|
42
47
|
export { countFindings, renderReport } from './run/report.js';
|
|
43
48
|
export { type RunConfigOptions, type RunDeps, type RunLocalDeps, type RunReport, runFromConfig, runLocal, } from './run/run.js';
|
|
44
49
|
export { isEnabledPackPath, unionPatterns } from './run/select.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,MAAM,GACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AACxE,OAAO,EACN,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,kBAAkB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,KAAK,eAAe,EACpB,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACX,UAAU,EACV,OAAO,EACP,SAAS,EACT,QAAQ,GACR,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,WAAW,EACX,YAAY,EACZ,UAAU,EACV,sBAAsB,EACtB,UAAU,EACV,YAAY,GACZ,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACX,eAAe,EACf,gBAAgB,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAC,KAAK,cAAc,EAAE,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAC,KAAK,cAAc,EAAE,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AACjE,OAAO,EACN,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,WAAW,EACX,YAAY,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,YAAY,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,cAAc,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjE,OAAO,EACN,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,aAAa,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,GACb,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,eAAe,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;AACnE,YAAY,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,OAAO,EACP,SAAS,EACT,cAAc,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AACjD,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACN,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,cAAc,GACd,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,aAAa,GACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAC,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAC,WAAW,EAAE,YAAY,EAAE,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC7E,YAAY,EAAC,gBAAgB,EAAC,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAC,mBAAmB,EAAC,MAAM,8BAA8B,CAAC;AACjE,OAAO,EACN,YAAY,EACZ,gBAAgB,EAChB,WAAW,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAC,aAAa,EAAE,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACtE,YAAY,EACX,SAAS,EACT,WAAW,EACX,QAAQ,EACR,aAAa,EACb,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,SAAS,EAAE,KAAK,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACN,cAAc,EACd,KAAK,aAAa,EAClB,WAAW,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,KAAK,YAAY,EACjB,aAAa,EACb,KAAK,kBAAkB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,KAAK,aAAa,EAClB,qBAAqB,EACrB,aAAa,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,KAAK,UAAU,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAC,aAAa,EAAE,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,aAAa,EACb,QAAQ,GACR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,iBAAiB,EAAE,aAAa,EAAC,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAC,YAAY,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC3D,YAAY,EACX,WAAW,EACX,aAAa,EACb,UAAU,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,UAAU,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,KAAK,eAAe,GACpB,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,8 @@ export { DEFAULT_INIT_OPTIONS, } from './init/types.js';
|
|
|
20
20
|
export { buildIssueBody, buildIssueTitle } from './issues/body.js';
|
|
21
21
|
export { buildIssueContent, fileFindings, qualifyingFindings, targetRepoFor, } from './issues/file.js';
|
|
22
22
|
export { buildGhCloseArgs, buildGhEditArgs, buildGhIssueArgs, buildGhListArgs, ghIssueClient, parseIssueList, parseIssueUrl, } from './issues/gh-client.js';
|
|
23
|
+
export { renderDashboard } from './observe/dashboard.js';
|
|
24
|
+
export { buildRunRecord, recordFilename } from './observe/record.js';
|
|
23
25
|
export { runAudit } from './orchestrator/audit.js';
|
|
24
26
|
export { buildAutoFixPrompt, runAuditWithAutoFix, } from './orchestrator/auto-fix.js';
|
|
25
27
|
export { extractJsonArray } from './orchestrator/extract.js';
|
|
@@ -29,8 +31,10 @@ export { resolveDependencies } from './rule-packs/dependencies.js';
|
|
|
29
31
|
export { globToRegExp, matchesAppliesTo, matchesGlob, } from './rule-packs/glob.js';
|
|
30
32
|
export { parseRulePack, splitFrontmatter } from './rule-packs/parse.js';
|
|
31
33
|
export { auditPack } from './run/audit.js';
|
|
32
|
-
export { buildCloneArgs } from './run/clone.js';
|
|
34
|
+
export { buildCloneArgs, prepareRepo, } from './run/clone.js';
|
|
35
|
+
export { expandTargets, } from './run/expand.js';
|
|
33
36
|
export { previewReconciliation, renderPreview, } from './run/preview.js';
|
|
37
|
+
export { buildRepoListArgs, ghRepoLister, parseRepoList, } from './run/repo-lister.js';
|
|
34
38
|
export { countFindings, renderReport } from './run/report.js';
|
|
35
39
|
export { runFromConfig, runLocal, } from './run/run.js';
|
|
36
40
|
export { isEnabledPackPath, unionPatterns } from './run/select.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAa5D,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AACxE,OAAO,EACN,kBAAkB,EAGlB,kBAAkB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEN,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EACN,WAAW,EACX,YAAY,EACZ,UAAU,EACV,sBAAsB,EACtB,UAAU,EACV,YAAY,GACZ,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAsB,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAsB,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AACjE,OAAO,EACN,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,WAAW,EACX,YAAY,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,oBAAoB,GAGpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,cAAc,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjE,OAAO,EACN,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,aAAa,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,GACb,MAAM,uBAAuB,CAAC;AAc/B,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAGN,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACN,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,cAAc,GACd,MAAM,oCAAoC,CAAC;AAO5C,OAAO,EAAC,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAC,mBAAmB,EAAC,MAAM,8BAA8B,CAAC;AACjE,OAAO,EACN,YAAY,EACZ,gBAAgB,EAChB,WAAW,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAC,aAAa,EAAE,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AAQtE,OAAO,EAAC,SAAS,EAAwB,MAAM,gBAAgB,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../source/init/templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;AAY5C,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAwBzD;AAED,mDAAmD;AACnD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../source/init/templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;AAY5C,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAwBzD;AAED,mDAAmD;AACnD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA2DzD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAmCpC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAkBxC;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAmCzD"}
|
package/dist/init/templates.js
CHANGED
|
@@ -54,8 +54,9 @@ concurrency:
|
|
|
54
54
|
group: sentinel
|
|
55
55
|
cancel-in-progress: false
|
|
56
56
|
|
|
57
|
+
# contents: write lets the run commit its record and dashboard back to this repo.
|
|
57
58
|
permissions:
|
|
58
|
-
contents:
|
|
59
|
+
contents: write
|
|
59
60
|
issues: write
|
|
60
61
|
|
|
61
62
|
jobs:
|
|
@@ -83,6 +84,16 @@ jobs:
|
|
|
83
84
|
--workspace "$RUNNER_TEMP/sentinel"
|
|
84
85
|
--output "$GITHUB_STEP_SUMMARY"
|
|
85
86
|
\${{ github.event.inputs.dry_run == 'true' && '--dry-run' || '' }}
|
|
87
|
+
|
|
88
|
+
- name: Commit run record and dashboard
|
|
89
|
+
run: |
|
|
90
|
+
git config user.name "github-actions[bot]"
|
|
91
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
92
|
+
git add runs dashboard
|
|
93
|
+
if ! git diff --cached --quiet; then
|
|
94
|
+
git commit -m "chore: sentinel run record [skip ci]"
|
|
95
|
+
git push
|
|
96
|
+
fi
|
|
86
97
|
`;
|
|
87
98
|
}
|
|
88
99
|
/**
|
|
@@ -182,6 +193,8 @@ the example block and set its key as an environment variable / Actions secret.
|
|
|
182
193
|
- \`agents.config.json\` — Nanocoder provider/model wiring.
|
|
183
194
|
- \`rule-packs/\` — your rule packs (you author these).
|
|
184
195
|
- \`.github/workflows/sentinel.yml\` — the scheduled audit.
|
|
196
|
+
- \`runs/\` — a committed JSON record per run (the durable history).
|
|
197
|
+
- \`dashboard/\` — a generated static \`index.html\`; serve it via GitHub Pages.
|
|
185
198
|
`;
|
|
186
199
|
}
|
|
187
200
|
//# sourceMappingURL=templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../source/init/templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,SAAS,YAAY,CAAC,OAAiB;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACnE,OAAO,IAAI;SACT,GAAG,CACH,IAAI,CAAC,EAAE,CACN,aAAa,IAAI,4DAA4D,CAC9E;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,OAAoB;IAChD,OAAO;;;;;EAKN,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;;;aAGlB,OAAO,CAAC,QAAQ;;;sBAGP,OAAO,CAAC,iBAAiB;;;;cAIjC,OAAO,CAAC,QAAQ;WACnB,OAAO,CAAC,KAAK;;;;WAIb,OAAO,CAAC,KAAK;;CAEvB,CAAC;AACF,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,YAAY,CAAC,OAAoB;IAChD,OAAO;;;;eAIO,OAAO,CAAC,QAAQ
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../source/init/templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,SAAS,YAAY,CAAC,OAAiB;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACnE,OAAO,IAAI;SACT,GAAG,CACH,IAAI,CAAC,EAAE,CACN,aAAa,IAAI,4DAA4D,CAC9E;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,OAAoB;IAChD,OAAO;;;;;EAKN,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;;;aAGlB,OAAO,CAAC,QAAQ;;;sBAGP,OAAO,CAAC,iBAAiB;;;;cAIjC,OAAO,CAAC,QAAQ;WACnB,OAAO,CAAC,KAAK;;;;WAIb,OAAO,CAAC,KAAK;;CAEvB,CAAC;AACF,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,YAAY,CAAC,OAAoB;IAChD,OAAO;;;;eAIO,OAAO,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqD9B,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCP,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC9B,OAAO,GAAG,IAAI,CAAC,SAAS,CACvB;QACC,SAAS,EAAE;YACV,SAAS,EAAE;gBACV;oBACC,IAAI,EAAE,yCAAyC;oBAC/C,WAAW,EAAE,WAAW;oBACxB,OAAO,EAAE,sCAAsC;oBAC/C,MAAM,EAAE,uBAAuB;oBAC/B,MAAM,EAAE,CAAC,eAAe,CAAC;iBACzB;aACD;SACD;KACD,EACD,IAAI,EACJ,CAAC,CACD,IAAI,CAAC;AACP,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,YAAY,CAAC,OAAoB;IAChD,OAAO;;;;;;;;;;;;;;wDAcgD,OAAO,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;CAmBvE,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render a self-contained static HTML dashboard from the committed run records.
|
|
3
|
+
* No database, no build step, no external assets — a single page suitable for
|
|
4
|
+
* the config repo's GitHub Pages. Pure and tested.
|
|
5
|
+
*/
|
|
6
|
+
import type { RunRecord } from './types.js';
|
|
7
|
+
/** Render the dashboard HTML for a set of run records (newest first). */
|
|
8
|
+
export declare function renderDashboard(records: RunRecord[]): string;
|
|
9
|
+
//# sourceMappingURL=dashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../source/observe/dashboard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AAmC1C,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CAsD5D"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render a self-contained static HTML dashboard from the committed run records.
|
|
3
|
+
* No database, no build step, no external assets — a single page suitable for
|
|
4
|
+
* the config repo's GitHub Pages. Pure and tested.
|
|
5
|
+
*/
|
|
6
|
+
const MAX_ROWS = 60;
|
|
7
|
+
function escapeHtml(text) {
|
|
8
|
+
return text
|
|
9
|
+
.replace(/&/g, '&')
|
|
10
|
+
.replace(/</g, '<')
|
|
11
|
+
.replace(/>/g, '>')
|
|
12
|
+
.replace(/"/g, '"');
|
|
13
|
+
}
|
|
14
|
+
function severityCell(count, className) {
|
|
15
|
+
const shown = count > 0 ? String(count) : '·';
|
|
16
|
+
return `<td class="sev ${className}">${shown}</td>`;
|
|
17
|
+
}
|
|
18
|
+
function row(record) {
|
|
19
|
+
const { bySeverity } = record.totals;
|
|
20
|
+
const filed = record.filing ? String(record.filing.filed) : '—';
|
|
21
|
+
return [
|
|
22
|
+
'<tr>',
|
|
23
|
+
`<td class="ts">${escapeHtml(record.timestamp)}</td>`,
|
|
24
|
+
`<td><span class="mode ${record.mode}">${record.mode}</span></td>`,
|
|
25
|
+
`<td class="num">${record.totals.repos}</td>`,
|
|
26
|
+
`<td class="num">${record.totals.findings}</td>`,
|
|
27
|
+
severityCell(bySeverity.critical, 'critical'),
|
|
28
|
+
severityCell(bySeverity.high, 'high'),
|
|
29
|
+
severityCell(bySeverity.medium, 'medium'),
|
|
30
|
+
severityCell(bySeverity.low, 'low'),
|
|
31
|
+
`<td class="num">${filed}</td>`,
|
|
32
|
+
'</tr>',
|
|
33
|
+
].join('');
|
|
34
|
+
}
|
|
35
|
+
/** Render the dashboard HTML for a set of run records (newest first). */
|
|
36
|
+
export function renderDashboard(records) {
|
|
37
|
+
const sorted = [...records].sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
38
|
+
const latest = sorted[0];
|
|
39
|
+
const rows = sorted.slice(0, MAX_ROWS).map(row).join('\n');
|
|
40
|
+
const summary = latest
|
|
41
|
+
? `Latest run ${escapeHtml(latest.timestamp)} — ${latest.totals.findings} finding(s) across ${latest.totals.repos} repo(s).`
|
|
42
|
+
: 'No runs recorded yet.';
|
|
43
|
+
return `<!doctype html>
|
|
44
|
+
<html lang="en">
|
|
45
|
+
<head>
|
|
46
|
+
<meta charset="utf-8">
|
|
47
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
48
|
+
<title>Sentinel</title>
|
|
49
|
+
<style>
|
|
50
|
+
:root { color-scheme: dark; }
|
|
51
|
+
body { font-family: system-ui, sans-serif; background: #1a1b26; color: #a9b1d6; margin: 0; padding: 2rem; }
|
|
52
|
+
h1 { color: #7aa2f7; margin: 0 0 .25rem; font-size: 1.4rem; }
|
|
53
|
+
p.summary { color: #c0caf5; margin: 0 0 1.5rem; }
|
|
54
|
+
table { border-collapse: collapse; width: 100%; font-size: .9rem; }
|
|
55
|
+
th, td { padding: .5rem .6rem; text-align: left; border-bottom: 1px solid #292e42; }
|
|
56
|
+
th { color: #565f89; font-weight: 600; text-transform: uppercase; font-size: .72rem; letter-spacing: .04em; }
|
|
57
|
+
td.num, td.sev { text-align: right; font-variant-numeric: tabular-nums; }
|
|
58
|
+
.ts { color: #9aa5ce; font-variant-numeric: tabular-nums; }
|
|
59
|
+
.mode { padding: .1rem .45rem; border-radius: 999px; font-size: .72rem; }
|
|
60
|
+
.mode.live { background: #2d3b2d; color: #9ece6a; }
|
|
61
|
+
.mode.dry-run { background: #3b352d; color: #e0af68; }
|
|
62
|
+
.mode.audit-only { background: #2d3242; color: #7dcfff; }
|
|
63
|
+
.sev.critical { color: #f7768e; }
|
|
64
|
+
.sev.high { color: #ff9e64; }
|
|
65
|
+
.sev.medium { color: #e0af68; }
|
|
66
|
+
.sev.low { color: #565f89; }
|
|
67
|
+
footer { margin-top: 1.5rem; color: #565f89; font-size: .8rem; }
|
|
68
|
+
</style>
|
|
69
|
+
</head>
|
|
70
|
+
<body>
|
|
71
|
+
<h1>🛡️ Sentinel</h1>
|
|
72
|
+
<p class="summary">${summary}</p>
|
|
73
|
+
<table>
|
|
74
|
+
<thead><tr>
|
|
75
|
+
<th>Run</th><th>Mode</th><th>Repos</th><th>Findings</th>
|
|
76
|
+
<th>Crit</th><th>High</th><th>Med</th><th>Low</th><th>Filed</th>
|
|
77
|
+
</tr></thead>
|
|
78
|
+
<tbody>
|
|
79
|
+
${rows}
|
|
80
|
+
</tbody>
|
|
81
|
+
</table>
|
|
82
|
+
<footer>Generated by <a href="https://docs.nanocollective.org/sentinel/docs" style="color:#7aa2f7">Sentinel</a> from committed run records.</footer>
|
|
83
|
+
</body>
|
|
84
|
+
</html>
|
|
85
|
+
`;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../source/observe/dashboard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,QAAQ,GAAG,EAAE,CAAC;AAEpB,SAAS,UAAU,CAAC,IAAY;IAC/B,OAAO,IAAI;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,SAAiB;IACrD,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,OAAO,kBAAkB,SAAS,KAAK,KAAK,OAAO,CAAC;AACrD,CAAC;AAED,SAAS,GAAG,CAAC,MAAiB;IAC7B,MAAM,EAAC,UAAU,EAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAChE,OAAO;QACN,MAAM;QACN,kBAAkB,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO;QACrD,yBAAyB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,cAAc;QAClE,mBAAmB,MAAM,CAAC,MAAM,CAAC,KAAK,OAAO;QAC7C,mBAAmB,MAAM,CAAC,MAAM,CAAC,QAAQ,OAAO;QAChD,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC;QAC7C,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;QACrC,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC;QACzC,YAAY,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;QACnC,mBAAmB,KAAK,OAAO;QAC/B,OAAO;KACP,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACZ,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,OAAoB;IACnD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACzC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CACtC,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG,MAAM;QACrB,CAAC,CAAC,cAAc,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,sBAAsB,MAAM,CAAC,MAAM,CAAC,KAAK,WAAW;QAC5H,CAAC,CAAC,uBAAuB,CAAC;IAE3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA6Ba,OAAO;;;;;;;EAO1B,IAAI;;;;;;CAML,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a durable {@link RunRecord} from a run's {@link RunReport}. Pure — the
|
|
3
|
+
* CLI stamps the timestamp and mode and writes the JSON.
|
|
4
|
+
*/
|
|
5
|
+
import type { RunReport } from '../run/run.js';
|
|
6
|
+
import type { RunMode, RunRecord } from './types.js';
|
|
7
|
+
/** Build a run record from a report, a timestamp, and the run mode. */
|
|
8
|
+
export declare function buildRunRecord(report: RunReport, timestamp: string, mode: RunMode): RunRecord;
|
|
9
|
+
/** A filesystem-safe filename for a run record from its timestamp. */
|
|
10
|
+
export declare function recordFilename(timestamp: string): string;
|
|
11
|
+
//# sourceMappingURL=record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../source/observe/record.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAGX,OAAO,EACP,SAAS,EAET,MAAM,YAAY,CAAC;AA8BpB,uEAAuE;AACvE,wBAAgB,cAAc,CAC7B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,GACX,SAAS,CAiCX;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a durable {@link RunRecord} from a run's {@link RunReport}. Pure — the
|
|
3
|
+
* CLI stamps the timestamp and mode and writes the JSON.
|
|
4
|
+
*/
|
|
5
|
+
import { SEVERITIES } from '../findings/types.js';
|
|
6
|
+
function emptyCounts() {
|
|
7
|
+
return { low: 0, medium: 0, high: 0, critical: 0 };
|
|
8
|
+
}
|
|
9
|
+
function addCounts(into, from) {
|
|
10
|
+
for (const severity of SEVERITIES) {
|
|
11
|
+
into[severity] += from[severity];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function repoRecord(outcome) {
|
|
15
|
+
const bySeverity = emptyCounts();
|
|
16
|
+
let findings = 0;
|
|
17
|
+
const packs = outcome.packs.map(pack => {
|
|
18
|
+
for (const finding of pack.findings) {
|
|
19
|
+
bySeverity[finding.severity] += 1;
|
|
20
|
+
}
|
|
21
|
+
findings += pack.findings.length;
|
|
22
|
+
return {
|
|
23
|
+
pack: pack.pack,
|
|
24
|
+
version: pack.version,
|
|
25
|
+
findings: pack.findings.length,
|
|
26
|
+
ok: pack.ok,
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
return { repo: outcome.repo, findings, bySeverity, packs };
|
|
30
|
+
}
|
|
31
|
+
/** Build a run record from a report, a timestamp, and the run mode. */
|
|
32
|
+
export function buildRunRecord(report, timestamp, mode) {
|
|
33
|
+
const repos = report.outcome.repos.map(repoRecord);
|
|
34
|
+
const totalsBySeverity = emptyCounts();
|
|
35
|
+
let totalFindings = 0;
|
|
36
|
+
for (const repo of repos) {
|
|
37
|
+
addCounts(totalsBySeverity, repo.bySeverity);
|
|
38
|
+
totalFindings += repo.findings;
|
|
39
|
+
}
|
|
40
|
+
const record = {
|
|
41
|
+
timestamp,
|
|
42
|
+
mode,
|
|
43
|
+
repos,
|
|
44
|
+
totals: {
|
|
45
|
+
repos: repos.length,
|
|
46
|
+
findings: totalFindings,
|
|
47
|
+
bySeverity: totalsBySeverity,
|
|
48
|
+
},
|
|
49
|
+
targetErrors: report.targetErrors,
|
|
50
|
+
};
|
|
51
|
+
if (report.filed) {
|
|
52
|
+
const filing = { filed: 0, touched: 0, resolved: 0 };
|
|
53
|
+
for (const { result } of report.reconciled) {
|
|
54
|
+
filing.filed += result.created.length;
|
|
55
|
+
filing.touched += result.touched;
|
|
56
|
+
filing.resolved += result.resolved;
|
|
57
|
+
}
|
|
58
|
+
record.filing = filing;
|
|
59
|
+
}
|
|
60
|
+
return record;
|
|
61
|
+
}
|
|
62
|
+
/** A filesystem-safe filename for a run record from its timestamp. */
|
|
63
|
+
export function recordFilename(timestamp) {
|
|
64
|
+
return `${timestamp.replace(/[:.]/g, '-')}.json`;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../source/observe/record.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable per-run record and the shapes the dashboard renders from. One
|
|
3
|
+
* record is committed to the config repo per run (the durable store); the
|
|
4
|
+
* dashboard is the read-side surface generated from the records
|
|
5
|
+
* (see docs/workflow/index.md#observability-and-run-history).
|
|
6
|
+
*/
|
|
7
|
+
import type { Severity } from '../findings/types.js';
|
|
8
|
+
/** Finding counts broken down by severity. */
|
|
9
|
+
export type SeverityCounts = Record<Severity, number>;
|
|
10
|
+
/** One pack's contribution within a repo, for the record. */
|
|
11
|
+
export interface PackRunRecord {
|
|
12
|
+
pack: string;
|
|
13
|
+
version: string;
|
|
14
|
+
findings: number;
|
|
15
|
+
ok: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** One repository's result within a run. */
|
|
18
|
+
export interface RepoRunRecord {
|
|
19
|
+
repo: string;
|
|
20
|
+
findings: number;
|
|
21
|
+
bySeverity: SeverityCounts;
|
|
22
|
+
packs: PackRunRecord[];
|
|
23
|
+
}
|
|
24
|
+
/** The mode a run executed in. */
|
|
25
|
+
export type RunMode = 'live' | 'dry-run' | 'audit-only';
|
|
26
|
+
/** Issue-filing totals for a live run. */
|
|
27
|
+
export interface FilingSummary {
|
|
28
|
+
filed: number;
|
|
29
|
+
touched: number;
|
|
30
|
+
resolved: number;
|
|
31
|
+
}
|
|
32
|
+
/** A committed record of one Sentinel run. */
|
|
33
|
+
export interface RunRecord {
|
|
34
|
+
/** ISO timestamp of the run. */
|
|
35
|
+
timestamp: string;
|
|
36
|
+
mode: RunMode;
|
|
37
|
+
repos: RepoRunRecord[];
|
|
38
|
+
totals: {
|
|
39
|
+
repos: number;
|
|
40
|
+
findings: number;
|
|
41
|
+
bySeverity: SeverityCounts;
|
|
42
|
+
};
|
|
43
|
+
/** Present on a live run. */
|
|
44
|
+
filing?: FilingSummary;
|
|
45
|
+
/** Target-expansion / clone failures, carried for visibility. */
|
|
46
|
+
targetErrors: string[];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../source/observe/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAEnD,8CAA8C;AAC9C,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAEtD,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;CACZ;AAED,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,cAAc,CAAC;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;CACvB;AAED,kCAAkC;AAClC,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;AAExD,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,SAAS;IACzB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,MAAM,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,cAAc,CAAC;KAC3B,CAAC;IACF,6BAA6B;IAC7B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,iEAAiE;IACjE,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable per-run record and the shapes the dashboard renders from. One
|
|
3
|
+
* record is committed to the config repo per run (the durable store); the
|
|
4
|
+
* dashboard is the read-side surface generated from the records
|
|
5
|
+
* (see docs/workflow/index.md#observability-and-run-history).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../source/observe/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/run/clone.d.ts
CHANGED
|
@@ -6,18 +6,16 @@
|
|
|
6
6
|
*/
|
|
7
7
|
/** Build the `gh repo clone` argv for a shallow single-branch clone. */
|
|
8
8
|
export declare function buildCloneArgs(repo: string, dir: string): string[];
|
|
9
|
-
/** The outcome of ensuring
|
|
10
|
-
export interface
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
error: string;
|
|
16
|
-
}[];
|
|
9
|
+
/** The outcome of ensuring one repo is present in the workspace. */
|
|
10
|
+
export interface PrepareResult {
|
|
11
|
+
ok: boolean;
|
|
12
|
+
/** True if the repo was already present and no clone was attempted. */
|
|
13
|
+
skipped: boolean;
|
|
14
|
+
error?: string;
|
|
17
15
|
}
|
|
18
16
|
/**
|
|
19
|
-
* Ensure
|
|
20
|
-
*
|
|
17
|
+
* Ensure a single repo is checked out at `dir`, cloning it if missing. Returns
|
|
18
|
+
* a result rather than throwing so one failure does not abort a run.
|
|
21
19
|
*/
|
|
22
|
-
export declare function
|
|
20
|
+
export declare function prepareRepo(repo: string, dir: string): Promise<PrepareResult>;
|
|
23
21
|
//# sourceMappingURL=clone.d.ts.map
|
package/dist/run/clone.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../../source/run/clone.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../../source/run/clone.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAElE;AAED,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,uEAAuE;IACvE,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAGD;;;GAGG;AACH,wBAAsB,WAAW,CAChC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACT,OAAO,CAAC,aAAa,CAAC,CAwBxB"}
|
package/dist/run/clone.js
CHANGED
|
@@ -6,46 +6,38 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { spawnSync } from 'node:child_process';
|
|
8
8
|
import { existsSync } from 'node:fs';
|
|
9
|
-
import { join } from 'node:path';
|
|
10
9
|
/** Build the `gh repo clone` argv for a shallow single-branch clone. */
|
|
11
10
|
export function buildCloneArgs(repo, dir) {
|
|
12
11
|
return ['repo', 'clone', repo, dir, '--', '--depth', '1', '--single-branch'];
|
|
13
12
|
}
|
|
14
13
|
/* c8 ignore start -- spawns gh and touches the filesystem. */
|
|
15
14
|
/**
|
|
16
|
-
* Ensure
|
|
17
|
-
*
|
|
15
|
+
* Ensure a single repo is checked out at `dir`, cloning it if missing. Returns
|
|
16
|
+
* a result rather than throwing so one failure does not abort a run.
|
|
18
17
|
*/
|
|
19
|
-
export function
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const dir = join(workspaceDir, repo);
|
|
23
|
-
if (existsSync(dir)) {
|
|
24
|
-
result.skipped.push(repo);
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
const run = spawnSync('gh', buildCloneArgs(repo, dir), {
|
|
28
|
-
encoding: 'utf8',
|
|
29
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
30
|
-
env: process.env,
|
|
31
|
-
});
|
|
32
|
-
if (run.error) {
|
|
33
|
-
const code = run.error.code;
|
|
34
|
-
result.errors.push({
|
|
35
|
-
repo,
|
|
36
|
-
error: code === 'ENOENT'
|
|
37
|
-
? '`gh` is not on PATH. Install the GitHub CLI.'
|
|
38
|
-
: String(run.error),
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
else if (run.status !== 0) {
|
|
42
|
-
result.errors.push({ repo, error: (run.stderr ?? '').trim() });
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
result.cloned.push(repo);
|
|
46
|
-
}
|
|
18
|
+
export async function prepareRepo(repo, dir) {
|
|
19
|
+
if (existsSync(dir)) {
|
|
20
|
+
return { ok: true, skipped: true };
|
|
47
21
|
}
|
|
48
|
-
|
|
22
|
+
const run = spawnSync('gh', buildCloneArgs(repo, dir), {
|
|
23
|
+
encoding: 'utf8',
|
|
24
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
25
|
+
env: process.env,
|
|
26
|
+
});
|
|
27
|
+
if (run.error) {
|
|
28
|
+
const code = run.error.code;
|
|
29
|
+
return {
|
|
30
|
+
ok: false,
|
|
31
|
+
skipped: false,
|
|
32
|
+
error: code === 'ENOENT'
|
|
33
|
+
? '`gh` is not on PATH. Install the GitHub CLI.'
|
|
34
|
+
: String(run.error),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (run.status !== 0) {
|
|
38
|
+
return { ok: false, skipped: false, error: (run.stderr ?? '').trim() };
|
|
39
|
+
}
|
|
40
|
+
return { ok: true, skipped: false };
|
|
49
41
|
}
|
|
50
42
|
/* c8 ignore stop */
|
|
51
43
|
//# sourceMappingURL=clone.js.map
|
package/dist/run/clone.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clone.js","sourceRoot":"","sources":["../../source/run/clone.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,UAAU,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"clone.js","sourceRoot":"","sources":["../../source/run/clone.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,UAAU,EAAC,MAAM,SAAS,CAAC;AAEnC,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAW;IACvD,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;AAC9E,CAAC;AAUD,8DAA8D;AAC9D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,IAAY,EACZ,GAAW;IAEX,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;IAClC,CAAC;IACD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;QACtD,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,GAAG,EAAE,OAAO,CAAC,GAAG;KAChB,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,GAAG,CAAC,KAA+B,CAAC,IAAI,CAAC;QACvD,OAAO;YACN,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,KAAK;YACd,KAAK,EACJ,IAAI,KAAK,QAAQ;gBAChB,CAAC,CAAC,8CAA8C;gBAChD,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;SACrB,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAC,CAAC;IACtE,CAAC;IACD,OAAO,EAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAC,CAAC;AACnC,CAAC;AACD,oBAAoB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expand a config's targets into concrete repositories. Explicit `repo:`
|
|
3
|
+
* targets pass through; `pattern:` targets are matched against the owner's
|
|
4
|
+
* repositories (listed via an injected {@link RepoLister}). A repo that matches
|
|
5
|
+
* several targets is audited once, with the union of their rule packs.
|
|
6
|
+
*/
|
|
7
|
+
import type { Target } from '../config/types.js';
|
|
8
|
+
import type { RepoLister } from './repo-lister.js';
|
|
9
|
+
/** A concrete repository to audit, with its assigned rule packs. */
|
|
10
|
+
export interface ResolvedRepoTarget {
|
|
11
|
+
repo: string;
|
|
12
|
+
rulePacks: string[];
|
|
13
|
+
}
|
|
14
|
+
/** The outcome of expanding targets. */
|
|
15
|
+
export interface ExpandResult {
|
|
16
|
+
targets: ResolvedRepoTarget[];
|
|
17
|
+
/** Reasons a target could not be expanded (missing lister, list failure). */
|
|
18
|
+
errors: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Expand `config.targets`. Pattern targets need a lister; without one they are
|
|
22
|
+
* recorded as errors and skipped. The owner is the segment before the first
|
|
23
|
+
* `/` in the pattern (e.g. `my-org` for `my-org/web-*`).
|
|
24
|
+
*/
|
|
25
|
+
export declare function expandTargets(targets: Target[], lister?: RepoLister): Promise<ExpandResult>;
|
|
26
|
+
//# sourceMappingURL=expand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../source/run/expand.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,oBAAoB,CAAC;AAE/C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,oEAAoE;AACpE,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAcD;;;;GAIG;AACH,wBAAsB,aAAa,CAClC,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,CAAC,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,CAAC,CAkDvB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expand a config's targets into concrete repositories. Explicit `repo:`
|
|
3
|
+
* targets pass through; `pattern:` targets are matched against the owner's
|
|
4
|
+
* repositories (listed via an injected {@link RepoLister}). A repo that matches
|
|
5
|
+
* several targets is audited once, with the union of their rule packs.
|
|
6
|
+
*/
|
|
7
|
+
import { matchesGlob } from '../rule-packs/glob.js';
|
|
8
|
+
function addRepo(byRepo, repo, rulePacks) {
|
|
9
|
+
const packs = byRepo.get(repo) ?? new Set();
|
|
10
|
+
for (const pack of rulePacks) {
|
|
11
|
+
packs.add(pack);
|
|
12
|
+
}
|
|
13
|
+
byRepo.set(repo, packs);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Expand `config.targets`. Pattern targets need a lister; without one they are
|
|
17
|
+
* recorded as errors and skipped. The owner is the segment before the first
|
|
18
|
+
* `/` in the pattern (e.g. `my-org` for `my-org/web-*`).
|
|
19
|
+
*/
|
|
20
|
+
export async function expandTargets(targets, lister) {
|
|
21
|
+
const byRepo = new Map();
|
|
22
|
+
const errors = [];
|
|
23
|
+
const listed = new Map();
|
|
24
|
+
for (const target of targets) {
|
|
25
|
+
if (target.repo) {
|
|
26
|
+
addRepo(byRepo, target.repo, target.rulePacks);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (!target.pattern) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const pattern = target.pattern;
|
|
33
|
+
if (!lister) {
|
|
34
|
+
errors.push(`cannot expand pattern "${pattern}" — no repo lister available (needs a GitHub token)`);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const owner = pattern.split('/')[0];
|
|
38
|
+
if (!owner) {
|
|
39
|
+
errors.push(`invalid pattern "${pattern}" — expected owner/glob`);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
let repos = listed.get(owner);
|
|
43
|
+
if (!repos) {
|
|
44
|
+
try {
|
|
45
|
+
repos = await lister.list(owner);
|
|
46
|
+
listed.set(owner, repos);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
50
|
+
errors.push(`failed to list repos for "${owner}": ${message}`);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const matched = repos.filter(repo => matchesGlob(pattern, repo));
|
|
55
|
+
for (const repo of matched) {
|
|
56
|
+
addRepo(byRepo, repo, target.rulePacks);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const resolved = [...byRepo.entries()].map(([repo, packs]) => ({ repo, rulePacks: [...packs] }));
|
|
60
|
+
return { targets: resolved, errors };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=expand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand.js","sourceRoot":"","sources":["../../source/run/expand.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AAgBlD,SAAS,OAAO,CACf,MAAgC,EAChC,IAAY,EACZ,SAAmB;IAEnB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC9B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,OAAiB,EACjB,MAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE3C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/C,SAAS;QACV,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACrB,SAAS;QACV,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACV,0BAA0B,OAAO,qDAAqD,CACtF,CAAC;YACF,SAAS;QACV,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,oBAAoB,OAAO,yBAAyB,CAAC,CAAC;YAClE,SAAS;QACV,CAAC;QAED,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,IAAI,CAAC;gBACJ,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,CAAC,IAAI,CAAC,6BAA6B,KAAK,MAAM,OAAO,EAAE,CAAC,CAAC;gBAC/D,SAAS;YACV,CAAC;QACF,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACjE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GAAyB,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAC/D,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,IAAI,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,EAAC,CAAC,CAClD,CAAC;IACF,OAAO,EAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List an owner's repositories so `pattern:` targets can be expanded into
|
|
3
|
+
* concrete repos. Injectable (RepoLister) so target expansion is testable
|
|
4
|
+
* without the GitHub API; the real implementation shells out to `gh`.
|
|
5
|
+
*/
|
|
6
|
+
/** Lists the repositories under a GitHub owner (org or user). */
|
|
7
|
+
export interface RepoLister {
|
|
8
|
+
/** Return `owner/name` for every non-archived repo under `owner`. */
|
|
9
|
+
list(owner: string): Promise<string[]>;
|
|
10
|
+
}
|
|
11
|
+
/** Build the `gh repo list` argv. Pure and tested. */
|
|
12
|
+
export declare function buildRepoListArgs(owner: string): string[];
|
|
13
|
+
/** Parse `gh repo list --json ...` output, dropping archived repos. */
|
|
14
|
+
export declare function parseRepoList(json: string): string[];
|
|
15
|
+
export declare const ghRepoLister: RepoLister;
|
|
16
|
+
//# sourceMappingURL=repo-lister.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-lister.d.ts","sourceRoot":"","sources":["../../source/run/repo-lister.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,iEAAiE;AACjE,MAAM,WAAW,UAAU;IAC1B,qEAAqE;IACrE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACvC;AAED,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUzD;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAMpD;AAGD,eAAO,MAAM,YAAY,EAAE,UAqB1B,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List an owner's repositories so `pattern:` targets can be expanded into
|
|
3
|
+
* concrete repos. Injectable (RepoLister) so target expansion is testable
|
|
4
|
+
* without the GitHub API; the real implementation shells out to `gh`.
|
|
5
|
+
*/
|
|
6
|
+
import { spawnSync } from 'node:child_process';
|
|
7
|
+
/** Build the `gh repo list` argv. Pure and tested. */
|
|
8
|
+
export function buildRepoListArgs(owner) {
|
|
9
|
+
return [
|
|
10
|
+
'repo',
|
|
11
|
+
'list',
|
|
12
|
+
owner,
|
|
13
|
+
'--limit',
|
|
14
|
+
'1000',
|
|
15
|
+
'--json',
|
|
16
|
+
'nameWithOwner,isArchived',
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
/** Parse `gh repo list --json ...` output, dropping archived repos. */
|
|
20
|
+
export function parseRepoList(json) {
|
|
21
|
+
const raw = JSON.parse(json);
|
|
22
|
+
return raw.filter(repo => !repo.isArchived).map(repo => repo.nameWithOwner);
|
|
23
|
+
}
|
|
24
|
+
/* c8 ignore start -- spawns the gh CLI; not exercised in unit tests. */
|
|
25
|
+
export const ghRepoLister = {
|
|
26
|
+
async list(owner) {
|
|
27
|
+
const result = spawnSync('gh', buildRepoListArgs(owner), {
|
|
28
|
+
encoding: 'utf8',
|
|
29
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
30
|
+
env: process.env,
|
|
31
|
+
});
|
|
32
|
+
if (result.error) {
|
|
33
|
+
const code = result.error.code;
|
|
34
|
+
if (code === 'ENOENT') {
|
|
35
|
+
throw new Error('`gh` is not on PATH. Install the GitHub CLI.');
|
|
36
|
+
}
|
|
37
|
+
throw result.error;
|
|
38
|
+
}
|
|
39
|
+
if (result.status !== 0) {
|
|
40
|
+
throw new Error(`gh repo list ${owner} failed (status ${result.status}): ${(result.stderr ?? '').trim()}`);
|
|
41
|
+
}
|
|
42
|
+
return parseRepoList(result.stdout ?? '');
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
/* c8 ignore stop */
|
|
46
|
+
//# sourceMappingURL=repo-lister.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-lister.js","sourceRoot":"","sources":["../../source/run/repo-lister.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAQ7C,sDAAsD;AACtD,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC9C,OAAO;QACN,MAAM;QACN,MAAM;QACN,KAAK;QACL,SAAS;QACT,MAAM;QACN,QAAQ;QACR,0BAA0B;KAC1B,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAGzB,CAAC;IACH,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC7E,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,MAAM,YAAY,GAAe;IACvC,KAAK,CAAC,IAAI,CAAC,KAAa;QACvB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE;YACxD,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG,EAAE,OAAO,CAAC,GAAG;SAChB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,GAAI,MAAM,CAAC,KAA+B,CAAC,IAAI,CAAC;YAC1D,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,MAAM,CAAC,KAAK,CAAC;QACpB,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACd,gBAAgB,KAAK,mBAAmB,MAAM,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CACzF,CAAC;QACH,CAAC;QACD,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;CACD,CAAC;AACF,oBAAoB"}
|
package/dist/run/run.d.ts
CHANGED
|
@@ -12,7 +12,9 @@ import { type ReconcileResult } from '../dedup/reconcile.js';
|
|
|
12
12
|
import type { ReconcileClient } from '../issues/types.js';
|
|
13
13
|
import type { AutoFixOptions } from '../orchestrator/auto-fix.js';
|
|
14
14
|
import type { ModelRunner } from '../orchestrator/types.js';
|
|
15
|
+
import type { PrepareResult } from './clone.js';
|
|
15
16
|
import { type DryRunPreview } from './preview.js';
|
|
17
|
+
import type { RepoLister } from './repo-lister.js';
|
|
16
18
|
import type { PackLoadError, PackLoader, RepoFiles, RunOutcome } from './types.js';
|
|
17
19
|
/** Injected dependencies for a run. */
|
|
18
20
|
export interface RunDeps {
|
|
@@ -21,6 +23,10 @@ export interface RunDeps {
|
|
|
21
23
|
packs: PackLoader;
|
|
22
24
|
/** Present only when filing issues (the Actions path). */
|
|
23
25
|
client?: ReconcileClient;
|
|
26
|
+
/** Lists an owner's repos to expand pattern targets. */
|
|
27
|
+
repoLister?: RepoLister;
|
|
28
|
+
/** Ensures a target repo is checked out; omit to assume repos are present. */
|
|
29
|
+
cloneRepo?: (repo: string, dir: string) => Promise<PrepareResult>;
|
|
24
30
|
/** ISO timestamp for deterministic reconciliation. */
|
|
25
31
|
now: string;
|
|
26
32
|
}
|
|
@@ -56,6 +62,8 @@ export interface RunReport {
|
|
|
56
62
|
preview: DryRunPreview;
|
|
57
63
|
}[];
|
|
58
64
|
packLoadErrors: PackLoadError[];
|
|
65
|
+
/** Target-expansion and clone failures. */
|
|
66
|
+
targetErrors: string[];
|
|
59
67
|
/** True if issues were filed (client present and not a dry run). */
|
|
60
68
|
filed: boolean;
|
|
61
69
|
}
|
package/dist/run/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../source/run/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAe,cAAc,EAAC,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAC,KAAK,eAAe,EAAoB,MAAM,uBAAuB,CAAC;AAE9E,OAAO,KAAK,EAAgB,eAAe,EAAC,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,0BAA0B,CAAC;AAK1D,OAAO,EAAC,KAAK,aAAa,EAAwB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../source/run/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAe,cAAc,EAAC,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAC,KAAK,eAAe,EAAoB,MAAM,uBAAuB,CAAC;AAE9E,OAAO,KAAK,EAAgB,eAAe,EAAC,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,0BAA0B,CAAC;AAK1D,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAC,KAAK,aAAa,EAAwB,MAAM,cAAc,CAAC;AACvE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EACX,aAAa,EACb,UAAU,EAEV,SAAS,EAET,UAAU,EACV,MAAM,YAAY,CAAC;AAEpB,uCAAuC;AACvC,MAAM,WAAW,OAAO;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,wDAAwD;IACxD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAClE,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAChC,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,+CAA+C;AAC/C,MAAM,WAAW,SAAS;IACzB,OAAO,EAAE,UAAU,CAAC;IACpB,4DAA4D;IAC5D,UAAU,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAC,EAAE,CAAC;IACtD,8CAA8C;IAC9C,QAAQ,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAC,EAAE,CAAC;IACnD,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,2CAA2C;IAC3C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAC;CACf;AAcD,gDAAgD;AAChD,wBAAsB,aAAa,CAClC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,gBAAgB,GACvB,OAAO,CAAC,SAAS,CAAC,CA6HpB;AAED,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,EAC9B,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,UAAU,CAAC,CAwBrB"}
|
package/dist/run/run.js
CHANGED
|
@@ -14,6 +14,7 @@ import { targetRepoFor } from '../issues/file.js';
|
|
|
14
14
|
import { resolveDependencies } from '../rule-packs/dependencies.js';
|
|
15
15
|
import { parseRulePack } from '../rule-packs/parse.js';
|
|
16
16
|
import { auditPack } from './audit.js';
|
|
17
|
+
import { expandTargets } from './expand.js';
|
|
17
18
|
import { previewReconciliation } from './preview.js';
|
|
18
19
|
import { unionPatterns } from './select.js';
|
|
19
20
|
async function readOverride(files, repoDir) {
|
|
@@ -32,14 +33,20 @@ export async function runFromConfig(config, deps, options) {
|
|
|
32
33
|
const reconciled = [];
|
|
33
34
|
const previews = [];
|
|
34
35
|
const filing = Boolean(deps.client) && !options.dryRun;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
36
|
+
// Expand explicit and pattern targets into concrete repositories.
|
|
37
|
+
const expanded = await expandTargets(config.targets, deps.repoLister);
|
|
38
|
+
const targetErrors = [...expanded.errors];
|
|
39
|
+
for (const target of expanded.targets) {
|
|
41
40
|
const repoName = target.repo;
|
|
42
41
|
const repoDir = join(options.workspaceDir, repoName);
|
|
42
|
+
// Clone the repo if a cloner is provided and it is not already present.
|
|
43
|
+
if (deps.cloneRepo) {
|
|
44
|
+
const prepared = await deps.cloneRepo(repoName, repoDir);
|
|
45
|
+
if (!prepared.ok) {
|
|
46
|
+
targetErrors.push(`could not check out ${repoName}: ${prepared.error ?? 'clone failed'}`);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
43
50
|
const resolvedNames = new Set();
|
|
44
51
|
const missingPacks = [];
|
|
45
52
|
for (const name of target.rulePacks) {
|
|
@@ -104,6 +111,7 @@ export async function runFromConfig(config, deps, options) {
|
|
|
104
111
|
reconciled,
|
|
105
112
|
previews,
|
|
106
113
|
packLoadErrors: loaded.errors,
|
|
114
|
+
targetErrors,
|
|
107
115
|
filed: filing,
|
|
108
116
|
};
|
|
109
117
|
}
|
package/dist/run/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../source/run/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAC,iBAAiB,EAAC,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAuB,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAIhD,OAAO,EAAC,mBAAmB,EAAC,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAC,aAAa,EAAC,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../source/run/run.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nanocollective/sentinel",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
4
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
5
|
"keywords": [
|
|
6
6
|
"security",
|