privacy-brush 1.0.0 β†’ 1.0.2

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/README.md CHANGED
@@ -1,302 +1,314 @@
1
- <h1 align="center" title="PrivacyBrush">πŸ›‘οΈ Privβ–ˆcyBrβ–ˆsh πŸ–ŒοΈ</h1>
2
-
3
- > **Terminal Output Masking Tool | Safely Share Logs by Hiding Sensitive Information**
4
-
5
- [![npm version](https://img.shields.io/npm/v/privacy-brush.svg)](https://www.npmjs.com/package/privacy-brush)
6
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
7
- [![Typecheck](https://github.com/legend80s/privacy-brush/actions/workflows/typecheck.yml/badge.svg?branch=master)](https://github.com/legend80s/privacy-brush/actions/workflows/typecheck.yml)
8
-
9
- <p align="center">
10
- <img src="https://raw.githubusercontent.com/legend80s/privacy-brush/main/docs/demo.gif" alt="PrivacyBrush Demo" width="800">
11
- </p>
12
-
13
- ## ✨ Features
14
-
15
- - 🎯 **Smart Detection** - Auto-detects 20+ sensitive information patterns
16
- - πŸ”§ **Highly Configurable** - Custom masking rules and characters
17
- - ⚑ **High Performance** - Stream processing for large files
18
- - πŸ›‘οΈ **Privacy First** - Local processing only, no data leaves your machine
19
- - πŸ“¦ **Multiple Formats** - CLI, API, Stream, File processing
20
- - 🌐 **Multi-language** - Supports English, Chinese, and other log formats
21
- - 🎨 **Customizable** - Add your own sensitive patterns
22
-
23
- ## πŸš€ Quick Start
24
-
25
- ### Basic Usage
26
-
27
- ```bash
28
- # Direct terminal output processing
29
- flutter devices | pnpx privacy-brush
30
- flutter doctor | pnpx privacy-brush
31
-
32
- # Process files
33
- privacy-brush input.log -o masked.log
34
-
35
- # Real-time command output
36
- echo 'Microsoft Windows [Version 10.0.12345.6785]' | privacy-brush
37
- ```
38
-
39
- ### In Your Node.js Project
40
-
41
- ```javascript
42
- // Or ES Module
43
- import { PrivacyBrush } from 'privacy-brush';
44
-
45
- // Create instance
46
- const brush = new PrivacyBrush();
47
-
48
- // Process text
49
- const sensitiveText = `Windows [Version 10.0.12345.1234]
50
- Chrome 144.0.1234.12
51
- User IP: 192.123.1.123`;
52
-
53
- const safeText = brush.maskText(sensitiveText);
54
- console.log(safeText);
55
-
56
- // Output:
57
- // Windows [Version 10.β–ˆ.β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆβ–ˆ]
58
- // Chrome 144.β–ˆ.β–ˆβ–ˆβ–ˆβ–ˆ.β–ˆβ–ˆ
59
- // User IP: 192.β–ˆβ–ˆβ–ˆ.β–ˆ.β–ˆβ–ˆβ–ˆ
60
- ```
61
-
62
- ## πŸ“– Examples
63
-
64
- ### Example 1: Process Flutter Output
65
-
66
- **Original:**
67
-
68
- ```bash
69
- ❯ flutter devices
70
- Found 4 connected devices:
71
- Windows (desktop) β€’ windows β€’ windows-x64 β€’ Microsoft Windows [Version 10.0.12345.1234]
72
- Chrome (web) β€’ chrome β€’ web-javascript β€’ Google Chrome 144.0.1234.60
73
- ```
74
-
75
- **After PrivacyBrush:**
76
-
77
- ```bash
78
- ❯ flutter devices | privacy-brush
79
- Found 4 connected devices:
80
- Windows (desktop) β€’ windows β€’ windows-x64 β€’ Microsoft Windows [Version 10.β–ˆ.β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆβ–ˆ]
81
- Chrome (web) β€’ chrome β€’ web-javascript β€’ Google Chrome 144.β–ˆ.β–ˆβ–ˆβ–ˆβ–ˆ.β–ˆβ–ˆ
82
- ```
83
-
84
- ### Example 2: Process Node.js Debug Logs
85
-
86
- ```javascript
87
- const masker = new PrivacyBrush({
88
- maskChar: '*',
89
- preserveFirstPart: false
90
- });
91
-
92
- const debugLog = `
93
- DEBUG: User login from IP 192.168.1.100
94
- DEBUG: Session ID: abc123def456
95
- DEBUG: Browser: Chrome/144.0.1234.60
96
- DEBUG: OS: Windows 10.0.12345
97
- `;
98
-
99
- console.log(masker.mask(debugLog));
100
- // Output:
101
- // DEBUG: User login from IP ***.***.*.***
102
- // DEBUG: Session ID: ************
103
- // DEBUG: Browser: Chrome/***.*.***.**
104
- // DEBUG: OS: Windows **.*.*****
105
- ```
106
-
107
- ## βš™οΈ Configuration
108
-
109
- ### CLI Options
110
-
111
- ```bash
112
- # Basic usage
113
- privacy-brush [input-file] [options]
114
-
115
- # Options
116
- --output, -o <file> Output to file
117
- --char, -c <char> Mask character (default: β–ˆ)
118
- --preserve-first Keep first part of version numbers
119
- --strict Strict mode (mask more info)
120
- --config <file> Use config file
121
- --list-patterns List all built-in patterns
122
- --add-pattern <regex> Add custom regex pattern
123
- --version Show version
124
- --help Show help
125
- ```
126
-
127
- ### JavaScript API Options
128
-
129
- ```javascript
130
- const masker = new PrivacyBrush({
131
- // Basic config
132
- maskChar: 'β–ˆ', // Mask character
133
- preserveFirstPart: true, // Keep first part of versions
134
-
135
- // Pattern config
136
- patterns: {
137
- ipAddress: true,
138
- macAddress: true,
139
- email: true,
140
- phone: true,
141
- creditCard: true,
142
- jwtToken: true,
143
- apiKey: true,
144
-
145
- osVersion: true,
146
- browserVersion: true,
147
- appVersion: true,
148
-
149
- deviceId: true,
150
- serialNumber: true,
151
-
152
- filePaths: false, // Don't mask file paths
153
- localhost: false // Don't mask localhost
154
- },
155
-
156
- // Custom patterns
157
- customPatterns: [
158
- {
159
- name: 'custom-id',
160
- regex: /ID-\d{6}/g,
161
- mask: 'ID-******'
162
- }
163
- ]
164
- });
165
- ```
166
-
167
- ## πŸ”§ Built-in Patterns
168
-
169
- PrivacyBrush includes 20+ pre-configured sensitive information patterns:
170
-
171
- ### πŸ” Personal Information
172
-
173
- - Email addresses `user@example.com` β†’ `***@example.com`
174
- - Phone numbers `13800138000` β†’ `138****8000`
175
- - ID numbers `110101199001011234` β†’ `110101********1234`
176
-
177
- ### πŸ’» Technical Information
178
-
179
- - IP addresses `192.168.1.100` β†’ `192.168.*.*`
180
- - MAC addresses `00:1A:2B:3C:4D:5E` β†’ `00:**:**:**:**:**`
181
- - Port numbers `:8080` β†’ `:****`
182
- - API keys `sk_live_1234567890` β†’ `sk_live_********`
183
-
184
- ### πŸ–₯️ System & Browser
185
-
186
- - Windows versions `10.0.12345.1234` β†’ `10.β–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆ`
187
- - Chrome versions `144.0.1234.60` β†’ `144.β–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆ`
188
- - Android versions `Android 16` β†’ `Android β–ˆβ–ˆ`
189
-
190
- ### 🏒 Business Data
191
-
192
- - Credit cards `4111 1111 1111 1111` β†’ `4111 **** **** 1111`
193
- - JWT tokens `eyJhbGciOiJIUzI1...` β†’ `eyJ********...`
194
- - Session IDs `session-abc123def456` β†’ `session-************`
195
-
196
- ## πŸ› οΈ Advanced Usage
197
-
198
- ### Stream Processing for Large Files
199
-
200
- ```javascript
201
- const fs = require('fs');
202
- const { createMaskStream } = require('privacy-brush');
203
-
204
- const inputStream = fs.createReadStream('huge.log');
205
- const maskStream = createMaskStream();
206
-
207
- inputStream
208
- .pipe(maskStream)
209
- .pipe(fs.createWriteStream('masked-huge.log'))
210
- .on('finish', () => {
211
- console.log('Large file processing completed!');
212
- });
213
- ```
214
-
215
- ### Express.js Integration
216
-
217
- ```javascript
218
- const express = require('express');
219
- const { PrivacyBrush } = require('privacy-brush');
220
- const app = express();
221
- const masker = new PrivacyBrush();
222
-
223
- // Middleware: auto-mask sensitive info in responses
224
- app.use((req, res, next) => {
225
- const originalSend = res.send;
226
- res.send = function(body) {
227
- if (typeof body === 'string' && body.includes('sensitive')) {
228
- body = masker.mask(body);
229
- }
230
- originalSend.call(this, body);
231
- };
232
- next();
233
- });
234
- ```
235
-
236
- ### Git Hook Integration
237
-
238
- ```bash
239
- #!/bin/bash
240
- # .git/hooks/pre-commit
241
-
242
- for file in $(git diff --cached --name-only | grep -E '\.(log|txt|json)$'); do
243
- if privacy-brush --check "$file"; then
244
- echo "❌ File $file contains unmasked sensitive information"
245
- echo "Use: privacy-brush $file -o $file && git add $file"
246
- exit 1
247
- fi
248
- done
249
- ```
250
-
251
- ## πŸ“ Configuration File
252
-
253
- Create `privacy-brush.config.json`:
254
-
255
- ```json
256
- {
257
- "maskChar": "β–ˆ",
258
- "preserveFirstPart": true,
259
- "patterns": {
260
- "ipAddress": true,
261
- "email": true,
262
- "phone": true,
263
- "osVersion": true,
264
- "browserVersion": true
265
- },
266
- "customPatterns": [
267
- {
268
- "name": "project-api-key",
269
- "regex": "PROJECT_API_KEY=\\w{32}",
270
- "mask": "PROJECT_API_KEY=******************************"
271
- }
272
- ]
273
- }
274
- ```
275
-
276
- ## 🀝 Contributing
277
-
278
- We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
279
-
280
- 1. Fork the repository
281
- 2. Create a feature branch (`git checkout -b feature/amazing-feature`)
282
- 3. Commit changes (`git commit -m 'Add amazing feature'`)
283
- 4. Push to branch (`git push origin feature/amazing-feature`)
284
- 5. Open a Pull Request
285
-
286
- ## πŸ“„ License
287
-
288
- MIT License Β© 2024 PrivacyBrush Contributors
289
-
290
- ## πŸ“ž Support
291
-
292
- - πŸ“§ Email: <support@privacy-brush.dev>
293
- - πŸ› [Issue Tracker](https://github.com/legend80s/privacy-brush/issues)
294
- - πŸ’¬ [Discussions](https://github.com/legend80s/privacy-brush/discussions)
295
- - πŸ“– [Documentation](https://privacy-brush.dev/docs)
296
-
297
- ---
298
-
299
- <p align="center">
300
- <strong>Share Safely, Start with PrivacyBrush</strong><br>
301
- <sub>Protect privacy, communicate with confidence</sub>
302
- </p>
1
+ <h1 align="center" title="PrivacyBrush">πŸ›‘οΈ Privβ–ˆcyBrβ–ˆsh πŸ–ŒοΈ</h1>
2
+
3
+ <p align="center">
4
+ <strong>Share Safely, Start with PrivacyBrush</strong><br>
5
+ <sub>Protect privacy, communicate with confidence</sub>
6
+ </p>
7
+
8
+ [![npm version](https://img.shields.io/npm/v/privacy-brush.svg)](https://www.npmjs.com/package/privacy-brush)
9
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
10
+ [![tsgo](https://github.com/legend80s/privacy-brush/actions/workflows/typecheck.yml/badge.svg?branch=master)](https://github.com/legend80s/privacy-brush/actions/workflows/typecheck.yml)
11
+
12
+ <p align="center">
13
+ <img src="https://raw.githubusercontent.com/legend80s/privacy-brush/main/docs/demo.gif" alt="PrivacyBrush Demo" width="800">
14
+ </p>
15
+
16
+ ## ✨ Features
17
+
18
+ - 🎯 **Smart Detection** - Auto-detects 20+ sensitive information patterns
19
+ - πŸ”§ **Highly Configurable** - Custom masking rules and characters
20
+ - ⚑ **High Performance** - Stream processing for large files
21
+ - πŸ›‘οΈ **Privacy First** - Local processing only, no data leaves your machine
22
+ - πŸ“¦ **Multiple Formats** - CLI, API, Stream, File processing
23
+ - 🌐 **Multi-language** - Supports English, Chinese, and other log formats
24
+ - 🎨 **Customizable** - Add your own sensitive patterns
25
+
26
+ ## πŸš€ Quick Start
27
+
28
+ ### Basic Usage
29
+
30
+ ```bash
31
+ # Direct terminal output processing
32
+ flutter devices | pnpx privacy-brush
33
+ flutter doctor | pnpx privacy-brush
34
+
35
+ # Process files
36
+ privacy-brush -i input.log -o masked.log
37
+
38
+ # Real-time command output
39
+ echo 'Microsoft Windows [Version 10.0.12345.6785]' | privacy-brush
40
+ ```
41
+
42
+ ### In Your Node.js Project
43
+
44
+ ```javascript
45
+ // Or ES Module
46
+ import { PrivacyBrush } from 'privacy-brush';
47
+
48
+ // Create instance
49
+ const brush = new PrivacyBrush();
50
+
51
+ // Process text
52
+ const sensitiveText = `Windows [Version 10.0.12345.1234]
53
+ Chrome 144.0.1234.12
54
+ User IP: 192.123.1.123`;
55
+
56
+ const safeText = brush.maskText(sensitiveText);
57
+ console.log(safeText);
58
+
59
+ // Output:
60
+ // Windows [Version 10.β–ˆ.β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆβ–ˆ]
61
+ // Chrome 144.β–ˆ.β–ˆβ–ˆβ–ˆβ–ˆ.β–ˆβ–ˆ
62
+ // User IP: 192.β–ˆβ–ˆβ–ˆ.β–ˆ.β–ˆβ–ˆβ–ˆ
63
+ ```
64
+
65
+ ## πŸ“– Examples
66
+
67
+ ### Example 1: Process Flutter Output
68
+
69
+ **Original:**
70
+
71
+ ```bash
72
+ ❯ flutter devices
73
+ Found 4 connected devices:
74
+ Windows (desktop) β€’ windows β€’ windows-x64 β€’ Microsoft Windows [Version 10.0.12345.1234]
75
+ Chrome (web) β€’ chrome β€’ web-javascript β€’ Google Chrome 144.0.1234.60
76
+ ```
77
+
78
+ **After PrivacyBrush:**
79
+
80
+ ```bash
81
+ ❯ flutter devices | privacy-brush
82
+ Found 4 connected devices:
83
+ Windows (desktop) β€’ windows β€’ windows-x64 β€’ Microsoft Windows [Version 10.β–ˆ.β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆβ–ˆ]
84
+ Chrome (web) β€’ chrome β€’ web-javascript β€’ Google Chrome 144.β–ˆ.β–ˆβ–ˆβ–ˆβ–ˆ.β–ˆβ–ˆ
85
+ ```
86
+
87
+ ### Example 2: Process Node.js Debug Logs
88
+
89
+ ```javascript
90
+ const masker = new PrivacyBrush({
91
+ maskChar: '*',
92
+ preserveFirstPart: false
93
+ });
94
+
95
+ const debugLog = `
96
+ DEBUG: User login from IP 192.168.1.100
97
+ DEBUG: Session ID: abc123def456
98
+ DEBUG: Browser: Chrome/144.0.1234.60
99
+ DEBUG: OS: Windows 10.0.12345
100
+ `;
101
+
102
+ console.log(masker.mask(debugLog));
103
+ // Output:
104
+ // DEBUG: User login from IP ***.***.*.***
105
+ // DEBUG: Session ID: ************
106
+ // DEBUG: Browser: Chrome/***.*.***.**
107
+ // DEBUG: OS: Windows **.*.*****
108
+ ```
109
+
110
+ ## βš™οΈ Configuration
111
+
112
+ ### CLI Options
113
+
114
+ ```bash
115
+ # Basic usage
116
+ privacy-brush [options]
117
+
118
+ # Options
119
+ --char, -c <char> Mask character (default: β–ˆ)
120
+ --preserve-first Keep first part of version numbers
121
+ --input, -i <file> File to read from
122
+ --output, -o <file> Output to file
123
+ --strict Strict mode (mask more info)
124
+ --config <file> Use config file
125
+ --list-patterns List all built-in patterns
126
+ --add-pattern <regex> Add custom regex pattern
127
+ --version Show version
128
+ --help Show help
129
+ ```
130
+
131
+ Read from stdin by default.
132
+
133
+ ### JavaScript API Options
134
+
135
+ ```javascript
136
+ const masker = new PrivacyBrush({
137
+ // Basic config
138
+ maskChar: 'β–ˆ', // Mask character
139
+ preserveFirstPart: true, // Keep first part of versions
140
+
141
+ // Pattern config
142
+ patterns: {
143
+ ipAddress: true,
144
+ macAddress: true,
145
+ email: true,
146
+ phone: true,
147
+ creditCard: true,
148
+ jwtToken: true,
149
+ apiKey: true,
150
+
151
+ osVersion: true,
152
+ browserVersion: true,
153
+ appVersion: true,
154
+
155
+ deviceId: true,
156
+ serialNumber: true,
157
+
158
+ filePaths: false, // Don't mask file paths
159
+ localhost: false // Don't mask localhost
160
+ },
161
+
162
+ // Custom patterns
163
+ customPatterns: [
164
+ {
165
+ name: 'custom-id',
166
+ regex: /ID-\d{6}/g,
167
+ mask: 'ID-******'
168
+ }
169
+ ]
170
+ });
171
+ ```
172
+
173
+ ## πŸ”§ Built-in Patterns
174
+
175
+ PrivacyBrush includes 20+ pre-configured sensitive information patterns:
176
+
177
+ ### πŸ” Personal Information
178
+
179
+ - Email addresses `user@example.com` β†’ `***@example.com`
180
+ - Phone numbers `13800138000` β†’ `138****8000`
181
+ - ID numbers `110101199001011234` β†’ `110101********1234`
182
+
183
+ ### πŸ’» Technical Information
184
+
185
+ - IP addresses `192.168.1.100` β†’ `192.168.*.*`
186
+ - MAC addresses `00:1A:2B:3C:4D:5E` β†’ `00:**:**:**:**:**`
187
+ - Port numbers `:8080` β†’ `:****`
188
+ - API keys `sk_live_1234567890` β†’ `sk_live_********`
189
+
190
+ ### πŸ–₯️ System & Browser
191
+
192
+ - Windows versions `10.0.12345.1234` β†’ `10.β–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆ`
193
+ - Chrome versions `144.0.1234.60` β†’ `144.β–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆ.β–ˆβ–ˆβ–ˆ`
194
+ - Android versions `Android 16` β†’ `Android β–ˆβ–ˆ`
195
+
196
+ ### 🏒 Business Data
197
+
198
+ - Credit cards `4111 1111 1111 1111` β†’ `4111 **** **** 1111`
199
+ - JWT tokens `eyJhbGciOiJIUzI1...` β†’ `eyJ********...`
200
+ - Session IDs `session-abc123def456` β†’ `session-************`
201
+
202
+ ## πŸ› οΈ Advanced Usage
203
+
204
+ ### Stream Processing for Large Files
205
+
206
+ ```javascript
207
+ const fs = require('fs');
208
+ const { createMaskStream } = require('privacy-brush');
209
+
210
+ const inputStream = fs.createReadStream('huge.log');
211
+ const maskStream = createMaskStream();
212
+
213
+ inputStream
214
+ .pipe(maskStream)
215
+ .pipe(fs.createWriteStream('masked-huge.log'))
216
+ .on('finish', () => {
217
+ console.log('Large file processing completed!');
218
+ });
219
+ ```
220
+
221
+ ### Express.js Integration
222
+
223
+ ```javascript
224
+ const express = require('express');
225
+ const { PrivacyBrush } = require('privacy-brush');
226
+ const app = express();
227
+ const masker = new PrivacyBrush();
228
+
229
+ // Middleware: auto-mask sensitive info in responses
230
+ app.use((req, res, next) => {
231
+ const originalSend = res.send;
232
+ res.send = function(body) {
233
+ if (typeof body === 'string' && body.includes('sensitive')) {
234
+ body = masker.mask(body);
235
+ }
236
+ originalSend.call(this, body);
237
+ };
238
+ next();
239
+ });
240
+ ```
241
+
242
+ ### Git Hook Integration
243
+
244
+ ```bash
245
+ #!/bin/bash
246
+ # .git/hooks/pre-commit
247
+
248
+ for file in $(git diff --cached --name-only | grep -E '\.(log|txt|json)$'); do
249
+ if privacy-brush --check "$file"; then
250
+ echo "❌ File $file contains unmasked sensitive information"
251
+ echo "Use: privacy-brush $file -o $file && git add $file"
252
+ exit 1
253
+ fi
254
+ done
255
+ ```
256
+
257
+ ## πŸ“ Configuration File
258
+
259
+ Create `privacy-brush.config.json`:
260
+
261
+ ```json
262
+ {
263
+ "maskChar": "β–ˆ",
264
+ "preserveFirstPart": true,
265
+ "patterns": {
266
+ "ipAddress": true,
267
+ "email": true,
268
+ "phone": true,
269
+ "osVersion": true,
270
+ "browserVersion": true
271
+ },
272
+ "customPatterns": [
273
+ {
274
+ "name": "project-api-key",
275
+ "regex": "PROJECT_API_KEY=\\w{32}",
276
+ "mask": "PROJECT_API_KEY=******************************"
277
+ }
278
+ ]
279
+ }
280
+ ```
281
+
282
+ ## 🀝 Contributing
283
+
284
+ We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
285
+
286
+ 1. Fork the repository
287
+ 2. Create a feature branch (`git checkout -b feature/amazing-feature`)
288
+ 3. Commit changes (`git commit -m 'Add amazing feature'`)
289
+ 4. Push to branch (`git push origin feature/amazing-feature`)
290
+ 5. Open a Pull Request
291
+
292
+ ## πŸ“„ License
293
+
294
+ MIT License Β© 2024 PrivacyBrush Contributors
295
+
296
+ ## πŸ“ž Support
297
+
298
+ - πŸ› [Issue Tracker](https://github.com/legend80s/privacy-brush/issues)
299
+ - πŸ’¬ [Discussions](https://github.com/legend80s/privacy-brush/discussions)
300
+ - πŸ“– [Documentation](https://github.com/legend80s/privacy-brush/)
301
+
302
+ ---
303
+
304
+ > **Terminal Output Masking Tool | Safely Share Logs by Hiding Sensitive Information**
305
+
306
+ ## Development
307
+
308
+ ```sh
309
+ # mask stdin with custom patterns
310
+ echo 'DEEPSEEK_API_KEY=sk-af75149812524eb08eb302bf9604c8e8' | node src/cli.mjs --pattern '/sk-[a-z0-9]{20,}/'
311
+
312
+ echo '/c/Users/legend80s/AppData/ /Users/test/code/' | node src/cli.mjs --pattern '/Users/[a-z]{2,}/i'
313
+ # /c/Users/β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ/AppData/ /Users/β–ˆβ–ˆβ–ˆβ–ˆ/code/
314
+ ```