@skillsmith/core 0.12.2 → 0.12.3

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 (132) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +2 -2
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/index.d.ts +2 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +3 -1
  7. package/dist/src/index.js.map +1 -1
  8. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +9 -1
  9. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  10. package/dist/src/scripts/scan-imported-skills.d.ts +7 -1
  11. package/dist/src/scripts/scan-imported-skills.d.ts.map +1 -1
  12. package/dist/src/scripts/scan-imported-skills.js +15 -2
  13. package/dist/src/scripts/scan-imported-skills.js.map +1 -1
  14. package/dist/src/scripts/skill-scanner/allowlist.d.ts +10 -0
  15. package/dist/src/scripts/skill-scanner/allowlist.d.ts.map +1 -1
  16. package/dist/src/scripts/skill-scanner/allowlist.js +10 -0
  17. package/dist/src/scripts/skill-scanner/allowlist.js.map +1 -1
  18. package/dist/src/scripts/skill-scanner/index.d.ts +8 -0
  19. package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -1
  20. package/dist/src/scripts/skill-scanner/index.js +13 -5
  21. package/dist/src/scripts/skill-scanner/index.js.map +1 -1
  22. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
  23. package/dist/src/scripts/skill-scanner/trust-scorer.js +6 -0
  24. package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
  25. package/dist/src/security/scanner/SecurityScanner.action-context.d.ts +15 -0
  26. package/dist/src/security/scanner/SecurityScanner.action-context.d.ts.map +1 -0
  27. package/dist/src/security/scanner/SecurityScanner.action-context.js +209 -0
  28. package/dist/src/security/scanner/SecurityScanner.action-context.js.map +1 -0
  29. package/dist/src/security/scanner/SecurityScanner.d.ts +25 -0
  30. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  31. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +40 -1
  32. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
  33. package/dist/src/security/scanner/SecurityScanner.helpers.js +88 -51
  34. package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
  35. package/dist/src/security/scanner/SecurityScanner.js +39 -6
  36. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  37. package/dist/src/security/scanner/SecurityScanner.pii.d.ts +30 -0
  38. package/dist/src/security/scanner/SecurityScanner.pii.d.ts.map +1 -1
  39. package/dist/src/security/scanner/SecurityScanner.pii.js +8 -1
  40. package/dist/src/security/scanner/SecurityScanner.pii.js.map +1 -1
  41. package/dist/src/security/scanner/SecurityScanner.prose-lexicon.d.ts +60 -0
  42. package/dist/src/security/scanner/SecurityScanner.prose-lexicon.d.ts.map +1 -0
  43. package/dist/src/security/scanner/SecurityScanner.prose-lexicon.js +228 -0
  44. package/dist/src/security/scanner/SecurityScanner.prose-lexicon.js.map +1 -0
  45. package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -1
  46. package/dist/src/security/scanner/SecurityScanner.scanners.js +35 -5
  47. package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -1
  48. package/dist/src/security/scanner/SecurityScanner.value-gate.d.ts +49 -0
  49. package/dist/src/security/scanner/SecurityScanner.value-gate.d.ts.map +1 -0
  50. package/dist/src/security/scanner/SecurityScanner.value-gate.js +134 -0
  51. package/dist/src/security/scanner/SecurityScanner.value-gate.js.map +1 -0
  52. package/dist/src/security/scanner/SecurityScanner.weak-passwords.d.ts +55 -0
  53. package/dist/src/security/scanner/SecurityScanner.weak-passwords.d.ts.map +1 -0
  54. package/dist/src/security/scanner/SecurityScanner.weak-passwords.js +313 -0
  55. package/dist/src/security/scanner/SecurityScanner.weak-passwords.js.map +1 -0
  56. package/dist/src/security/scanner/patterns.d.ts +16 -6
  57. package/dist/src/security/scanner/patterns.d.ts.map +1 -1
  58. package/dist/src/security/scanner/patterns.js +25 -61
  59. package/dist/src/security/scanner/patterns.js.map +1 -1
  60. package/dist/src/security/scanner/patterns.sensitive-path.d.ts +45 -0
  61. package/dist/src/security/scanner/patterns.sensitive-path.d.ts.map +1 -0
  62. package/dist/src/security/scanner/patterns.sensitive-path.js +137 -0
  63. package/dist/src/security/scanner/patterns.sensitive-path.js.map +1 -0
  64. package/dist/src/security/scanner/regex-utils.d.ts +31 -17
  65. package/dist/src/security/scanner/regex-utils.d.ts.map +1 -1
  66. package/dist/src/security/scanner/regex-utils.js +31 -17
  67. package/dist/src/security/scanner/regex-utils.js.map +1 -1
  68. package/dist/src/security/scanner/types.d.ts +9 -0
  69. package/dist/src/security/scanner/types.d.ts.map +1 -1
  70. package/dist/src/utils/index.d.ts +1 -0
  71. package/dist/src/utils/index.d.ts.map +1 -1
  72. package/dist/src/utils/index.js +2 -0
  73. package/dist/src/utils/index.js.map +1 -1
  74. package/dist/src/utils/skill-name.d.ts +19 -0
  75. package/dist/src/utils/skill-name.d.ts.map +1 -0
  76. package/dist/src/utils/skill-name.js +26 -0
  77. package/dist/src/utils/skill-name.js.map +1 -0
  78. package/dist/src/utils/skill-name.test.d.ts +2 -0
  79. package/dist/src/utils/skill-name.test.d.ts.map +1 -0
  80. package/dist/src/utils/skill-name.test.js +34 -0
  81. package/dist/src/utils/skill-name.test.js.map +1 -0
  82. package/dist/tests/security/ContinuousSecurity.performance.test.js +12 -7
  83. package/dist/tests/security/ContinuousSecurity.performance.test.js.map +1 -1
  84. package/dist/tests/security/ContinuousSecurity.test.js +14 -2
  85. package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
  86. package/dist/tests/security/ai-defence-multiline-promotion.test.d.ts +10 -12
  87. package/dist/tests/security/ai-defence-multiline-promotion.test.d.ts.map +1 -1
  88. package/dist/tests/security/ai-defence-multiline-promotion.test.js +26 -33
  89. package/dist/tests/security/ai-defence-multiline-promotion.test.js.map +1 -1
  90. package/dist/tests/security/nested-instruction-long-attribute.test.js +20 -10
  91. package/dist/tests/security/nested-instruction-long-attribute.test.js.map +1 -1
  92. package/dist/tests/security/scanner-evidence-tiers.test.js +15 -0
  93. package/dist/tests/security/scanner-evidence-tiers.test.js.map +1 -1
  94. package/dist/tests/security/scanner-multiline-cap.test.d.ts +21 -0
  95. package/dist/tests/security/scanner-multiline-cap.test.d.ts.map +1 -0
  96. package/dist/tests/security/scanner-multiline-cap.test.js +152 -0
  97. package/dist/tests/security/scanner-multiline-cap.test.js.map +1 -0
  98. package/dist/tests/security/scanner-regression-guard.test.js +37 -0
  99. package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
  100. package/dist/tests/security/scanner-witness-sw1.test.d.ts +32 -0
  101. package/dist/tests/security/scanner-witness-sw1.test.d.ts.map +1 -0
  102. package/dist/tests/security/scanner-witness-sw1.test.js +255 -0
  103. package/dist/tests/security/scanner-witness-sw1.test.js.map +1 -0
  104. package/dist/tests/security/sensitive-path-adversarial-review.test.d.ts +2 -0
  105. package/dist/tests/security/sensitive-path-adversarial-review.test.d.ts.map +1 -0
  106. package/dist/tests/security/sensitive-path-adversarial-review.test.js +193 -0
  107. package/dist/tests/security/sensitive-path-adversarial-review.test.js.map +1 -0
  108. package/dist/tests/security/sensitive-path-fp.test.js +248 -0
  109. package/dist/tests/security/sensitive-path-fp.test.js.map +1 -1
  110. package/dist/tests/security/smi5879-corroboration.core.test.js +44 -0
  111. package/dist/tests/security/smi5879-corroboration.core.test.js.map +1 -1
  112. package/dist/tests/security/weak-password-lexicon.test.d.ts +18 -0
  113. package/dist/tests/security/weak-password-lexicon.test.d.ts.map +1 -0
  114. package/dist/tests/security/weak-password-lexicon.test.js +122 -0
  115. package/dist/tests/security/weak-password-lexicon.test.js.map +1 -0
  116. package/dist/tests/skill-scanner/allowlist.test.js +58 -4
  117. package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
  118. package/dist/tests/skill-scanner/categorizer.test.d.ts +2 -0
  119. package/dist/tests/skill-scanner/categorizer.test.d.ts.map +1 -0
  120. package/dist/tests/skill-scanner/categorizer.test.js +71 -0
  121. package/dist/tests/skill-scanner/categorizer.test.js.map +1 -0
  122. package/dist/tests/skill-scanner/cli-guard.test.d.ts +23 -0
  123. package/dist/tests/skill-scanner/cli-guard.test.d.ts.map +1 -0
  124. package/dist/tests/skill-scanner/cli-guard.test.js +71 -0
  125. package/dist/tests/skill-scanner/cli-guard.test.js.map +1 -0
  126. package/dist/tests/unit/services/skill-installation.content.test.js +36 -0
  127. package/dist/tests/unit/services/skill-installation.content.test.js.map +1 -1
  128. package/dist/tests/unit/services/skill-installation.service.sensitive-path-fp.test.d.ts +29 -0
  129. package/dist/tests/unit/services/skill-installation.service.sensitive-path-fp.test.d.ts.map +1 -0
  130. package/dist/tests/unit/services/skill-installation.service.sensitive-path-fp.test.js +200 -0
  131. package/dist/tests/unit/services/skill-installation.service.sensitive-path-fp.test.js.map +1 -0
  132. package/package.json +6 -1
