triflux 9.2.4 → 9.3.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/bin/triflux.mjs +15 -0
- package/package.json +1 -1
- package/skills/tfx-auto/SKILL.md +4 -1
- package/skills/tfx-auto-codex/SKILL.md +3 -1
- package/skills/tfx-autopilot/SKILL.md +1 -1
- package/skills/tfx-autoresearch/SKILL.md +2 -0
- package/skills/tfx-codex/SKILL.md +3 -1
- package/skills/tfx-consensus/SKILL.md +5 -3
- package/skills/tfx-fullcycle/SKILL.md +1 -1
- package/skills/tfx-gemini/SKILL.md +3 -1
- package/skills/tfx-hooks/SKILL.md +216 -0
- package/skills/tfx-multi/SKILL.md +4 -1
- package/skills/tfx-plan/SKILL.md +1 -1
- package/skills/tfx-ralph/SKILL.md +11 -66
- package/skills/tfx-review/SKILL.md +1 -1
package/bin/triflux.mjs
CHANGED
|
@@ -876,6 +876,21 @@ function cmdSetup(options = {}) {
|
|
|
876
876
|
skillCount++;
|
|
877
877
|
}
|
|
878
878
|
}
|
|
879
|
+
// references/ 디렉토리 동기화 (존재하면)
|
|
880
|
+
const refSrc = join(skillsSrc, name, "references");
|
|
881
|
+
const refDst = join(skillsDst, name, "references");
|
|
882
|
+
if (existsSync(refSrc)) {
|
|
883
|
+
mkdirSync(refDst, { recursive: true });
|
|
884
|
+
for (const refFile of readdirSync(refSrc)) {
|
|
885
|
+
const rSrc = join(refSrc, refFile);
|
|
886
|
+
const rDst = join(refDst, refFile);
|
|
887
|
+
if (statSync(rSrc).isFile()) {
|
|
888
|
+
if (!existsSync(rDst) || readFileSync(rSrc, "utf8") !== readFileSync(rDst, "utf8")) {
|
|
889
|
+
copyFileSync(rSrc, rDst);
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
}
|
|
879
894
|
}
|
|
880
895
|
for (const { alias, source } of SKILL_ALIASES) {
|
|
881
896
|
const srcDir = join(skillsSrc, source);
|
package/package.json
CHANGED
package/skills/tfx-auto/SKILL.md
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-auto
|
|
3
|
-
description:
|
|
3
|
+
description: >
|
|
4
|
+
통합 CLI 오케스트레이터. 커맨드 숏컷(단일) + 자동 분류/분해(병렬) + 수동 병렬. tfx-route.sh 기반.
|
|
5
|
+
'코드 짜줘', '구현해줘', '만들어줘', '수정해줘', '고쳐줘', 'implement', 'build', 'fix' 같은
|
|
6
|
+
구현/수정 요청에 사용. CLI 라우팅이 필요한 모든 작업에 적극 활용.
|
|
4
7
|
triggers:
|
|
5
8
|
- tfx-auto
|
|
6
9
|
- implement
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-auto-codex
|
|
3
|
-
description:
|
|
3
|
+
description: >
|
|
4
|
+
Codex 리드형 tfx-auto. Claude 네이티브 역할을 Codex로 치환하고 Gemini 사용은 유지합니다.
|
|
5
|
+
'코덱스 리드', '코덱스가 주도', 'codex lead' 같은 요청에 사용.
|
|
4
6
|
triggers:
|
|
5
7
|
- tfx-auto-codex
|
|
6
8
|
argument-hint: "\"작업 설명\" | N:agent_type \"작업 설명\""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-autopilot
|
|
3
|
-
description: "간단한 작업을
|
|
3
|
+
description: "단일 파일/모듈 수준의 간단한 작업을 자율 구현할 때 사용한다. 구현+검증까지 5분 이내 완료 가능한 작업, '간단히', '빠르게', '하나만', '자동으로', '알아서 해', '그냥 해줘' 같은 수식어가 있을 때 사용. 복잡한 멀티파일 작업은 tfx-fullcycle을 사용하세요."
|
|
4
4
|
triggers:
|
|
5
5
|
- autopilot
|
|
6
6
|
- 자동
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-codex
|
|
3
|
-
description:
|
|
3
|
+
description: >
|
|
4
|
+
Codex-Only 오케스트레이터. tfx-auto 워크플로우를 Codex 전용으로 고정합니다.
|
|
5
|
+
'코덱스로 해줘', '코덱스한테 시켜', 'codex로', 'Codex 전용' 같은 요청에 반드시 사용.
|
|
4
6
|
triggers:
|
|
5
7
|
- tfx-codex
|
|
6
8
|
argument-hint: "\"작업 설명\" | N:codex \"작업 설명\""
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-consensus
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
description: >
|
|
4
|
+
3자 합의 엔진 — 모든 Deep 스킬의 핵심 인프라. Claude/Codex/Gemini 독립 분석 결과를 교차검증하여 편향 없는 합의를 도출한다.
|
|
5
|
+
독립 실행도 가능: '합의로 분석해', '3자 합의', 'consensus' 같은 요청 시 직접 호출 가능.
|
|
6
|
+
triggers: [consensus, 합의]
|
|
7
|
+
argument-hint: "<분석 주제 또는 컨텍스트> (Deep 스킬 내부 자동 호출 또는 직접 사용 가능)"
|
|
6
8
|
---
|
|
7
9
|
|
|
8
10
|
# tfx-consensus — Tri-CLI Consensus Engine
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-fullcycle
|
|
3
|
-
description: "복잡한 기능을 처음부터 끝까지 자율
|
|
3
|
+
description: "여러 파일/모듈에 걸친 복잡한 기능을 처음부터 끝까지 자율 개발할 때 사용한다. 설계→계획→구현→QA→검증 전체 파이프라인이 필요한 작업, '처음부터 끝까지', '전체', '완전히', '풀 오토', 'full auto', '전체 파이프라인으로' 같은 수식어가 있을 때 사용. 단순 단일 작업은 tfx-autopilot이 더 빠릅니다."
|
|
4
4
|
triggers:
|
|
5
5
|
- deep autopilot
|
|
6
6
|
- 풀 오토
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-gemini
|
|
3
|
-
description:
|
|
3
|
+
description: >
|
|
4
|
+
Gemini-Only 오케스트레이터. tfx-auto 워크플로우를 Gemini 전용으로 고정합니다.
|
|
5
|
+
'제미나이로 해줘', '제미나이한테 시켜', 'gemini로', 'Gemini 전용' 같은 요청에 반드시 사용.
|
|
4
6
|
triggers:
|
|
5
7
|
- tfx-gemini
|
|
6
8
|
argument-hint: "\"작업 설명\" | N:gemini \"작업 설명\""
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tfx-hooks
|
|
3
|
+
description: >
|
|
4
|
+
Claude Code 훅 우선순위 관리자. AskUserQuestion 기반 인터랙티브 UI로
|
|
5
|
+
훅 스캔, 우선순위 조정, 오케스트레이터 적용/복원, 개별 훅 토글을 수행합니다.
|
|
6
|
+
사용자가 훅, hooks, 훅 관리, hook priority, 훅 우선순위, 오케스트레이터,
|
|
7
|
+
orchestrator, 훅 설정, hook 설정, 훅 순서, hook order를 언급할 때마다
|
|
8
|
+
반드시 이 스킬을 사용하세요.
|
|
9
|
+
Use when: hooks, 훅, hook priority, 훅 관리, orchestrator, 오케스트레이터, 훅 설정, 훅 순서
|
|
10
|
+
triggers:
|
|
11
|
+
- tfx-hooks
|
|
12
|
+
argument-hint: "[scan|apply|restore]"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# tfx-hooks — 훅 우선순위 관리자
|
|
16
|
+
|
|
17
|
+
> Claude Code 훅의 실행 순서를 관리합니다. triflux 훅이 항상 최우선 실행되도록 보장합니다.
|
|
18
|
+
|
|
19
|
+
## 핵심 개념
|
|
20
|
+
|
|
21
|
+
Claude Code는 같은 이벤트에 매칭된 훅을 **병렬 실행**합니다. 순서 보장이 불가능합니다.
|
|
22
|
+
triflux의 **hook-orchestrator**는 이벤트당 하나의 진입점을 두고, 내부에서 **우선순위대로 순차 실행**합니다.
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
settings.json → hook-orchestrator.mjs (단일 진입점)
|
|
26
|
+
↓ hook-registry.json 읽기
|
|
27
|
+
↓ priority 순 정렬
|
|
28
|
+
1. triflux 훅 (priority=0)
|
|
29
|
+
2. OMC 훅 (priority=50)
|
|
30
|
+
3. 외부 훅 (priority=100)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 워크플로우
|
|
34
|
+
|
|
35
|
+
### Step 1: 현재 상태 확인
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
Bash("node hooks/hook-manager.mjs status")
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
결과 JSON에서 `orchestrated` 필드로 적용 여부를 판단한다.
|
|
42
|
+
|
|
43
|
+
### Step 2: 메인 메뉴 (AskUserQuestion)
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
question: "훅 관리 — 어떤 작업을 수행하시겠습니까?"
|
|
47
|
+
header: "Hook Manager"
|
|
48
|
+
options:
|
|
49
|
+
- label: "현재 상태 보기"
|
|
50
|
+
description: "settings.json 훅 스캔 + 오케스트레이터 적용 상태"
|
|
51
|
+
- label: "오케스트레이터 적용"
|
|
52
|
+
description: "모든 훅을 통합 — triflux 최우선 실행 보장"
|
|
53
|
+
- label: "변경점 미리보기 (diff)"
|
|
54
|
+
description: "적용 시 어떻게 바뀌는지 확인"
|
|
55
|
+
- label: "원래대로 복원"
|
|
56
|
+
description: "오케스트레이터 제거, 원래 settings.json 훅으로 복원"
|
|
57
|
+
- label: "개별 훅 관리"
|
|
58
|
+
description: "특정 훅 활성/비활성, 우선순위 변경"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Step 3: 선택에 따른 분기
|
|
62
|
+
|
|
63
|
+
#### "현재 상태 보기"
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
Bash("node hooks/hook-manager.mjs scan")
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
결과 JSON을 파싱하여 테이블로 표시:
|
|
70
|
+
|
|
71
|
+
```markdown
|
|
72
|
+
## 현재 훅 상태
|
|
73
|
+
|
|
74
|
+
| 이벤트 | 훅 수 | 소스 |
|
|
75
|
+
|--------|-------|------|
|
|
76
|
+
| SessionStart | 4 | triflux(3), session-vault(1) |
|
|
77
|
+
| PreToolUse | 3 | triflux(1), omc(2) |
|
|
78
|
+
| ... | ... | ... |
|
|
79
|
+
|
|
80
|
+
오케스트레이터: ❌ 미적용 / ✅ 적용됨 (N개 이벤트)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### "오케스트레이터 적용"
|
|
84
|
+
|
|
85
|
+
먼저 diff를 보여준 후 확인:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
Bash("node hooks/hook-manager.mjs diff")
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
결과를 표시한 뒤 AskUserQuestion:
|
|
92
|
+
```
|
|
93
|
+
question: "위 변경을 적용하시겠습니까?"
|
|
94
|
+
header: "확인"
|
|
95
|
+
options:
|
|
96
|
+
- label: "적용"
|
|
97
|
+
description: "settings.json 백업 후 오케스트레이터 적용"
|
|
98
|
+
- label: "취소"
|
|
99
|
+
description: "변경 없이 돌아가기"
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
"적용" 선택 시:
|
|
103
|
+
```bash
|
|
104
|
+
Bash("node hooks/hook-manager.mjs apply")
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
적용 결과 표시:
|
|
108
|
+
```
|
|
109
|
+
✅ 오케스트레이터 적용 완료
|
|
110
|
+
N개 이벤트 → 1개 오케스트레이터로 통합
|
|
111
|
+
실행 순서: triflux(0) → OMC(50) → external(100)
|
|
112
|
+
복원: /tfx-hooks → 원래대로 복원
|
|
113
|
+
또는: triflux hooks restore
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
#### "변경점 미리보기 (diff)"
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
Bash("node hooks/hook-manager.mjs diff")
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
결과를 테이블로 표시:
|
|
123
|
+
```markdown
|
|
124
|
+
| 이벤트 | 현재 | 적용 후 | 변경 |
|
|
125
|
+
|--------|------|---------|------|
|
|
126
|
+
| PreToolUse | 2개 개별 | 1개 오케스트레이터 (내부 4개) | 교체 |
|
|
127
|
+
| PostToolUse | 없음 | 1개 오케스트레이터 (내부 1개) | 신규 |
|
|
128
|
+
| ... | ... | ... | ... |
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### "원래대로 복원"
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
Bash("node hooks/hook-manager.mjs restore")
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
결과에서 status를 확인:
|
|
138
|
+
- `"restored"` → "✅ 원래 훅 설정이 복원되었습니다."
|
|
139
|
+
- `"no_backup"` → "⚠️ 백업이 없습니다. 오케스트레이터를 적용한 적이 없습니다."
|
|
140
|
+
|
|
141
|
+
#### "개별 훅 관리"
|
|
142
|
+
|
|
143
|
+
레지스트리에서 전체 훅 목록을 읽어 표시:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
Bash("node -e \"const r=JSON.parse(require('fs').readFileSync('hooks/hook-registry.json','utf8')); const all=[]; for(const [e,hs] of Object.entries(r.events)) hs.forEach(h=>all.push({event:e,...h})); console.log(JSON.stringify(all))\"")
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
결과를 테이블로 표시 후 AskUserQuestion:
|
|
150
|
+
```
|
|
151
|
+
question: "어떤 훅을 관리하시겠습니까?"
|
|
152
|
+
header: "훅 선택"
|
|
153
|
+
options:
|
|
154
|
+
(레지스트리의 각 훅을 옵션으로 나열)
|
|
155
|
+
- label: "tfx-safety-guard"
|
|
156
|
+
description: "[PreToolUse:Bash] 위험 명령 차단 — priority:0, 활성"
|
|
157
|
+
- label: "tfx-agent-route-guard"
|
|
158
|
+
description: "[PreToolUse:Agent] 에이전트 라우팅 — priority:0, 활성"
|
|
159
|
+
- label: "omc-headless-guard"
|
|
160
|
+
description: "[PreToolUse:Bash|Agent] headless 가드 — priority:50, 활성"
|
|
161
|
+
...
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
훅 선택 후 AskUserQuestion:
|
|
165
|
+
```
|
|
166
|
+
question: "{hookId} — 어떤 조작을 하시겠습니까?"
|
|
167
|
+
header: "훅 조작"
|
|
168
|
+
options:
|
|
169
|
+
- label: "활성/비활성 토글"
|
|
170
|
+
description: "현재: 활성 → 비활성으로 전환"
|
|
171
|
+
- label: "우선순위 변경"
|
|
172
|
+
description: "현재: 0 — 숫자가 낮을수록 먼저 실행"
|
|
173
|
+
- label: "뒤로"
|
|
174
|
+
description: "훅 목록으로 돌아가기"
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
"활성/비활성 토글":
|
|
178
|
+
```bash
|
|
179
|
+
Bash("node hooks/hook-manager.mjs toggle {hookId}")
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
"우선순위 변경":
|
|
183
|
+
AskUserQuestion으로 새 우선순위 입력:
|
|
184
|
+
```
|
|
185
|
+
question: "새 우선순위를 입력하세요 (0=최우선, 50=중간, 100=후순위)"
|
|
186
|
+
header: "Priority"
|
|
187
|
+
```
|
|
188
|
+
```bash
|
|
189
|
+
Bash("node hooks/hook-manager.mjs set-priority {hookId} {newPriority}")
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
변경 후 오케스트레이터가 적용된 상태라면 재적용 안내:
|
|
193
|
+
```
|
|
194
|
+
💡 레지스트리가 변경되었습니다. 오케스트레이터는 실시간으로 레지스트리를 읽으므로 재적용 불필요합니다.
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## CLI 대응
|
|
198
|
+
|
|
199
|
+
| 스킬 UI | CLI 명령 |
|
|
200
|
+
|---------|---------|
|
|
201
|
+
| 현재 상태 보기 | `triflux hooks scan` |
|
|
202
|
+
| 오케스트레이터 적용 | `triflux hooks apply` |
|
|
203
|
+
| 변경점 미리보기 | `triflux hooks diff` |
|
|
204
|
+
| 원래대로 복원 | `triflux hooks restore` |
|
|
205
|
+
| 상태 확인 | `triflux hooks status` |
|
|
206
|
+
| 훅 토글 | `triflux hooks toggle <hookId>` |
|
|
207
|
+
| 우선순위 변경 | `triflux hooks set-priority <hookId> <priority>` |
|
|
208
|
+
|
|
209
|
+
## 에러 처리
|
|
210
|
+
|
|
211
|
+
| 상황 | 처리 |
|
|
212
|
+
|------|------|
|
|
213
|
+
| hook-registry.json 없음 | "레지스트리가 없습니다. triflux hooks 디렉토리를 확인하세요." |
|
|
214
|
+
| settings.json 파싱 실패 | "settings.json이 손상되었습니다. 수동 확인이 필요합니다." |
|
|
215
|
+
| 백업 없이 복원 시도 | "오케스트레이터를 적용한 적이 없어 복원할 수 없습니다." |
|
|
216
|
+
| hook-manager.mjs 실행 실패 | "hook-manager를 실행할 수 없습니다. node hooks/hook-manager.mjs를 직접 실행해 보세요." |
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-multi
|
|
3
|
-
description:
|
|
3
|
+
description: >
|
|
4
|
+
멀티-CLI 팀 모드. Claude Native Agent Teams + Codex/Gemini 멀티모델 오케스트레이션.
|
|
5
|
+
'멀티로', '팀 모드', '다중 CLI', '3개 다 동원', 'multi' 같은 요청에 반드시 사용.
|
|
6
|
+
Claude+Codex+Gemini 협업이 필요한 모든 상황에 적극 활용.
|
|
4
7
|
triggers:
|
|
5
8
|
- tfx-multi
|
|
6
9
|
argument-hint: '"작업 설명" | --agents codex,gemini "작업" | --tmux "작업" | status | stop'
|
package/skills/tfx-plan/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-plan
|
|
3
|
-
description: "구현 계획이 필요할 때 사용한다. '계획 세워줘', 'plan', '플랜', '어떻게 구현하지', '태스크 분해', '작업 순서' 같은 요청에 반드시 사용. 기능 구현 전 영향 범위 파악과 태스크 분해가 필요할 때 적극 활용."
|
|
3
|
+
description: "구현 계획이 필요할 때 사용한다. '계획 세워줘', 'plan', '플랜', '어떻게 구현하지', '태스크 분해', '작업 순서' 같은 요청에 반드시 사용. 기능 구현 전 영향 범위 파악과 태스크 분해가 필요할 때 적극 활용. 작업 분해, 순서 정리, '어떤 순서로', '먼저 뭐 해야', 'breakdown', 'decompose', 'task list' 같은 요청에도 적극 활용. 단순 계획은 이 스킬, 3자 합의 계획은 tfx-deep-plan을 사용."
|
|
4
4
|
triggers:
|
|
5
5
|
- plan
|
|
6
6
|
- 계획
|
|
@@ -1,78 +1,23 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-ralph
|
|
3
|
-
description:
|
|
3
|
+
description: >
|
|
4
|
+
tfx-persist의 별칭(alias). 'ralph', '끝까지 해', '멈추지 마' 같은 요청에 사용.
|
|
5
|
+
실제 동작은 tfx-persist 스킬이 수행합니다.
|
|
6
|
+
Use when: ralph, 끝까지, don't stop, 멈추지 마
|
|
4
7
|
triggers:
|
|
5
8
|
- tfx-ralph
|
|
6
|
-
|
|
9
|
+
- ralph
|
|
7
10
|
---
|
|
8
11
|
|
|
9
|
-
# tfx-ralph —
|
|
12
|
+
# tfx-ralph — tfx-persist 별칭
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
> `tfx-ralph`는 `tfx-persist`의 alias이다. 동일한 Tri-Verified Persistence Loop을 실행한다.
|
|
13
|
-
> The boulder never stops — but it stops being wrong.
|
|
14
|
+
이 스킬은 `tfx-persist`와 동일합니다. `/tfx-persist` 스킬을 호출하세요.
|
|
14
15
|
|
|
15
|
-
##
|
|
16
|
-
|
|
17
|
-
이 스킬은 `tfx-persist`와 **완전히 동일한 실행 흐름**을 공유한다:
|
|
18
|
-
|
|
19
|
-
1. **동일한 headless multi 경로** — `tfx multi --teammate-mode headless` 기반 3자 검증
|
|
20
|
-
2. **동일한 degradation 체인** — Tier 1 (전체 가용) → Tier 2 (부분 가용) → Tier 3 (Claude only)
|
|
21
|
-
3. **동일한 워크플로우** — Goal Definition → Execution Loop → Final Verification → Deslop Pass
|
|
22
|
-
|
|
23
|
-
## 전제조건 프로브 및 Tier Degradation
|
|
24
|
-
|
|
25
|
-
> **진입 즉시 실행** — 10초 내 가시적 출력을 보장한다. 빈 stdout + exit 0 **금지**.
|
|
26
|
-
|
|
27
|
-
### 환경 프로브
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
psmux --version 2>/dev/null && \
|
|
31
|
-
curl -sf http://127.0.0.1:27888/status >/dev/null && \
|
|
32
|
-
codex --version 2>/dev/null && \
|
|
33
|
-
gemini --version 2>/dev/null
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### Tier 판정
|
|
37
|
-
|
|
38
|
-
| Tier | 조건 | 실행 방식 |
|
|
39
|
-
|------|------|----------|
|
|
40
|
-
| **Tier 1** | psmux + Hub + Codex + Gemini 전부 정상 | 기존 headless multi (변경 없음) |
|
|
41
|
-
| **Tier 2** | 일부 CLI만 가용 (Codex 또는 Gemini 중 하나) | 가용 CLI + Claude Agent 조합 |
|
|
42
|
-
| **Tier 3** | headless 불가 또는 `claude -p` one-shot | Claude Agent only |
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
IF claude -p (one-shot 모드):
|
|
46
|
-
→ Tier 3 즉시 fallback
|
|
47
|
-
|
|
48
|
-
IF psmux 없음 OR Hub 미응답:
|
|
49
|
-
→ Tier 3
|
|
50
|
-
|
|
51
|
-
IF Codex 없음 AND Gemini 없음:
|
|
52
|
-
→ Tier 3
|
|
53
|
-
|
|
54
|
-
IF Codex 없음 OR Gemini 없음:
|
|
55
|
-
→ Tier 2
|
|
56
|
-
|
|
57
|
-
ELSE:
|
|
58
|
-
→ Tier 1
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### Tier 3 진입 시 필수 출력
|
|
62
|
-
|
|
63
|
-
```
|
|
64
|
-
⚠ [Tier 3] headless multi 환경 미충족 — single-model 모드로 실행합니다 (consensus 미적용)
|
|
65
|
-
누락: {missing_components}
|
|
66
|
-
권장: psmux, Hub, Codex CLI, Gemini CLI 설치 후 재실행
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
Tier 3에서는 모든 headless dispatch(`tfx multi ...`)를 **Claude Agent**(subagent)로 대체한다.
|
|
70
|
-
Tier 2에서는 누락된 CLI만 Claude Agent로 대체한다.
|
|
71
|
-
|
|
72
|
-
## 라우팅
|
|
16
|
+
## 동작
|
|
73
17
|
|
|
18
|
+
Skill 도구로 tfx-persist를 호출한다:
|
|
74
19
|
```
|
|
75
|
-
|
|
20
|
+
Skill: tfx-persist
|
|
76
21
|
```
|
|
77
22
|
|
|
78
|
-
|
|
23
|
+
사용자의 원래 요청을 그대로 전달한다.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-review
|
|
3
|
-
description: "코드 리뷰가 필요할 때 사용한다. 'review', '리뷰해줘', '코드 봐줘', '이거 괜찮아?', 'PR 리뷰', '변경사항 확인' 같은 요청에 반드시 사용. git diff, 특정 파일, 또는 최근 변경에 대한 빠른 피드백이 필요할 때 적극 활용."
|
|
3
|
+
description: "코드 리뷰가 필요할 때 사용한다. 'review', '리뷰해줘', '코드 봐줘', '이거 괜찮아?', 'PR 리뷰', '변경사항 확인' 같은 요청에 반드시 사용. git diff, 특정 파일, 또는 최근 변경에 대한 빠른 피드백이 필요할 때 적극 활용. 코드 변경사항 확인, '이거 문제 없어?', 'looks good?', 'LGTM?', '머지해도 될까' 같은 요청에도 적극 활용. 꼼꼼한 심층 리뷰는 tfx-deep-review를 사용."
|
|
4
4
|
triggers:
|
|
5
5
|
- review
|
|
6
6
|
- 리뷰
|