triflux 3.3.0-dev.8 → 4.0.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 (91) hide show
  1. package/README.ko.md +108 -199
  2. package/README.md +108 -199
  3. package/bin/triflux.mjs +2427 -1762
  4. package/hooks/keyword-rules.json +361 -354
  5. package/hooks/pipeline-stop.mjs +5 -2
  6. package/hub/assign-callbacks.mjs +136 -136
  7. package/hub/bridge.mjs +734 -684
  8. package/hub/delegator/contracts.mjs +38 -38
  9. package/hub/delegator/index.mjs +14 -14
  10. package/hub/delegator/schema/delegator-tools.schema.json +250 -250
  11. package/hub/delegator/service.mjs +302 -118
  12. package/hub/delegator/tool-definitions.mjs +35 -35
  13. package/hub/hitl.mjs +67 -67
  14. package/hub/paths.mjs +28 -0
  15. package/hub/pipe.mjs +589 -561
  16. package/hub/pipeline/state.mjs +23 -0
  17. package/hub/public/dashboard.html +349 -0
  18. package/hub/public/tray-icon.ico +0 -0
  19. package/hub/public/tray-icon.png +0 -0
  20. package/hub/router.mjs +782 -782
  21. package/hub/schema.sql +40 -40
  22. package/hub/server.mjs +810 -637
  23. package/hub/store.mjs +706 -706
  24. package/hub/team/cli/commands/attach.mjs +37 -0
  25. package/hub/team/cli/commands/control.mjs +43 -0
  26. package/hub/team/cli/commands/debug.mjs +74 -0
  27. package/hub/team/cli/commands/focus.mjs +53 -0
  28. package/hub/team/cli/commands/interrupt.mjs +36 -0
  29. package/hub/team/cli/commands/kill.mjs +37 -0
  30. package/hub/team/cli/commands/list.mjs +24 -0
  31. package/hub/team/cli/commands/send.mjs +37 -0
  32. package/hub/team/cli/commands/start/index.mjs +87 -0
  33. package/hub/team/cli/commands/start/parse-args.mjs +32 -0
  34. package/hub/team/cli/commands/start/start-in-process.mjs +40 -0
  35. package/hub/team/cli/commands/start/start-mux.mjs +73 -0
  36. package/hub/team/cli/commands/start/start-wt.mjs +69 -0
  37. package/hub/team/cli/commands/status.mjs +87 -0
  38. package/hub/team/cli/commands/stop.mjs +31 -0
  39. package/hub/team/cli/commands/task.mjs +30 -0
  40. package/hub/team/cli/commands/tasks.mjs +13 -0
  41. package/hub/team/{cli.mjs → cli/help.mjs} +38 -99
  42. package/hub/team/cli/index.mjs +39 -0
  43. package/hub/team/cli/manifest.mjs +28 -0
  44. package/hub/team/cli/render.mjs +30 -0
  45. package/hub/team/cli/services/attach-fallback.mjs +54 -0
  46. package/hub/team/cli/services/hub-client.mjs +171 -0
  47. package/hub/team/cli/services/member-selector.mjs +30 -0
  48. package/hub/team/cli/services/native-control.mjs +115 -0
  49. package/hub/team/cli/services/runtime-mode.mjs +60 -0
  50. package/hub/team/cli/services/state-store.mjs +34 -0
  51. package/hub/team/cli/services/task-model.mjs +30 -0
  52. package/hub/team/native-supervisor.mjs +69 -63
  53. package/hub/team/native.mjs +367 -367
  54. package/hub/team/nativeProxy.mjs +217 -173
  55. package/hub/team/pane.mjs +149 -149
  56. package/hub/team/psmux.mjs +946 -946
  57. package/hub/team/session.mjs +608 -608
  58. package/hub/team/staleState.mjs +369 -299
  59. package/hub/tools.mjs +107 -107
  60. package/hub/tray.mjs +332 -0
  61. package/hub/workers/claude-worker.mjs +446 -446
  62. package/hub/workers/codex-mcp.mjs +414 -414
  63. package/hub/workers/delegator-mcp.mjs +1045 -1045
  64. package/hub/workers/factory.mjs +21 -21
  65. package/hub/workers/gemini-worker.mjs +349 -349
  66. package/hub/workers/interface.mjs +41 -41
  67. package/package.json +3 -2
  68. package/scripts/__tests__/keyword-detector.test.mjs +234 -234
  69. package/scripts/hub-ensure.mjs +102 -101
  70. package/scripts/keyword-detector.mjs +272 -272
  71. package/scripts/keyword-rules-expander.mjs +521 -521
  72. package/scripts/lib/keyword-rules.mjs +168 -168
  73. package/scripts/lib/mcp-filter.mjs +642 -642
  74. package/scripts/lib/mcp-server-catalog.mjs +118 -118
  75. package/scripts/mcp-check.mjs +126 -126
  76. package/scripts/preflight-cache.mjs +19 -0
  77. package/scripts/run.cjs +62 -62
  78. package/scripts/setup.mjs +68 -31
  79. package/scripts/test-tfx-route-no-claude-native.mjs +57 -57
  80. package/scripts/tfx-route-worker.mjs +161 -161
  81. package/scripts/tfx-route.sh +1360 -1326
  82. package/skills/tfx-auto/SKILL.md +196 -196
  83. package/skills/tfx-auto-codex/SKILL.md +77 -77
  84. package/skills/tfx-multi/SKILL.md +378 -378
  85. package/hub/team/cli-team-common.mjs +0 -348
  86. package/hub/team/cli-team-control.mjs +0 -393
  87. package/hub/team/cli-team-start.mjs +0 -516
  88. package/hub/team/cli-team-status.mjs +0 -283
  89. package/skills/auto-verify/SKILL.md +0 -145
  90. package/skills/manage-skills/SKILL.md +0 -192
  91. package/skills/verify-implementation/SKILL.md +0 -138
