@triflux/core 10.49.0 → 10.50.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 (46) hide show
  1. package/hooks/agy-session-hook.mjs +1 -1
  2. package/hooks/claude-cwd-projection-refresh.mjs +7 -79
  3. package/hooks/codex-session-hook.mjs +3 -8
  4. package/hooks/hook-orchestrator.mjs +8 -648
  5. package/hooks/lib/resolve-root.mjs +1 -1
  6. package/hub/bridge.mjs +290 -51
  7. package/hub/team/claude-daemon-control.mjs +54 -6
  8. package/hub/team/claude-transcript.mjs +240 -0
  9. package/hub/team/session-context.mjs +203 -0
  10. package/hud/constants.mjs +10 -0
  11. package/hud/hud-qos-status.mjs +23 -4
  12. package/hud/providers/gemini.mjs +4 -1
  13. package/hud/renderers.mjs +10 -6
  14. package/package.json +1 -1
  15. package/scripts/lib/doctor-env-checks.mjs +0 -85
  16. package/scripts/lib/legacy-hook-cleanup.mjs +230 -0
  17. package/scripts/lib/legacy-mcp-cleanup.mjs +772 -0
  18. package/scripts/lib/mcp-guard-engine.mjs +44 -271
  19. package/scripts/lib/mcp-manifest.mjs +2 -2
  20. package/scripts/lib/session-presence.mjs +249 -0
  21. package/hooks/agent-route-guard.mjs +0 -113
  22. package/hooks/cross-review-tracker.mjs +0 -135
  23. package/hooks/cto-north-star-brief.mjs +0 -133
  24. package/hooks/error-context.mjs +0 -185
  25. package/hooks/hook-adaptive-collector.mjs +0 -88
  26. package/hooks/hook-manager.mjs +0 -426
  27. package/hooks/hook-registry.json +0 -367
  28. package/hooks/hooks.json +0 -149
  29. package/hooks/keyword-rules.json +0 -676
  30. package/hooks/mcp-config-watcher.mjs +0 -84
  31. package/hooks/permission-safe-allow.mjs +0 -267
  32. package/hooks/pipeline-stop.mjs +0 -435
  33. package/hooks/post-tool-tips.mjs +0 -306
  34. package/hooks/pre-compact-snapshot.mjs +0 -181
  35. package/hooks/safety-guard.mjs +0 -466
  36. package/hooks/session-end-cleanup.mjs +0 -360
  37. package/hooks/session-start-fast.mjs +0 -579
  38. package/hooks/session-start-lake.mjs +0 -81
  39. package/hooks/subagent-tracker.mjs +0 -281
  40. package/hooks/subagent-verifier.mjs +0 -85
  41. package/scripts/lib/cross-review-utils.mjs +0 -59
  42. package/scripts/lib/hook-utils.mjs +0 -16
  43. package/scripts/lib/keyword-rules.mjs +0 -296
  44. package/scripts/lib/mcp-gateway-health-check.mjs +0 -224
  45. package/scripts/lib/mcp-gateway-servers.mjs +0 -70
  46. package/scripts/lib/mcp-gateway-wrapper-check.mjs +0 -35
