@blamejs/exceptd-skills 0.18.4 → 0.18.5
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/CHANGELOG.md +4 -0
- package/data/_indexes/_meta.json +4 -4
- package/data/d3fend-catalog.json +73 -11
- package/data/rfc-references.json +36 -12
- package/manifest-snapshot.json +253 -51
- package/manifest-snapshot.sha256 +1 -1
- package/manifest.json +325 -123
- package/package.json +1 -1
- package/sbom.cdx.json +22 -22
- package/scripts/sync-manifest-metadata.js +37 -11
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blamejs/exceptd-skills",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.5",
|
|
4
4
|
"description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 51 skills, 11 catalogs (459 CVEs / 181 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 8888 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-security",
|
package/sbom.cdx.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"bomFormat": "CycloneDX",
|
|
3
3
|
"specVersion": "1.6",
|
|
4
|
-
"serialNumber": "urn:uuid:
|
|
4
|
+
"serialNumber": "urn:uuid:eb1ee0a4-0742-4f4b-a0fe-81744d380236",
|
|
5
5
|
"version": 1,
|
|
6
6
|
"metadata": {
|
|
7
|
-
"timestamp": "
|
|
7
|
+
"timestamp": "2151-01-01T21:29:08.000Z",
|
|
8
8
|
"tools": [
|
|
9
9
|
{
|
|
10
10
|
"vendor": "blamejs",
|
|
11
11
|
"name": "scripts/refresh-sbom.js",
|
|
12
|
-
"version": "0.18.
|
|
12
|
+
"version": "0.18.5"
|
|
13
13
|
}
|
|
14
14
|
],
|
|
15
15
|
"component": {
|
|
16
|
-
"bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.18.
|
|
16
|
+
"bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.18.5",
|
|
17
17
|
"type": "application",
|
|
18
18
|
"name": "@blamejs/exceptd-skills",
|
|
19
|
-
"version": "0.18.
|
|
19
|
+
"version": "0.18.5",
|
|
20
20
|
"description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 51 skills, 11 catalogs (459 CVEs / 181 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 8888 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
|
|
21
21
|
"licenses": [
|
|
22
22
|
{
|
|
@@ -25,17 +25,17 @@
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
],
|
|
28
|
-
"purl": "pkg:npm/%40blamejs/exceptd-skills@0.18.
|
|
28
|
+
"purl": "pkg:npm/%40blamejs/exceptd-skills@0.18.5",
|
|
29
29
|
"hashes": [
|
|
30
30
|
{
|
|
31
31
|
"alg": "SHA-256",
|
|
32
|
-
"content": "
|
|
32
|
+
"content": "969194699d1e9d763d9be4e1a15ac51abdf9542799dceb4e4d5f252d58d15f96"
|
|
33
33
|
}
|
|
34
34
|
],
|
|
35
35
|
"externalReferences": [
|
|
36
36
|
{
|
|
37
37
|
"type": "distribution",
|
|
38
|
-
"url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.18.
|
|
38
|
+
"url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.18.5"
|
|
39
39
|
},
|
|
40
40
|
{
|
|
41
41
|
"type": "vcs",
|
|
@@ -116,11 +116,11 @@
|
|
|
116
116
|
"hashes": [
|
|
117
117
|
{
|
|
118
118
|
"alg": "SHA-256",
|
|
119
|
-
"content": "
|
|
119
|
+
"content": "7b291ac3ee6977e02aa614587ad3fa48b0c01a98fad35e93ebe20847e92255cf"
|
|
120
120
|
},
|
|
121
121
|
{
|
|
122
122
|
"alg": "SHA3-512",
|
|
123
|
-
"content": "
|
|
123
|
+
"content": "a189a036e9197f779e04f1c0fe293e599d070b1625bcad3f1f24d20fb34216812ef040be23a69623b49ecce6a6bc40c1317fb1c1db20b881a4be8c6b73b22d3b"
|
|
124
124
|
}
|
|
125
125
|
]
|
|
126
126
|
},
|
|
@@ -356,11 +356,11 @@
|
|
|
356
356
|
"hashes": [
|
|
357
357
|
{
|
|
358
358
|
"alg": "SHA-256",
|
|
359
|
-
"content": "
|
|
359
|
+
"content": "349d14b2777342d38e5f8b0149a9ebd7703ee59f67a9efee200d1e19313088ac"
|
|
360
360
|
},
|
|
361
361
|
{
|
|
362
362
|
"alg": "SHA3-512",
|
|
363
|
-
"content": "
|
|
363
|
+
"content": "f57d9a8d43d8f5d953e0bcf0de0a2f57fae4f4345dfc87d0ee6c26b03da53b4978645f82f40b68b45ad1dd272b1217debe83bf33dd65206ed21104859f502209"
|
|
364
364
|
}
|
|
365
365
|
]
|
|
366
366
|
},
|
|
@@ -926,11 +926,11 @@
|
|
|
926
926
|
"hashes": [
|
|
927
927
|
{
|
|
928
928
|
"alg": "SHA-256",
|
|
929
|
-
"content": "
|
|
929
|
+
"content": "5db2f7006a1d7f2b8642a3e393213394e92798604576df973d0a0b8550f4b5ac"
|
|
930
930
|
},
|
|
931
931
|
{
|
|
932
932
|
"alg": "SHA3-512",
|
|
933
|
-
"content": "
|
|
933
|
+
"content": "93ee274979c14a6869359e434677396b3157470460bd9c3ef3091573d5c60e208f4600a526ff1404e224844bc2fc734f3db67217d57c8ec8ce728ea7c5240027"
|
|
934
934
|
}
|
|
935
935
|
]
|
|
936
936
|
},
|
|
@@ -1871,11 +1871,11 @@
|
|
|
1871
1871
|
"hashes": [
|
|
1872
1872
|
{
|
|
1873
1873
|
"alg": "SHA-256",
|
|
1874
|
-
"content": "
|
|
1874
|
+
"content": "3298b773823c834dde46c771fc14baa0ec84f6c7059b52ad568d519305fde144"
|
|
1875
1875
|
},
|
|
1876
1876
|
{
|
|
1877
1877
|
"alg": "SHA3-512",
|
|
1878
|
-
"content": "
|
|
1878
|
+
"content": "dd01e63ba81e97db83f3ff82c21d3642f1c71f8004c41b32b4d1d00b25a7edee405c38be12e7a8262764f343484ce8776bb0052627594de320cc6905df641b5a"
|
|
1879
1879
|
}
|
|
1880
1880
|
]
|
|
1881
1881
|
},
|
|
@@ -1886,11 +1886,11 @@
|
|
|
1886
1886
|
"hashes": [
|
|
1887
1887
|
{
|
|
1888
1888
|
"alg": "SHA-256",
|
|
1889
|
-
"content": "
|
|
1889
|
+
"content": "d479f64741c9de91df610b874331ea07ebe442b43337dd8c9919fb9c43a78dfe"
|
|
1890
1890
|
},
|
|
1891
1891
|
{
|
|
1892
1892
|
"alg": "SHA3-512",
|
|
1893
|
-
"content": "
|
|
1893
|
+
"content": "9bf29cc45e0e1b4af8a829bdcda30a8af57758abc88951a17ec687d713af18dd24c8b30f543096fbb1d6090737ea8ccfe509c6c892077f449dc21a654f7ca740"
|
|
1894
1894
|
}
|
|
1895
1895
|
]
|
|
1896
1896
|
},
|
|
@@ -1901,11 +1901,11 @@
|
|
|
1901
1901
|
"hashes": [
|
|
1902
1902
|
{
|
|
1903
1903
|
"alg": "SHA-256",
|
|
1904
|
-
"content": "
|
|
1904
|
+
"content": "d6486b4209c765883b69c32a3f52df0956c2e9cb770cc0d603fafb5b15aeb865"
|
|
1905
1905
|
},
|
|
1906
1906
|
{
|
|
1907
1907
|
"alg": "SHA3-512",
|
|
1908
|
-
"content": "
|
|
1908
|
+
"content": "d0b227b3cc046f601ab3ae34c687c88b78e02bfb40ea54638916d55da0c1d3b208176e7a3f58a88585ad9c1bb210c9a7121f5086777b22b88048d8c87699f3a6"
|
|
1909
1909
|
}
|
|
1910
1910
|
]
|
|
1911
1911
|
},
|
|
@@ -2681,11 +2681,11 @@
|
|
|
2681
2681
|
"hashes": [
|
|
2682
2682
|
{
|
|
2683
2683
|
"alg": "SHA-256",
|
|
2684
|
-
"content": "
|
|
2684
|
+
"content": "06d9c0b3b342b3b96d5c17675ec060cc0273e793b19d004af0fde2b3669ce1b0"
|
|
2685
2685
|
},
|
|
2686
2686
|
{
|
|
2687
2687
|
"alg": "SHA3-512",
|
|
2688
|
-
"content": "
|
|
2688
|
+
"content": "12fdee49bc8fa5f90a503439b778c6203f75a8fee4ef6a7e6df9690a4216070cea5ee25979ba75b522a0f4b00df3ece0b77bc627db6ce59c23b5282b047a877e"
|
|
2689
2689
|
}
|
|
2690
2690
|
]
|
|
2691
2691
|
},
|
|
@@ -3,18 +3,29 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* scripts/sync-manifest-metadata.js
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* frontmatter
|
|
9
|
-
*
|
|
10
|
-
* pass, or rewording a forward_watch item) left the manifest copy stale.
|
|
11
|
-
* Over time the two diverged on dozens of skills.
|
|
6
|
+
* Several per-skill fields in manifest.json are a cache of the authoritative
|
|
7
|
+
* values in each skill's frontmatter (the linter and the staleness gate read
|
|
8
|
+
* frontmatter, so frontmatter is the single source of truth). Nothing kept
|
|
9
|
+
* the cache in sync, so editing frontmatter left the manifest copy stale.
|
|
12
10
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
11
|
+
* Two sync disciplines, because the fields differ in kind:
|
|
12
|
+
*
|
|
13
|
+
* - MIRROR (exact): `last_threat_review` (scalar) and `forward_watch`
|
|
14
|
+
* (array) are an exact copy of frontmatter. Synced by replace.
|
|
15
|
+
*
|
|
16
|
+
* - COVER (union): the cross-reference arrays (`data_deps`,
|
|
17
|
+
* `framework_gaps`, `atlas_refs`, `attack_refs`, `rfc_refs`, `cwe_refs`,
|
|
18
|
+
* `d3fend_refs`) are an ENRICHED SUPERSET — the manifest may carry extra
|
|
19
|
+
* curated refs that the derived indexes (build-indexes) and the
|
|
20
|
+
* reverse-ref refresh (refresh-reverse-refs) read. The invariant is that
|
|
21
|
+
* every frontmatter-declared ref MUST appear in the manifest, or it
|
|
22
|
+
* silently vanishes from those surfaces. Synced by UNION (append the
|
|
23
|
+
* missing frontmatter refs, preserve the manifest's order + enrichment) —
|
|
24
|
+
* never by replace, which would drop curated refs.
|
|
25
|
+
*
|
|
26
|
+
* Run it whenever skill frontmatter changes, then re-run sign-all (and, when
|
|
27
|
+
* cross-ref arrays changed, refresh-reverse-refs + build-indexes) so the
|
|
28
|
+
* refreshed manifest is signed and the derived surfaces pick up the refs.
|
|
18
29
|
*
|
|
19
30
|
* tests/manifest-frontmatter-sync.test.js fails the suite if the cache ever
|
|
20
31
|
* drifts again, so a missed run is caught before release rather than shipping
|
|
@@ -34,6 +45,10 @@ const MANIFEST = path.join(ROOT, "manifest.json");
|
|
|
34
45
|
// The frontmatter fields the manifest caches and must mirror verbatim.
|
|
35
46
|
const MIRRORED_SCALAR = ["last_threat_review"];
|
|
36
47
|
const MIRRORED_ARRAY = ["forward_watch"];
|
|
48
|
+
// Cross-reference arrays: the manifest is an enriched superset, so sync by
|
|
49
|
+
// UNION (cover) — append frontmatter refs the manifest is missing, keep the
|
|
50
|
+
// manifest's own curated refs. See the header for why replace would regress.
|
|
51
|
+
const MIRRORED_COVER = ["data_deps", "framework_gaps", "atlas_refs", "attack_refs", "rfc_refs", "cwe_refs", "d3fend_refs"];
|
|
37
52
|
|
|
38
53
|
function skillFrontmatter(id) {
|
|
39
54
|
const p = path.join(ROOT, "skills", id, "skill.md");
|
|
@@ -73,6 +88,17 @@ function sync() {
|
|
|
73
88
|
changed++;
|
|
74
89
|
}
|
|
75
90
|
}
|
|
91
|
+
for (const key of MIRRORED_COVER) {
|
|
92
|
+
const want = Array.isArray(fm[key]) ? fm[key] : [];
|
|
93
|
+
if (!want.length) continue;
|
|
94
|
+
const have = Array.isArray(entry[key]) ? entry[key] : [];
|
|
95
|
+
const haveSet = new Set(have);
|
|
96
|
+
const missing = want.filter((x) => !haveSet.has(x));
|
|
97
|
+
if (missing.length) {
|
|
98
|
+
entry[key] = [...have, ...missing];
|
|
99
|
+
changed += missing.length;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
76
102
|
}
|
|
77
103
|
if (errors.length) {
|
|
78
104
|
for (const e of errors) process.stderr.write(`[sync-manifest-metadata] ${e}\n`);
|