@yayaluoya-claude-plugins/auto-allow-bash-plugin 0.0.0
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/.claude-plugin/plugin.json +8 -0
- package/README.md +25 -0
- package/dist/auto-allow-bash.js +11494 -0
- package/dist/auto-allow.js +11494 -0
- package/hooks/hooks.json +16 -0
- package/log/auto-allow-2026-06-05.md +600 -0
- package/package.json +18 -0
- package/test/auto-allow-bash.test.js +78 -0
- package/tsconfig.json +16 -0
package/hooks/hooks.json
ADDED
|
@@ -0,0 +1,600 @@
|
|
|
1
|
+
## recv
|
|
2
|
+
|
|
3
|
+
时间:2026-06-05 11:12:24
|
|
4
|
+
命令长度:20
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
cat README.md | head
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## allow
|
|
11
|
+
|
|
12
|
+
时间:2026-06-05 11:12:24
|
|
13
|
+
来源:local
|
|
14
|
+
判定:allow
|
|
15
|
+
命令长度:20
|
|
16
|
+
详情:本地只读规则快速放行
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
cat README.md | head
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## recv
|
|
23
|
+
|
|
24
|
+
时间:2026-06-05 11:12:24
|
|
25
|
+
命令长度:12
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
mkdir newdir
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## ask
|
|
32
|
+
|
|
33
|
+
时间:2026-06-05 11:12:27
|
|
34
|
+
来源:llm
|
|
35
|
+
判定:ask
|
|
36
|
+
模型:claude-haiku-4-5-20251001
|
|
37
|
+
耗时:3034ms
|
|
38
|
+
重试:0
|
|
39
|
+
命令长度:12
|
|
40
|
+
LLM 响应:`ask`
|
|
41
|
+
详情:未命中自动放行规则,需人工确认
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
mkdir newdir
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## recv
|
|
48
|
+
|
|
49
|
+
时间:2026-06-05 11:14:47
|
|
50
|
+
命令长度:14
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
touch test.txt
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## ask
|
|
57
|
+
|
|
58
|
+
时间:2026-06-05 11:14:50
|
|
59
|
+
来源:llm
|
|
60
|
+
判定:ask
|
|
61
|
+
模型:claude-haiku-4-5-20251001
|
|
62
|
+
耗时:3010ms
|
|
63
|
+
重试:0
|
|
64
|
+
命令长度:14
|
|
65
|
+
LLM 响应:`ask`
|
|
66
|
+
详情:未命中自动放行规则,需人工确认
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
touch test.txt
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## recv
|
|
73
|
+
|
|
74
|
+
时间:2026-06-05 11:15:47
|
|
75
|
+
命令长度:14
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
touch test.txt
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## ask
|
|
82
|
+
|
|
83
|
+
时间:2026-06-05 11:15:49
|
|
84
|
+
来源:llm
|
|
85
|
+
判定:ask
|
|
86
|
+
模型:claude-haiku-4-5-20251001
|
|
87
|
+
耗时:2034ms
|
|
88
|
+
重试:0
|
|
89
|
+
命令长度:14
|
|
90
|
+
LLM 响应:`ask`
|
|
91
|
+
详情:未命中自动放行规则,需人工确认
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
touch test.txt
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## recv
|
|
98
|
+
|
|
99
|
+
时间:2026-06-05 11:17:27
|
|
100
|
+
命令长度:11
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
touch a.txt
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## ask
|
|
107
|
+
|
|
108
|
+
时间:2026-06-05 11:17:30
|
|
109
|
+
来源:llm
|
|
110
|
+
判定:ask
|
|
111
|
+
模型:claude-haiku-4-5-20251001
|
|
112
|
+
耗时:2223ms
|
|
113
|
+
重试:0
|
|
114
|
+
命令长度:11
|
|
115
|
+
LLM 响应:`ask`
|
|
116
|
+
详情:未命中自动放行规则,需人工确认
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
touch a.txt
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## recv
|
|
123
|
+
|
|
124
|
+
时间:2026-06-05 11:17:30
|
|
125
|
+
命令长度:11
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
touch a.txt
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## retry
|
|
132
|
+
|
|
133
|
+
时间:2026-06-05 11:17:31
|
|
134
|
+
来源:llm
|
|
135
|
+
模型:claude-haiku-4-5-20251001
|
|
136
|
+
耗时:765ms
|
|
137
|
+
重试:1/4
|
|
138
|
+
详情:调用失败: 401 Invalid API key
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
touch a.txt
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## retry
|
|
145
|
+
|
|
146
|
+
时间:2026-06-05 11:17:31
|
|
147
|
+
来源:llm
|
|
148
|
+
模型:claude-haiku-4-5-20251001
|
|
149
|
+
耗时:724ms
|
|
150
|
+
重试:2/4
|
|
151
|
+
详情:调用失败: 401 Invalid API key
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
touch a.txt
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## retry
|
|
158
|
+
|
|
159
|
+
时间:2026-06-05 11:17:31
|
|
160
|
+
来源:llm
|
|
161
|
+
模型:claude-haiku-4-5-20251001
|
|
162
|
+
耗时:261ms
|
|
163
|
+
重试:3/4
|
|
164
|
+
详情:调用失败: 401 Invalid API key
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
touch a.txt
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## retry
|
|
171
|
+
|
|
172
|
+
时间:2026-06-05 11:17:32
|
|
173
|
+
来源:llm
|
|
174
|
+
模型:claude-haiku-4-5-20251001
|
|
175
|
+
耗时:223ms
|
|
176
|
+
重试:4/4
|
|
177
|
+
详情:调用失败: 401 Invalid API key
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
touch a.txt
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## error
|
|
184
|
+
|
|
185
|
+
时间:2026-06-05 11:17:32
|
|
186
|
+
来源:llm
|
|
187
|
+
模型:claude-haiku-4-5-20251001
|
|
188
|
+
详情:自动放行判定异常: 401 Invalid API key
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
touch a.txt
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## recv
|
|
195
|
+
|
|
196
|
+
时间:2026-06-05 12:47:57
|
|
197
|
+
命令长度:6
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
ls -la
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## allow
|
|
204
|
+
|
|
205
|
+
时间:2026-06-05 12:47:57
|
|
206
|
+
来源:local
|
|
207
|
+
判定:allow
|
|
208
|
+
命令长度:6
|
|
209
|
+
详情:本地只读规则快速放行
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
ls -la
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## recv
|
|
216
|
+
|
|
217
|
+
时间:2026-06-05 13:34:34
|
|
218
|
+
命令长度:6
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
ls -la
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## allow
|
|
225
|
+
|
|
226
|
+
时间:2026-06-05 13:34:34
|
|
227
|
+
来源:local
|
|
228
|
+
判定:allow
|
|
229
|
+
命令长度:6
|
|
230
|
+
详情:本地只读规则快速放行
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
ls -la
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## recv
|
|
237
|
+
|
|
238
|
+
时间:2026-06-05 13:34:34
|
|
239
|
+
命令长度:10
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
rm -rf foo
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## ask
|
|
246
|
+
|
|
247
|
+
时间:2026-06-05 13:34:37
|
|
248
|
+
来源:llm
|
|
249
|
+
判定:ask
|
|
250
|
+
模型:claude-haiku-4-5-20251001
|
|
251
|
+
耗时:3451ms
|
|
252
|
+
重试:0
|
|
253
|
+
命令长度:10
|
|
254
|
+
LLM 响应:`ask`
|
|
255
|
+
详情:未命中自动放行规则,需人工确认
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
rm -rf foo
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## recv
|
|
262
|
+
|
|
263
|
+
时间:2026-06-05 13:41:35
|
|
264
|
+
命令长度:6
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
ls -la
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## allow
|
|
271
|
+
|
|
272
|
+
时间:2026-06-05 13:41:35
|
|
273
|
+
来源:local
|
|
274
|
+
判定:allow
|
|
275
|
+
命令长度:6
|
|
276
|
+
详情:本地只读规则快速放行
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
ls -la
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
## recv
|
|
283
|
+
|
|
284
|
+
时间:2026-06-05 13:41:35
|
|
285
|
+
命令长度:10
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
rm -rf foo
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## ask
|
|
292
|
+
|
|
293
|
+
时间:2026-06-05 13:41:37
|
|
294
|
+
来源:llm
|
|
295
|
+
判定:ask
|
|
296
|
+
模型:claude-haiku-4-5-20251001
|
|
297
|
+
耗时:2639ms
|
|
298
|
+
重试:0
|
|
299
|
+
命令长度:10
|
|
300
|
+
LLM 响应:`ask`
|
|
301
|
+
详情:未命中自动放行规则,需人工确认
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
rm -rf foo
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## recv
|
|
308
|
+
|
|
309
|
+
时间:2026-06-05 13:52:42
|
|
310
|
+
命令长度:6
|
|
311
|
+
|
|
312
|
+
```bash
|
|
313
|
+
ls -la
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## allow
|
|
317
|
+
|
|
318
|
+
时间:2026-06-05 13:52:42
|
|
319
|
+
来源:local
|
|
320
|
+
判定:allow
|
|
321
|
+
命令长度:6
|
|
322
|
+
详情:本地只读规则快速放行
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
ls -la
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## recv
|
|
329
|
+
|
|
330
|
+
时间:2026-06-05 13:52:42
|
|
331
|
+
命令长度:13
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
cat README.md
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## allow
|
|
338
|
+
|
|
339
|
+
时间:2026-06-05 13:52:42
|
|
340
|
+
来源:local
|
|
341
|
+
判定:allow
|
|
342
|
+
命令长度:13
|
|
343
|
+
详情:本地只读规则快速放行
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
cat README.md
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## recv
|
|
350
|
+
|
|
351
|
+
时间:2026-06-05 13:52:42
|
|
352
|
+
命令长度:10
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
git status
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## allow
|
|
359
|
+
|
|
360
|
+
时间:2026-06-05 13:52:42
|
|
361
|
+
来源:local
|
|
362
|
+
判定:allow
|
|
363
|
+
命令长度:10
|
|
364
|
+
详情:本地只读规则快速放行
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
git status
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
## recv
|
|
371
|
+
|
|
372
|
+
时间:2026-06-05 13:52:42
|
|
373
|
+
命令长度:21
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
git log --oneline -10
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## allow
|
|
380
|
+
|
|
381
|
+
时间:2026-06-05 13:52:42
|
|
382
|
+
来源:local
|
|
383
|
+
判定:allow
|
|
384
|
+
命令长度:21
|
|
385
|
+
详情:本地只读规则快速放行
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
git log --oneline -10
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
## recv
|
|
392
|
+
|
|
393
|
+
时间:2026-06-05 13:52:42
|
|
394
|
+
命令长度:8
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
git diff
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
## allow
|
|
401
|
+
|
|
402
|
+
时间:2026-06-05 13:52:42
|
|
403
|
+
来源:local
|
|
404
|
+
判定:allow
|
|
405
|
+
命令长度:8
|
|
406
|
+
详情:本地只读规则快速放行
|
|
407
|
+
|
|
408
|
+
```bash
|
|
409
|
+
git diff
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
## recv
|
|
413
|
+
|
|
414
|
+
时间:2026-06-05 13:52:42
|
|
415
|
+
命令长度:9
|
|
416
|
+
|
|
417
|
+
```bash
|
|
418
|
+
pnpm list
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
## allow
|
|
422
|
+
|
|
423
|
+
时间:2026-06-05 13:52:42
|
|
424
|
+
来源:local
|
|
425
|
+
判定:allow
|
|
426
|
+
命令长度:9
|
|
427
|
+
详情:本地只读规则快速放行
|
|
428
|
+
|
|
429
|
+
```bash
|
|
430
|
+
pnpm list
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
## recv
|
|
434
|
+
|
|
435
|
+
时间:2026-06-05 13:52:42
|
|
436
|
+
命令长度:14
|
|
437
|
+
|
|
438
|
+
```bash
|
|
439
|
+
node --version
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
## allow
|
|
443
|
+
|
|
444
|
+
时间:2026-06-05 13:52:42
|
|
445
|
+
来源:local
|
|
446
|
+
判定:allow
|
|
447
|
+
命令长度:14
|
|
448
|
+
详情:本地只读规则快速放行
|
|
449
|
+
|
|
450
|
+
```bash
|
|
451
|
+
node --version
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
## recv
|
|
455
|
+
|
|
456
|
+
时间:2026-06-05 13:52:42
|
|
457
|
+
命令长度:24
|
|
458
|
+
|
|
459
|
+
```bash
|
|
460
|
+
cat README.md | head -20
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
## allow
|
|
464
|
+
|
|
465
|
+
时间:2026-06-05 13:52:42
|
|
466
|
+
来源:local
|
|
467
|
+
判定:allow
|
|
468
|
+
命令长度:24
|
|
469
|
+
详情:本地只读规则快速放行
|
|
470
|
+
|
|
471
|
+
```bash
|
|
472
|
+
cat README.md | head -20
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
## recv
|
|
476
|
+
|
|
477
|
+
时间:2026-06-05 13:52:42
|
|
478
|
+
命令长度:16
|
|
479
|
+
|
|
480
|
+
```bash
|
|
481
|
+
git status && ls
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
## allow
|
|
485
|
+
|
|
486
|
+
时间:2026-06-05 13:52:42
|
|
487
|
+
来源:local
|
|
488
|
+
判定:allow
|
|
489
|
+
命令长度:16
|
|
490
|
+
详情:本地只读规则快速放行
|
|
491
|
+
|
|
492
|
+
```bash
|
|
493
|
+
git status && ls
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
## recv
|
|
497
|
+
|
|
498
|
+
时间:2026-06-05 13:52:43
|
|
499
|
+
命令长度:18
|
|
500
|
+
|
|
501
|
+
```bash
|
|
502
|
+
echo foo > bar.txt
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
## ask
|
|
506
|
+
|
|
507
|
+
时间:2026-06-05 13:52:45
|
|
508
|
+
来源:llm
|
|
509
|
+
判定:ask
|
|
510
|
+
模型:claude-haiku-4-5-20251001
|
|
511
|
+
耗时:2352ms
|
|
512
|
+
重试:0
|
|
513
|
+
命令长度:18
|
|
514
|
+
LLM 响应:`ask`
|
|
515
|
+
详情:未命中自动放行规则,需人工确认
|
|
516
|
+
|
|
517
|
+
```bash
|
|
518
|
+
echo foo > bar.txt
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
## recv
|
|
522
|
+
|
|
523
|
+
时间:2026-06-05 13:52:45
|
|
524
|
+
命令长度:19
|
|
525
|
+
|
|
526
|
+
```bash
|
|
527
|
+
cat file >> out.txt
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
## ask
|
|
531
|
+
|
|
532
|
+
时间:2026-06-05 13:52:47
|
|
533
|
+
来源:llm
|
|
534
|
+
判定:ask
|
|
535
|
+
模型:claude-haiku-4-5-20251001
|
|
536
|
+
耗时:2519ms
|
|
537
|
+
重试:0
|
|
538
|
+
命令长度:19
|
|
539
|
+
LLM 响应:`ask`
|
|
540
|
+
详情:未命中自动放行规则,需人工确认
|
|
541
|
+
|
|
542
|
+
```bash
|
|
543
|
+
cat file >> out.txt
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
## recv
|
|
547
|
+
|
|
548
|
+
时间:2026-06-05 13:52:48
|
|
549
|
+
命令长度:8
|
|
550
|
+
|
|
551
|
+
```bash
|
|
552
|
+
rm $(ls)
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
## ask
|
|
556
|
+
|
|
557
|
+
时间:2026-06-05 13:52:51
|
|
558
|
+
来源:llm
|
|
559
|
+
判定:ask
|
|
560
|
+
模型:claude-haiku-4-5-20251001
|
|
561
|
+
耗时:2949ms
|
|
562
|
+
重试:0
|
|
563
|
+
命令长度:8
|
|
564
|
+
LLM 响应:`ask`
|
|
565
|
+
详情:未命中自动放行规则,需人工确认
|
|
566
|
+
|
|
567
|
+
```bash
|
|
568
|
+
rm $(ls)
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
## recv
|
|
572
|
+
|
|
573
|
+
时间:2026-06-05 13:52:51
|
|
574
|
+
命令长度:7
|
|
575
|
+
|
|
576
|
+
```bash
|
|
577
|
+
sudo ls
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
## ask
|
|
581
|
+
|
|
582
|
+
时间:2026-06-05 13:52:53
|
|
583
|
+
来源:llm
|
|
584
|
+
判定:ask
|
|
585
|
+
模型:claude-haiku-4-5-20251001
|
|
586
|
+
耗时:2248ms
|
|
587
|
+
重试:0
|
|
588
|
+
命令长度:7
|
|
589
|
+
LLM 响应:`ask`
|
|
590
|
+
详情:未命中自动放行规则,需人工确认
|
|
591
|
+
|
|
592
|
+
```bash
|
|
593
|
+
sudo ls
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
## skip
|
|
597
|
+
|
|
598
|
+
时间:2026-06-05 13:52:53
|
|
599
|
+
详情:命令为空或解析失败
|
|
600
|
+
|
package/package.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yayaluoya-claude-plugins/auto-allow-bash-plugin",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "自动放行只读 Bash 命令 — 本地正则 + LLM 双重判定",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"private": false,
|
|
7
|
+
"dependencies": {
|
|
8
|
+
"@yayaluoya-claude-plugins/shared": "^1.0.0"
|
|
9
|
+
},
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"esbuild": "^0.28.0"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "esbuild src/bin/auto-allow-bash.js --bundle --platform=node --format=esm --outfile=dist/auto-allow-bash.js",
|
|
15
|
+
"test": "node --test test/auto-allow-bash.test.js",
|
|
16
|
+
"typecheck": "tsc -p tsconfig.json"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
|
|
7
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const DIST = path.resolve(__dirname, '../dist/auto-allow-bash.js');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 模拟 Claude Code 调用 hook:把 JSON 写入 stdin,收集 stdout 输出。
|
|
12
|
+
* @param {object} toolInput
|
|
13
|
+
* @returns {Promise<{ decision: string, reason: string }>}
|
|
14
|
+
*/
|
|
15
|
+
function callHook(toolInput) {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
const child = spawn('node', [DIST], { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
18
|
+
let stdout = '';
|
|
19
|
+
let stderr = '';
|
|
20
|
+
child.stdout.on('data', (d) => (stdout += d));
|
|
21
|
+
child.stderr.on('data', (d) => (stderr += d));
|
|
22
|
+
child.on('close', (code) => {
|
|
23
|
+
try {
|
|
24
|
+
const out = JSON.parse(stdout);
|
|
25
|
+
const hs = out.hookSpecificOutput;
|
|
26
|
+
resolve({ decision: hs.permissionDecision, reason: hs.permissionDecisionReason });
|
|
27
|
+
} catch {
|
|
28
|
+
reject(new Error(`解析输出失败 (exit ${code}): stdout=${stdout} stderr=${stderr}`));
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
child.stdin.write(JSON.stringify({ tool_input: toolInput }));
|
|
32
|
+
child.stdin.end();
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
describe('auto-allow-bash-plugin hook', () => {
|
|
37
|
+
describe('本地放行(只读命令)', () => {
|
|
38
|
+
const readonlyCmds = [
|
|
39
|
+
'ls -la',
|
|
40
|
+
'cat README.md',
|
|
41
|
+
'git status',
|
|
42
|
+
'git log --oneline -10',
|
|
43
|
+
'git diff',
|
|
44
|
+
'pnpm list',
|
|
45
|
+
'node --version',
|
|
46
|
+
'cat README.md | head -20',
|
|
47
|
+
'git status && ls',
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
for (const cmd of readonlyCmds) {
|
|
51
|
+
it(`allow: ${cmd}`, async () => {
|
|
52
|
+
const result = await callHook({ command: cmd });
|
|
53
|
+
assert.equal(result.decision, 'allow');
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe('LLM 判定(非只读命令,走 LLM 后返回 ask)', () => {
|
|
59
|
+
const nonReadonlyCmds = [
|
|
60
|
+
'echo foo > bar.txt',
|
|
61
|
+
'cat file >> out.txt',
|
|
62
|
+
'rm $(ls)',
|
|
63
|
+
'sudo ls',
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
for (const cmd of nonReadonlyCmds) {
|
|
67
|
+
it(`ask: ${cmd}`, async () => {
|
|
68
|
+
const result = await callHook({ command: cmd });
|
|
69
|
+
assert.equal(result.decision, 'ask');
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('ask: 空命令', async () => {
|
|
75
|
+
const result = await callHook({ command: '' });
|
|
76
|
+
assert.equal(result.decision, 'ask');
|
|
77
|
+
});
|
|
78
|
+
});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "NodeNext",
|
|
5
|
+
"moduleResolution": "NodeNext",
|
|
6
|
+
"allowJs": true,
|
|
7
|
+
"checkJs": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"strict": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"resolveJsonModule": true,
|
|
12
|
+
"skipLibCheck": true,
|
|
13
|
+
"types": ["node"]
|
|
14
|
+
},
|
|
15
|
+
"include": ["src/**/*"]
|
|
16
|
+
}
|