triflux 9.2.1 → 9.2.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/bin/triflux.mjs CHANGED
@@ -20,7 +20,7 @@ const CODEX_CONFIG_PATH = join(CODEX_DIR, "config.toml");
20
20
  const PKG = JSON.parse(readFileSync(join(PKG_ROOT, "package.json"), "utf8"));
21
21
 
22
22
  // 이 배열에 포함된 버전에서만 star prompt를 표시한다 (빈 배열 = 모든 버전에서 표시)
23
- const STAR_PROMPT_VERSIONS = ["9.2.1"];
23
+ const STAR_PROMPT_VERSIONS = [];
24
24
 
25
25
  const REQUIRED_CODEX_PROFILES = [
26
26
  {
@@ -825,7 +825,7 @@ function buildSetupDryRunPlan() {
825
825
  }
826
826
 
827
827
  function cmdSetup(options = {}) {
828
- const { dryRun = false, fromUpdate = false } = options;
828
+ const { dryRun = false } = options;
829
829
  if (dryRun) {
830
830
  printJson(buildSetupDryRunPlan());
831
831
  return;
@@ -979,7 +979,7 @@ function cmdSetup(options = {}) {
979
979
  }
980
980
 
981
981
  // Star request (버전 게이팅)
982
- const showStar = !fromUpdate && (STAR_PROMPT_VERSIONS.length === 0 || STAR_PROMPT_VERSIONS.includes(PKG.version));
982
+ const showStar = STAR_PROMPT_VERSIONS.length === 0 || STAR_PROMPT_VERSIONS.includes(PKG.version);
983
983
  if (showStar) {
984
984
  try {
985
985
  execFileSync("gh", ["auth", "status"], { timeout: 5000, stdio: ["pipe", "pipe", "pipe"] });
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ // PreToolUse:Agent hook — triflux 프로젝트 기본 에이전트 라우팅
3
+ // 특정 시스템을 차단하지 않고, triflux의 의도를 context로 주입
4
+
5
+ console.log(
6
+ "triflux 프로젝트 기본: Agent spawn 시 subagent_type='general-purpose'를 사용하세요. " +
7
+ "프로젝트 스킬(tfx-*)이 활성 상태이면 스킬 MD의 라우팅 지시를 우선합니다."
8
+ );
package/hooks/hooks.json CHANGED
@@ -40,6 +40,18 @@
40
40
  ]
41
41
  }
42
42
  ],
43
+ "PreToolUse": [
44
+ {
45
+ "matcher": "Agent",
46
+ "hooks": [
47
+ {
48
+ "type": "command",
49
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/agent-route-guard.mjs\"",
50
+ "timeout": 3
51
+ }
52
+ ]
53
+ }
54
+ ],
43
55
  "Stop": [
44
56
  {
45
57
  "matcher": "*",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "triflux",
3
- "version": "9.2.1",
3
+ "version": "9.2.2",
4
4
  "description": "CLI-first multi-model orchestrator for Claude Code — route tasks to Codex, Gemini, and Claude",
5
5
  "type": "module",
6
6
  "bin": {
@@ -25,6 +25,24 @@ argument-hint: "<topic>"
25
25
  /딥인터뷰 데이터 파이프라인 설계
26
26
  ```
27
27
 
28
+ ## 위임 패턴
29
+
30
+ Claude 토큰을 절약하기 위해 분석 작업은 Gemini CLI에 위임합니다.
31
+
32
+ - **Claude 담당**: AskUserQuestion (사용자 상호작용), 산출물 저장
33
+ - **Gemini 담당**: 질문 생성, 응답 분석, 종합 문서 초안 작성
34
+
35
+ 각 단계에서 Claude는 누적 컨텍스트를 Gemini에 전달하고, Gemini가 반환한 질문을 AskUserQuestion으로 사용자에게 제시합니다. 사용자 답변은 다음 단계 Gemini 호출의 입력으로 전달됩니다.
36
+
37
+ **Fallback**: Gemini 호출이 실패하면 Claude Opus가 모든 분석을 직접 수행합니다 (원래 동작 유지).
38
+
39
+ ## 토큰 예산
40
+
41
+ | 담당 | 토큰 | 역할 |
42
+ |------|------|------|
43
+ | Claude | ~2K | 오케스트레이션 + AskUserQuestion만 |
44
+ | Gemini | ~10K | 분석 + 질문 생성 + 문서 초안 |
45
+
28
46
  ## 5단계 인터뷰 프로세스
29
47
 
30
48
  인터뷰는 반드시 아래 5단계를 순서대로 진행합니다. 각 단계에서 사용자 응답을 수집한 후 다음 단계로 이동합니다.
@@ -35,7 +53,15 @@ argument-hint: "<topic>"
35
53
 
36
54
  목표를 한 문장으로 정의하고, 성공 기준과 현재 상태의 차이를 파악합니다.
37
55
 
38
- **질문 템플릿:**
56
+ **단계 진입 시 Gemini 위임:**
57
+
58
+ ```
59
+ Bash("bash scripts/tfx-route.sh gemini exec 'Deep interview Stage 1: Clarify. Topic: {topic}. Previous answers: none. Generate 3 probing questions for this stage and analyze prior responses. Return JSON: {analysis, questions, key_insights}'")
60
+ ```
61
+
62
+ Gemini가 반환한 `questions` 배열을 AskUserQuestion으로 사용자에게 제시합니다.
63
+
64
+ **질문 템플릿 (Gemini 실패 시 Fallback):**
39
65
 
40
66
  1. "이 작업의 핵심 목표를 한 문장으로 설명해주세요."
41
67
  2. "완료 후 어떤 상태가 되어야 성공인가요?"
@@ -47,7 +73,15 @@ argument-hint: "<topic>"
47
73
 
48
74
  대상을 3-5개의 독립적 하위 문제로 분해하고, 의존성과 우선순위를 결정합니다.
49
75
 
50
- **질문 템플릿:**
76
+ **단계 진입 시 Gemini 위임:**
77
+
78
+ ```
79
+ Bash("bash scripts/tfx-route.sh gemini exec 'Deep interview Stage 2: Decompose. Topic: {topic}. Previous answers: {stage1_answers}. Generate 3 probing questions for this stage and analyze prior responses. Return JSON: {analysis, questions, key_insights}'")
80
+ ```
81
+
82
+ Gemini가 반환한 `questions` 배열을 AskUserQuestion으로 사용자에게 제시합니다.
83
+
84
+ **질문 템플릿 (Gemini 실패 시 Fallback):**
51
85
 
52
86
  1. "이 작업을 3-5개의 독립된 단계로 나눈다면?"
53
87
  2. "각 단계 사이에 의존성이 있나요?"
@@ -59,7 +93,15 @@ argument-hint: "<topic>"
59
93
 
60
94
  선택한 접근 방식의 단점을 식별하고, 실패 시나리오와 기술 부채 가능성을 탐색합니다.
61
95
 
62
- **질문 템플릿:**
96
+ **단계 진입 시 Gemini 위임:**
97
+
98
+ ```
99
+ Bash("bash scripts/tfx-route.sh gemini exec 'Deep interview Stage 3: Challenge. Topic: {topic}. Previous answers: {stage1_answers} {stage2_answers}. Generate 3 probing questions for this stage and analyze prior responses. Return JSON: {analysis, questions, key_insights}'")
100
+ ```
101
+
102
+ Gemini가 반환한 `questions` 배열을 AskUserQuestion으로 사용자에게 제시합니다.
103
+
104
+ **질문 템플릿 (Gemini 실패 시 Fallback):**
63
105
 
64
106
  1. "이 방식이 실패할 수 있는 시나리오는?"
65
107
  2. "6개월 후 이 코드를 유지보수할 때 문제가 될 부분은?"
@@ -71,7 +113,15 @@ argument-hint: "<topic>"
71
113
 
72
114
  최소 2개의 대안을 검토하고, 각 대안의 trade-off를 비교합니다.
73
115
 
74
- **질문 템플릿:**
116
+ **단계 진입 시 Gemini 위임:**
117
+
118
+ ```
119
+ Bash("bash scripts/tfx-route.sh gemini exec 'Deep interview Stage 4: Alternatives. Topic: {topic}. Previous answers: {stage1_answers} {stage2_answers} {stage3_answers}. Generate 3 probing questions for this stage and analyze prior responses. Return JSON: {analysis, questions, key_insights}'")
120
+ ```
121
+
122
+ Gemini가 반환한 `questions` 배열을 AskUserQuestion으로 사용자에게 제시합니다.
123
+
124
+ **질문 템플릿 (Gemini 실패 시 Fallback):**
75
125
 
76
126
  1. "같은 목표를 달성할 수 있는 완전히 다른 접근은?"
77
127
  2. "시간이 절반밖에 없다면 어떤 방식을 택하겠습니까?"
@@ -83,7 +133,15 @@ argument-hint: "<topic>"
83
133
 
84
134
  인터뷰 결과를 종합하여 실행 계획을 도출하고, 구조화된 요구사항 문서를 생성합니다.
85
135
 
86
- **질문 템플릿:**
136
+ **단계 진입 시 Gemini 위임:**
137
+
138
+ ```
139
+ Bash("bash scripts/tfx-route.sh gemini exec 'Deep interview Stage 5: Synthesize. Topic: {topic}. Previous answers: {stage1_answers} {stage2_answers} {stage3_answers} {stage4_answers}. Generate 3 probing questions for this stage and analyze prior responses. Return JSON: {analysis, questions, key_insights}'")
140
+ ```
141
+
142
+ Gemini가 반환한 `questions` 배열을 AskUserQuestion으로 사용자에게 제시합니다.
143
+
144
+ **질문 템플릿 (Gemini 실패 시 Fallback):**
87
145
 
88
146
  1. "지금까지의 논의를 종합하면, 최적의 접근 방식은?"
89
147
  2. "첫 번째 단계로 무엇을 실행하시겠습니까?"
@@ -91,7 +149,15 @@ argument-hint: "<topic>"
91
149
 
92
150
  ## 산출물
93
151
 
94
- 인터뷰 완료 후 `.tfx/plans/interview-{timestamp}.md` 경로에 구조화된 요구사항 문서를 생성합니다.
152
+ 인터뷰 완료 후 Gemini가 전체 인터뷰 문서 초안을 생성하고, Claude가 Write 툴로 `.tfx/plans/interview-{timestamp}.md`에 저장합니다.
153
+
154
+ **산출물 생성 Gemini 위임:**
155
+
156
+ ```
157
+ Bash("bash scripts/tfx-route.sh gemini exec 'Deep interview complete. Topic: {topic}. All answers: {all_answers}. Generate a structured requirements document draft. Return the full markdown document.'")
158
+ ```
159
+
160
+ Gemini 실패 시 Claude가 직접 아래 형식으로 문서를 작성합니다.
95
161
 
96
162
  ### 산출물 형식
97
163
 
@@ -13,6 +13,8 @@ argument-hint: "[--update] [경로]"
13
13
 
14
14
  > SuperClaude index-repo 오마주. 1회 2K 토큰으로 인덱스 생성, 이후 세션마다 55K 토큰 절감.
15
15
 
16
+ > **Gemini 위임**: 스캔 + 인덱스 생성 작업은 Gemini CLI에 위임한다. Claude는 모드 선택(Step 0)과 파일 쓰기만 담당. Claude 토큰 소비 ~500 tokens으로 줄어든다.
17
+
16
18
  ## 원리
17
19
 
18
20
  매 세션마다 프로젝트 구조를 파악하려면 수십 개 파일을 읽어야 한다 (~58K tokens).
@@ -40,102 +42,65 @@ AskUserQuestion:
40
42
 
41
43
  `--update` 플래그나 경로 인자가 이미 제공된 경우 이 단계를 건너뛴다.
42
44
 
43
- ### Step 1: 파일 트리 스캔
44
-
45
- ```
46
- 병렬 Glob으로 전체 파일 트리 수집:
47
- - **/*.{ts,js,mjs,tsx,jsx,py,go,rs,java} (소스)
48
- - **/*.{md,json,yaml,toml} (설정/문서)
49
- - **/package.json, **/tsconfig.json (프로젝트 메타)
50
-
51
- 제외:
52
- - node_modules/, .git/, dist/, build/, coverage/
53
- - *.lock, *.log, *.map
54
- ```
55
-
56
- ### Step 2: 메타데이터 추출 (병렬)
57
-
58
- 각 소스 파일에서 핵심 메타데이터만 추출 (전체 읽기 금지):
45
+ ### Step 1: Gemini에 스캔 + 인덱스 생성 위임
59
46
 
60
- ```
61
- 파일당 추출 항목:
62
- - exports (함수, 클래스, 상수 이름)
63
- - imports (의존성)
64
- - 파일 크기 (라인 수)
65
- - 주요 패턴 (테스트? 설정? 컴포넌트? 유틸?)
47
+ Claude는 프로젝트 경로와 모드를 Gemini에 전달하고, Gemini가 파일 트리 스캔·메타데이터 추출·인덱스 생성을 모두 수행한다.
66
48
 
67
- 추출 방법:
68
- - Grep으로 export/import 문 추출 (파일당 ~20줄만)
69
- - 전체 파일을 읽지 않음 → 토큰 절약
70
49
  ```
50
+ Bash("bash scripts/tfx-route.sh gemini exec 'Scan the project at {path}. For each source file, extract: exports, imports, line count, file type. Exclude node_modules/, .git/, dist/, build/, coverage/, *.lock, *.log, *.map. Generate both PROJECT_INDEX.md and PROJECT_INDEX.json following this format:
71
51
 
72
- ### Step 3: 인덱스 생성
73
-
74
- ```markdown
52
+ PROJECT_INDEX.md:
75
53
  # PROJECT_INDEX.md
76
54
  Generated: {date} | Files: {count} | Lines: {total_lines}
77
-
78
55
  ## Architecture
79
- {1-2 아키텍처 요약}
80
-
56
+ {1-2 line summary}
81
57
  ## Directory Map
82
- ```
83
- src/
84
- ├─ hub/ # MCP 메시지 버스 (bridge, router, pipe)
85
- │ ├─ team/ # 멀티-CLI 팀 모드 (headless, psmux, native)
86
- │ └─ pipeline/ # 상태 관리 (state, transitions, gates)
87
- ├─ skills/ # 스킬 정의 (tfx-*, SKILL.md)
88
- └─ bin/ # CLI 진입점
89
- ```
90
-
58
+ {tree with inline comments}
91
59
  ## Key Files
92
60
  | File | Lines | Exports | Role |
93
- |------|-------|---------|------|
94
- | hub/bridge.mjs | 850 | BridgeServer, createBridge | MCP 프로토콜 브릿지 |
95
- | hub/router.mjs | 720 | Router, routeRequest | 요청/응답 라우팅 |
96
- | ... | ... | ... | ... |
97
-
98
61
  ## Dependencies
99
62
  | Package | Version | Purpose |
100
- |---------|---------|---------|
101
- | express | 4.x | HTTP 서버 |
102
- | ... | ... | ... |
103
-
104
63
  ## Entry Points
105
- - `bin/tfx` → CLI 메인
106
- - `hub/bridge.mjs` → MCP 서버
107
- - `skills/*/SKILL.md` → 스킬 정의
108
- ```
109
-
110
- ### Step 4: JSON 인덱스 (기계용)
64
+ - {entry}: {role}
111
65
 
112
- ```json
113
- // PROJECT_INDEX.json (~10KB)
66
+ PROJECT_INDEX.json:
114
67
  {
115
- "generated": "2026-03-29",
116
- "stats": { "files": 45, "lines": 12500 },
117
- "files": {
118
- "hub/bridge.mjs": {
119
- "lines": 850,
120
- "exports": ["BridgeServer", "createBridge"],
121
- "imports": ["express", "./router"],
122
- "type": "server"
123
- }
124
- },
125
- "graph": {
126
- "hub/bridge.mjs": ["hub/router.mjs", "hub/pipe.mjs"],
127
- "hub/router.mjs": ["hub/intent.mjs"]
128
- }
68
+ "generated": "{date}",
69
+ "stats": { "files": N, "lines": N },
70
+ "files": { "{path}": { "lines": N, "exports": [], "imports": [], "type": "" } },
71
+ "graph": { "{path}": ["{dep}", ...] }
129
72
  }
73
+
74
+ Return the full content of both files separated by the delimiter: ===PROJECT_INDEX_JSON_START===
75
+ Mode: {mode}
76
+ '")
77
+ ```
78
+
79
+ Gemini 출력을 받은 후 Claude가 파일로 기록한다:
80
+
81
+ ```
82
+ Write("PROJECT_INDEX.md", <md_section>)
83
+ Write("PROJECT_INDEX.json", <json_section>)
84
+ ```
85
+
86
+ #### Fallback: Gemini 실패 시
87
+
88
+ Gemini 위임이 실패하거나 `tfx-route.sh`가 없는 경우, Claude가 직접 원래 워크플로우로 폴백한다:
89
+
90
+ ```
91
+ 1. 병렬 Glob으로 파일 트리 수집 (**/*.{ts,js,mjs,tsx,jsx,...})
92
+ 2. Grep으로 export/import 문 추출 (파일당 ~20줄)
93
+ 3. PROJECT_INDEX.md + PROJECT_INDEX.json 직접 생성
130
94
  ```
131
95
 
132
- ### Step 5: 검증
96
+ ### Step 2: 검증 (Claude 담당)
133
97
 
134
98
  ```
135
- 생성된 인덱스 검증:
136
- - 파일 수 일치 확인
99
+ 생성된 인덱스 빠른 검증:
100
+ - 파일 수 일치 확인 (stats.files vs 실제)
137
101
  - 주요 진입점 포함 확인
138
102
  - 인덱스 크기 < 5KB 확인
103
+ - PROJECT_INDEX.json 파싱 가능 여부 확인
139
104
  ```
140
105
 
141
106
  ## --update 모드
@@ -158,12 +123,15 @@ src/
158
123
 
159
124
  ## 토큰 예산
160
125
 
161
- | 작업 | 토큰 |
162
- |------|------|
163
- | 스캔+추출 | ~1.5K |
164
- | 인덱스 생성 | ~0.5K |
165
- | **총합** | **~2K** |
166
- | **세션당 절감** | **~55K** |
126
+ | 작업 | Claude | Gemini |
127
+ |------|--------|--------|
128
+ | 모드 선택 (Step 0) | ~100 | — |
129
+ | 스캔 + 메타데이터 추출 | | Gemini 부담 |
130
+ | 인덱스 생성 (MD + JSON) | | Gemini 부담 |
131
+ | 파일 쓰기 (Write) | ~300 | — |
132
+ | 검증 (Step 2) | ~100 | — |
133
+ | **Claude 총합** | **~500** | — |
134
+ | **세션당 절감** | **~55K** | — |
167
135
 
168
136
  ## 사용 예
169
137
 
@@ -14,6 +14,25 @@ argument-hint: "<구현할 주제 또는 요구사항>"
14
14
 
15
15
  > OMC deep-interview + ouroboros 오마주. 모호성을 숫자로 측정하고 20% 미만까지 질문한다.
16
16
  > "측정할 수 없으면 개선할 수 없다."
17
+ >
18
+ > **Gemini 위임**: 분석·점수 계산·산출물 초안은 Gemini CLI에 위임하여 Claude 토큰을 절약한다.
19
+ > 위임 패턴: `Bash("bash scripts/tfx-route.sh gemini exec '{prompt}'")`
20
+
21
+ ## 위임 패턴
22
+
23
+ Claude와 Gemini의 역할을 분리하여 토큰을 최적화한다.
24
+
25
+ | 담당 | 작업 |
26
+ |------|------|
27
+ | **Claude** | AskUserQuestion (사용자 상호작용), 최종 파일 저장 |
28
+ | **Gemini** | 모호성 점수 계산, 질문 생성, 응답 분석, 산출물 초안 |
29
+
30
+ ```bash
31
+ # 위임 호출 형태
32
+ Bash("bash scripts/tfx-route.sh gemini exec '{prompt}'")
33
+ ```
34
+
35
+ Gemini 실패 시 Fallback: Claude Opus가 분석을 직접 처리한다.
17
36
 
18
37
  ## 용도
19
38
 
@@ -48,15 +67,17 @@ ambiguity = 1 - (goal × 0.40 + constraints × 0.30 + criteria × 0.30)
48
67
 
49
68
  ### Step 1: 초기 모호성 평가
50
69
 
51
- 사용자 입력을 분석하여 초기 ambiguity score를 계산한다:
70
+ 사용자 입력을 Gemini에 전달하여 초기 ambiguity score를 계산한다:
52
71
 
72
+ ```bash
73
+ # Claude → Gemini 위임
74
+ Bash("bash scripts/tfx-route.sh gemini exec 'Analyze the following requirement and calculate ambiguity score. Return JSON: {goal, constraints, criteria, ambiguity, suggested_questions}: {user_input}'")
53
75
  ```
54
- 입력 분석:
55
- 1. goal, constraints, criteria 각 요소의 현재 명확도 평가
56
- 2. ambiguity score 계산
57
- 3. 가장 불명확한 요소 식별 → 해당 단계부터 질문 시작
58
76
 
59
- 출력:
77
+ Gemini가 반환한 JSON에서 점수를 읽어 사용자에게 표시한다:
78
+
79
+ ```
80
+ 출력 예시:
60
81
  "📊 현재 모호성: 71%
61
82
  - 목표: 50% 명확 (어떤 인증 방식?)
62
83
  - 제약: 20% 명확 (기술 스택 미정)
@@ -66,7 +87,9 @@ ambiguity = 1 - (goal × 0.40 + constraints × 0.30 + criteria × 0.30)
66
87
 
67
88
  ### Step 2: 5단계 인터뷰 (모호성 < 20%까지)
68
89
 
69
- 각 단계에서 AskUserQuestion으로 질문하고, 응답 ambiguity score를 재계산한다.
90
+ 각 단계에서 Claude가 AskUserQuestion으로 질문하고, 사용자 응답을 Gemini에 전달하여 분석 및 다음 질문을 생성한다.
91
+
92
+ 흐름: `Claude(질문) → 사용자(응답) → Gemini(분석+재계산) → Claude(다음 질문 제시)`
70
93
 
71
94
  #### Stage 1: Clarify (명확화) — goal 개선
72
95
 
@@ -75,8 +98,15 @@ ambiguity = 1 - (goal × 0.40 + constraints × 0.30 + criteria × 0.30)
75
98
  - "정확히 무엇을 달성하려는가?"
76
99
  - "이 작업의 범위는 어디까지인가?"
77
100
  - "완료 후 어떤 상태가 되어야 하는가?"
101
+ ```
78
102
 
79
- 응답 후: goal 점수 재평가 → ambiguity 재계산
103
+ ```bash
104
+ # 응답 수집 후 Gemini에 분석 위임
105
+ Bash("bash scripts/tfx-route.sh gemini exec 'Stage 1 response analysis. Previous context: {context}. User answer: {answer}. Calculate updated ambiguity score and generate next stage questions. Return JSON.'")
106
+ ```
107
+
108
+ ```
109
+ 응답 후: Gemini JSON에서 goal 점수 읽기 → ambiguity 재계산 결과 사용자에게 표시
80
110
  ```
81
111
 
82
112
  #### Stage 2: Decompose (분해) — constraints 개선
@@ -86,8 +116,15 @@ ambiguity = 1 - (goal × 0.40 + constraints × 0.30 + criteria × 0.30)
86
116
  - "이것을 어떤 하위 문제로 나눌 수 있는가?"
87
117
  - "기술적 제약 조건은? (스택, 호환성, 성능)"
88
118
  - "의존하는 외부 시스템이나 API는?"
119
+ ```
89
120
 
90
- 응답 후: constraints 점수 재평가 → ambiguity 재계산
121
+ ```bash
122
+ # 응답 수집 후 Gemini에 분석 위임
123
+ Bash("bash scripts/tfx-route.sh gemini exec 'Stage 2 response analysis. Previous context: {context}. User answer: {answer}. Calculate updated ambiguity score and generate next stage questions. Return JSON.'")
124
+ ```
125
+
126
+ ```
127
+ 응답 후: Gemini JSON에서 constraints 점수 읽기 → ambiguity 재계산 결과 사용자에게 표시
91
128
  ```
92
129
 
93
130
  #### Stage 3: Challenge (반론) — 숨은 제약 발견
@@ -97,8 +134,15 @@ ambiguity = 1 - (goal × 0.40 + constraints × 0.30 + criteria × 0.30)
97
134
  - "이 접근의 약점은?"
98
135
  - "실패할 수 있는 시나리오는?"
99
136
  - "6개월 후 유지보수 관점에서 문제될 부분은?"
137
+ ```
138
+
139
+ ```bash
140
+ # 응답 수집 후 Gemini에 분석 위임
141
+ Bash("bash scripts/tfx-route.sh gemini exec 'Stage 3 response analysis. Previous context: {context}. User answer: {answer}. Calculate updated ambiguity score and generate next stage questions. Return JSON.'")
142
+ ```
100
143
 
101
- 응답 후: constraints + criteria 재평가 → ambiguity 재계산
144
+ ```
145
+ 응답 후: Gemini JSON에서 constraints + criteria 점수 읽기 → ambiguity 재계산 결과 사용자에게 표시
102
146
  ```
103
147
 
104
148
  #### Stage 4: Alternatives (대안) — criteria 정밀화
@@ -108,8 +152,15 @@ ambiguity = 1 - (goal × 0.40 + constraints × 0.30 + criteria × 0.30)
108
152
  - "다른 방법은 없는가?"
109
153
  - "시간이 절반이라면 어떤 방식을 택하겠는가?"
110
154
  - "각 대안의 trade-off는?"
155
+ ```
156
+
157
+ ```bash
158
+ # 응답 수집 후 Gemini에 분석 위임
159
+ Bash("bash scripts/tfx-route.sh gemini exec 'Stage 4 response analysis. Previous context: {context}. User answer: {answer}. Calculate updated ambiguity score and generate next stage questions. Return JSON.'")
160
+ ```
111
161
 
112
- 응답 후: criteria 점수 재평가 → ambiguity 재계산
162
+ ```
163
+ 응답 후: Gemini JSON에서 criteria 점수 읽기 → ambiguity 재계산 결과 사용자에게 표시
113
164
  ```
114
165
 
115
166
  #### Stage 5: Synthesize (종합) — 최종 확인
@@ -119,8 +170,15 @@ ambiguity = 1 - (goal × 0.40 + constraints × 0.30 + criteria × 0.30)
119
170
  - "지금까지의 논의를 종합하면 최적 경로는?"
120
171
  - "첫 번째로 실행할 단계는?"
121
172
  - "이 결정에 대한 확신도는? (1-10)"
173
+ ```
122
174
 
123
- 응답 후: 전체 재평가 → 최종 ambiguity score
175
+ ```bash
176
+ # 응답 수집 후 Gemini에 최종 분석 위임
177
+ Bash("bash scripts/tfx-route.sh gemini exec 'Stage 5 response analysis. Previous context: {context}. User answer: {answer}. Calculate updated ambiguity score and generate next stage questions. Return JSON.'")
178
+ ```
179
+
180
+ ```
181
+ 응답 후: Gemini JSON에서 전체 점수 읽기 → 최종 ambiguity score 사용자에게 표시
124
182
  ```
125
183
 
126
184
  ### Step 3: 조기 종료 판단
@@ -140,7 +198,18 @@ ambiguity = 1 - (goal × 0.40 + constraints × 0.30 + criteria × 0.30)
140
198
 
141
199
  ### Step 4: 산출물 생성
142
200
 
143
- 인터뷰 결과를 구조화된 문서로 저장한다:
201
+ Gemini가 인터뷰 전체 컨텍스트를 바탕으로 구조화된 문서 초안을 생성하고, Claude가 파일로 저장한다:
202
+
203
+ ```bash
204
+ # Gemini에 산출물 초안 생성 위임
205
+ Bash("bash scripts/tfx-route.sh gemini exec 'Generate a structured interview output document based on the following interview context: {full_context}. Return the complete markdown document.'")
206
+ ```
207
+
208
+ Claude는 Gemini가 반환한 마크다운을 Write 도구로 저장한다.
209
+
210
+ 저장 위치: `.omc/plans/interview-{timestamp}.md`
211
+
212
+ 산출물 형식:
144
213
 
145
214
  ```markdown
146
215
  # Interview: {topic}
@@ -179,8 +248,6 @@ Date: {date} | Final Ambiguity: {score}%
179
248
  3. ...
180
249
  ```
181
250
 
182
- 저장 위치: `.omc/plans/interview-{timestamp}.md`
183
-
184
251
  ## 동작 규칙
185
252
 
186
253
  1. 각 단계에서 반드시 사용자 응답을 수집한 후 다음으로 이동한다.
@@ -192,13 +259,16 @@ Date: {date} | Final Ambiguity: {score}%
192
259
 
193
260
  ## 토큰 예산
194
261
 
195
- | 단계 | 토큰 |
196
- |------|------|
197
- | 초기 평가 | ~1K |
198
- | 5단계 인터뷰 (질문+분석) | ~10K |
199
- | 산출물 생성 | ~2K |
200
- | 코드베이스 탐색 | ~2K |
201
- | **총합** | **~15K** |
262
+ | 단계 | Claude | Gemini |
263
+ |------|--------|--------|
264
+ | 초기 평가 (모호성 분석) | ~0.2K | ~1K |
265
+ | 5단계 인터뷰 (질문 제시) | ~1K | ~10K |
266
+ | 산출물 초안 생성 | — | ~2K |
267
+ | 최종 파일 저장 | ~0.5K | — |
268
+ | 코드베이스 탐색 | ~0.3K | — |
269
+ | **총합** | **~2K** | **~13K** |
270
+
271
+ Fallback: Gemini 호출 실패 시 Claude Opus가 분석을 직접 처리한다 (총합 ~15K).
202
272
 
203
273
  ## 사용 예
204
274
 
@@ -12,26 +12,28 @@ argument-hint: "<구현할 기능 설명>"
12
12
  # tfx-plan — Light Implementation Plan
13
13
 
14
14
  > **Deep 버전**: tfx-deep-plan. "제대로/꼼꼼히" 수정자로 자동 에스컬레이션.
15
- > Claude Opus 단독 빠른 계획. 복잡한 합의 없이 즉시 태스크 분해.
15
+ > Gemini 위임 빠른 계획 Claude는 컨텍스트 수집·출력 포맷만, 핵심 계획 수립은 Gemini에 위임.
16
16
 
17
17
  ## 워크플로우
18
18
 
19
19
  ### Step 1: 요구사항 파싱
20
20
  사용자 입력 + 프로젝트 컨텍스트(PROJECT_INDEX.md 있으면 활용)에서 핵심 추출.
21
21
 
22
- ### Step 2: Claude Opus 계획 수립
22
+ ### Step 2: Gemini 위임 계획 수립
23
+
24
+ Claude는 최소 컨텍스트만 수집한다.
25
+ - Glob으로 영향 가능 파일 목록 수집
26
+ - PROJECT_INDEX.md 존재 시 읽기 (없으면 생략)
27
+
28
+ 수집 후 Gemini에 위임:
23
29
  ```
24
- "소프트웨어 아키텍트로서 다음 기능의 구현 계획을 수립하라:
25
- 기능: {feature}
26
- 프로젝트 컨텍스트: {context}
27
-
28
- 출력 형식:
29
- 1. 영향 범위 (수정할 파일 목록)
30
- 2. 태스크 분해 (순서대로, 각 태스크에 검증 방법 포함)
31
- 3. 리스크 및 의존성
32
- 4. 예상 복잡도 (low/medium/high)"
30
+ Bash("bash scripts/tfx-route.sh gemini exec '소프트웨어 아키텍트로서 다음 기능의 구현 계획을 수립하라.\n기능: {feature}\n프로젝트 컨텍스트: {context}\n관련 파일: {file_list}\n\n출력 형식:\n1. 영향 범위 (수정할 파일 목록)\n2. 태스크 분해 (순서대로, 각 태스크에 검증 방법 포함)\n3. 리스크 및 의존성\n4. 예상 복잡도 (low/medium/high)'")
33
31
  ```
34
32
 
33
+ Claude는 Gemini 출력을 받아 아래 출력 형식으로 포맷팅만 수행한다.
34
+
35
+ > **Fallback**: Gemini 호출이 실패(exit non-zero 또는 빈 출력)하면 Claude Opus가 동일 프롬프트로 직접 계획을 수립한다.
36
+
35
37
  ### Step 3: 구조화된 계획 출력
36
38
  ```markdown
37
39
  ## 구현 계획: {feature}
@@ -51,4 +53,12 @@ argument-hint: "<구현할 기능 설명>"
51
53
  ### 복잡도: {level}
52
54
  ```
53
55
 
54
- ## 토큰: ~8K
56
+ ## 토큰 절감
57
+
58
+ | 구분 | 변경 전 | 변경 후 |
59
+ |------|---------|---------|
60
+ | Claude 입력 | ~6K (컨텍스트 + 계획 프롬프트) | ~1K (컨텍스트 수집 + 포맷 지시) |
61
+ | Claude 출력 | ~2K (계획 전문) | ~0.5K (포맷팅만) |
62
+ | 합계 | ~8K | ~1.5K (**-81%**) |
63
+
64
+ Gemini가 계획 생성의 대부분을 담당하므로 Claude 토큰 비용이 대폭 감소한다.
@@ -14,7 +14,7 @@ argument-hint: "<검색 주제>"
14
14
  # tfx-research — Light Web Research
15
15
 
16
16
  > **Deep 버전**: tfx-deep-research. "제대로/꼼꼼히" 수정자로 자동 에스컬레이션.
17
- > 빠른 단일 소스 검색 + 요약. 토큰 최소화, 즉시 결과.
17
+ > 빠른 단일 소스 검색 + 요약. **검색 자체를 Gemini에 위임**해 Claude 토큰 최소화. Gemini CLI의 네이티브 Google Search로 검색+요약을 한 번에 처리.
18
18
 
19
19
  ## 용도
20
20
 
@@ -26,9 +26,9 @@ argument-hint: "<검색 주제>"
26
26
 
27
27
  ## 워크플로우
28
28
 
29
- ### Step 1: 쿼리 최적화
29
+ ### Step 1: 쿼리 최적화 (Claude — ~100 토큰)
30
30
 
31
- 사용자 입력을 검색에 최적화된 쿼리로 변환한다:
31
+ 사용자 입력을 검색에 최적화된 영문 키워드로 변환한다. 이 단계만 Claude가 처리한다:
32
32
 
33
33
  ```
34
34
  입력: "React 19에서 use() 훅 사용법"
@@ -49,10 +49,58 @@ AskUserQuestion:
49
49
  5. URL 콘텐츠 추출
50
50
  ```
51
51
 
52
- 선택 결과에 따라 Step 2 자동 선택 로직을 건너뛰고 해당 MCP를 직접 사용한다.
53
- 인자가 제공된 경우 이 단계를 건너뛰고 Step 2 자동 선택 로직을 따른다.
52
+ 선택 결과에 따라 Step 2 Gemini 위임 프롬프트에 검색 유형 힌트를 추가한다.
53
+ 인자가 제공된 경우 이 단계를 건너뛰고 Step 2 직행한다.
54
54
 
55
- ### Step 2: MCP 소스 자동 선택
55
+ ### Step 2: Gemini에 검색+요약 위임 (검색 실행 전체를 Gemini가 처리)
56
+
57
+ 최적화된 쿼리를 Gemini CLI로 전달한다. Gemini는 네이티브 Google Search를 사용해 검색과 요약을 모두 수행한다:
58
+
59
+ ```
60
+ Bash("bash scripts/tfx-route.sh gemini exec 'Research the following topic. Use Google Search to find current information. Return a structured markdown summary with sources: {optimized_query}'")
61
+ ```
62
+
63
+ Gemini가 반환하는 결과에는 검색 결과, 출처 URL, 핵심 요약이 포함된다. Claude는 이 단계에서 토큰을 소비하지 않는다.
64
+
65
+ **실패 시**: Gemini CLI가 응답하지 않거나 오류가 발생하면 → [Claude Fallback](#claude-fallback-gemini-실패-시) 으로 전환.
66
+
67
+ ### Step 3: 결과 포맷팅 (Claude — 경량, ~300 토큰)
68
+
69
+ Gemini 출력을 표준 결과 템플릿으로 정리한다. 새로운 검색이나 요약 없이 포맷 변환만 수행:
70
+
71
+ ```markdown
72
+ ## 검색 결과: {query}
73
+
74
+ ### 핵심 답변
75
+ {Gemini 요약에서 추출한 1-3문장 직접 답변}
76
+
77
+ ### 상세 내용
78
+ - **[출처 1 제목](URL)**: {하이라이트 요약}
79
+ - **[출처 2 제목](URL)**: {하이라이트 요약}
80
+ - **[출처 3 제목](URL)**: {하이라이트 요약}
81
+
82
+ ### 관련 키워드
83
+ {추가 검색에 유용한 키워드}
84
+ ```
85
+
86
+ ## 토큰 예산
87
+
88
+ | 단계 | 담당 | 토큰 |
89
+ |------|------|------|
90
+ | 쿼리 최적화 | Claude | ~100 |
91
+ | 검색 실행 + 요약 | Gemini | 0 (Claude 미소비) |
92
+ | 결과 포맷팅 | Claude | ~300 |
93
+ | **Claude 총합** | | **~500 (오케스트레이션만)** |
94
+
95
+ > 기존 대비 Claude 토큰 ~90% 절감. 검색 품질은 Gemini의 Google Search 네이티브 연동으로 유지.
96
+
97
+ ---
98
+
99
+ ## Claude Fallback (Gemini 실패 시)
100
+
101
+ Gemini CLI가 실패하거나 응답이 없을 경우 Claude + MCP 원본 워크플로우로 폴백한다.
102
+
103
+ ### Fallback Step 2: MCP 소스 자동 선택
56
104
 
57
105
  검색 유형에 따라 최적 MCP를 자동 선택한다:
58
106
 
@@ -73,7 +121,7 @@ elif query contains URL → Exa crawling
73
121
  else → Tavily (가장 범용적)
74
122
  ```
75
123
 
76
- ### Step 3: 검색 실행
124
+ ### Fallback Step 3: 검색 실행
77
125
 
78
126
  선택된 MCP로 검색 실행. 결과를 토큰 효율적으로 포맷:
79
127
 
@@ -85,36 +133,6 @@ else → Tavily (가장 범용적)
85
133
  - freshness: 상황에 따라 자동 설정
86
134
  ```
87
135
 
88
- ### Step 4: 결과 요약
89
-
90
- 검색 결과를 구조화된 요약으로 변환:
91
-
92
- ```markdown
93
- ## 검색 결과: {query}
94
-
95
- ### 핵심 답변
96
- {1-3문장 직접 답변}
97
-
98
- ### 상세 내용
99
- - **[출처 1 제목](URL)**: {하이라이트 요약}
100
- - **[출처 2 제목](URL)**: {하이라이트 요약}
101
- - **[출처 3 제목](URL)**: {하이라이트 요약}
102
-
103
- ### 관련 키워드
104
- {추가 검색에 유용한 키워드}
105
- ```
106
-
107
- ## 토큰 예산
108
-
109
- | 단계 | 토큰 |
110
- |------|------|
111
- | 쿼리 최적화 | ~200 |
112
- | 검색 실행 | ~2K (MCP 결과) |
113
- | 결과 요약 | ~2K |
114
- | **총합** | **~5K** |
115
-
116
- ## Fallback 전략
117
-
118
136
  MCP 사용 불가 시 순서:
119
137
  1. context7 → 2. WebSearch (내장) → 3. Brave → 4. Exa → 5. Tavily
120
138