@blamejs/exceptd-skills 0.16.22 → 0.16.24

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.
Files changed (62) hide show
  1. package/ARCHITECTURE.md +2 -2
  2. package/CHANGELOG.md +42 -0
  3. package/CONTEXT.md +9 -9
  4. package/README.md +3 -3
  5. package/agents/report-generator.md +2 -2
  6. package/agents/skill-updater.md +1 -1
  7. package/agents/source-validator.md +3 -4
  8. package/agents/threat-researcher.md +1 -1
  9. package/bin/exceptd.js +91 -32
  10. package/data/_indexes/_meta.json +10 -10
  11. package/data/_indexes/activity-feed.json +12 -12
  12. package/data/_indexes/chains.json +70435 -4026
  13. package/data/_indexes/frequency.json +492 -163
  14. package/data/_indexes/section-offsets.json +51 -51
  15. package/data/_indexes/summary-cards.json +272 -106
  16. package/data/_indexes/token-budget.json +10 -10
  17. package/data/_indexes/trigger-table.json +15 -6
  18. package/data/_indexes/xref.json +218 -26
  19. package/data/cve-catalog.json +10 -10
  20. package/data/cwe-catalog.json +1 -0
  21. package/lib/auto-discovery.js +39 -1
  22. package/lib/collectors/ai-api.js +112 -7
  23. package/lib/collectors/citation-hygiene.js +27 -0
  24. package/lib/collectors/crypto-codebase.js +25 -0
  25. package/lib/collectors/kernel.js +32 -2
  26. package/lib/collectors/library-author.js +30 -0
  27. package/lib/collectors/runtime.js +38 -3
  28. package/lib/collectors/sbom.js +21 -2
  29. package/lib/collectors/scan-excludes.js +4 -1
  30. package/lib/collectors/secrets.js +125 -0
  31. package/lib/cve-cli.js +9 -1
  32. package/lib/cve-curation.js +8 -1
  33. package/lib/cve-regression-watcher.js +5 -2
  34. package/lib/exit-codes.js +2 -0
  35. package/lib/flag-suggest.js +1 -1
  36. package/lib/lint-skills.js +70 -0
  37. package/lib/playbook-runner.js +75 -14
  38. package/lib/prefetch.js +24 -1
  39. package/lib/refresh-external.js +32 -3
  40. package/lib/rfc-cli.js +8 -1
  41. package/lib/scoring.js +36 -8
  42. package/lib/validate-cve-catalog.js +36 -14
  43. package/lib/validate-package.js +8 -0
  44. package/lib/validate-playbooks.js +42 -0
  45. package/lib/verify.js +4 -3
  46. package/manifest-snapshot.json +4 -2
  47. package/manifest-snapshot.sha256 +1 -1
  48. package/manifest.json +57 -54
  49. package/orchestrator/README.md +1 -1
  50. package/orchestrator/index.js +65 -7
  51. package/orchestrator/scanner.js +53 -5
  52. package/package.json +1 -1
  53. package/sbom.cdx.json +110 -110
  54. package/scripts/build-indexes.js +42 -8
  55. package/scripts/builders/cwe-chains.js +1 -0
  56. package/scripts/builders/section-offsets.js +10 -2
  57. package/scripts/builders/token-budget.js +3 -3
  58. package/scripts/check-changelog-extract.js +38 -1
  59. package/scripts/check-sbom-currency.js +72 -0
  60. package/scripts/check-version-tags.js +5 -0
  61. package/scripts/release.js +22 -15
  62. package/skills/exploit-scoring/skill.md +8 -8
@@ -517,12 +517,60 @@ function probeTls(target) {
517
517
  return match ? match[1] : null;
518
518
  }
519
519
 
520
+ // Key names that signal a credential value, matched case-insensitively at any
521
+ // nesting depth. MCP server configs place real secrets inside `env` and
522
+ // `headers` sub-objects (e.g. env.OPENAI_API_KEY, headers.Authorization), so a
523
+ // top-level-only sweep leaks them into emitted findings.
524
+ const SECRET_KEY_RE = /token|key|secret|password|credential|auth|bearer|api[-_]?key|access[-_]?key/i;
525
+
526
+ // Value shapes that look like live credentials even under an innocuous key name
527
+ // (e.g. args: ['--token', 'sk-...'] or a positional bearer string).
528
+ const SECRET_VALUE_RES = [
529
+ /\bsk-[A-Za-z0-9_-]{8,}/, // OpenAI-style keys
530
+ /\bAKIA[0-9A-Z]{12,}/, // AWS access key id
531
+ /\bASIA[0-9A-Z]{12,}/, // AWS temporary access key id
532
+ /\bgh[pousr]_[A-Za-z0-9]{20,}/, // GitHub tokens
533
+ /\bxox[baprs]-[A-Za-z0-9-]{10,}/, // Slack tokens
534
+ /\bBearer\s+[A-Za-z0-9._-]{8,}/i, // Authorization: Bearer ...
535
+ /eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]+/ // JWT
536
+ ];
537
+
538
+ function looksLikeSecretValue(value) {
539
+ if (typeof value !== 'string') return false;
540
+ return SECRET_VALUE_RES.some((re) => re.test(value));
541
+ }
542
+
543
+ // Recursively redact credential-shaped data so nothing emitted to stdout or
544
+ // persisted carries an operator's live secrets. Redacts values of secret-named
545
+ // keys at any depth and any standalone string value that matches a known
546
+ // credential shape. Cycles are guarded with a seen-set.
547
+ function redactDeep(value, seen) {
548
+ if (value === null || typeof value !== 'object') {
549
+ return looksLikeSecretValue(value) ? '[REDACTED]' : value;
550
+ }
551
+ if (seen.has(value)) return '[CIRCULAR]';
552
+ seen.add(value);
553
+
554
+ if (Array.isArray(value)) {
555
+ return value.map((item) => redactDeep(item, seen));
556
+ }
557
+
558
+ const out = {};
559
+ for (const key of Object.keys(value)) {
560
+ if (SECRET_KEY_RE.test(key)) {
561
+ out[key] = '[REDACTED]';
562
+ } else {
563
+ out[key] = redactDeep(value[key], seen);
564
+ }
565
+ }
566
+ return out;
567
+ }
568
+
520
569
  function sanitizeConfig(obj) {
521
- const safe = { ...obj };
522
- for (const key of Object.keys(safe)) {
523
- if (/token|key|secret|password|credential/i.test(key)) safe[key] = '[REDACTED]';
570
+ if (obj === null || typeof obj !== 'object') {
571
+ return looksLikeSecretValue(obj) ? '[REDACTED]' : obj;
524
572
  }
525
- return safe;
573
+ return redactDeep(obj, new Set());
526
574
  }
527
575
 
528
576
  function loadJson(filename) {
@@ -533,4 +581,4 @@ function loadJson(filename) {
533
581
  }
534
582
  }
535
583
 
536
- module.exports = { scan, scanDomain };
584
+ module.exports = { scan, scanDomain, sanitizeConfig };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blamejs/exceptd-skills",
3
- "version": "0.16.22",
3
+ "version": "0.16.24",
4
4
  "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 51 skills, 11 catalogs (439 CVEs / 177 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",