skein-cli 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.
Files changed (250) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +180 -0
  3. package/bin/skein.mjs +7 -0
  4. package/dist/adapters/aider/conv-reader.d.ts +7 -0
  5. package/dist/adapters/aider/conv-reader.js +203 -0
  6. package/dist/adapters/aider/conv-reader.js.map +1 -0
  7. package/dist/adapters/aider/index.d.ts +2 -0
  8. package/dist/adapters/aider/index.js +123 -0
  9. package/dist/adapters/aider/index.js.map +1 -0
  10. package/dist/adapters/base.d.ts +71 -0
  11. package/dist/adapters/base.js +38 -0
  12. package/dist/adapters/base.js.map +1 -0
  13. package/dist/adapters/claude-code/conv-reader.d.ts +2 -0
  14. package/dist/adapters/claude-code/conv-reader.js +155 -0
  15. package/dist/adapters/claude-code/conv-reader.js.map +1 -0
  16. package/dist/adapters/claude-code/index.d.ts +3 -0
  17. package/dist/adapters/claude-code/index.js +517 -0
  18. package/dist/adapters/claude-code/index.js.map +1 -0
  19. package/dist/adapters/claude-desktop/index.d.ts +2 -0
  20. package/dist/adapters/claude-desktop/index.js +95 -0
  21. package/dist/adapters/claude-desktop/index.js.map +1 -0
  22. package/dist/adapters/codex/index.d.ts +2 -0
  23. package/dist/adapters/codex/index.js +472 -0
  24. package/dist/adapters/codex/index.js.map +1 -0
  25. package/dist/adapters/cursor/index.d.ts +2 -0
  26. package/dist/adapters/cursor/index.js +255 -0
  27. package/dist/adapters/cursor/index.js.map +1 -0
  28. package/dist/adapters/opencode/conv-reader.d.ts +3 -0
  29. package/dist/adapters/opencode/conv-reader.js +190 -0
  30. package/dist/adapters/opencode/conv-reader.js.map +1 -0
  31. package/dist/adapters/opencode/index.d.ts +2 -0
  32. package/dist/adapters/opencode/index.js +349 -0
  33. package/dist/adapters/opencode/index.js.map +1 -0
  34. package/dist/adapters/registry.d.ts +4 -0
  35. package/dist/adapters/registry.js +26 -0
  36. package/dist/adapters/registry.js.map +1 -0
  37. package/dist/cli.d.ts +3 -0
  38. package/dist/cli.js +54 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/commands/conv.d.ts +2 -0
  41. package/dist/commands/conv.js +261 -0
  42. package/dist/commands/conv.js.map +1 -0
  43. package/dist/commands/doctor.d.ts +2 -0
  44. package/dist/commands/doctor.js +85 -0
  45. package/dist/commands/doctor.js.map +1 -0
  46. package/dist/commands/init.d.ts +2 -0
  47. package/dist/commands/init.js +38 -0
  48. package/dist/commands/init.js.map +1 -0
  49. package/dist/commands/memory.d.ts +2 -0
  50. package/dist/commands/memory.js +197 -0
  51. package/dist/commands/memory.js.map +1 -0
  52. package/dist/commands/migrate.d.ts +2 -0
  53. package/dist/commands/migrate.js +102 -0
  54. package/dist/commands/migrate.js.map +1 -0
  55. package/dist/commands/profile.d.ts +2 -0
  56. package/dist/commands/profile.js +183 -0
  57. package/dist/commands/profile.js.map +1 -0
  58. package/dist/commands/redact.d.ts +2 -0
  59. package/dist/commands/redact.js +73 -0
  60. package/dist/commands/redact.js.map +1 -0
  61. package/dist/commands/trace.d.ts +2 -0
  62. package/dist/commands/trace.js +181 -0
  63. package/dist/commands/trace.js.map +1 -0
  64. package/dist/commands/view.d.ts +13 -0
  65. package/dist/commands/view.js +184 -0
  66. package/dist/commands/view.js.map +1 -0
  67. package/dist/commands/watch.d.ts +6 -0
  68. package/dist/commands/watch.js +61 -0
  69. package/dist/commands/watch.js.map +1 -0
  70. package/dist/commands/wrap.d.ts +2 -0
  71. package/dist/commands/wrap.js +131 -0
  72. package/dist/commands/wrap.js.map +1 -0
  73. package/dist/conv/chatgpt-import.d.ts +33 -0
  74. package/dist/conv/chatgpt-import.js +145 -0
  75. package/dist/conv/chatgpt-import.js.map +1 -0
  76. package/dist/conv/cursor.d.ts +12 -0
  77. package/dist/conv/cursor.js +55 -0
  78. package/dist/conv/cursor.js.map +1 -0
  79. package/dist/conv/export.d.ts +40 -0
  80. package/dist/conv/export.js +215 -0
  81. package/dist/conv/export.js.map +1 -0
  82. package/dist/conv/replay/aider.d.ts +24 -0
  83. package/dist/conv/replay/aider.js +56 -0
  84. package/dist/conv/replay/aider.js.map +1 -0
  85. package/dist/conv/replay/claude-code.d.ts +38 -0
  86. package/dist/conv/replay/claude-code.js +80 -0
  87. package/dist/conv/replay/claude-code.js.map +1 -0
  88. package/dist/conv/replay/context.d.ts +25 -0
  89. package/dist/conv/replay/context.js +63 -0
  90. package/dist/conv/replay/context.js.map +1 -0
  91. package/dist/conv/replay/index.d.ts +22 -0
  92. package/dist/conv/replay/index.js +84 -0
  93. package/dist/conv/replay/index.js.map +1 -0
  94. package/dist/conv/search.d.ts +67 -0
  95. package/dist/conv/search.js +379 -0
  96. package/dist/conv/search.js.map +1 -0
  97. package/dist/conv/sink.d.ts +26 -0
  98. package/dist/conv/sink.js +76 -0
  99. package/dist/conv/sink.js.map +1 -0
  100. package/dist/conv/sources/aider.d.ts +13 -0
  101. package/dist/conv/sources/aider.js +95 -0
  102. package/dist/conv/sources/aider.js.map +1 -0
  103. package/dist/conv/sources/claude-code.d.ts +13 -0
  104. package/dist/conv/sources/claude-code.js +189 -0
  105. package/dist/conv/sources/claude-code.js.map +1 -0
  106. package/dist/conv/sources/codex.d.ts +15 -0
  107. package/dist/conv/sources/codex.js +175 -0
  108. package/dist/conv/sources/codex.js.map +1 -0
  109. package/dist/conv/sources/opencode.d.ts +12 -0
  110. package/dist/conv/sources/opencode.js +92 -0
  111. package/dist/conv/sources/opencode.js.map +1 -0
  112. package/dist/conv/store.d.ts +10 -0
  113. package/dist/conv/store.js +75 -0
  114. package/dist/conv/store.js.map +1 -0
  115. package/dist/conv/title.d.ts +9 -0
  116. package/dist/conv/title.js +74 -0
  117. package/dist/conv/title.js.map +1 -0
  118. package/dist/conv/watcher.d.ts +28 -0
  119. package/dist/conv/watcher.js +75 -0
  120. package/dist/conv/watcher.js.map +1 -0
  121. package/dist/conv/zip.d.ts +11 -0
  122. package/dist/conv/zip.js +82 -0
  123. package/dist/conv/zip.js.map +1 -0
  124. package/dist/hf/client.d.ts +41 -0
  125. package/dist/hf/client.js +87 -0
  126. package/dist/hf/client.js.map +1 -0
  127. package/dist/index.d.ts +5 -0
  128. package/dist/index.js +6 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/ir/index.d.ts +24 -0
  131. package/dist/ir/index.js +23 -0
  132. package/dist/ir/index.js.map +1 -0
  133. package/dist/ir/profile.d.ts +55 -0
  134. package/dist/ir/profile.js +177 -0
  135. package/dist/ir/profile.js.map +1 -0
  136. package/dist/memory/index.d.ts +41 -0
  137. package/dist/memory/index.js +109 -0
  138. package/dist/memory/index.js.map +1 -0
  139. package/dist/memory/search.d.ts +24 -0
  140. package/dist/memory/search.js +114 -0
  141. package/dist/memory/search.js.map +1 -0
  142. package/dist/memory/sinks/claude-mem.d.ts +13 -0
  143. package/dist/memory/sinks/claude-mem.js +100 -0
  144. package/dist/memory/sinks/claude-mem.js.map +1 -0
  145. package/dist/memory/sinks/codex.d.ts +12 -0
  146. package/dist/memory/sinks/codex.js +82 -0
  147. package/dist/memory/sinks/codex.js.map +1 -0
  148. package/dist/memory/sinks/context.d.ts +21 -0
  149. package/dist/memory/sinks/context.js +42 -0
  150. package/dist/memory/sinks/context.js.map +1 -0
  151. package/dist/memory/sources/chatgpt.d.ts +22 -0
  152. package/dist/memory/sources/chatgpt.js +98 -0
  153. package/dist/memory/sources/chatgpt.js.map +1 -0
  154. package/dist/memory/sources/claude-mem.d.ts +8 -0
  155. package/dist/memory/sources/claude-mem.js +104 -0
  156. package/dist/memory/sources/claude-mem.js.map +1 -0
  157. package/dist/memory/sources/codex.d.ts +8 -0
  158. package/dist/memory/sources/codex.js +77 -0
  159. package/dist/memory/sources/codex.js.map +1 -0
  160. package/dist/memory/store.d.ts +19 -0
  161. package/dist/memory/store.js +82 -0
  162. package/dist/memory/store.js.map +1 -0
  163. package/dist/proxy/http.d.ts +21 -0
  164. package/dist/proxy/http.js +205 -0
  165. package/dist/proxy/http.js.map +1 -0
  166. package/dist/proxy/recorder.d.ts +35 -0
  167. package/dist/proxy/recorder.js +221 -0
  168. package/dist/proxy/recorder.js.map +1 -0
  169. package/dist/proxy/streaming.d.ts +33 -0
  170. package/dist/proxy/streaming.js +185 -0
  171. package/dist/proxy/streaming.js.map +1 -0
  172. package/dist/redactor/entropy.d.ts +29 -0
  173. package/dist/redactor/entropy.js +98 -0
  174. package/dist/redactor/entropy.js.map +1 -0
  175. package/dist/redactor/index.d.ts +52 -0
  176. package/dist/redactor/index.js +152 -0
  177. package/dist/redactor/index.js.map +1 -0
  178. package/dist/redactor/ner.d.ts +53 -0
  179. package/dist/redactor/ner.js +97 -0
  180. package/dist/redactor/ner.js.map +1 -0
  181. package/dist/redactor/pii-patterns.d.ts +22 -0
  182. package/dist/redactor/pii-patterns.js +187 -0
  183. package/dist/redactor/pii-patterns.js.map +1 -0
  184. package/dist/redactor/secret-patterns.d.ts +27 -0
  185. package/dist/redactor/secret-patterns.js +475 -0
  186. package/dist/redactor/secret-patterns.js.map +1 -0
  187. package/dist/schema/conv.d.ts +698 -0
  188. package/dist/schema/conv.js +85 -0
  189. package/dist/schema/conv.js.map +1 -0
  190. package/dist/schema/index.d.ts +2 -0
  191. package/dist/schema/index.js +3 -0
  192. package/dist/schema/index.js.map +1 -0
  193. package/dist/schema/manifest.d.ts +1531 -0
  194. package/dist/schema/manifest.js +179 -0
  195. package/dist/schema/manifest.js.map +1 -0
  196. package/dist/schema/memory.d.ts +107 -0
  197. package/dist/schema/memory.js +45 -0
  198. package/dist/schema/memory.js.map +1 -0
  199. package/dist/schema/trace.d.ts +164 -0
  200. package/dist/schema/trace.js +89 -0
  201. package/dist/schema/trace.js.map +1 -0
  202. package/dist/trace/consent.d.ts +30 -0
  203. package/dist/trace/consent.js +60 -0
  204. package/dist/trace/consent.js.map +1 -0
  205. package/dist/trace/extract.d.ts +22 -0
  206. package/dist/trace/extract.js +168 -0
  207. package/dist/trace/extract.js.map +1 -0
  208. package/dist/trace/ml-pii.d.ts +33 -0
  209. package/dist/trace/ml-pii.js +35 -0
  210. package/dist/trace/ml-pii.js.map +1 -0
  211. package/dist/trace/push.d.ts +59 -0
  212. package/dist/trace/push.js +141 -0
  213. package/dist/trace/push.js.map +1 -0
  214. package/dist/trace/serialize.d.ts +23 -0
  215. package/dist/trace/serialize.js +67 -0
  216. package/dist/trace/serialize.js.map +1 -0
  217. package/dist/ui/banner.d.ts +2 -0
  218. package/dist/ui/banner.js +17 -0
  219. package/dist/ui/banner.js.map +1 -0
  220. package/dist/ui/box.d.ts +4 -0
  221. package/dist/ui/box.js +38 -0
  222. package/dist/ui/box.js.map +1 -0
  223. package/dist/ui/index.d.ts +5 -0
  224. package/dist/ui/index.js +5 -0
  225. package/dist/ui/index.js.map +1 -0
  226. package/dist/ui/spinner.d.ts +10 -0
  227. package/dist/ui/spinner.js +44 -0
  228. package/dist/ui/spinner.js.map +1 -0
  229. package/dist/ui/table.d.ts +9 -0
  230. package/dist/ui/table.js +55 -0
  231. package/dist/ui/table.js.map +1 -0
  232. package/dist/util/frontmatter.d.ts +6 -0
  233. package/dist/util/frontmatter.js +20 -0
  234. package/dist/util/frontmatter.js.map +1 -0
  235. package/dist/util/fs.d.ts +5 -0
  236. package/dist/util/fs.js +41 -0
  237. package/dist/util/fs.js.map +1 -0
  238. package/dist/util/ids.d.ts +3 -0
  239. package/dist/util/ids.js +16 -0
  240. package/dist/util/ids.js.map +1 -0
  241. package/dist/util/log.d.ts +13 -0
  242. package/dist/util/log.js +33 -0
  243. package/dist/util/log.js.map +1 -0
  244. package/dist/util/paths.d.ts +18 -0
  245. package/dist/util/paths.js +36 -0
  246. package/dist/util/paths.js.map +1 -0
  247. package/dist/version.d.ts +5 -0
  248. package/dist/version.js +32 -0
  249. package/dist/version.js.map +1 -0
  250. package/package.json +86 -0