@@ -1,676 +0,0 @@
1
- {
2
- "rules": [
3
- {
4
- "id": "tfx-cancel",
5
- "patterns": [
6
- {
7
- "source": "\\b(canceltfx|stoptfx)\\b",
8
- "flags": "i"
9
- }
10
- ],
11
- "skill": null,
12
- "action": "suppress_all",
13
- "priority": 0,
14
- "supersedes": ["tfx-multi", "tfx-unified", "tfx-codex", "tfx-gemini"],
15
- "exclusive": true,
16
- "state": null,
17
- "mcp_route": null
18
- },
19
- {
20
- "id": "tfx-multi",
21
- "patterns": [
22
- {
23
- "source": "(?<![\\w/.-])/tfx[\\s-]?multi\\b",
24
- "flags": "i",
25
- "strength": "explicit"
26
- },
27
- {
28
- "source": "\\btfx[\\s-]?multi\\s*(?:로|으로)\\s*(?:해|돌려|처리|진행|시켜|보내|라우팅)",
29
- "flags": "i",
30
- "strength": "explicit"
31
- }
32
- ],
33
- "skill": "tfx-auto",
34
- "priority": 1,
35
- "supersedes": [],
36
- "exclusive": false,
37
- "state": null,
38
- "mcp_route": null
39
- },
40
- {
41
- "id": "tfx-swarm",
42
- "patterns": [
43
- {
44
- "source": "\\btfx[\\s-]?swarm\\b",
45
- "flags": "i"
46
- },
47
- {
48
- "source": "\\btfx[\\s-]?codex[\\s-]?swarm\\b",
49
- "flags": "i"
50
- },
51
- {
52
- "source": "\\bcodex[\\s-]?swarm\\b",
53
- "flags": "i"
54
- },
55
- {
56
- "source": "\\btfx[\\s-]?remote[\\s-]?spawn\\b",
57
- "flags": "i"
58
- },
59
- {
60
- "source": "\\bremote[\\s-]?spawn\\b",
61
- "flags": "i"
62
- }
63
- ],
64
- "skill": "tfx-auto",
65
- "priority": 1,
66
- "supersedes": ["tfx-codex"],
67
- "exclusive": false,
68
- "state": null,
69
- "mcp_route": null
70
- },
71
- {
72
- "id": "tfx-harness",
73
- "patterns": [
74
- {
75
- "source": "(?<![\\w/.-])/tfx[\\s-]?harness\\b",
76
- "flags": "i",
77
- "strength": "explicit"
78
- },
79
- {
80
- "source": "\\btfx[\\s-]?harness\\s*(?:로|으로)\\s*(?:해|돌려|처리|진행|시켜|보내|라우팅)",
81
- "flags": "i",
82
- "strength": "explicit"
83
- }
84
- ],
85
- "skill": "tfx-harness",
86
- "priority": 1,
87
- "supersedes": ["tfx-unified"],
88
- "exclusive": false,
89
- "state": null,
90
- "mcp_route": null
91
- },
92
- {
93
- "id": "tfx-harness-meta",
94
- "patterns": [
95
- {
96
- "source": "(?:어떤\\s*스킬|스킬\\s*추천|스킬\\s*라우팅|작업\\s*라우팅|메타\\s*라우팅)",
97
- "flags": "i"
98
- },
99
- {
100
- "source": "\\bwhich\\s+skill\\b",
101
- "flags": "i"
102
- },
103
- {
104
- "source": "(?:뭐|어떤|무슨)\\s*스킬|스킬\\s*(?:있나|있어|없나|도움)",
105
- "flags": "i"
106
- }
107
- ],
108
- "skill": "tfx-harness",
109
- "priority": 2,
110
- "supersedes": ["tfx-unified"],
111
- "exclusive": false,
112
- "state": null,
113
- "mcp_route": null,
114
- "strength": "suggest",
115
- "suggest_when": "어떤 스킬·경로를 쓸지 묻는 메타 라우팅 요청"
116
- },
117
- {
118
- "id": "tfx-review",
119
- "patterns": [
120
- {
121
- "source": "\\btfx[\\s-]?review\\b",
122
- "flags": "i"
123
- }
124
- ],
125
- "skill": "tfx-review",
126
- "priority": 1,
127
- "supersedes": ["tfx-unified"],
128
- "exclusive": false,
129
- "state": null,
130
- "mcp_route": null,
131
- "explicit": true
132
- },
133
- {
134
- "id": "tfx-plan",
135
- "patterns": [
136
- {
137
- "source": "\\btfx[\\s-]?plan\\b",
138
- "flags": "i"
139
- }
140
- ],
141
- "skill": "tfx-plan",
142
- "priority": 1,
143
- "supersedes": ["tfx-unified"],
144
- "exclusive": false,
145
- "state": null,
146
- "mcp_route": null,
147
- "explicit": true
148
- },
149
- {
150
- "id": "tfx-qa",
151
- "patterns": [
152
- {
153
- "source": "\\btfx[\\s-]?qa\\b",
154
- "flags": "i"
155
- }
156
- ],
157
- "skill": "tfx-review",
158
- "priority": 1,
159
- "supersedes": ["tfx-unified"],
160
- "exclusive": false,
161
- "state": null,
162
- "mcp_route": null,
163
- "explicit": true
164
- },
165
- {
166
- "id": "tfx-research",
167
- "patterns": [
168
- {
169
- "source": "\\btfx[\\s-]?research\\b",
170
- "flags": "i"
171
- }
172
- ],
173
- "skill": "tfx-research",
174
- "priority": 1,
175
- "supersedes": ["tfx-unified"],
176
- "exclusive": false,
177
- "state": null,
178
- "mcp_route": null,
179
- "explicit": true
180
- },
181
- {
182
- "id": "tfx-unified",
183
- "patterns": [
184
- {
185
- "source": "(?<![\\w/.-])/tfx[\\s-]?auto(?:[\\s-]?codex)?\\b",
186
- "flags": "i",
187
- "strength": "explicit"
188
- },
189
- {
190
- "source": "\\btfx[\\s-]?auto(?:[\\s-]?codex)?\\s*(?:로|으로)\\s*(?:해|돌려|처리|진행|시켜|보내|라우팅)",
191
- "flags": "i",
192
- "strength": "explicit"
193
- },
194
- {
195
- "source": "(?:코드|프론트|화면|버튼|위젯|셸|\\.sh|경로|콜백|생성기|함수|메서드|파일|모듈|클래스|기능|버그|결함|스크립트|훅|스킬|API|엔드포인트|컴포넌트|로직|알고리즘|테스트\\s*코드|빌드|에러|오류|UI|스키마|CLI|패턴|정규식|설정)[^.?!\\n]{0,15}?(?:구현|만들어|고쳐|수정해|짜\\s*줘|작성해|추가해|리팩터|개선해|패치해|지워|넣어|바꿔)",
196
- "flags": "i"
197
- },
198
- {
199
- "source": "구현\\s*(?:해|하자|할\\s*거|해\\s*줘)",
200
- "flags": ""
201
- },
202
- {
203
- "source": "\\b(?:implement|refactor)\\b|\\bfix\\s+(?:the\\s+|this\\s+|a\\s+)?(?:bug|test|build|error|issue|code)\\b",
204
- "flags": "i"
205
- }
206
- ],
207
- "exclude_patterns": [
208
- {
209
- "source": "(?:[??]|(?:있나|없나|되나|될까|할까|인가|일까|하나|어때|맞아|맞나|건가|거야|던데|을걸|을껄))\\s*[??]?\\s*$",
210
- "flags": "i"
211
- }
212
- ],
213
- "skill": "tfx-auto",
214
- "priority": 2,
215
- "supersedes": ["tfx-auto-codex"],
216
- "exclusive": false,
217
- "state": null,
218
- "mcp_route": null,
219
- "strength": "suggest",
220
- "suggest_when": "코드 구현·수정 실행 요청"
221
- },
222
- {
223
- "id": "host-ai-slop-cleaner",
224
- "patterns": [
225
- {
226
- "source": "(?:AI\\s*슬롭|ai\\s*slop)",
227
- "flags": "i"
228
- },
229
- {
230
- "source": "\\b(?:anti[\\s-]?slop|deslop)\\b",
231
- "flags": "i",
232
- "strength": "explicit"
233
- }
234
- ],
235
- "skill": "ai-slop-cleaner",
236
- "priority": 1,
237
- "supersedes": [],
238
- "exclusive": false,
239
- "state": null,
240
- "mcp_route": null,
241
- "strength": "suggest",
242
- "suggest_when": "AI 슬롭 정리(deslop) 실행 요청"
243
- },
244
- {
245
- "id": "tfx-codex",
246
- "patterns": [
247
- {
248
- "source": "\\btfx[\\s-]?codex\\b(?![\\s-]?swarm)",
249
- "flags": "i"
250
- }
251
- ],
252
- "skill": "tfx-auto",
253
- "priority": 3,
254
- "supersedes": [],
255
- "exclusive": false,
256
- "state": null,
257
- "mcp_route": null
258
- },
259
- {
260
- "id": "tfx-gemini",
261
- "patterns": [
262
- {
263
- "source": "\\btfx[\\s-]?gemini\\b",
264
- "flags": "i"
265
- }
266
- ],
267
- "skill": "tfx-auto",
268
- "priority": 3,
269
- "supersedes": [],
270
- "exclusive": false,
271
- "state": null,
272
- "mcp_route": null
273
- },
274
- {
275
- "id": "tfx-doctor",
276
- "patterns": [
277
- {
278
- "source": "\\btfx[\\s-]?(?:doctor|hub)\\b",
279
- "flags": "i"
280
- }
281
- ],
282
- "skill": "tfx-doctor",
283
- "priority": 1,
284
- "supersedes": [],
285
- "exclusive": false,
286
- "state": null,
287
- "mcp_route": null
288
- },
289
- {
290
- "id": "tfx-setup",
291
- "patterns": [
292
- {
293
- "source": "\\btfx[\\s-]?setup\\b",
294
- "flags": "i"
295
- }
296
- ],
297
- "skill": "tfx-setup",
298
- "priority": 1,
299
- "supersedes": [],
300
- "exclusive": false,
301
- "state": null,
302
- "mcp_route": null
303
- },
304
- {
305
- "id": "tfx-autoresearch",
306
- "patterns": [
307
- {
308
- "source": "\\btfx[\\s-]?autoresearch\\b",
309
- "flags": "i"
310
- }
311
- ],
312
- "skill": "tfx-research",
313
- "priority": 1,
314
- "supersedes": [],
315
- "exclusive": false,
316
- "state": null,
317
- "mcp_route": null
318
- },
319
- {
320
- "id": "tfx-deep-interview",
321
- "patterns": [
322
- {
323
- "source": "\\btfx[\\s-]?deep[\\s-]?interview\\b",
324
- "flags": "i"
325
- }
326
- ],
327
- "skill": "tfx-interview",
328
- "priority": 1,
329
- "supersedes": [],
330
- "exclusive": false,
331
- "state": null,
332
- "mcp_route": null
333
- },
334
- {
335
- "id": "wt-tab-route",
336
- "patterns": [
337
- {
338
- "source": "(?:새\\s*탭|탭\\s*(?:새로|추가|생성|열|띄|파|만들))",
339
- "flags": "i"
340
- },
341
- {
342
- "source": "(?:패인|화면|pane)\\s*(?:분할|나눠|스플릿|split)",
343
- "flags": "i"
344
- },
345
- {
346
- "source": "\\bwt\\b\\s*(?:에\\s*)?(?:탭|tab|열|띄|새)",
347
- "flags": "i"
348
- },
349
- {
350
- "source": "(?:터미널|terminal)\\s*(?:탭|새\\s*탭)",
351
- "flags": "i"
352
- },
353
- {
354
- "source": "\\b(?:new\\s+tab|split\\s+pane|open\\s+(?:new\\s+)?tab)\\b",
355
- "flags": "i"
356
- }
357
- ],
358
- "skill": "tfx-wt",
359
- "priority": 1,
360
- "supersedes": ["tfx-unified"],
361
- "exclusive": false,
362
- "state": null,
363
- "mcp_route": null,
364
- "platform": ["win32"],
365
- "strength": "suggest",
366
- "suggest_when": "Windows Terminal 탭·패인 조작 요청"
367
- },
368
- {
369
- "id": "wt-tab-rename",
370
- "patterns": [
371
- {
372
- "source": "(?:탭\\s*(?:이름|제목)\\s*(?:바꿔|변경|rename))",
373
- "flags": "i"
374
- },
375
- {
376
- "source": "(?:rename\\s+tab|tab\\s+rename)",
377
- "flags": "i"
378
- }
379
- ],
380
- "skill": "tfx-wt",
381
- "priority": 1,
382
- "supersedes": ["tfx-unified"],
383
- "exclusive": false,
384
- "state": null,
385
- "mcp_route": null,
386
- "platform": ["win32"],
387
- "strength": "suggest",
388
- "suggest_when": "Windows Terminal 탭·패인 조작 요청"
389
- },
390
- {
391
- "id": "wt-tab-list",
392
- "patterns": [
393
- {
394
- "source": "(?:탭\\s*(?:목록|리스트|열린|현재))",
395
- "flags": "i"
396
- },
397
- {
398
- "source": "(?:list\\s+tabs|tab\\s+list|열린\\s*탭)",
399
- "flags": "i"
400
- }
401
- ],
402
- "skill": "tfx-wt",
403
- "priority": 1,
404
- "supersedes": ["tfx-unified"],
405
- "exclusive": false,
406
- "state": null,
407
- "mcp_route": null,
408
- "platform": ["win32"],
409
- "strength": "suggest",
410
- "suggest_when": "Windows Terminal 탭·패인 조작 요청"
411
- },
412
- {
413
- "id": "wt-tab-close",
414
- "patterns": [
415
- {
416
- "source": "(?:탭\\s*(?:닫아|닫기|종료|정리|close))",
417
- "flags": "i"
418
- },
419
- {
420
- "source": "(?:close\\s+tab|tab\\s+close|탭\\s*정리)",
421
- "flags": "i"
422
- }
423
- ],
424
- "skill": "tfx-wt",
425
- "priority": 1,
426
- "supersedes": ["tfx-unified"],
427
- "exclusive": false,
428
- "state": null,
429
- "mcp_route": null,
430
- "platform": ["win32"],
431
- "strength": "suggest",
432
- "suggest_when": "Windows Terminal 탭·패인 조작 요청"
433
- },
434
- {
435
- "id": "gstack-checkpoint",
436
- "patterns": [
437
- {
438
- "source": "(?:어디까지\\s*했|뭐\\s*하고\\s*있었|중단\\s*지점)",
439
- "flags": "i"
440
- },
441
- {
442
- "source": "\\bwhere\\s*was\\s*I\\b",
443
- "flags": "i"
444
- }
445
- ],
446
- "skill_candidates": ["context-restore", "gstack-context-restore"],
447
- "priority": 5,
448
- "supersedes": [],
449
- "exclusive": false,
450
- "state": null,
451
- "mcp_route": null,
452
- "strength": "suggest",
453
- "suggest_when": "이전 세션의 작업 맥락을 복원하려는 요청"
454
- },
455
- {
456
- "id": "gstack-office-hours",
457
- "patterns": [
458
- {
459
- "source": "(?:아이디어\\s*(?:있|정리|브레인)|뭘\\s*만들|제품\\s*구상)",
460
- "flags": "i"
461
- },
462
- {
463
- "source": "\\boffice[\\s-]?hours\\b",
464
- "flags": "i",
465
- "strength": "explicit"
466
- }
467
- ],
468
- "skill_candidates": ["office-hours", "gstack-office-hours"],
469
- "priority": 5,
470
- "supersedes": [],
471
- "exclusive": false,
472
- "state": null,
473
- "mcp_route": null,
474
- "strength": "suggest",
475
- "suggest_when": "새 제품·아이디어의 문제 정의를 시작하려는 요청"
476
- },
477
- {
478
- "id": "gstack-ship",
479
- "patterns": [
480
- {
481
- "source": "PR\\s*(?:만들|올려|생성|열어)|머지하고\\s*배포|릴리스\\s*해",
482
- "flags": "i"
483
- },
484
- {
485
- "source": "(?<![\\w/-])ship\\s+(?:it|this)\\b",
486
- "flags": "i"
487
- }
488
- ],
489
- "exclude_patterns": [
490
- {
491
- "source": "(?:[??]|(?:있나|없나|되나|될까|할까|인가|일까|하나|어때|맞아|맞나|건가|거야|던데|을걸|을껄))\\s*[??]?\\s*$",
492
- "flags": "i"
493
- }
494
- ],
495
- "skill_candidates": ["ship", "gstack-ship"],
496
- "priority": 1,
497
- "supersedes": [],
498
- "exclusive": false,
499
- "state": null,
500
- "mcp_route": null,
501
- "strength": "suggest",
502
- "suggest_when": "일반 저장소의 PR·배포 실행 요청"
503
- },
504
- {
505
- "id": "gstack-investigate",
506
- "patterns": [
507
- {
508
- "source": "(?:왜\\s*(?:안\\s*돼|터져|에러)|원인\\s*(?:찾아|분석)|root\\s*cause)",
509
- "flags": "i"
510
- },
511
- {
512
- "source": "\\binvestigate\\b",
513
- "flags": "i"
514
- }
515
- ],
516
- "skill_candidates": ["investigate", "gstack-investigate"],
517
- "priority": 5,
518
- "supersedes": [],
519
- "exclusive": false,
520
- "state": null,
521
- "mcp_route": null,
522
- "strength": "suggest",
523
- "suggest_when": "버그·장애의 원인을 조사하려는 요청"
524
- },
525
- {
526
- "id": "gstack-cso",
527
- "patterns": [
528
- {
529
- "source": "(?:보안\\s*(?:감사|점검|리뷰|검토|스캔)|\\bOWASP\\b|\\bSTRIDE\\b)",
530
- "flags": "i"
531
- },
532
- {
533
- "source": "\\bcso\\b",
534
- "flags": "i",
535
- "strength": "explicit"
536
- }
537
- ],
538
- "skill_candidates": ["cso", "gstack-cso"],
539
- "priority": 1,
540
- "supersedes": [],
541
- "exclusive": false,
542
- "state": null,
543
- "mcp_route": null,
544
- "strength": "suggest",
545
- "suggest_when": "보안 감사·점검 실행 요청"
546
- },
547
- {
548
- "id": "gstack-qa-browser",
549
- "patterns": [
550
- {
551
- "source": "(?:사이트|브라우저|웹)\\s*(?:QA|테스트|확인|점검)",
552
- "flags": "i"
553
- },
554
- {
555
- "source": "(?:클릭|접속).*(?:테스트|확인)",
556
- "flags": "i"
557
- }
558
- ],
559
- "skill_candidates": ["qa", "gstack-qa"],
560
- "priority": 1,
561
- "supersedes": [],
562
- "exclusive": false,
563
- "state": null,
564
- "mcp_route": null,
565
- "strength": "suggest",
566
- "suggest_when": "사이트·브라우저 흐름을 실제로 테스트하려는 요청"
567
- },
568
- {
569
- "id": "gstack-retro",
570
- "patterns": [
571
- {
572
- "source": "(?:주간|이번\\s*주|지난\\s*주|스프린트)\\s*(?:회고|리뷰)|이번\\s*주\\s*뭐\\s*했",
573
- "flags": "i"
574
- },
575
- {
576
- "source": "(?<![\\w/-])retro\\b",
577
- "flags": "i",
578
- "strength": "explicit"
579
- }
580
- ],
581
- "exclude_patterns": [
582
- {
583
- "source": "회고\\s*(?:문서|록|템플릿)|회의|전사",
584
- "flags": ""
585
- }
586
- ],
587
- "skill_candidates": ["retro", "gstack-retro"],
588
- "priority": 5,
589
- "supersedes": [],
590
- "exclusive": false,
591
- "state": null,
592
- "mcp_route": null,
593
- "strength": "suggest",
594
- "suggest_when": "작업 회고를 하려는 요청"
595
- },
596
- {
597
- "id": "gstack-autoplan",
598
- "patterns": [
599
- {
600
- "source": "(?:자동\\s*리뷰|리뷰\\s*파이프라인|전체\\s*리뷰)",
601
- "flags": "i"
602
- },
603
- {
604
- "source": "\\bautoplan\\b",
605
- "flags": "i",
606
- "strength": "explicit"
607
- }
608
- ],
609
- "skill_candidates": ["autoplan", "gstack-autoplan"],
610
- "priority": 5,
611
- "supersedes": [],
612
- "exclusive": false,
613
- "state": null,
614
- "mcp_route": null,
615
- "strength": "suggest",
616
- "suggest_when": "계획 전체 리뷰 파이프라인 실행 요청"
617
- },
618
- {
619
- "id": "suppress-omc-team",
620
- "patterns": [
621
- {
622
- "source": "(?<!tfx[\\s-]?)\\bteam\\b|팀\\s*(?:모드|으로|구성)",
623
- "flags": "i"
624
- }
625
- ],
626
- "exclude_patterns": [
627
- {
628
- "source": "(?<![\\w.-])/team\\b|레드\\s*팀|개발\\s*팀|팀\\s*저장소",
629
- "flags": "i"
630
- }
631
- ],
632
- "skill": null,
633
- "action": "suppress_omc",
634
- "priority": 20,
635
- "supersedes": [],
636
- "exclusive": false,
637
- "state": null,
638
- "mcp_route": null,
639
- "strength": "suggest"
640
- },
641
- {
642
- "id": "tfx-ship",
643
- "patterns": [
644
- {
645
- "source": "\\btfx[\\s-]?ship\\b",
646
- "flags": "i",
647
- "strength": "explicit"
648
- },
649
- {
650
- "source": "(?:배포|릴리[즈스])\\s*(?:해|하고|하자|진행|가자|시작)",
651
- "flags": ""
652
- },
653
- {
654
- "source": "쉽\\s*(?:해|하자|가자|쳐)",
655
- "flags": ""
656
- }
657
- ],
658
- "exclude_patterns": [
659
- {
660
- "source": "(?:[??]|(?:있나|없나|되나|될까|할까|인가|일까|하나|어때|맞아|맞나|건가|거야|던데|을걸|을껄))\\s*[??]?\\s*$",
661
- "flags": "i"
662
- }
663
- ],
664
- "skill": "tfx-ship",
665
- "priority": 1,
666
- "supersedes": ["gstack-ship"],
667
- "exclusive": false,
668
- "state": null,
669
- "mcp_route": null,
670
- "repo_scope": ["triflux"],
671
- "explicit": true,
672
- "strength": "suggest",
673
- "suggest_when": "triflux 릴리즈·배포 실행 요청"
674
- }
675
- ]
676
- }