@@ -7,14 +7,14 @@ export declare const DEFAULT_ALLOWED_DOMAINS: string[];
7
7
  export declare const ANON_PASTE_HOSTS: string[];
8
8
  export declare const TRANSIENT_TRANSFER_HOSTS: string[];
9
9
  export declare const URL_SHORTENER_DOMAINS: string[];
10
- export declare const ENV_PATH_PATTERN: RegExp;
11
- export declare const SENSITIVE_PATH_PATTERNS: RegExp[];
12
- export declare const VALUE_GATED_KEYWORD_PATTERNS: ReadonlySet<RegExp>;
10
+ export { ENV_PATH_PATTERN, SENSITIVE_PATH_PATTERNS, VALUE_GATED_KEYWORD_PATTERNS, PATH_FORM_PATTERNS, VALUE_GATED_ASSIGNMENT_PATTERNS, } from './patterns.sensitive-path.js';
13
11
  export { JAILBREAK_PATTERNS, AI_DEFENCE_PATTERNS } from './patterns.jailbreak.js';
14
12
  export { EVIDENCE_TYPE_BY_PATTERN } from './patterns.jailbreak.evidence.js';
15
13
  /**
16
14
  * SMI-5876 §0.1/§0.2: bump on ANY pattern-array or evidence-table change in
17
- * this module or patterns.jailbreak.ts. The security-audit baseline
15
+ * this module, patterns.jailbreak.ts, or patterns.sensitive-path.ts (SMI-5207
16
+ * moved the sensitive_path family there; the bump obligation moved with it).
17
+ * The security-audit baseline
18
18
  * (packages/mcp-server/src/audit/security-baseline.ts /
19
19
  * security-audit.ts) stamps every stored entry with the version that
20
20
  * produced it and treats a mismatch as "not comparable" — forcing a re-scan
@@ -70,11 +70,21 @@ export { EVIDENCE_TYPE_BY_PATTERN } from './patterns.jailbreak.evidence.js';
70
70
  * produced advisory-tier findings before. All three are the
71
71
  * previously-clean-content-now-fires scenario this gate exists for. Scope
72
72
  * note (unchanged from Wave 3): this forces re-evaluation of the local MCP
73
- * audit baseline only (patterns.ts:100-125,
73
+ * audit baseline only (this constant and its `comparable` consumer,
74
74
  * packages/mcp-server/src/audit/security-audit.ts:219-222); the edge indexer
75
75
  * never reads this constant, which is why it has no edge counterpart.
76
+ * (SMI-5207 replaced a `patterns.ts:100-125` line-range citation here — that
77
+ * range addressed the sensitive_path family, which moved to
78
+ * patterns.sensitive-path.ts, so the numbers no longer resolve.)
79
+ *
80
+ * Bumped to `2026-09-07.1`: SMI-5207 added the MF-3 (path-form
81
+ * action-context, negation-aware) and MF-4 (assignment-form value,
82
+ * default-HIGH-unless-prose) severity gates. Unlike every bump above, this
83
+ * one is *previously-flagged-content-now-clean* — without it, the
84
+ * `comparable` gate keeps reusing a stored `malicious` verdict produced by
85
+ * the pre-fix ruleset, and the fix never reaches an already-scanned skill.
76
86
  */
77
- export declare const SCANNER_RULESET_VERSION: "2026-08-15.1";
87
+ export declare const SCANNER_RULESET_VERSION: "2026-09-07.1";
78
88
  export declare const SUSPICIOUS_PATTERNS: RegExp[];
79
89
  export { CODE_EXECUTION_PATTERNS, IMPERATIVE_FETCH_EXEC_PROSE } from './patterns.exec.js';