@@ -1,354 +1,361 @@
1
- {
2
- "rules": [
3
- {
4
- "id": "tfx-cancel",
5
- "patterns": [
6
- {
7
- "source": "\\b(canceltfx|stoptfx)\\b",
8
- "flags": "i"
9
- }
10
- ],
11
- "skill": "tfx-cancel",
12
- "priority": 0,
13
- "supersedes": [
14
- "tfx-multi",
15
- "tfx-auto",
16
- "tfx-auto-codex",
17
- "tfx-codex",
18
- "tfx-gemini"
19
- ],
20
- "exclusive": true,
21
- "state": null,
22
- "mcp_route": null
23
- },
24
- {
25
- "id": "tfx-multi",
26
- "patterns": [
27
- {
28
- "source": "(?<!\\b(?:my|the|our|omc|oh-my-claudecode)\\s)\\btfx[\\s-]?multi\\b",
29
- "flags": "i"
30
- }
31
- ],
32
- "skill": "tfx-multi",
33
- "priority": 1,
34
- "supersedes": [],
35
- "exclusive": false,
36
- "state": null,
37
- "mcp_route": null
38
- },
39
- {
40
- "id": "tfx-auto-codex",
41
- "patterns": [
42
- {
43
- "source": "\\btfx[\\s-]?auto[\\s-]?codex\\b",
44
- "flags": "i"
45
- }
46
- ],
47
- "skill": "tfx-auto-codex",
48
- "priority": 1,
49
- "supersedes": [
50
- "tfx-auto",
51
- "tfx-codex"
52
- ],
53
- "exclusive": false,
54
- "state": null,
55
- "mcp_route": null
56
- },
57
- {
58
- "id": "tfx-auto",
59
- "patterns": [
60
- {
61
- "source": "\\btfx[\\s-]?auto\\b",
62
- "flags": "i"
63
- }
64
- ],
65
- "skill": "tfx-auto",
66
- "priority": 2,
67
- "supersedes": [],
68
- "exclusive": false,
69
- "state": null,
70
- "mcp_route": null
71
- },
72
- {
73
- "id": "tfx-codex",
74
- "patterns": [
75
- {
76
- "source": "\\btfx[\\s-]?codex\\b",
77
- "flags": "i"
78
- }
79
- ],
80
- "skill": "tfx-codex",
81
- "priority": 3,
82
- "supersedes": [],
83
- "exclusive": false,
84
- "state": null,
85
- "mcp_route": null
86
- },
87
- {
88
- "id": "tfx-gemini",
89
- "patterns": [
90
- {
91
- "source": "\\btfx[\\s-]?gemini\\b",
92
- "flags": "i"
93
- }
94
- ],
95
- "skill": "tfx-gemini",
96
- "priority": 3,
97
- "supersedes": [],
98
- "exclusive": false,
99
- "state": null,
100
- "mcp_route": null
101
- },
102
- {
103
- "id": "notion-route",
104
- "patterns": [
105
- {
106
- "source": "\\b(노션|notion)[\\s-]?(페이지|글|조회|생성|수정|검색)\\b",
107
- "flags": "i"
108
- },
109
- {
110
- "source": "(노션|notion)[\\s-]?(페이지|글|조회|생성|수정|검색)",
111
- "flags": "i"
112
- }
113
- ],
114
- "skill": null,
115
- "priority": 10,
116
- "supersedes": [],
117
- "exclusive": false,
118
- "state": null,
119
- "mcp_route": "gemini"
120
- },
121
- {
122
- "id": "chrome-route",
123
- "patterns": [
124
- {
125
- "source": "\\b(크롬|chrome|브라우저)[\\s-]?(열|접속|로그인|navigate|click)\\b",
126
- "flags": "i"
127
- },
128
- {
129
- "source": "(크롬|chrome|브라우저)[\\s-]?(열|접속|로그인|navigate|click)",
130
- "flags": "i"
131
- }
132
- ],
133
- "skill": null,
134
- "priority": 10,
135
- "supersedes": [],
136
- "exclusive": false,
137
- "state": null,
138
- "mcp_route": "gemini"
139
- },
140
- {
141
- "id": "jira-route",
142
- "patterns": [
143
- {
144
- "source": "\\b(jira|지라)[\\s-]?(이슈|티켓|생성|조회|스프린트)\\b",
145
- "flags": "i"
146
- },
147
- {
148
- "source": "(jira|지라)[\\s-]?(이슈|티켓|생성|조회|스프린트)",
149
- "flags": "i"
150
- }
151
- ],
152
- "skill": null,
153
- "priority": 10,
154
- "supersedes": [],
155
- "exclusive": false,
156
- "state": null,
157
- "mcp_route": "codex"
158
- },
159
- {
160
- "id": "mail-route",
161
- "patterns": [
162
- {
163
- "source": "\\b(메일|gmail|이메일)[\\s-]?(보내|읽|검색|draft)\\b",
164
- "flags": "i"
165
- },
166
- {
167
- "source": "(메일|gmail|이메일)[\\s-]?(보내|읽|검색|draft)",
168
- "flags": "i"
169
- }
170
- ],
171
- "skill": null,
172
- "priority": 10,
173
- "supersedes": [],
174
- "exclusive": false,
175
- "state": null,
176
- "mcp_route": "gemini"
177
- },
178
- {
179
- "id": "calendar-route",
180
- "patterns": [
181
- {
182
- "source": "\\b(일정|캘린더|calendar)[\\s-]?(생성|조회|추가)\\b",
183
- "flags": "i"
184
- },
185
- {
186
- "source": "(일정|캘린더|calendar)[\\s-]?(생성|조회|추가)",
187
- "flags": "i"
188
- }
189
- ],
190
- "skill": null,
191
- "priority": 10,
192
- "supersedes": [],
193
- "exclusive": false,
194
- "state": null,
195
- "mcp_route": "gemini"
196
- },
197
- {
198
- "id": "playwright-route",
199
- "patterns": [
200
- {
201
- "source": "\\b(playwright|브라우저\\s*테스트)\\b",
202
- "flags": "i"
203
- },
204
- {
205
- "source": "(playwright|브라우저\\s*테스트)",
206
- "flags": "i"
207
- }
208
- ],
209
- "skill": null,
210
- "priority": 10,
211
- "supersedes": [],
212
- "exclusive": false,
213
- "state": null,
214
- "mcp_route": "gemini"
215
- },
216
- {
217
- "id": "canva-route",
218
- "patterns": [
219
- {
220
- "source": "\\b(canva|캔바|디자인\\s*생성)\\b",
221
- "flags": "i"
222
- },
223
- {
224
- "source": "(canva|캔바|디자인\\s*생성)",
225
- "flags": "i"
226
- }
227
- ],
228
- "skill": null,
229
- "priority": 10,
230
- "supersedes": [],
231
- "exclusive": false,
232
- "state": null,
233
- "mcp_route": "gemini"
234
- },
235
- {
236
- "id": "tfx-hub",
237
- "patterns": [
238
- {
239
- "source": "\\btfx[\\s-]?hub\\b",
240
- "flags": "i"
241
- }
242
- ],
243
- "skill": "tfx-hub",
244
- "priority": 2,
245
- "supersedes": [],
246
- "exclusive": false,
247
- "state": null,
248
- "mcp_route": null
249
- },
250
- {
251
- "id": "tfx-doctor",
252
- "patterns": [
253
- {
254
- "source": "\\btfx[\\s-]?doctor\\b",
255
- "flags": "i"
256
- }
257
- ],
258
- "skill": "tfx-doctor",
259
- "priority": 2,
260
- "supersedes": [],
261
- "exclusive": false,
262
- "state": null,
263
- "mcp_route": null
264
- },
265
- {
266
- "id": "tfx-setup",
267
- "patterns": [
268
- {
269
- "source": "\\btfx[\\s-]?setup\\b",
270
- "flags": "i"
271
- }
272
- ],
273
- "skill": "tfx-setup",
274
- "priority": 2,
275
- "supersedes": [],
276
- "exclusive": false,
277
- "state": null,
278
- "mcp_route": null
279
- },
280
- {
281
- "id": "suppress-omc-team",
282
- "patterns": [
283
- {
284
- "source": "(?<!tfx[\\s-]?)(팀|\\bteam\\b)",
285
- "flags": "i"
286
- }
287
- ],
288
- "skill": null,
289
- "action": "suppress_omc",
290
- "priority": 20,
291
- "supersedes": [],
292
- "exclusive": false,
293
- "state": null,
294
- "mcp_route": null
295
- },
296
- {
297
- "id": "confluence-route",
298
- "patterns": [
299
- {
300
- "source": "\\b(confluence|위키|wiki)[\\s-]?(페이지|문서|조회|생성|수정|검색)\\b",
301
- "flags": "i"
302
- },
303
- {
304
- "source": "(confluence|위키|wiki)[\\s-]?(페이지|문서|조회|생성|수정|검색)",
305
- "flags": "i"
306
- }
307
- ],
308
- "skill": null,
309
- "priority": 10,
310
- "supersedes": [],
311
- "exclusive": false,
312
- "state": null,
313
- "mcp_route": "gemini"
314
- },
315
- {
316
- "id": "slack-route",
317
- "patterns": [
318
- {
319
- "source": "\\b(slack|슬랙)[\\s-]?(메시지|채널|보내|읽|검색|알림)\\b",
320
- "flags": "i"
321
- },
322
- {
323
- "source": "(slack|슬랙)[\\s-]?(메시지|채널|보내|읽|검색|알림)",
324
- "flags": "i"
325
- }
326
- ],
327
- "skill": null,
328
- "priority": 10,
329
- "supersedes": [],
330
- "exclusive": false,
331
- "state": null,
332
- "mcp_route": "gemini"
333
- },
334
- {
335
- "id": "github-route",
336
- "patterns": [
337
- {
338
- "source": "\\b(github|깃허브)[\\s-]?(이슈|issue|PR|pull|커밋|commit|리포|repo)\\b",
339
- "flags": "i"
340
- },
341
- {
342
- "source": "(github|깃허브)[\\s-]?(이슈|issue|PR|pull|커밋|commit|리포|repo)",
343
- "flags": "i"
344
- }
345
- ],
346
- "skill": null,
347
- "priority": 10,
348
- "supersedes": [],
349
- "exclusive": false,
350
- "state": null,
351
- "mcp_route": "codex"
352
- }
353
- ]
354
- }
1
+ {
2
+ "rules": [
3
+ {
4
+ "id": "tfx-cancel",
5
+ "patterns": [
6
+ {
7
+ "source": "\\b(canceltfx|stoptfx)\\b",
8
+ "flags": "i"
9
+ }
10
+ ],
11
+ "skill": "tfx-cancel",
12
+ "priority": 0,
13
+ "supersedes": [
14
+ "tfx-multi",
15
+ "tfx-auto",
16
+ "tfx-auto-codex",
17
+ "tfx-codex",
18
+ "tfx-gemini"
19
+ ],
20
+ "exclusive": true,
21
+ "state": null,
22
+ "mcp_route": null
23
+ },
24
+ {
25
+ "id": "tfx-multi",
26
+ "patterns": [
27
+ {
28
+ "source": "(?<!\\b(?:my|the|our|omc|oh-my-claudecode)\\s)\\btfx[\\s-]?multi\\b",
29
+ "flags": "i"
30
+ }
31
+ ],
32
+ "skill": "tfx-multi",
33
+ "priority": 1,
34
+ "supersedes": [],
35
+ "exclusive": false,
36
+ "state": null,
37
+ "mcp_route": null
38
+ },
39
+ {
40
+ "id": "tfx-auto-codex",
41
+ "patterns": [
42
+ {
43
+ "source": "\\btfx[\\s-]?auto[\\s-]?codex\\b",
44
+ "flags": "i"
45
+ }
46
+ ],
47
+ "skill": "tfx-auto-codex",
48
+ "priority": 1,
49
+ "supersedes": [
50
+ "tfx-auto",
51
+ "tfx-codex"
52
+ ],
53
+ "exclusive": false,
54
+ "state": null,
55
+ "mcp_route": null
56
+ },
57
+ {
58
+ "id": "tfx-auto",
59
+ "patterns": [
60
+ {
61
+ "source": "\\btfx[\\s-]?auto\\b",
62
+ "flags": "i"
63
+ }
64
+ ],
65
+ "skill": "tfx-auto",
66
+ "priority": 2,
67
+ "supersedes": [],
68
+ "exclusive": false,
69
+ "state": null,
70
+ "mcp_route": null
71
+ },
72
+ {
73
+ "id": "tfx-codex",
74
+ "patterns": [
75
+ {
76
+ "source": "\\btfx[\\s-]?codex\\b",
77
+ "flags": "i"
78
+ }
79
+ ],
80
+ "skill": "tfx-codex",
81
+ "priority": 3,
82
+ "supersedes": [],
83
+ "exclusive": false,
84
+ "state": null,
85
+ "mcp_route": null
86
+ },
87
+ {
88
+ "id": "tfx-gemini",
89
+ "patterns": [
90
+ {
91
+ "source": "\\btfx[\\s-]?gemini\\b",
92
+ "flags": "i"
93
+ }
94
+ ],
95
+ "skill": "tfx-gemini",
96
+ "priority": 3,
97
+ "supersedes": [],
98
+ "exclusive": false,
99
+ "state": null,
100
+ "mcp_route": null
101
+ },
102
+ {
103
+ "id": "tfx-hub",
104
+ "patterns": [
105
+ {
106
+ "source": "\\btfx[\\s-]?hub\\b",
107
+ "flags": "i"
108
+ }
109
+ ],
110
+ "skill": "tfx-hub",
111
+ "priority": 2,
112
+ "supersedes": [],
113
+ "exclusive": false,
114
+ "state": null,
115
+ "mcp_route": null
116
+ },
117
+ {
118
+ "id": "tfx-doctor",
119
+ "patterns": [
120
+ {
121
+ "source": "\\btfx[\\s-]?doctor\\b",
122
+ "flags": "i"
123
+ }
124
+ ],
125
+ "skill": "tfx-doctor",
126
+ "priority": 2,
127
+ "supersedes": [],
128
+ "exclusive": false,
129
+ "state": null,
130
+ "mcp_route": null
131
+ },
132
+ {
133
+ "id": "tfx-setup",
134
+ "patterns": [
135
+ {
136
+ "source": "\\btfx[\\s-]?setup\\b",
137
+ "flags": "i"
138
+ }
139
+ ],
140
+ "skill": "tfx-setup",
141
+ "priority": 2,
142
+ "supersedes": [],
143
+ "exclusive": false,
144
+ "state": null,
145
+ "mcp_route": null
146
+ },
147
+ {
148
+ "id": "handoff-route",
149
+ "patterns": [
150
+ {
151
+ "source": "\\b(핸드오프|handoff|세션\\s*넘기)[\\s]*(생성|만들|써줘|작성|넘겨)",
152
+ "flags": "i"
153
+ }
154
+ ],
155
+ "skill": "mp",
156
+ "priority": 5,
157
+ "supersedes": [],
158
+ "exclusive": false,
159
+ "state": null,
160
+ "mcp_route": null
161
+ },
162
+ {
163
+ "id": "notion-route",
164
+ "patterns": [
165
+ {
166
+ "source": "\\b(노션|notion)[\\s-]?(페이지|글|조회|생성|수정|검색)\\b",
167
+ "flags": "i"
168
+ },
169
+ {
170
+ "source": "(노션|\\bnotion\\b)",
171
+ "flags": "i"
172
+ }
173
+ ],
174
+ "skill": null,
175
+ "priority": 10,
176
+ "supersedes": [],
177
+ "exclusive": false,
178
+ "state": null,
179
+ "mcp_route": "gemini"
180
+ },
181
+ {
182
+ "id": "chrome-route",
183
+ "patterns": [
184
+ {
185
+ "source": "\\b(크롬|chrome|브라우저)[\\s-]?(열|접속|로그인|navigate|click)\\b",
186
+ "flags": "i"
187
+ },
188
+ {
189
+ "source": "(크롬|\\bchrome\\b)",
190
+ "flags": "i"
191
+ }
192
+ ],
193
+ "skill": null,
194
+ "priority": 10,
195
+ "supersedes": [],
196
+ "exclusive": false,
197
+ "state": null,
198
+ "mcp_route": "gemini"
199
+ },
200
+ {
201
+ "id": "jira-route",
202
+ "patterns": [
203
+ {
204
+ "source": "\\b(jira|지라)[\\s-]?(이슈|티켓|생성|조회|스프린트)\\b",
205
+ "flags": "i"
206
+ },
207
+ {
208
+ "source": "(지라|\\bjira\\b)",
209
+ "flags": "i"
210
+ }
211
+ ],
212
+ "skill": null,
213
+ "priority": 10,
214
+ "supersedes": [],
215
+ "exclusive": false,
216
+ "state": null,
217
+ "mcp_route": "codex"
218
+ },
219
+ {
220
+ "id": "mail-route",
221
+ "patterns": [
222
+ {
223
+ "source": "\\b(메일|gmail|이메일)[\\s-]?(보내|읽|검색|draft)\\b",
224
+ "flags": "i"
225
+ },
226
+ {
227
+ "source": "(메일|이메일|\\bgmail\\b)",
228
+ "flags": "i"
229
+ }
230
+ ],
231
+ "skill": null,
232
+ "priority": 10,
233
+ "supersedes": [],
234
+ "exclusive": false,
235
+ "state": null,
236
+ "mcp_route": "gemini"
237
+ },
238
+ {
239
+ "id": "calendar-route",
240
+ "patterns": [
241
+ {
242
+ "source": "\\b(일정|캘린더|calendar)[\\s-]?(생성|조회|추가)\\b",
243
+ "flags": "i"
244
+ },
245
+ {
246
+ "source": "(일정|캘린더|\\bcalendar\\b)",
247
+ "flags": "i"
248
+ }
249
+ ],
250
+ "skill": null,
251
+ "priority": 10,
252
+ "supersedes": [],
253
+ "exclusive": false,
254
+ "state": null,
255
+ "mcp_route": "gemini"
256
+ },
257
+ {
258
+ "id": "playwright-route",
259
+ "patterns": [
260
+ {
261
+ "source": "\\b(playwright|브라우저\\s*테스트)\\b",
262
+ "flags": "i"
263
+ }
264
+ ],
265
+ "skill": null,
266
+ "priority": 10,
267
+ "supersedes": [],
268
+ "exclusive": false,
269
+ "state": null,
270
+ "mcp_route": "gemini"
271
+ },
272
+ {
273
+ "id": "canva-route",
274
+ "patterns": [
275
+ {
276
+ "source": "\\b(canva|캔바|디자인\\s*생성)\\b",
277
+ "flags": "i"
278
+ }
279
+ ],
280
+ "skill": null,
281
+ "priority": 10,
282
+ "supersedes": [],
283
+ "exclusive": false,
284
+ "state": null,
285
+ "mcp_route": "gemini"
286
+ },
287
+ {
288
+ "id": "confluence-route",
289
+ "patterns": [
290
+ {
291
+ "source": "\\b(confluence|위키|wiki)[\\s-]?(페이지|문서|조회|생성|수정|검색)\\b",
292
+ "flags": "i"
293
+ },
294
+ {
295
+ "source": "(위키|\\bconfluence\\b|\\bwiki\\b)",
296
+ "flags": "i"
297
+ }
298
+ ],
299
+ "skill": null,
300
+ "priority": 10,
301
+ "supersedes": [],
302
+ "exclusive": false,
303
+ "state": null,
304
+ "mcp_route": "gemini"
305
+ },
306
+ {
307
+ "id": "slack-route",
308
+ "patterns": [
309
+ {
310
+ "source": "\\b(slack|슬랙)[\\s-]?(메시지|채널|보내|읽|검색|알림)\\b",
311
+ "flags": "i"
312
+ },
313
+ {
314
+ "source": "(슬랙|\\bslack\\b)",
315
+ "flags": "i"
316
+ }
317
+ ],
318
+ "skill": null,
319
+ "priority": 10,
320
+ "supersedes": [],
321
+ "exclusive": false,
322
+ "state": null,
323
+ "mcp_route": "gemini"
324
+ },
325
+ {
326
+ "id": "github-route",
327
+ "patterns": [
328
+ {
329
+ "source": "\\b(github|깃허브)[\\s-]?(이슈|issue|PR|pull|커밋|commit|리포|repo)\\b",
330
+ "flags": "i"
331
+ },
332
+ {
333
+ "source": "(깃허브|\\bgithub\\b)",
334
+ "flags": "i"
335
+ }
336
+ ],
337
+ "skill": null,
338
+ "priority": 10,
339
+ "supersedes": [],
340
+ "exclusive": false,
341
+ "state": null,
342
+ "mcp_route": "codex"
343
+ },
344
+ {
345
+ "id": "suppress-omc-team",
346
+ "patterns": [
347
+ {
348
+ "source": "(?<!tfx[\\s-]?)(팀|\\bteam\\b)",
349
+ "flags": "i"
350
+ }
351
+ ],
352
+ "skill": null,
353
+ "action": "suppress_omc",
354
+ "priority": 20,
355
+ "supersedes": [],
356
+ "exclusive": false,
357
+ "state": null,
358
+ "mcp_route": null
359
+ }
360
+ ]
361
+ }