@@ -0,0 +1,475 @@
1
+ /**
2
+ * Comprehensive secret patterns curated from Gitleaks, TruffleHog, and
3
+ * detect-secrets rule sets, then narrowed to the patterns most relevant
4
+ * to AI coding tool transcripts.
5
+ *
6
+ * Each pattern has:
7
+ * - id: stable identifier surfaced in redaction reports
8
+ * - category: groups patterns for opt-in/opt-out
9
+ * - name: human-readable label
10
+ * - regex: detection pattern (must use `g` flag)
11
+ * - replacement: token written in place of the match
12
+ * - severity: high (real credential), medium (likely credential), low (heuristic)
13
+ *
14
+ * Replacements use [REDACTED:<id>] so reviewers can grep for what was lost.
15
+ */
16
+ const PRIVATE_KEY_BLOCK = /-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED |)PRIVATE KEY(?: BLOCK)?-----[\s\S]*?-----END (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED |)PRIVATE KEY(?: BLOCK)?-----/g;
17
+ export const SECRET_PATTERNS = [
18
+ // ---------- LLM providers ----------
19
+ {
20
+ id: 'anthropic-key',
21
+ category: 'llm-provider',
22
+ name: 'Anthropic API key',
23
+ regex: /sk-ant-[A-Za-z0-9_-]{20,}/g,
24
+ replacement: '[REDACTED:anthropic-key]',
25
+ severity: 'high',
26
+ },
27
+ {
28
+ id: 'openai-key',
29
+ category: 'llm-provider',
30
+ name: 'OpenAI API key (legacy / project / service / admin)',
31
+ regex: /sk-(?:proj-|svcacct-|admin-)?[A-Za-z0-9_-]{30,}/g,
32
+ replacement: '[REDACTED:openai-key]',
33
+ severity: 'high',
34
+ },
35
+ {
36
+ id: 'cohere-key',
37
+ category: 'llm-provider',
38
+ name: 'Cohere API key',
39
+ regex: /\b[A-Za-z0-9]{40}\b(?=.*cohere)/gi,
40
+ replacement: '[REDACTED:cohere-key]',
41
+ severity: 'medium',
42
+ },
43
+ {
44
+ id: 'huggingface-token',
45
+ category: 'llm-provider',
46
+ name: 'HuggingFace user access token',
47
+ regex: /\bhf_[A-Za-z0-9]{30,}\b/g,
48
+ replacement: '[REDACTED:huggingface-token]',
49
+ severity: 'high',
50
+ },
51
+ {
52
+ id: 'replicate-token',
53
+ category: 'llm-provider',
54
+ name: 'Replicate API token',
55
+ regex: /\br8_[A-Za-z0-9]{30,}\b/g,
56
+ replacement: '[REDACTED:replicate-token]',
57
+ severity: 'high',
58
+ },
59
+ {
60
+ id: 'mistral-key',
61
+ category: 'llm-provider',
62
+ name: 'Mistral AI key',
63
+ regex: /\b(?<![A-Za-z0-9])[A-Za-z0-9]{32}(?![A-Za-z0-9])(?=.*mistral)/gi,
64
+ replacement: '[REDACTED:mistral-key]',
65
+ severity: 'medium',
66
+ },
67
+ // ---------- Source control ----------
68
+ {
69
+ id: 'github-pat-classic',
70
+ category: 'scm',
71
+ name: 'GitHub PAT (classic)',
72
+ regex: /ghp_[A-Za-z0-9]{36}/g,
73
+ replacement: '[REDACTED:github-pat-classic]',
74
+ severity: 'high',
75
+ },
76
+ {
77
+ id: 'github-pat-fine-grained',
78
+ category: 'scm',
79
+ name: 'GitHub PAT (fine-grained)',
80
+ regex: /github_pat_[A-Za-z0-9_]{82}/g,
81
+ replacement: '[REDACTED:github-pat-fine-grained]',
82
+ severity: 'high',
83
+ },
84
+ {
85
+ id: 'github-app-token',
86
+ category: 'scm',
87
+ name: 'GitHub App / OAuth token',
88
+ regex: /gh[suoir]_[A-Za-z0-9]{36}/g,
89
+ replacement: '[REDACTED:github-app-token]',
90
+ severity: 'high',
91
+ },
92
+ {
93
+ id: 'gitlab-pat',
94
+ category: 'scm',
95
+ name: 'GitLab personal access token',
96
+ regex: /\bglpat-[A-Za-z0-9_-]{20,}\b/g,
97
+ replacement: '[REDACTED:gitlab-pat]',
98
+ severity: 'high',
99
+ },
100
+ {
101
+ id: 'gitlab-runner',
102
+ category: 'scm',
103
+ name: 'GitLab runner registration token',
104
+ regex: /\bglrt-[A-Za-z0-9_-]{20,}\b/g,
105
+ replacement: '[REDACTED:gitlab-runner]',
106
+ severity: 'high',
107
+ },
108
+ {
109
+ id: 'bitbucket-app-password',
110
+ category: 'scm',
111
+ name: 'Bitbucket app password',
112
+ regex: /\bATBB[A-Za-z0-9]{32}\b/g,
113
+ replacement: '[REDACTED:bitbucket-app-password]',
114
+ severity: 'high',
115
+ },
116
+ // ---------- Cloud providers ----------
117
+ {
118
+ id: 'aws-access-key',
119
+ category: 'cloud',
120
+ name: 'AWS access key ID',
121
+ regex: /\b(?:AKIA|ABIA|ACCA|ASIA)[0-9A-Z]{16}\b/g,
122
+ replacement: '[REDACTED:aws-access-key]',
123
+ severity: 'high',
124
+ },
125
+ {
126
+ id: 'aws-secret-key',
127
+ category: 'cloud',
128
+ name: 'AWS secret access key',
129
+ regex: /(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])(?=.*aws|.*amazon|.*s3|.*ec2|.*iam)/gi,
130
+ replacement: '[REDACTED:aws-secret-key]',
131
+ severity: 'medium',
132
+ },
133
+ {
134
+ id: 'aws-session-token',
135
+ category: 'cloud',
136
+ name: 'AWS STS session token',
137
+ regex: /\bFwoGZXIvYXdzE[A-Za-z0-9/+=]{100,}/g,
138
+ replacement: '[REDACTED:aws-session-token]',
139
+ severity: 'high',
140
+ },
141
+ {
142
+ id: 'azure-sas',
143
+ category: 'cloud',
144
+ name: 'Azure Storage SAS token',
145
+ regex: /sig=[A-Za-z0-9%+=/]{40,}/g,
146
+ replacement: 'sig=[REDACTED:azure-sas]',
147
+ severity: 'high',
148
+ },
149
+ {
150
+ id: 'gcp-service-account-key',
151
+ category: 'cloud',
152
+ name: 'Google Cloud service account JSON',
153
+ regex: /"private_key":\s*"-----BEGIN[\s\S]*?-----END [A-Z ]*KEY-----[\\nA-Za-z0-9+=/]*"/g,
154
+ replacement: '"private_key": "[REDACTED:gcp-service-account-key]"',
155
+ severity: 'high',
156
+ },
157
+ {
158
+ id: 'google-api-key',
159
+ category: 'cloud',
160
+ name: 'Google API key',
161
+ regex: /AIza[0-9A-Za-z_-]{35}/g,
162
+ replacement: '[REDACTED:google-api-key]',
163
+ severity: 'high',
164
+ },
165
+ {
166
+ id: 'google-oauth-token',
167
+ category: 'cloud',
168
+ name: 'Google OAuth access token',
169
+ regex: /ya29\.[A-Za-z0-9_-]{40,}/g,
170
+ replacement: '[REDACTED:google-oauth-token]',
171
+ severity: 'high',
172
+ },
173
+ {
174
+ id: 'digitalocean-token',
175
+ category: 'cloud',
176
+ name: 'DigitalOcean PAT',
177
+ regex: /\bdop_v1_[a-f0-9]{64}\b/g,
178
+ replacement: '[REDACTED:digitalocean-token]',
179
+ severity: 'high',
180
+ },
181
+ {
182
+ id: 'heroku-api-key',
183
+ category: 'cloud',
184
+ name: 'Heroku API key (UUID with heroku context)',
185
+ regex: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b(?=.*heroku)/gi,
186
+ replacement: '[REDACTED:heroku-api-key]',
187
+ severity: 'medium',
188
+ },
189
+ {
190
+ id: 'cloudflare-api-token',
191
+ category: 'cloud',
192
+ name: 'Cloudflare API token',
193
+ regex: /\bv1\.0-[A-Za-z0-9_-]{20,}-[A-Za-z0-9_-]{20,}\b/g,
194
+ replacement: '[REDACTED:cloudflare-api-token]',
195
+ severity: 'high',
196
+ },
197
+ // ---------- Payment providers ----------
198
+ {
199
+ id: 'stripe-secret',
200
+ category: 'payment',
201
+ name: 'Stripe secret / restricted key',
202
+ regex: /\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{20,}\b/g,
203
+ replacement: '[REDACTED:stripe-secret]',
204
+ severity: 'high',
205
+ },
206
+ {
207
+ id: 'stripe-publishable',
208
+ category: 'payment',
209
+ name: 'Stripe publishable key',
210
+ regex: /\bpk_(?:live|test)_[A-Za-z0-9]{20,}\b/g,
211
+ replacement: '[REDACTED:stripe-publishable]',
212
+ severity: 'low',
213
+ },
214
+ {
215
+ id: 'paypal-braintree',
216
+ category: 'payment',
217
+ name: 'Braintree access token',
218
+ regex: /\baccess_token\$production\$[A-Za-z0-9_]{16}\$[A-Za-z0-9_]{32}\b/g,
219
+ replacement: '[REDACTED:paypal-braintree]',
220
+ severity: 'high',
221
+ },
222
+ {
223
+ id: 'square-access-token',
224
+ category: 'payment',
225
+ name: 'Square access token',
226
+ regex: /\bsq0[a-z]{3}-[A-Za-z0-9_-]{22,}\b/g,
227
+ replacement: '[REDACTED:square-access-token]',
228
+ severity: 'high',
229
+ },
230
+ // ---------- Communications ----------
231
+ {
232
+ id: 'slack-token',
233
+ category: 'comms',
234
+ name: 'Slack token',
235
+ regex: /xox[abps]-[A-Za-z0-9-]{10,}/g,
236
+ replacement: '[REDACTED:slack-token]',
237
+ severity: 'high',
238
+ },
239
+ {
240
+ id: 'slack-webhook',
241
+ category: 'comms',
242
+ name: 'Slack webhook URL',
243
+ regex: /https:\/\/hooks\.slack\.com\/services\/[A-Z0-9]{8,12}\/[A-Z0-9]{8,12}\/[A-Za-z0-9]{16,32}/g,
244
+ replacement: '[REDACTED:slack-webhook]',
245
+ severity: 'high',
246
+ },
247
+ {
248
+ id: 'discord-token',
249
+ category: 'comms',
250
+ name: 'Discord bot token',
251
+ regex: /\b[MN][A-Za-z0-9_-]{23}\.[A-Za-z0-9_-]{6}\.[A-Za-z0-9_-]{27,38}\b/g,
252
+ replacement: '[REDACTED:discord-token]',
253
+ severity: 'high',
254
+ },
255
+ {
256
+ id: 'twilio-account-sid',
257
+ category: 'comms',
258
+ name: 'Twilio account SID',
259
+ regex: /\bAC[a-f0-9]{32}\b/g,
260
+ replacement: '[REDACTED:twilio-account-sid]',
261
+ severity: 'medium',
262
+ },
263
+ {
264
+ id: 'twilio-auth-token',
265
+ category: 'comms',
266
+ name: 'Twilio API key SID',
267
+ regex: /\bSK[a-f0-9]{32}\b/g,
268
+ replacement: '[REDACTED:twilio-auth-token]',
269
+ severity: 'high',
270
+ },
271
+ {
272
+ id: 'sendgrid-key',
273
+ category: 'comms',
274
+ name: 'SendGrid API key',
275
+ regex: /\bSG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}\b/g,
276
+ replacement: '[REDACTED:sendgrid-key]',
277
+ severity: 'high',
278
+ },
279
+ {
280
+ id: 'mailgun-key',
281
+ category: 'comms',
282
+ name: 'Mailgun API key',
283
+ regex: /\bkey-[a-f0-9]{32}\b/g,
284
+ replacement: '[REDACTED:mailgun-key]',
285
+ severity: 'high',
286
+ },
287
+ {
288
+ id: 'postmark-token',
289
+ category: 'comms',
290
+ name: 'Postmark server token (UUID + context)',
291
+ regex: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b(?=.*postmark)/gi,
292
+ replacement: '[REDACTED:postmark-token]',
293
+ severity: 'medium',
294
+ },
295
+ // ---------- Databases ----------
296
+ {
297
+ id: 'mongodb-srv',
298
+ category: 'database',
299
+ name: 'MongoDB Atlas connection string',
300
+ regex: /\bmongodb(?:\+srv)?:\/\/[A-Za-z0-9._%-]+:[^@\s]+@[A-Za-z0-9.-]+/g,
301
+ replacement: 'mongodb+srv://[REDACTED:mongodb-srv]',
302
+ severity: 'high',
303
+ },
304
+ {
305
+ id: 'postgres-url',
306
+ category: 'database',
307
+ name: 'Postgres connection string with password',
308
+ regex: /\bpostgres(?:ql)?:\/\/[A-Za-z0-9._%-]+:[^@\s]+@[A-Za-z0-9.-]+/g,
309
+ replacement: 'postgres://[REDACTED:postgres-url]',
310
+ severity: 'high',
311
+ },
312
+ {
313
+ id: 'mysql-url',
314
+ category: 'database',
315
+ name: 'MySQL connection string with password',
316
+ regex: /\bmysql:\/\/[A-Za-z0-9._%-]+:[^@\s]+@[A-Za-z0-9.-]+/g,
317
+ replacement: 'mysql://[REDACTED:mysql-url]',
318
+ severity: 'high',
319
+ },
320
+ {
321
+ id: 'redis-url',
322
+ category: 'database',
323
+ name: 'Redis connection string with password',
324
+ regex: /\brediss?:\/\/[A-Za-z0-9._%-]*:[^@\s]+@[A-Za-z0-9.-]+/g,
325
+ replacement: 'redis://[REDACTED:redis-url]',
326
+ severity: 'high',
327
+ },
328
+ // ---------- Package registries ----------
329
+ {
330
+ id: 'npm-token',
331
+ category: 'package',
332
+ name: 'npm publish token',
333
+ regex: /\bnpm_[A-Za-z0-9]{36}\b/g,
334
+ replacement: '[REDACTED:npm-token]',
335
+ severity: 'high',
336
+ },
337
+ {
338
+ id: 'pypi-token',
339
+ category: 'package',
340
+ name: 'PyPI API token',
341
+ regex: /\bpypi-AgEIcHlwaS5vcmc[A-Za-z0-9_-]{50,}\b/g,
342
+ replacement: '[REDACTED:pypi-token]',
343
+ severity: 'high',
344
+ },
345
+ {
346
+ id: 'docker-hub-token',
347
+ category: 'package',
348
+ name: 'Docker Hub PAT (UUID + context)',
349
+ regex: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b(?=.*docker)/gi,
350
+ replacement: '[REDACTED:docker-hub-token]',
351
+ severity: 'medium',
352
+ },
353
+ // ---------- Monitoring / observability ----------
354
+ {
355
+ id: 'datadog-api-key',
356
+ category: 'monitoring',
357
+ name: 'Datadog API key',
358
+ regex: /\bdd[A-Za-z0-9]{30,}\b(?=.*datadog)/gi,
359
+ replacement: '[REDACTED:datadog-api-key]',
360
+ severity: 'medium',
361
+ },
362
+ {
363
+ id: 'sentry-dsn',
364
+ category: 'monitoring',
365
+ name: 'Sentry DSN with secret',
366
+ regex: /https:\/\/[a-f0-9]{32}:[a-f0-9]{32}@[A-Za-z0-9.-]+\.ingest\.sentry\.io\/\d+/g,
367
+ replacement: '[REDACTED:sentry-dsn]',
368
+ severity: 'high',
369
+ },
370
+ {
371
+ id: 'newrelic-license',
372
+ category: 'monitoring',
373
+ name: 'New Relic license key',
374
+ regex: /\bNRAK-[A-Z0-9]{27}\b/g,
375
+ replacement: '[REDACTED:newrelic-license]',
376
+ severity: 'high',
377
+ },
378
+ // ---------- Productivity ----------
379
+ {
380
+ id: 'linear-token',
381
+ category: 'productivity',
382
+ name: 'Linear API key',
383
+ regex: /\blin_api_[A-Za-z0-9]{40}\b/g,
384
+ replacement: '[REDACTED:linear-token]',
385
+ severity: 'high',
386
+ },
387
+ {
388
+ id: 'notion-secret',
389
+ category: 'productivity',
390
+ name: 'Notion integration secret',
391
+ regex: /\bsecret_[A-Za-z0-9]{43}\b/g,
392
+ replacement: '[REDACTED:notion-secret]',
393
+ severity: 'high',
394
+ },
395
+ {
396
+ id: 'figma-token',
397
+ category: 'productivity',
398
+ name: 'Figma personal access token',
399
+ regex: /\bfigd_[A-Za-z0-9_-]{40,}\b/g,
400
+ replacement: '[REDACTED:figma-token]',
401
+ severity: 'high',
402
+ },
403
+ {
404
+ id: 'asana-token',
405
+ category: 'productivity',
406
+ name: 'Asana personal access token',
407
+ regex: /\b[0-9]\/[0-9]{16}:[a-f0-9]{32}\b/g,
408
+ replacement: '[REDACTED:asana-token]',
409
+ severity: 'high',
410
+ },
411
+ // ---------- Generic / cross-cutting ----------
412
+ {
413
+ id: 'jwt',
414
+ category: 'generic',
415
+ name: 'JSON Web Token',
416
+ regex: /\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,
417
+ replacement: '[REDACTED:jwt]',
418
+ severity: 'high',
419
+ },
420
+ {
421
+ id: 'private-key-block',
422
+ category: 'generic',
423
+ name: 'PEM-encoded private key',
424
+ regex: PRIVATE_KEY_BLOCK,
425
+ replacement: '[REDACTED:private-key]',
426
+ severity: 'high',
427
+ },
428
+ {
429
+ id: 'ssh-private-key-openssh',
430
+ category: 'generic',
431
+ name: 'OpenSSH private key',
432
+ regex: /-----BEGIN OPENSSH PRIVATE KEY-----[\s\S]*?-----END OPENSSH PRIVATE KEY-----/g,
433
+ replacement: '[REDACTED:ssh-private-key]',
434
+ severity: 'high',
435
+ },
436
+ {
437
+ id: 'basic-auth-in-url',
438
+ category: 'generic',
439
+ name: 'HTTP basic auth credentials in URL',
440
+ regex: /https?:\/\/[A-Za-z0-9._%-]+:[^@\s/]+@[A-Za-z0-9.-]+/g,
441
+ replacement: 'https://[REDACTED:basic-auth-in-url]',
442
+ severity: 'high',
443
+ },
444
+ {
445
+ id: 'bearer-token',
446
+ category: 'generic',
447
+ name: 'Bearer authorization header',
448
+ regex: /\b(?:Bearer\s+|bearer\s+)[A-Za-z0-9._-]{20,}/g,
449
+ replacement: 'Bearer [REDACTED:bearer-token]',
450
+ severity: 'medium',
451
+ },
452
+ {
453
+ id: 'env-assignment',
454
+ category: 'generic',
455
+ name: 'Environment variable assignment with high-entropy value',
456
+ regex: /\b((?:[A-Z][A-Z0-9_]{2,})_(?:KEY|TOKEN|SECRET|PASSWORD|PWD|API|AUTH))\s*=\s*([A-Za-z0-9_/+=-]{16,})/g,
457
+ replacement: '$1=[REDACTED:env-value]',
458
+ severity: 'medium',
459
+ },
460
+ {
461
+ id: 'generic-api-key-context',
462
+ category: 'generic',
463
+ name: 'Generic API key in JSON / YAML context',
464
+ regex: /(["'`]?(?:api[-_]?key|apikey|api[-_]?secret|access[-_]?token|auth[-_]?token|client[-_]?secret|secret[-_]?key)["'`]?\s*[:=]\s*["'`])([A-Za-z0-9_/+=.-]{20,})(["'`])/gi,
465
+ replacement: '$1[REDACTED:generic-api-key]$3',
466
+ severity: 'medium',
467
+ },
468
+ ];
469
+ export function patternsByCategory(...categories) {
470
+ if (categories.length === 0)
471
+ return SECRET_PATTERNS;
472
+ const set = new Set(categories);
473
+ return SECRET_PATTERNS.filter(p => set.has(p.category));
474
+ }
475
+ //# sourceMappingURL=secret-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-patterns.js","sourceRoot":"","sources":["../../src/redactor/secret-patterns.ts"],"names":[],"mappings":"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"}