@arjunkhera/atlas 0.4.16 → 0.4.17
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/.claude-plugin/plugin.json +1 -1
- package/door/lib/doc-sources.mjs +0 -1
- package/door/lib/kind-drift.mjs +1 -1
- package/door/lib/upkeep.mjs +1 -1
- package/package.json +1 -1
- package/shape/check.mjs +25 -172
- package/shape/releases.json +6 -0
package/door/lib/doc-sources.mjs
CHANGED
|
@@ -96,7 +96,6 @@ export function docUnits(root) {
|
|
|
96
96
|
const units = [];
|
|
97
97
|
const folders = new Set();
|
|
98
98
|
for (const file of markdownFiles(root, 'docs')) {
|
|
99
|
-
if (file.startsWith('docs/site/')) continue;
|
|
100
99
|
const folder = designFolderOf(root, file);
|
|
101
100
|
if (folder) {
|
|
102
101
|
if (folders.has(folder)) continue;
|
package/door/lib/kind-drift.mjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Milestone M2, slice L2 stage one: "The facts helper compares the `kind` in
|
|
4
4
|
// `atlas.yaml` with the `kind` on the repo record and reports drift."
|
|
5
5
|
//
|
|
6
|
-
// The kind decides which of the
|
|
6
|
+
// The kind decides which of the six files a repository needs, so the two
|
|
7
7
|
// copies disagreeing is not a detail. A repo record that says `service` while
|
|
8
8
|
// atlas.yaml says `library` means four required parts read "not applicable" in
|
|
9
9
|
// CI and "required" everywhere else.
|
package/door/lib/upkeep.mjs
CHANGED
|
@@ -119,7 +119,7 @@ export function docsIndex(root) {
|
|
|
119
119
|
if (path.startsWith('docs/')) listed.add(path);
|
|
120
120
|
}
|
|
121
121
|
const unlisted = markdownFiles(root, 'docs').filter((path) => {
|
|
122
|
-
if (path === INDEX ||
|
|
122
|
+
if (path === INDEX || listed.has(path)) return false;
|
|
123
123
|
const folder = designFolderOf(root, path);
|
|
124
124
|
return !(folder && listed.has(`${folder}/design.yaml`));
|
|
125
125
|
});
|
package/package.json
CHANGED
package/shape/check.mjs
CHANGED
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
// mode only, it reads git objects with the git binary, and writes two trees
|
|
12
12
|
// into a temp folder outside the checkout.
|
|
13
13
|
//
|
|
14
|
-
// What it reports: one state per part of the
|
|
15
|
-
// empty, stale, not applicable
|
|
16
|
-
//
|
|
14
|
+
// What it reports: one state per part of the six files. Four states: filled,
|
|
15
|
+
// empty, stale, not applicable. It leads with the count of required parts
|
|
16
|
+
// that are not filled.
|
|
17
17
|
//
|
|
18
18
|
// It carries the version of the Atlas package it came from, so a copy in a
|
|
19
19
|
// repo says where it came from. It refuses a spec version it cannot read.
|
|
@@ -38,7 +38,7 @@ export const sha256 = (text) => createHash('sha256').update(String(text ?? ''),
|
|
|
38
38
|
// Whether a copy is current or behind is not decided here. CI has no package
|
|
39
39
|
// and no network. The session verb decides it, from the release list that
|
|
40
40
|
// ships beside this file in the package, shape/releases.json.
|
|
41
|
-
export const CHECK_VERSION =
|
|
41
|
+
export const CHECK_VERSION = 7;
|
|
42
42
|
|
|
43
43
|
// ---------------------------------------------------------------------------
|
|
44
44
|
// The spec. One object per version. The check reads a version it has here and
|
|
@@ -53,8 +53,7 @@ export const SPEC_1 = {
|
|
|
53
53
|
"filled": "The part exists and matches the repo.",
|
|
54
54
|
"empty": "The part is missing, or it holds nothing.",
|
|
55
55
|
"stale": "The part exists but disagrees with the repo.",
|
|
56
|
-
"not applicable": "This repo kind does not need the part."
|
|
57
|
-
"no extractor": "The part is generated, and no extractor exists for it yet."
|
|
56
|
+
"not applicable": "This repo kind does not need the part."
|
|
58
57
|
},
|
|
59
58
|
"kinds": {
|
|
60
59
|
"service": "A running product with a deploy target, logs and metrics.",
|
|
@@ -320,101 +319,9 @@ export const SPEC_1 = {
|
|
|
320
319
|
}
|
|
321
320
|
]
|
|
322
321
|
},
|
|
323
|
-
{
|
|
324
|
-
"id": "docs-content",
|
|
325
|
-
"number": 6,
|
|
326
|
-
"title": "Docs content",
|
|
327
|
-
"class": "docs",
|
|
328
|
-
"written_by": "the upkeep task and the talk-through; merges on its own",
|
|
329
|
-
"parts": [
|
|
330
|
-
{
|
|
331
|
-
"id": "pages",
|
|
332
|
-
"path": "docs/site",
|
|
333
|
-
"glob": "*.md",
|
|
334
|
-
"holds": "The pages: home, features, flows with their step lists, concepts. Each page carries the commit it was built from.",
|
|
335
|
-
"kind": {
|
|
336
|
-
"service": "required",
|
|
337
|
-
"library": "optional",
|
|
338
|
-
"schema": "optional",
|
|
339
|
-
"plugin": "optional",
|
|
340
|
-
"cli": "optional"
|
|
341
|
-
},
|
|
342
|
-
"check": "docs-pages"
|
|
343
|
-
},
|
|
344
|
-
{
|
|
345
|
-
"id": "features",
|
|
346
|
-
"path": "docs/site/features.yaml",
|
|
347
|
-
"holds": "The feature list the renderer reads.",
|
|
348
|
-
"kind": {
|
|
349
|
-
"service": "required",
|
|
350
|
-
"library": "optional",
|
|
351
|
-
"schema": "optional",
|
|
352
|
-
"plugin": "optional",
|
|
353
|
-
"cli": "optional"
|
|
354
|
-
},
|
|
355
|
-
"check": "features"
|
|
356
|
-
},
|
|
357
|
-
{
|
|
358
|
-
"id": "notes",
|
|
359
|
-
"path": "docs/site/notes.md",
|
|
360
|
-
"class": "instruction",
|
|
361
|
-
"holds": "The standing corrections. Each note names who said it and the session. A person merges it.",
|
|
362
|
-
"kind": {
|
|
363
|
-
"service": "optional",
|
|
364
|
-
"library": "optional",
|
|
365
|
-
"schema": "optional",
|
|
366
|
-
"plugin": "optional",
|
|
367
|
-
"cli": "optional"
|
|
368
|
-
},
|
|
369
|
-
"check": "notes"
|
|
370
|
-
},
|
|
371
|
-
{
|
|
372
|
-
"id": "api",
|
|
373
|
-
"path": "docs/site/reference/api.md",
|
|
374
|
-
"holds": "Every route with its method, path, principal, handler file and line.",
|
|
375
|
-
"kind": {
|
|
376
|
-
"service": "required",
|
|
377
|
-
"library": "not applicable",
|
|
378
|
-
"schema": "not applicable",
|
|
379
|
-
"plugin": "not applicable",
|
|
380
|
-
"cli": "not applicable"
|
|
381
|
-
},
|
|
382
|
-
"check": "generated",
|
|
383
|
-
"extractor": "routes"
|
|
384
|
-
},
|
|
385
|
-
{
|
|
386
|
-
"id": "database",
|
|
387
|
-
"path": "docs/site/reference/database.md",
|
|
388
|
-
"holds": "The tables, their fields, their types and the purpose of each field.",
|
|
389
|
-
"kind": {
|
|
390
|
-
"service": "required",
|
|
391
|
-
"library": "not applicable",
|
|
392
|
-
"schema": "required",
|
|
393
|
-
"plugin": "not applicable",
|
|
394
|
-
"cli": "not applicable"
|
|
395
|
-
},
|
|
396
|
-
"check": "generated",
|
|
397
|
-
"extractor": "migrations"
|
|
398
|
-
},
|
|
399
|
-
{
|
|
400
|
-
"id": "mcp-tools",
|
|
401
|
-
"path": "docs/site/reference/mcp-tools.md",
|
|
402
|
-
"holds": "Every MCP tool, its inputs, and when to use it.",
|
|
403
|
-
"kind": {
|
|
404
|
-
"service": "optional",
|
|
405
|
-
"library": "optional",
|
|
406
|
-
"schema": "optional",
|
|
407
|
-
"plugin": "optional",
|
|
408
|
-
"cli": "optional"
|
|
409
|
-
},
|
|
410
|
-
"check": "generated",
|
|
411
|
-
"extractor": "mcp"
|
|
412
|
-
}
|
|
413
|
-
]
|
|
414
|
-
},
|
|
415
322
|
{
|
|
416
323
|
"id": "tooling",
|
|
417
|
-
"number":
|
|
324
|
+
"number": 6,
|
|
418
325
|
"title": "Tooling",
|
|
419
326
|
"class": "instruction",
|
|
420
327
|
"written_by": "the helper; a person merges",
|
|
@@ -467,11 +374,6 @@ export const SPEC_1 = {
|
|
|
467
374
|
]
|
|
468
375
|
}
|
|
469
376
|
],
|
|
470
|
-
"extractors": {
|
|
471
|
-
"routes": "Slice L3 builds it.",
|
|
472
|
-
"migrations": "Slice L3 builds it.",
|
|
473
|
-
"mcp": "Slice L3 builds it."
|
|
474
|
-
},
|
|
475
377
|
"by_reference": {
|
|
476
378
|
"rule": "A file under docs/ that an instruction file points at is instruction class by reference (D7 finding R1). The check computes that set and reports each member.",
|
|
477
379
|
"scanned": [
|
|
@@ -480,8 +382,7 @@ export const SPEC_1 = {
|
|
|
480
382
|
".claude/rules/*.md",
|
|
481
383
|
".claude/skills/*/SKILL.md",
|
|
482
384
|
"atlas.yaml",
|
|
483
|
-
"atlas/*.yaml"
|
|
484
|
-
"docs/site/notes.md"
|
|
385
|
+
"atlas/*.yaml"
|
|
485
386
|
]
|
|
486
387
|
}
|
|
487
388
|
};
|
|
@@ -498,7 +399,7 @@ function deepFreeze(value) {
|
|
|
498
399
|
}
|
|
499
400
|
deepFreeze(SPEC_1);
|
|
500
401
|
|
|
501
|
-
// Spec 2 adds one part: the check file itself, scored inside file
|
|
402
|
+
// Spec 2 adds one part: the check file itself, scored inside file 6.
|
|
502
403
|
//
|
|
503
404
|
// Why a new version and not a line in spec 1. Adding a scored part changes what
|
|
504
405
|
// `spec: 1` means, and the spec version is the whole coupling between a
|
|
@@ -506,8 +407,9 @@ deepFreeze(SPEC_1);
|
|
|
506
407
|
// P11). The check reads both versions, so a repository stays green while it is
|
|
507
408
|
// still on spec 1, and it opts in by moving `atlas.yaml` to `spec: 2`.
|
|
508
409
|
//
|
|
509
|
-
// Nothing else moves. Spec 1 keeps its
|
|
510
|
-
//
|
|
410
|
+
// Nothing else moves. Spec 1 keeps its sixteen parts, and spec 2 has
|
|
411
|
+
// seventeen. Check version 7 took the six parts of the retired docs site out
|
|
412
|
+
// of both (roadmap R37).
|
|
511
413
|
//
|
|
512
414
|
// Check version 4 adds two kinds, plugin and cli, to both specs (issue #141).
|
|
513
415
|
// No cell of an older kind moves, so a repo that names service, library or
|
|
@@ -965,8 +867,8 @@ export function frontMatter(source) {
|
|
|
965
867
|
// The scanners. One per part of the spec.
|
|
966
868
|
// ---------------------------------------------------------------------------
|
|
967
869
|
|
|
968
|
-
export const STATES = Object.freeze(['filled', 'empty', 'stale', 'not applicable'
|
|
969
|
-
export const NOT_FILLED = Object.freeze(['empty', 'stale'
|
|
870
|
+
export const STATES = Object.freeze(['filled', 'empty', 'stale', 'not applicable']);
|
|
871
|
+
export const NOT_FILLED = Object.freeze(['empty', 'stale']);
|
|
970
872
|
export const CREDENTIAL_NAME = /^[A-Z][A-Z0-9_]*$/;
|
|
971
873
|
const PINNED = /^[0-9a-f]{40}$/;
|
|
972
874
|
const MAX_LISTED = 12;
|
|
@@ -1007,10 +909,10 @@ function symlinks(root, path, out = []) {
|
|
|
1007
909
|
|
|
1008
910
|
// A symbolic link is a finding, never a state on its own: the part it sits
|
|
1009
911
|
// under says what state it makes.
|
|
1010
|
-
function symlinkFindings(root, path
|
|
1011
|
-
const found = symlinks(root, path)
|
|
912
|
+
function symlinkFindings(root, path) {
|
|
913
|
+
const found = symlinks(root, path);
|
|
1012
914
|
return found.length
|
|
1013
|
-
? [`${found.length} symbolic link(s) under ${path}/: ${found.slice(0, MAX_LISTED).join(', ')}; the check does not follow one
|
|
915
|
+
? [`${found.length} symbolic link(s) under ${path}/: ${found.slice(0, MAX_LISTED).join(', ')}; the check does not follow one`]
|
|
1014
916
|
: [];
|
|
1015
917
|
}
|
|
1016
918
|
|
|
@@ -1213,59 +1115,16 @@ function checkDocsIndex(context, part) {
|
|
|
1213
1115
|
const text = readText(context.root, part.path);
|
|
1214
1116
|
if (text === null || !text.trim()) return result(part, 'empty', [`${part.path} is missing or holds nothing`]);
|
|
1215
1117
|
const listed = new Set(pointers(text).map((path) => (path.startsWith('docs/') ? path : posix.join('docs', path))));
|
|
1216
|
-
const onDisk = walk(context.root, 'docs').filter((path) => path.endsWith('.md') && path !== part.path
|
|
1118
|
+
const onDisk = walk(context.root, 'docs').filter((path) => path.endsWith('.md') && path !== part.path);
|
|
1217
1119
|
const unlisted = onDisk.filter((path) => !listed.has(path));
|
|
1218
1120
|
const gone = [...listed].filter((path) => !existsSync(join(context.root, path)));
|
|
1219
1121
|
const findings = [];
|
|
1220
1122
|
if (unlisted.length) findings.push(`${unlisted.length} file(s) under docs/ are not listed: ${unlisted.slice(0, MAX_LISTED).join(', ')}`);
|
|
1221
1123
|
if (gone.length) findings.push(`${gone.length} listed file(s) are gone: ${gone.slice(0, MAX_LISTED).join(', ')}`);
|
|
1222
|
-
|
|
1223
|
-
findings.push(...symlinkFindings(context.root, 'docs', (path) => !path.startsWith('docs/site/')));
|
|
1124
|
+
findings.push(...symlinkFindings(context.root, 'docs'));
|
|
1224
1125
|
return findings.length ? result(part, 'stale', findings) : result(part, 'filled', [`${onDisk.length} file(s) listed`]);
|
|
1225
1126
|
}
|
|
1226
1127
|
|
|
1227
|
-
function checkDocsPages(context, part) {
|
|
1228
|
-
const links = symlinkFindings(context.root, part.path);
|
|
1229
|
-
if (!isDirectory(context.root, part.path)) return result(part, 'empty', [`${part.path}/ does not exist`]);
|
|
1230
|
-
const pages = walk(context.root, part.path).filter((path) => path.endsWith('.md') && !path.endsWith('/notes.md'));
|
|
1231
|
-
if (!pages.length) return result(part, links.length ? 'stale' : 'empty', [`${part.path}/ holds no page`, ...links]);
|
|
1232
|
-
const without = pages.filter((path) => !frontMatter(readText(context.root, path) ?? '')?.built_from);
|
|
1233
|
-
const findings = [...(without.length ? [`${without.length} page(s) do not name the commit they were built from: ${without.slice(0, MAX_LISTED).join(', ')}`] : []), ...links];
|
|
1234
|
-
return findings.length ? result(part, 'stale', findings) : result(part, 'filled', [`${pages.length} page(s)`]);
|
|
1235
|
-
}
|
|
1236
|
-
|
|
1237
|
-
function checkFeatures(context, part) {
|
|
1238
|
-
const text = readText(context.root, part.path);
|
|
1239
|
-
if (text === null || !text.trim()) return result(part, 'empty', [`${part.path} is missing or holds nothing`]);
|
|
1240
|
-
let data;
|
|
1241
|
-
try { data = parseYaml(text); } catch (error) { return result(part, 'stale', [`${part.path} cannot be read: ${error.message}`]); }
|
|
1242
|
-
const rows = data?.features;
|
|
1243
|
-
if (emptyValue(rows)) return result(part, 'stale', [`${part.path} lists no feature`]);
|
|
1244
|
-
const list = Array.isArray(rows) ? rows : Object.values(rows);
|
|
1245
|
-
const dead = list.filter((row) => row?.page && !existsSync(join(context.root, String(row.page)))).map((row) => row.page);
|
|
1246
|
-
return dead.length ? result(part, 'stale', [`${dead.length} feature page(s) are gone: ${dead.slice(0, MAX_LISTED).join(', ')}`]) : result(part, 'filled', [`${list.length} feature(s)`]);
|
|
1247
|
-
}
|
|
1248
|
-
|
|
1249
|
-
function checkNotes(context, part) {
|
|
1250
|
-
const text = readText(context.root, part.path);
|
|
1251
|
-
if (text === null || !text.trim()) return result(part, 'empty', [`${part.path} is missing or holds nothing`]);
|
|
1252
|
-
// Finding R12 and the spec: each note names who said it and the session.
|
|
1253
|
-
// A note that does not is a stale note, not a remark on a filled file.
|
|
1254
|
-
const entries = text.split('\n').filter((line) => /^\s*[-*]\s+/.test(line));
|
|
1255
|
-
if (!entries.length) return result(part, 'empty', [`${part.path} holds no note`]);
|
|
1256
|
-
const without = entries.filter((line) => !/session/i.test(line));
|
|
1257
|
-
if (without.length) return result(part, 'stale', [`${without.length} of ${entries.length} note(s) do not name the session they came from`]);
|
|
1258
|
-
return result(part, 'filled', [`${entries.length} note(s)`]);
|
|
1259
|
-
}
|
|
1260
|
-
|
|
1261
|
-
function checkGenerated(context, part) {
|
|
1262
|
-
const available = context.extractors.includes(part.extractor);
|
|
1263
|
-
if (!available) return result(part, 'no extractor', [`no ${part.extractor} extractor exists yet; slice L3 builds it`]);
|
|
1264
|
-
const text = readText(context.root, part.path);
|
|
1265
|
-
if (text === null || !text.trim()) return result(part, 'empty', [`${part.path} is missing or holds nothing`]);
|
|
1266
|
-
return result(part, 'filled');
|
|
1267
|
-
}
|
|
1268
|
-
|
|
1269
1128
|
// Every permission the workflow grants at anything other than read. It reads a
|
|
1270
1129
|
// block map under `permissions:` and a flow map on the same line.
|
|
1271
1130
|
function writeGrants(text) {
|
|
@@ -1459,10 +1318,6 @@ const CHECKS = {
|
|
|
1459
1318
|
'facts-section': checkFactsSection,
|
|
1460
1319
|
'facts-credentials': checkCredentials,
|
|
1461
1320
|
'docs-index': checkDocsIndex,
|
|
1462
|
-
'docs-pages': checkDocsPages,
|
|
1463
|
-
features: checkFeatures,
|
|
1464
|
-
notes: checkNotes,
|
|
1465
|
-
generated: checkGenerated,
|
|
1466
1321
|
workflow: checkWorkflow,
|
|
1467
1322
|
'check-file': checkCheckFile,
|
|
1468
1323
|
linters: checkLinters,
|
|
@@ -1470,7 +1325,7 @@ const CHECKS = {
|
|
|
1470
1325
|
|
|
1471
1326
|
// The one exemption in the by-reference set, and it is exactly one.
|
|
1472
1327
|
//
|
|
1473
|
-
// File 1, the entry map, must hold a pointer to each of the
|
|
1328
|
+
// File 1, the entry map, must hold a pointer to each of the six files, and
|
|
1474
1329
|
// `docs/index.md` is one of them. Rule R1 makes any `docs/` file an instruction
|
|
1475
1330
|
// file points at instruction class by reference. Those two together make the
|
|
1476
1331
|
// index instruction class, and the frozen L4 path limit lets the upkeep routine
|
|
@@ -1484,8 +1339,7 @@ const CHECKS = {
|
|
|
1484
1339
|
// only this one path, only these two pointing files, and the row stays in the
|
|
1485
1340
|
// report with `exempt: true` so nothing is hidden. Any other instruction file
|
|
1486
1341
|
// that names the index still makes it instruction class, and the index's own
|
|
1487
|
-
// row then carries that file.
|
|
1488
|
-
// treating the index as an agent-facing surface.
|
|
1342
|
+
// row then carries that file.
|
|
1489
1343
|
export const EXEMPT_PATH = 'docs/index.md';
|
|
1490
1344
|
export const EXEMPT_FROM = Object.freeze(['CLAUDE.md', 'AGENTS.md']);
|
|
1491
1345
|
|
|
@@ -1571,7 +1425,7 @@ export function readFacts(root) {
|
|
|
1571
1425
|
// `kind: library` would be two different spec tables, and the comparison would
|
|
1572
1426
|
// mean nothing (architect finding P2). Nothing else about the scan changes: the
|
|
1573
1427
|
// tree still speaks for itself about every part.
|
|
1574
|
-
export function scan({ root, repoId = null,
|
|
1428
|
+
export function scan({ root, repoId = null, secretPatterns: patterns = secretPatterns(), scoreAs = null }) {
|
|
1575
1429
|
const { facts, error: factsError } = readFacts(root);
|
|
1576
1430
|
const errors = [];
|
|
1577
1431
|
// The credential-value check is the only thing that turns the job red at the
|
|
@@ -1603,7 +1457,7 @@ export function scan({ root, repoId = null, extractors = [], secretPatterns: pat
|
|
|
1603
1457
|
// that a pull request moves is also scored where the base had it (roadmap R7
|
|
1604
1458
|
// line 3).
|
|
1605
1459
|
const pointed = scoreAs?.pointers ? { ...facts, files: scoreAs.pointers.files, procedures: scoreAs.pointers.procedures } : facts;
|
|
1606
|
-
const context = { root, facts: pointed, factsError, repoId,
|
|
1460
|
+
const context = { root, facts: pointed, factsError, repoId, secretPatterns: usable, errors };
|
|
1607
1461
|
// atlas.yaml's own values reach the report: the kind, the repo id, a
|
|
1608
1462
|
// procedure's skill name, every pointer path. Scan it before any of them is
|
|
1609
1463
|
// quoted (acceptance review of batch 16, note S3-2).
|
|
@@ -1626,7 +1480,7 @@ export function scan({ root, repoId = null, extractors = [], secretPatterns: pat
|
|
|
1626
1480
|
}
|
|
1627
1481
|
|
|
1628
1482
|
export function counts(files) {
|
|
1629
|
-
const out = { filled: 0, empty: 0, stale: 0, 'not applicable': 0,
|
|
1483
|
+
const out = { filled: 0, empty: 0, stale: 0, 'not applicable': 0, required: 0, optional: 0, not_filled: 0, required_not_filled: 0, optional_not_filled: 0 };
|
|
1630
1484
|
for (const file of files) for (const part of file.parts) {
|
|
1631
1485
|
out[part.state] += 1;
|
|
1632
1486
|
if (part.required === 'required') out.required += 1;
|
|
@@ -1845,7 +1699,7 @@ export function gateLines(answer, state) {
|
|
|
1845
1699
|
// the job summary. Both list every part, its state and its findings.
|
|
1846
1700
|
// ---------------------------------------------------------------------------
|
|
1847
1701
|
|
|
1848
|
-
const MARK = { filled: '+', empty: '-', stale: '~', 'not applicable': '.'
|
|
1702
|
+
const MARK = { filled: '+', empty: '-', stale: '~', 'not applicable': '.' };
|
|
1849
1703
|
const label = (part) => part.procedure ? `procedure ${part.procedure}` : part.path ?? part.id;
|
|
1850
1704
|
|
|
1851
1705
|
// The one number the owner sees is the count of REQUIRED files not filled.
|
|
@@ -1959,7 +1813,6 @@ export function verdict(report, failOn) {
|
|
|
1959
1813
|
// ---------------------------------------------------------------------------
|
|
1960
1814
|
|
|
1961
1815
|
export const FAIL_ON = Object.freeze(['error', 'required', 'any']);
|
|
1962
|
-
export const EXTRACTORS = Object.freeze([]); // Slice L3 adds routes, migrations and mcp.
|
|
1963
1816
|
|
|
1964
1817
|
export function parseArguments(argv) {
|
|
1965
1818
|
const out = { root: process.cwd(), failOn: 'error', json: null, summary: null, quiet: false, base: null, baseSha: null, baseCommit: null, headCommit: null, git: process.cwd(), gate: false };
|
|
@@ -1999,7 +1852,7 @@ export function run(argv, env = process.env) {
|
|
|
1999
1852
|
if (options.gate) return runGate({ options, env });
|
|
2000
1853
|
const repoId = options.repo ?? env.GITHUB_REPOSITORY ?? null;
|
|
2001
1854
|
const patterns = secretPatterns();
|
|
2002
|
-
const report = scan({ root: options.root, repoId,
|
|
1855
|
+
const report = scan({ root: options.root, repoId, secretPatterns: patterns });
|
|
2003
1856
|
// No `--base` means no pull request to measure: a push build, or a run by
|
|
2004
1857
|
// hand. The no-loss rule then does not run at all, and the report says nothing
|
|
2005
1858
|
// about it rather than claiming a pass.
|
package/shape/releases.json
CHANGED
|
@@ -34,6 +34,12 @@
|
|
|
34
34
|
{
|
|
35
35
|
"check_version": 6,
|
|
36
36
|
"sha256": "bad1d05853e173c034971282c5762a1628dfd9f198c8276178bd17280afdf6e7",
|
|
37
|
+
"first_package": "0.4.16",
|
|
38
|
+
"workflow_sha256": "fcddebef030e6564f97e1a5fb81c8ad1b3084ebef9622167c6565698312dcdd7"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"check_version": 7,
|
|
42
|
+
"sha256": "b29fdb036170419b9f0642ef0ca7da45a80ff53492421eb57beaf157df13d057",
|
|
37
43
|
"workflow_sha256": "fcddebef030e6564f97e1a5fb81c8ad1b3084ebef9622167c6565698312dcdd7"
|
|
38
44
|
}
|
|
39
45
|
]
|