80
90
  export declare const SOCIAL_ENGINEERING_PATTERNS: RegExp[];
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/patterns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,eAAO,MAAM,uBAAuB,UAanC,CAAA;AAWD,eAAO,MAAM,gBAAgB,UAe5B,CAAA;AAMD,eAAO,MAAM,wBAAwB,UAAwD,CAAA;AAK7F,eAAO,MAAM,qBAAqB,UAA6C,CAAA;AA4B/E,eAAO,MAAM,gBAAgB,QAAoE,CAAA;AAMjG,eAAO,MAAM,uBAAuB,UAsBnC,CAAA;AAID,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,CAG3D,CAAA;AAUF,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAIjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,eAAO,MAAM,uBAAuB,EAAG,cAAuB,CAAA;AAG9D,eAAO,MAAM,mBAAmB,UAY/B,CAAA;AAOD,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAA;AAGzF,eAAO,MAAM,2BAA2B,UAavC,CAAA;AAGD,eAAO,MAAM,uBAAuB,UAenC,CAAA;AAGD,eAAO,MAAM,0BAA0B,UA2DtC,CAAA;AAMD,eAAO,MAAM,gCAAgC,UAG5C,CAAA;AAGD,eAAO,MAAM,6BAA6B,UA8EzC,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,yBAAyB,UAuBrC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,UAwBxB,CAAA"}
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/patterns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,eAAO,MAAM,uBAAuB,UAanC,CAAA;AAWD,eAAO,MAAM,gBAAgB,UAe5B,CAAA;AAMD,eAAO,MAAM,wBAAwB,UAAwD,CAAA;AAK7F,eAAO,MAAM,qBAAqB,UAA6C,CAAA;AAW/E,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,4BAA4B,EAC5B,kBAAkB,EAClB,+BAA+B,GAChC,MAAM,8BAA8B,CAAA;AAUrC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAIjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyEG;AACH,eAAO,MAAM,uBAAuB,EAAG,cAAuB,CAAA;AAG9D,eAAO,MAAM,mBAAmB,UAY/B,CAAA;AAOD,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAA;AAGzF,eAAO,MAAM,2BAA2B,UAavC,CAAA;AAGD,eAAO,MAAM,uBAAuB,UAenC,CAAA;AAGD,eAAO,MAAM,0BAA0B,UA2DtC,CAAA;AAMD,eAAO,MAAM,gCAAgC,UAG5C,CAAA;AAGD,eAAO,MAAM,6BAA6B,UA8EzC,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,yBAAyB,UAuBrC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,UAwBxB,CAAA"}
@@ -52,64 +52,16 @@ export const TRANSIENT_TRANSFER_HOSTS = ['transfer.sh', 'file.io', 'tmpfiles.org
52
52
  // execution-correlated — a shortened URL piped to a shell has no legitimate
53
53
  // install shape (a bare shortened link stays at url:medium like any tier here).
54
54
  export const URL_SHORTENER_DOMAINS = ['bit.ly', 'tinyurl.com', 't.co', 'is.gd'];
55
- // Sensitive file path patterns
56
- // SMI-4396 Wave 2: bare-keyword variants (credentials, secrets?, password) tightened
57
- // to require assignment/path/file-extension context. Without this tuning,
58
- // documentation keywords in SKILL.md frontmatter and prose (1Password integration
59
- // guides, security-research skill domain vocabulary) tripped HIGH severity.
60
- //
61
- // SMI-5359 Wave 4 — FP-narrowing for two over-firing entries (severity policy lives
62
- // in scanSensitivePaths so the array length / regression-guard baseline is unchanged):
63
- // MF-1: bare /api[_-]?key/i & /auth[_-]?token/i fired HIGH on ANY substring
64
- // benign prose ("set your api_key in the dashboard"), `export API_KEY=$1`, and
65
- // `apiKey: <YOUR_KEY>` placeholders. They are now VALUE-GATED: HIGH only when the
66
- // line assigns a real (non-placeholder, sufficiently-entropic) secret. The
67
- // value-BEARING leak is already caught at PII (PII_PATTERNS[0/2]); the
68
- // credential-in-an-outbound-curl exfil is caught by DATA_EXFILTRATION_PATTERNS
69
- // (the `$API_KEY`-in-a-fetched-URL pattern added below). See
70
- // VALUE_GATED_KEYWORD_PATTERNS.
71
- // MF-2: lone /\.env/i fired HIGH on every `.env` mention AND on the benign committed
72
- // family (.envrc, .env.example/.sample/.template/.schema/.dist). ENV_PATH_PATTERN
73
- // negative-lookaheads exclude that family; scanSensitivePaths downgrades a LONE
74
- // `.env` to MEDIUM and keeps HIGH when it co-occurs with a read/exfil verb or
75
- // shell pipe/redirect (`cat .env | curl ...`).
76
- // MF-2: `.env` as a real env-file reference. Excludes `.envrc` (direnv config) and the
77
- // committed placeholder family (.env.example/.sample/.template/.schema/.dist). The
78
- // `(?![A-Za-z])` guard also drops the `.environment`/`.envision` English-word FP while
79
- // still matching real variants like `.env`, `.env.local`, `.env.production`.
80
- export const ENV_PATH_PATTERN = /\.env(?![A-Za-z])(?!\.(?:example|sample|template|schema|dist))/i;
81
- // MF-1: bare credential keywords — value-gated in scanSensitivePaths, never standalone HIGH.
82
- const API_KEY_KEYWORD = /api[_-]?key/i;
83
- const AUTH_TOKEN_KEYWORD = /auth[_-]?token/i;
84
- export const SENSITIVE_PATH_PATTERNS = [
85
- ENV_PATH_PATTERN,
86
- // Contextual credentials: filename or assignment, not bare prose
87
- /credentials\.(?:json|ya?ml|env|toml|txt)/i,
88
- /credentials\s*[:=]/i,
89
- // Contextual secrets: assignment or path, not bare word
90
- /\bsecrets?\s*[:=]/i,
91
- /\bsecrets?\/[a-z0-9_.-]+/i,
92
- /\.pem$/i,
93
- /\.key$/i,
94
- /\.crt$/i,
95
- // Contextual password: assignment or URL (postgres://user:pass@host) only
96
- /password\s*[:=]/i,
97
- API_KEY_KEYWORD,
98
- AUTH_TOKEN_KEYWORD,
99
- /~\/\.ssh/i,
100
- /~\/\.aws/i,
101
- /~\/\.config/i,
102
- // SMI-4396 Wave 2: explicit system-file paths. Added so that tightening
103
- // bare /credentials/i and /password/i into assignment-context variants
104
- // doesn't drop coverage of obvious sensitive references like /etc/passwd.
105
- /\/etc\/(?:passwd|shadow|sudoers|hosts)\b/i,
106
- ];
107
- // MF-1: the two bare-keyword patterns above emit HIGH only when accompanied by a real
108
- // assigned secret value; scanSensitivePaths suppresses an otherwise-bare match.
109
- export const VALUE_GATED_KEYWORD_PATTERNS = new Set([
110
- API_KEY_KEYWORD,
111
- AUTH_TOKEN_KEYWORD,
112
- ]);
55
+ // SMI-5207: the whole `sensitive_path` family (ENV_PATH_PATTERN, the 15-entry
56
+ // SENSITIVE_PATH_PATTERNS array and the three ReadonlySets that classify its
57
+ // entries by severity gate) moved to patterns.sensitive-path.ts this file
58
+ // had only 18 lines of headroom under the 500-line pre-commit gate, and the
59
+ // MF-3/MF-4 classification needed ~42. Re-exported here unchanged so every
60
+ // existing import path (index.ts, SecurityScanner.scanners.ts,
61
+ // scanner-regression-guard.test.ts) keeps working AND reference identity is
62
+ // preserved scanSensitivePaths classifies patterns by reference, so this
63
+ // re-export is load-bearing exactly like the two below it; do not remove.
64
+ export { ENV_PATH_PATTERN, SENSITIVE_PATH_PATTERNS, VALUE_GATED_KEYWORD_PATTERNS, PATH_FORM_PATTERNS, VALUE_GATED_ASSIGNMENT_PATTERNS, } from './patterns.sensitive-path.js';
113
65
  // Jailbreak attempt patterns
114
66
  // SMI-5876 Wave 1: JAILBREAK_PATTERNS and AI_DEFENCE_PATTERNS (below) moved to
115
67
  // patterns.jailbreak.ts together with the evidence-tier classification map
@@ -125,7 +77,9 @@ export { JAILBREAK_PATTERNS, AI_DEFENCE_PATTERNS } from './patterns.jailbreak.js
125
77
  export { EVIDENCE_TYPE_BY_PATTERN } from './patterns.jailbreak.evidence.js';
126
78
  /**
127
79
  * SMI-5876 §0.1/§0.2: bump on ANY pattern-array or evidence-table change in
128
- * this module or patterns.jailbreak.ts. The security-audit baseline
80
+ * this module, patterns.jailbreak.ts, or patterns.sensitive-path.ts (SMI-5207
81
+ * moved the sensitive_path family there; the bump obligation moved with it).
82
+ * The security-audit baseline
129
83
  * (packages/mcp-server/src/audit/security-baseline.ts /
130
84
  * security-audit.ts) stamps every stored entry with the version that
131
85
  * produced it and treats a mismatch as "not comparable" — forcing a re-scan
@@ -181,11 +135,21 @@ export { EVIDENCE_TYPE_BY_PATTERN } from './patterns.jailbreak.evidence.js';
181
135
  * produced advisory-tier findings before. All three are the
182
136
  * previously-clean-content-now-fires scenario this gate exists for. Scope
183
137
  * note (unchanged from Wave 3): this forces re-evaluation of the local MCP
184
- * audit baseline only (patterns.ts:100-125,
138
+ * audit baseline only (this constant and its `comparable` consumer,
185
139
  * packages/mcp-server/src/audit/security-audit.ts:219-222); the edge indexer
186
140
  * never reads this constant, which is why it has no edge counterpart.
141
+ * (SMI-5207 replaced a `patterns.ts:100-125` line-range citation here — that
142
+ * range addressed the sensitive_path family, which moved to
143
+ * patterns.sensitive-path.ts, so the numbers no longer resolve.)
144
+ *
145
+ * Bumped to `2026-09-07.1`: SMI-5207 added the MF-3 (path-form
146
+ * action-context, negation-aware) and MF-4 (assignment-form value,
147
+ * default-HIGH-unless-prose) severity gates. Unlike every bump above, this
148
+ * one is *previously-flagged-content-now-clean* — without it, the
149
+ * `comparable` gate keeps reusing a stored `malicious` verdict produced by
150
+ * the pre-fix ruleset, and the fix never reaches an already-scanned skill.
187
151
  */
188
- export const SCANNER_RULESET_VERSION = '2026-08-15.1';
152
+ export const SCANNER_RULESET_VERSION = '2026-09-07.1';
189
153
  // Suspicious patterns that might indicate malicious intent
190
154
  export const SUSPICIOUS_PATTERNS = [
191
155
  /eval\s*\(/i,
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../../src/security/scanner/patterns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../../src/security/scanner/patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Security Scanner Patterns — the `sensitive_path` family
3
+ * @module @skillsmith/core/security/scanner/patterns.sensitive-path
4
+ *
5
+ * SMI-5207: extracted from patterns.ts, which sat 18 lines under the repo's
6
+ * 500-line pre-commit gate (scripts/check-file-length.mjs) before this wave —
7
+ * not enough headroom for the 12 hoisted pattern consts plus the two new
8
+ * severity-gate classification sets below (~42 lines). Same
9
+ * move-the-family-then-re-export convention already used twice in patterns.ts
10
+ * (patterns.jailbreak.ts, SMI-5876; patterns.exec.ts, SMI-6033 Wave 4).
11
+ *
12
+ * Every symbol here is re-exported unchanged from patterns.ts, so every
13
+ * existing import path keeps working AND reference identity is preserved —
14
+ * load-bearing, because scanSensitivePaths() classifies patterns by reference
15
+ * (`pattern === ENV_PATH_PATTERN`, `VALUE_GATED_KEYWORD_PATTERNS.has(pattern)`,
16
+ * and now `PATH_FORM_PATTERNS.has(pattern)` /
17
+ * `VALUE_GATED_ASSIGNMENT_PATTERNS.has(pattern)`).
18
+ *
19
+ * NOTE: a change to SENSITIVE_PATH_PATTERNS or to the severity classification
20
+ * below requires bumping SCANNER_RULESET_VERSION in patterns.ts — see that
21
+ * constant's own doc comment.
22
+ */
23
+ export declare const ENV_PATH_PATTERN: RegExp;
24
+ export declare const SENSITIVE_PATH_PATTERNS: RegExp[];
25
+ export declare const VALUE_GATED_KEYWORD_PATTERNS: ReadonlySet<RegExp>;
26
+ /**
27
+ * SMI-5207 (MF-3): the 9 path/filename-form entries. HIGH only when an action
28
+ * verb or shell operator appears within +/-1 line of the match; otherwise
29
+ * MEDIUM — a bare path *mention* is the common case, so evidence is required
30
+ * to escalate. See scanSensitivePaths' hasPathActionContext().
31
+ */
32
+ export declare const PATH_FORM_PATTERNS: ReadonlySet<RegExp>;
33
+ /**
34
+ * SMI-5207 (MF-4): the 3 keyword-assignment entries. HIGH BY DEFAULT —
35
+ * `keyword: value` is a syntactic credential-assignment shape, rare in
36
+ * innocent prose — downgraded to MEDIUM only on positive prose evidence about
37
+ * the assigned value. See scanSensitivePaths' assignmentHasRealValue().
38
+ *
39
+ * Partition check (guarded by a dedicated test): 1 (ENV) + 9 (PATH_FORM) +
40
+ * 3 (ASSIGNMENT) + 2 (VALUE_GATED_KEYWORD) = 15, total and disjoint. An
41
+ * unclassified future pattern falls through to scanSensitivePaths' fail-CLOSED
42
+ * `else` branch and stays HIGH.
43
+ */
44
+ export declare const VALUE_GATED_ASSIGNMENT_PATTERNS: ReadonlySet<RegExp>;
45
+ //# sourceMappingURL=patterns.sensitive-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.sensitive-path.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/patterns.sensitive-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAmCH,eAAO,MAAM,gBAAgB,QAAoE,CAAA;AA6BjG,eAAO,MAAM,uBAAuB,UAgBnC,CAAA;AAID,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,CAG3D,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAUjD,CAAA;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,+BAA+B,EAAE,WAAW,CAAC,MAAM,CAI9D,CAAA"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Security Scanner Patterns — the `sensitive_path` family
3
+ * @module @skillsmith/core/security/scanner/patterns.sensitive-path
4
+ *
5
+ * SMI-5207: extracted from patterns.ts, which sat 18 lines under the repo's
6
+ * 500-line pre-commit gate (scripts/check-file-length.mjs) before this wave —
7
+ * not enough headroom for the 12 hoisted pattern consts plus the two new
8
+ * severity-gate classification sets below (~42 lines). Same
9
+ * move-the-family-then-re-export convention already used twice in patterns.ts
10
+ * (patterns.jailbreak.ts, SMI-5876; patterns.exec.ts, SMI-6033 Wave 4).
11
+ *
12
+ * Every symbol here is re-exported unchanged from patterns.ts, so every
13
+ * existing import path keeps working AND reference identity is preserved —
14
+ * load-bearing, because scanSensitivePaths() classifies patterns by reference
15
+ * (`pattern === ENV_PATH_PATTERN`, `VALUE_GATED_KEYWORD_PATTERNS.has(pattern)`,
16
+ * and now `PATH_FORM_PATTERNS.has(pattern)` /
17
+ * `VALUE_GATED_ASSIGNMENT_PATTERNS.has(pattern)`).
18
+ *
19
+ * NOTE: a change to SENSITIVE_PATH_PATTERNS or to the severity classification
20
+ * below requires bumping SCANNER_RULESET_VERSION in patterns.ts — see that
21
+ * constant's own doc comment.
22
+ */
23
+ // Sensitive file path patterns
24
+ // SMI-4396 Wave 2: bare-keyword variants (credentials, secrets?, password) tightened
25
+ // to require assignment/path/file-extension context. Without this tuning,
26
+ // documentation keywords in SKILL.md frontmatter and prose (1Password integration
27
+ // guides, security-research skill domain vocabulary) tripped HIGH severity.
28
+ //
29
+ // SMI-5359 Wave 4 — FP-narrowing for two over-firing entries (severity policy lives
30
+ // in scanSensitivePaths so the array length / regression-guard baseline is unchanged):
31
+ // MF-1: bare /api[_-]?key/i & /auth[_-]?token/i fired HIGH on ANY substring —
32
+ // benign prose ("set your api_key in the dashboard"), `export API_KEY=$1`, and
33
+ // `apiKey: <YOUR_KEY>` placeholders. They are now VALUE-GATED: HIGH only when the
34
+ // line assigns a real (non-placeholder, sufficiently-entropic) secret. The
35
+ // value-BEARING leak is already caught at PII (PII_PATTERNS[0/2]); the
36
+ // credential-in-an-outbound-curl exfil is caught by DATA_EXFILTRATION_PATTERNS
37
+ // (the `$API_KEY`-in-a-fetched-URL pattern added there). See
38
+ // VALUE_GATED_KEYWORD_PATTERNS.
39
+ // MF-2: lone /\.env/i fired HIGH on every `.env` mention AND on the benign committed
40
+ // family (.envrc, .env.example/.sample/.template/.schema/.dist). ENV_PATH_PATTERN
41
+ // negative-lookaheads exclude that family; scanSensitivePaths downgrades a LONE
42
+ // `.env` to MEDIUM and keeps HIGH when it co-occurs with a read/exfil verb or
43
+ // shell pipe/redirect (`cat .env | curl ...`).
44
+ //
45
+ // SMI-5207 — the remaining 12 entries got the same treatment the two MF-1 keywords
46
+ // and the MF-2 `.env` entry already had: severity is now context-gated rather than
47
+ // unconditionally HIGH. MF-3 covers the 9 path-form entries (action verb or shell
48
+ // operator within +/-1 line), MF-4 the 3 keyword-assignment entries (HIGH unless the
49
+ // assigned value positively reads as prose). Both gates live in
50
+ // SecurityScanner.scanners.ts; this module only supplies the classification.
51
+ // MF-2: `.env` as a real env-file reference. Excludes `.envrc` (direnv config) and the
52
+ // committed placeholder family (.env.example/.sample/.template/.schema/.dist). The
53
+ // `(?![A-Za-z])` guard also drops the `.environment`/`.envision` English-word FP while
54
+ // still matching real variants like `.env`, `.env.local`, `.env.production`.
55
+ export const ENV_PATH_PATTERN = /\.env(?![A-Za-z])(?!\.(?:example|sample|template|schema|dist))/i;
56
+ // MF-1: bare credential keywords — value-gated in scanSensitivePaths, never standalone HIGH.
57
+ const API_KEY_KEYWORD = /api[_-]?key/i;
58
+ const AUTH_TOKEN_KEYWORD = /auth[_-]?token/i;
59
+ // SMI-5207: the 12 non-`.env` entries are hoisted from inline array literals to named
60
+ // consts so scanSensitivePaths can classify each by severity gate BY REFERENCE. The
61
+ // array's contents, order, and length (15) are unchanged — the regression-guard floor
62
+ // (scanner-regression-guard.test.ts) still holds.
63
+ // Contextual credentials: filename or assignment, not bare prose
64
+ const CREDENTIALS_FILE_PATTERN = /credentials\.(?:json|ya?ml|env|toml|txt)/i;
65
+ const CREDENTIALS_ASSIGN_PATTERN = /credentials\s*[:=]/i;
66
+ // Contextual secrets: assignment or path, not bare word
67
+ const SECRETS_ASSIGN_PATTERN = /\bsecrets?\s*[:=]/i;
68
+ const SECRETS_PATH_PATTERN = /\bsecrets?\/[a-z0-9_.-]+/i;
69
+ const PEM_PATTERN = /\.pem$/i;
70
+ const KEY_FILE_PATTERN = /\.key$/i;
71
+ const CRT_PATTERN = /\.crt$/i;
72
+ // Contextual password: assignment or URL (postgres://user:pass@host) only
73
+ const PASSWORD_ASSIGN_PATTERN = /password\s*[:=]/i;
74
+ const SSH_DIR_PATTERN = /~\/\.ssh/i;
75
+ const AWS_DIR_PATTERN = /~\/\.aws/i;
76
+ const CONFIG_DIR_PATTERN = /~\/\.config/i;
77
+ // SMI-4396 Wave 2: explicit system-file paths. Added so that tightening
78
+ // bare /credentials/i and /password/i into assignment-context variants
79
+ // doesn't drop coverage of obvious sensitive references like /etc/passwd.
80
+ const ETC_SYSTEM_FILE_PATTERN = /\/etc\/(?:passwd|shadow|sudoers|hosts)\b/i;
81
+ export const SENSITIVE_PATH_PATTERNS = [
82
+ ENV_PATH_PATTERN,
83
+ CREDENTIALS_FILE_PATTERN,
84
+ CREDENTIALS_ASSIGN_PATTERN,
85
+ SECRETS_ASSIGN_PATTERN,
86
+ SECRETS_PATH_PATTERN,
87
+ PEM_PATTERN,
88
+ KEY_FILE_PATTERN,
89
+ CRT_PATTERN,
90
+ PASSWORD_ASSIGN_PATTERN,
91
+ API_KEY_KEYWORD,
92
+ AUTH_TOKEN_KEYWORD,
93
+ SSH_DIR_PATTERN,
94
+ AWS_DIR_PATTERN,
95
+ CONFIG_DIR_PATTERN,
96
+ ETC_SYSTEM_FILE_PATTERN,
97
+ ];
98
+ // MF-1: the two bare-keyword patterns above emit HIGH only when accompanied by a real
99
+ // assigned secret value; scanSensitivePaths suppresses an otherwise-bare match.
100
+ export const VALUE_GATED_KEYWORD_PATTERNS = new Set([
101
+ API_KEY_KEYWORD,
102
+ AUTH_TOKEN_KEYWORD,
103
+ ]);
104
+ /**
105
+ * SMI-5207 (MF-3): the 9 path/filename-form entries. HIGH only when an action
106
+ * verb or shell operator appears within +/-1 line of the match; otherwise
107
+ * MEDIUM — a bare path *mention* is the common case, so evidence is required
108
+ * to escalate. See scanSensitivePaths' hasPathActionContext().
109
+ */
110
+ export const PATH_FORM_PATTERNS = new Set([
111
+ CREDENTIALS_FILE_PATTERN,
112
+ SECRETS_PATH_PATTERN,
113
+ PEM_PATTERN,
114
+ KEY_FILE_PATTERN,
115
+ CRT_PATTERN,
116
+ SSH_DIR_PATTERN,
117
+ AWS_DIR_PATTERN,
118
+ CONFIG_DIR_PATTERN,
119
+ ETC_SYSTEM_FILE_PATTERN,
120
+ ]);
121
+ /**
122
+ * SMI-5207 (MF-4): the 3 keyword-assignment entries. HIGH BY DEFAULT —
123
+ * `keyword: value` is a syntactic credential-assignment shape, rare in
124
+ * innocent prose — downgraded to MEDIUM only on positive prose evidence about
125
+ * the assigned value. See scanSensitivePaths' assignmentHasRealValue().
126
+ *
127
+ * Partition check (guarded by a dedicated test): 1 (ENV) + 9 (PATH_FORM) +
128
+ * 3 (ASSIGNMENT) + 2 (VALUE_GATED_KEYWORD) = 15, total and disjoint. An
129
+ * unclassified future pattern falls through to scanSensitivePaths' fail-CLOSED
130
+ * `else` branch and stays HIGH.
131
+ */
132
+ export const VALUE_GATED_ASSIGNMENT_PATTERNS = new Set([
133
+ CREDENTIALS_ASSIGN_PATTERN,
134
+ SECRETS_ASSIGN_PATTERN,
135
+ PASSWORD_ASSIGN_PATTERN,
136
+ ]);
137
+ //# sourceMappingURL=patterns.sensitive-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.sensitive-path.js","sourceRoot":"","sources":["../../../../src/security/scanner/patterns.sensitive-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,+BAA+B;AAC/B,qFAAqF;AACrF,0EAA0E;AAC1E,kFAAkF;AAClF,4EAA4E;AAC5E,EAAE;AACF,oFAAoF;AACpF,uFAAuF;AACvF,gFAAgF;AAChF,mFAAmF;AACnF,sFAAsF;AACtF,+EAA+E;AAC/E,2EAA2E;AAC3E,mFAAmF;AACnF,iEAAiE;AACjE,oCAAoC;AACpC,uFAAuF;AACvF,sFAAsF;AACtF,oFAAoF;AACpF,kFAAkF;AAClF,mDAAmD;AACnD,EAAE;AACF,mFAAmF;AACnF,mFAAmF;AACnF,kFAAkF;AAClF,qFAAqF;AACrF,gEAAgE;AAChE,6EAA6E;AAE7E,uFAAuF;AACvF,mFAAmF;AACnF,uFAAuF;AACvF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,iEAAiE,CAAA;AAEjG,6FAA6F;AAC7F,MAAM,eAAe,GAAG,cAAc,CAAA;AACtC,MAAM,kBAAkB,GAAG,iBAAiB,CAAA;AAE5C,sFAAsF;AACtF,oFAAoF;AACpF,sFAAsF;AACtF,kDAAkD;AAClD,iEAAiE;AACjE,MAAM,wBAAwB,GAAG,2CAA2C,CAAA;AAC5E,MAAM,0BAA0B,GAAG,qBAAqB,CAAA;AACxD,wDAAwD;AACxD,MAAM,sBAAsB,GAAG,oBAAoB,CAAA;AACnD,MAAM,oBAAoB,GAAG,2BAA2B,CAAA;AACxD,MAAM,WAAW,GAAG,SAAS,CAAA;AAC7B,MAAM,gBAAgB,GAAG,SAAS,CAAA;AAClC,MAAM,WAAW,GAAG,SAAS,CAAA;AAC7B,0EAA0E;AAC1E,MAAM,uBAAuB,GAAG,kBAAkB,CAAA;AAClD,MAAM,eAAe,GAAG,WAAW,CAAA;AACnC,MAAM,eAAe,GAAG,WAAW,CAAA;AACnC,MAAM,kBAAkB,GAAG,cAAc,CAAA;AACzC,wEAAwE;AACxE,uEAAuE;AACvE,0EAA0E;AAC1E,MAAM,uBAAuB,GAAG,2CAA2C,CAAA;AAE3E,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,gBAAgB;IAChB,wBAAwB;IACxB,0BAA0B;IAC1B,sBAAsB;IACtB,oBAAoB;IACpB,WAAW;IACX,gBAAgB;IAChB,WAAW;IACX,uBAAuB;IACvB,eAAe;IACf,kBAAkB;IAClB,eAAe;IACf,eAAe;IACf,kBAAkB;IAClB,uBAAuB;CACxB,CAAA;AAED,sFAAsF;AACtF,gFAAgF;AAChF,MAAM,CAAC,MAAM,4BAA4B,GAAwB,IAAI,GAAG,CAAC;IACvE,eAAe;IACf,kBAAkB;CACnB,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IAC7D,wBAAwB;IACxB,oBAAoB;IACpB,WAAW;IACX,gBAAgB;IAChB,WAAW;IACX,eAAe;IACf,eAAe;IACf,kBAAkB;IAClB,uBAAuB;CACxB,CAAC,CAAA;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAwB,IAAI,GAAG,CAAC;IAC1E,0BAA0B;IAC1B,sBAAsB;IACtB,uBAAuB;CACxB,CAAC,CAAA"}
@@ -11,25 +11,39 @@
11
11
  */
12
12
  export declare const MAX_LINE_LENGTH_FOR_REGEX = 10000;
13
13
  /**
14
- * SMI-5881: Cap for the FULL-CONTENT (multiline "pass 1") regex scan, in
15
- * UTF-16 code units (JavaScript `string.length` — NOT bytes/code points; see
16
- * SecurityScanner.ts's content-length finding message).
14
+ * SMI-5879 (design §3.4): Cap for the FULL-CONTENT (multiline "pass 1") regex
15
+ * scan, in UTF-16 code units (JavaScript `string.length` — NOT bytes/code
16
+ * points; see SecurityScanner.ts's content-length finding message).
17
17
  *
18
- * Equal to MAX_LINE_LENGTH_FOR_REGEX today (both 10_000) but declared
19
- * separately because the two caps protect different scan passes (per-line vs
20
- * whole-document) and may need to diverge later. This is a ReDoS budget
21
- * input, not a free parameter — raising it requires first proving
22
- * AD_CRLF_INJECTION-class patterns stay linear at the new size. Measured
23
- * (SMI-5881): the fixed AD_CRLF_INJECTION pattern is already ~4x slower per
24
- * doubling of input size on some adversarial inputs at sizes past this cap,
25
- * extrapolating to unacceptable latency well before 1,000,000 so this cap
26
- * is NOT raised as part of SMI-5881 even though larger trust tiers allow a
27
- * much bigger `maxContentLength`. See SecurityScanner.ts's
28
- * `effectiveMultilineLimit` (`Math.min(MAX_CONTENT_LENGTH_FOR_REGEX,
29
- * maxContentLength)`) for how this interacts with the per-tier content-length
30
- * ceiling.
18
+ * SMI-5881 set this equal to MAX_LINE_LENGTH_FOR_REGEX (10,000) and declined
19
+ * to raise it, citing a doubling-based extrapolation from smaller inputs that
20
+ * projected "unacceptable latency well before 1,000,000" for
21
+ * AD_CRLF_INJECTION-class patterns. SMI-5879 independently re-measured
22
+ * directly at 1,000,000 (not extrapolated) across the 7 ported multiline
23
+ * patterns (AD_CRLF_INJECTION, AD_ROLE_MARKER_BARE, AD_HTML_COMMENT_VERB/NOUN,
24
+ * AD_DELIMITER_BARE, AD_AN2_ROLE_BODY_NEXT_LINE, JB_JS3A/JS3B) against
25
+ * per-pattern adversarial near-miss shapes (not just the CRLF-pair shape
26
+ * SMI-5881 used) and found linear scaling with a worst case of ~56ms at
27
+ * 1,000,000 chars (AD_HTML_COMMENT_NOUN, "repeated HTML-comment-open"
28
+ * near-miss) — confirmed still linear (not superlinear) up to 4,000,000
29
+ * chars (~145ms), comfortably under the section 7.3 250ms per-case budget.
30
+ * The prior extrapolation does not hold empirically at this exact size; the
31
+ * measured worst case has real headroom, just less than the ~78x this
32
+ * design doc's own (unverified) claim asserted. Raising this cap closes the
33
+ * 10 KB pass-1 truncation blind spot (design §3.4) — the edge's own
34
+ * MAX_SKILL_CONTENT_SIZE is 1,000,000 bytes, so pass 1 previously saw only
35
+ * the first 1% of a large SKILL.md.
36
+ *
37
+ * Still declared separately from MAX_LINE_LENGTH_FOR_REGEX because the two
38
+ * caps protect different scan passes (per-line vs whole-document) and may
39
+ * need to diverge again. See SecurityScanner.ts's `effectiveMultilineLimit`
40
+ * (`Math.min(MAX_CONTENT_LENGTH_FOR_REGEX, maxContentLength)`) for how this
41
+ * interacts with the per-tier content-length ceiling — a trust tier with a
42
+ * SMALLER configured `maxContentLength` still tightens the effective limit
43
+ * below this cap; none currently need MORE than this cap for the multiline
44
+ * pass specifically.
31
45
  */
32
- export declare const MAX_CONTENT_LENGTH_FOR_REGEX = 10000;
46
+ export declare const MAX_CONTENT_LENGTH_FOR_REGEX = 1000000;
33
47
  /**
34
48
  * SMI-882: Safe regex test with length limit
35
49
  * Applies input length limit before regex matching to prevent ReDoS attacks.
@@ -1 +1 @@
1
- {"version":3,"file":"regex-utils.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/regex-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,QAAQ,CAAA;AAE9C;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,4BAA4B,QAA4B,CAAA;AAErE;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAkC,GAC5C,gBAAgB,GAAG,IAAI,CAIzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAkC,GAC5C,OAAO,CAIT"}
1
+ {"version":3,"file":"regex-utils.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/regex-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,QAAQ,CAAA;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,4BAA4B,UAAY,CAAA;AAErD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAkC,GAC5C,gBAAgB,GAAG,IAAI,CAIzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAkC,GAC5C,OAAO,CAIT"}
@@ -11,25 +11,39 @@
11
11
  */
12
12
  export const MAX_LINE_LENGTH_FOR_REGEX = 10000;
13
13
  /**
14
- * SMI-5881: Cap for the FULL-CONTENT (multiline "pass 1") regex scan, in
15
- * UTF-16 code units (JavaScript `string.length` — NOT bytes/code points; see
16
- * SecurityScanner.ts's content-length finding message).
14
+ * SMI-5879 (design §3.4): Cap for the FULL-CONTENT (multiline "pass 1") regex
15
+ * scan, in UTF-16 code units (JavaScript `string.length` — NOT bytes/code
16
+ * points; see SecurityScanner.ts's content-length finding message).
17
17
  *
18
- * Equal to MAX_LINE_LENGTH_FOR_REGEX today (both 10_000) but declared
19
- * separately because the two caps protect different scan passes (per-line vs
20
- * whole-document) and may need to diverge later. This is a ReDoS budget
21
- * input, not a free parameter — raising it requires first proving
22
- * AD_CRLF_INJECTION-class patterns stay linear at the new size. Measured
23
- * (SMI-5881): the fixed AD_CRLF_INJECTION pattern is already ~4x slower per
24
- * doubling of input size on some adversarial inputs at sizes past this cap,
25
- * extrapolating to unacceptable latency well before 1,000,000 so this cap
26
- * is NOT raised as part of SMI-5881 even though larger trust tiers allow a
27
- * much bigger `maxContentLength`. See SecurityScanner.ts's
28
- * `effectiveMultilineLimit` (`Math.min(MAX_CONTENT_LENGTH_FOR_REGEX,
29
- * maxContentLength)`) for how this interacts with the per-tier content-length
30
- * ceiling.
18
+ * SMI-5881 set this equal to MAX_LINE_LENGTH_FOR_REGEX (10,000) and declined
19
+ * to raise it, citing a doubling-based extrapolation from smaller inputs that
20
+ * projected "unacceptable latency well before 1,000,000" for
21
+ * AD_CRLF_INJECTION-class patterns. SMI-5879 independently re-measured
22
+ * directly at 1,000,000 (not extrapolated) across the 7 ported multiline
23
+ * patterns (AD_CRLF_INJECTION, AD_ROLE_MARKER_BARE, AD_HTML_COMMENT_VERB/NOUN,
24
+ * AD_DELIMITER_BARE, AD_AN2_ROLE_BODY_NEXT_LINE, JB_JS3A/JS3B) against
25
+ * per-pattern adversarial near-miss shapes (not just the CRLF-pair shape
26
+ * SMI-5881 used) and found linear scaling with a worst case of ~56ms at
27
+ * 1,000,000 chars (AD_HTML_COMMENT_NOUN, "repeated HTML-comment-open"
28
+ * near-miss) — confirmed still linear (not superlinear) up to 4,000,000
29
+ * chars (~145ms), comfortably under the section 7.3 250ms per-case budget.
30
+ * The prior extrapolation does not hold empirically at this exact size; the
31
+ * measured worst case has real headroom, just less than the ~78x this
32
+ * design doc's own (unverified) claim asserted. Raising this cap closes the
33
+ * 10 KB pass-1 truncation blind spot (design §3.4) — the edge's own
34
+ * MAX_SKILL_CONTENT_SIZE is 1,000,000 bytes, so pass 1 previously saw only
35
+ * the first 1% of a large SKILL.md.
36
+ *
37
+ * Still declared separately from MAX_LINE_LENGTH_FOR_REGEX because the two
38
+ * caps protect different scan passes (per-line vs whole-document) and may
39
+ * need to diverge again. See SecurityScanner.ts's `effectiveMultilineLimit`
40
+ * (`Math.min(MAX_CONTENT_LENGTH_FOR_REGEX, maxContentLength)`) for how this
41
+ * interacts with the per-tier content-length ceiling — a trust tier with a
42
+ * SMALLER configured `maxContentLength` still tightens the effective limit
43
+ * below this cap; none currently need MORE than this cap for the multiline
44
+ * pass specifically.
31
45
  */
32
- export const MAX_CONTENT_LENGTH_FOR_REGEX = MAX_LINE_LENGTH_FOR_REGEX;
46
+ export const MAX_CONTENT_LENGTH_FOR_REGEX = 1_000_000;
33
47
  /**
34
48
  * SMI-882: Safe regex test with length limit
35
49
  * Applies input length limit before regex matching to prevent ReDoS attacks.
@@ -1 +1 @@
1
- {"version":3,"file":"regex-utils.js","sourceRoot":"","sources":["../../../../src/security/scanner/regex-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAA;AAE9C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,yBAAyB,CAAA;AAErE;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,KAAa,EACb,YAAoB,yBAAyB;IAE7C,2DAA2D;IAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC9E,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,KAAa,EACb,YAAoB,yBAAyB;IAE7C,2DAA2D;IAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC9E,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AAChC,CAAC"}
1
+ {"version":3,"file":"regex-utils.js","sourceRoot":"","sources":["../../../../src/security/scanner/regex-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAA;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,SAAS,CAAA;AAErD;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,KAAa,EACb,YAAoB,yBAAyB;IAE7C,2DAA2D;IAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC9E,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,KAAa,EACb,YAAoB,yBAAyB;IAE7C,2DAA2D;IAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC9E,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AAChC,CAAC"}
@@ -117,6 +117,15 @@ export interface ScanReport {
117
117
  riskScore: number;
118
118
  /** Breakdown of risk score by category */
119
119
  riskBreakdown: RiskScoreBreakdown;
120
+ /**
121
+ * SMI-5879 (design §3.3.6): true when the jailbreak or ai_defence multiline
122
+ * pass hit its per-pattern iteration ceiling before exhausting matches on a
123
+ * pathological same-line-repetition input. NOT provably score-neutral — the
124
+ * write path must treat this scan as authoritative for RAISING a verdict
125
+ * only, never for lowering an existing quarantine. Absent/undefined is
126
+ * equivalent to `false` (not truncated) for gating purposes.
127
+ */
128
+ multilineTruncated?: boolean;
120
129
  }
121
130
  /**
122
131
  * Verdict returned by comparing two scans of the SAME skill to detect a
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/types.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export { logger, createLogger, silentLogger, type Logger } from './logger.js';
5
5
  export { withRetry, fetchWithRetry, isTransientError, isRetryableStatus, parseRetryAfter, RetryExhaustedError, DEFAULT_RETRY_CONFIG, type RetryConfig, } from './retry.js';
6
6
  export { checkForUpdates, formatUpdateNotification, agentInstallRemediationCommand, checkCursorMcpArtifact, type VersionCheckResult, type CursorMcpArtifactCheck, } from './version-check.js';
7
7
  export { parseRepoUrl, isGitHubUrl, type ParsedRepoUrl } from './github-url.js';
8
+ export { VALID_SKILL_NAME_RE, validateSkillName } from './skill-name.js';
8
9
  export { safeWriteFile, SymlinkError, HardlinkError } from './safe-fs.js';
9
10
  export { isQuietModeEnabled } from './quiet-mode.js';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,8BAA8B,EAC9B,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG/E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAKzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,8BAA8B,EAC9B,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG/E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGxE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAKzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA"}
@@ -7,6 +7,8 @@ export { withRetry, fetchWithRetry, isTransientError, isRetryableStatus, parseRe
7
7
  export { checkForUpdates, formatUpdateNotification, agentInstallRemediationCommand, checkCursorMcpArtifact, } from './version-check.js';
8
8
  // SMI-2171: GitHub URL parsing utilities
9
9
  export { parseRepoUrl, isGitHubUrl } from './github-url.js';
10
+ // Shared skill name validation (relocated from @skillsmith/cli — canonical here now)
11
+ export { VALID_SKILL_NAME_RE, validateSkillName } from './skill-name.js';
10
12
  // SMI-2274: Safe filesystem operations (symlink protection)
11
13
  export { safeWriteFile, SymlinkError, HardlinkError } from './safe-fs.js';
12
14
  // SMI-5897 (C-18/C-19, Wave 4 fix): shared SKILLSMITH_QUIET guard — used by
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAe,MAAM,aAAa,CAAA;AAC7E,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,YAAY,CAAA;AAEnB,wDAAwD;AACxD,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,8BAA8B,EAC9B,sBAAsB,GAGvB,MAAM,oBAAoB,CAAA;AAE3B,yCAAyC;AACzC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAsB,MAAM,iBAAiB,CAAA;AAE/E,4DAA4D;AAC5D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEzE,4EAA4E;AAC5E,sEAAsE;AACtE,6EAA6E;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAe,MAAM,aAAa,CAAA;AAC7E,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,YAAY,CAAA;AAEnB,wDAAwD;AACxD,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,8BAA8B,EAC9B,sBAAsB,GAGvB,MAAM,oBAAoB,CAAA;AAE3B,yCAAyC;AACzC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAsB,MAAM,iBAAiB,CAAA;AAE/E,qFAAqF;AACrF,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAExE,4DAA4D;AAC5D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEzE,4EAA4E;AAC5E,sEAAsE;AACtE,6EAA6E;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared skill name validation utilities.
3
+ *
4
+ * Used by both `skillsmith author init` and `skillsmith create` to enforce
5
+ * a consistent, registry-safe naming convention across all scaffolding paths.
6
+ */
7
+ /**
8
+ * Valid skill names: lowercase letters, digits, and hyphens only.
9
+ * Must start with a lowercase letter.
10
+ * Matches the Skillsmith registry slug format.
11
+ */
12
+ export declare const VALID_SKILL_NAME_RE: RegExp;
13
+ /**
14
+ * Validate a skill name against the canonical Skillsmith naming convention.
15
+ *
16
+ * @returns `true` if valid, or a string error message if invalid.
17
+ */
18
+ export declare function validateSkillName(name: string): true | string;
19
+ //# sourceMappingURL=skill-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-name.d.ts","sourceRoot":"","sources":["../../../src/utils/skill-name.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAsB,CAAA;AAEtD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAM7D"}